//! A templated queue data structure.
module watt.containers.queue;
//! A templated stack data structure.
module watt.containers.stack;
//! Contains an implementation of the Murmur hashing function.
module watt.digest.murmur;
//! Hash data using the 32 bit Murmur hash, and a seed of 0.
fn hashMurmur_32(arr: const(const(void)[])) u32 { }
//! Hash data using the 32 bit Murmur hash, and a seed.
fn hashMurmur_32(arr: const(const(void)[]), seed: u32) u32 { }
//! Contains two variants of the Fowler–Noll–Vo hashing function.
module watt.digest.fnv;
//! Hash data using a 32 bit variant of the FNV hash function.
fn hashFNV1A_32(arr: scope (const(scope (void)[])) u32 { }
//! Hash data using a 64 bit variant of the FNV hash function.
fn hashFNV1A_64(arr: scope (const(scope (void)[])) u64 { }
//! Modules that generate hashes of data.
module watt.digest;
public import watt.digest.fnv;
public import watt.digest.murmur;
//! Functions for classifying characters in the ASCII range.
module watt.text.ascii;
enum HEX_DIGITS;
enum FULL_HEX_DIGITS;
enum DIGITS;
enum OCTAL_DIGITS;
enum LOWERCASE;
enum LETTERS;
enum UPPERCASE;
enum WHITESPACE;
enum NEWLINE;
//! Is a character alphanumeric?
fn isAlphaNum(c: dchar) bool { }
//! Is a character alphabetical?
fn isAlpha(c: dchar) bool { }
//! Is a character a lowercase alphabetical character?
fn isLower(c: dchar) bool { }
//! Is a character a uppercase alphabetical character?
fn isUpper(c: dchar) bool { }
//! Is a character a digit?
fn isDigit(c: dchar) bool { }
//! Is a character an octal digit?
fn isOctalDigit(c: dchar) bool { }
//! Is a character a hexadecimal digit?
fn isHexDigit(c: dchar) bool { }
//! Is a character whitespace?
fn isWhite(c: dchar) bool { }
//! Is a character a control character?
fn isControl(c: dchar) bool { }
//! Is a character punctuation?
fn isPunctuation(c: dchar) bool { }
//! Is a character a printable ASCII character?
fn isPrintable(c: dchar) bool { }
//! Is a given character an ASCII character?
fn isASCII(c: dchar) bool { }
//! Get the lowerspace letter of an uppercase character.
fn toLower(c: dchar) dchar { }
//! Get the upperspace letter of a lowercase character.
fn toUpper(c: dchar) dchar { }
//! Functions for escaping and unescaping HTML.
module watt.text.html;
//! Get the HTML escaped version of a given string.
fn htmlEscape(str: string) string { }
//! Given an HTML escaped string str, unescape that string.
fn htmlUnescape(str: string) string { }
//! Writes the HTML escaped version of a given string to the given dgt.
fn htmlEscape(dgt: scope (Sink), str: string, ignore: string) { }
//! Returns the HTML escaped version of a given string, ignoring any HTML
//! tags.
fn htmlEscapeIgnoreTags(str: string) string { }
//! Writes the HTML escaped version of a given string to the given dgt,
//! ignoring any HTML tags.
fn htmlEscapeIgnoreTags(dgt: scope (Sink), str: string) { }
//! Escape every single character.
fn htmlEscapeAll(str: string) string { }
//! Escape every single character into a Sink.
fn htmlEscapeAll(dgt: scope (Sink), str: string) { }
//! Volt doccomment parsing and cleaning code.
module watt.text.vdoc;
enum DocState
{
Content,
Brief,
Param,
Section,
}
enum DocSection
{
SeeAlso,
Return,
SideEffect,
Throw,
}
//! Interface for doc string consumers.
interface DocSink
{
public:
//! Signals the start of the full content.
fn start(sink: scope (Sink));
//! Signals the end of the full content.
fn end(sink: scope (Sink));
//! Signals the start of a brief comment section.
fn briefStart(sink: scope (Sink));
//! Signals the end of a brief comment section.
fn briefEnd(sink: scope (Sink));
//! Signals the start of a param comment section.
fn paramStart(sink: scope (Sink), direction: string, arg: string);
//! Signals the end of a param comment section.
fn paramEnd(sink: scope (Sink));
//! Signals the start of a section, these are never nested.
fn sectionStart(sink: scope (Sink), sec: DocSection);
//! Signals the end of a section, these are never nested.
fn sectionEnd(sink: scope (Sink), sec: DocSection);
//! Regular text content.
fn content(sink: scope (Sink), state: DocState, d: string);
//! p comment section.
fn p(sink: scope (Sink), state: DocState, d: string);
//! link comment section.
fn link(sink: scope (Sink), state: DocState, target: string, text: string);
//! The defgroup command.
fn defgroup(sink: scope (Sink), group: string, text: string);
//! The ingroup command, may get called multiple times.
fn ingroup(sink: scope (Sink), group: string);
}
//! Take a doc comment and remove comment cruft from it.
fn cleanComment(comment: string, isBackwardsComment: bool) string { }
//! Given a doc string input, call dsink methods with the given sink as an
//! argument.
fn parse(src: string, dsink: DocSink, sink: scope (Sink)) { }
//! Process command line arguments.
module watt.text.getopt;
//! Thrown when arguments are in error.
class GetoptException : Exception
{
public:
this(msg: string) { }
}
//! Parse a flag taking a string argument from an array of strings.
fn getopt(args: string[], description: string, _string: string) bool { }
//! Parse a flag taking multiple string argument from an array of strings.
fn getopt(args: string[], description: string, strings: string[]) bool { }
//! Parse a flag that takes an integer argument from an array of strings.
fn getopt(args: string[], description: string, _int: i32) bool { }
//! Handle a simple boolean flag.
fn getopt(args: string[], description: string, _bool: bool) bool { }
//! Calls a delegate each time the flag appears.
fn getopt(args: string[], description: string, dgt: scope (void delegate())) bool { }
//! Calls a delegate with argument each time the flag appears.
fn getopt(args: string[], description: string, dgt: scope (void delegate(string))) bool { }
//! Get the first flag in an array of strings.
fn remainingOptions(args: string[]) string { }
//! Functions for demangling Volt mangled symbols.
module watt.text.demangle;
//! Demangle a given mangled name.
fn demangle(mangledName: const(char)[]) string { }
//! Demangle a given mangled name, but omit redundant information.
fn demangleShort(mangledName: const(char)[]) string { }
//! Simple functions for working with string values.
module watt.text.string;
//! Helper alias for string args that are scoped.
alias StrArg = scope (const(scope (char)[]);
//! Helper alias for string array args that are scoped.
alias StrArrayArg = scope (scope (const(scope (char)[])[]);
//! Divide s into an array of strings.
fn split(s: scope (StrArg), delimiter: dchar) string[] { }
//! Divide s into an array of strings.
fn split(s: scope (StrArg), delimiter: scope (StrArg)) string[] { }
//! Get an array with an element for each line in s.
fn splitLines(s: scope (StrArg)) string[] { }
//! Get an array with an element for each line in s.
fn splitLines(s: string) string[] { }
//! Remove whitespace before and after str.
fn strip(str: scope (StrArg)) string { }
//! Remove leading whitespace from str.
fn stripLeft(str: scope (StrArg)) string { }
//! Remove trailing whitespace.
fn stripRight(str: scope (StrArg)) string { }
//! Count how many times c occurs in s.
fn count(str: scope (StrArg), c: dchar) size_t { }
//! Find a character in a string.
fn indexOf(str: scope (StrArg), c: dchar) ptrdiff_t { }
//! Find a character in a string, starting from the end.
fn lastIndexOf(str: scope (StrArg), c: dchar) ptrdiff_t { }
//! Find a string in a string.
fn indexOf(str: scope (StrArg), sub: scope (StrArg)) ptrdiff_t { }
//! Find a string in an array of strings.
fn indexOf(ss: scope (StrArrayArg), str: scope (StrArg)) ptrdiff_t { }
//! Replace instances of a string in a string with another.
fn replace(str: scope (StrArg), from: scope (StrArg), to: scope (StrArg)) string { }
fn startsWith(str: scope (StrArg), beginnings: scope (StrArrayArg)) i32 { }
fn endsWith(str: scope (StrArg), ends: scope (StrArrayArg)) i32 { }
//! Join an array of strings into one string, separated by sep.
fn join(ss: scope (StrArrayArg), sep: scope (StrArg)) string { }
//! Functions that output the differences between two strings.
module watt.text.diff;
//! Print the difference between two strings, line-by-line, to stdout.
fn diff(a: const(char)[], b: const(char)[]) { }
//! Parse Semantic Version strings.
module watt.text.semver;
//! Parses a string into a Semantic Version.
class Release
{
public:
//! major>..(-)(+)
major: i32;
minor: i32;
patch: i32;
prerelease: string;
metadata: string;
public:
//! Parse a SemVer from a given string.
this(verString: string) { }
//! Get a string representation of this semver string.
fn toString() string { }
//! Compare this release to another.
fn opCmp(b: Release) i32 { }
//! Test this release for equality with another.
fn opEquals(b: Release) bool { }
public:
static fn isValid(verString: string) bool { }
}
//! A class for dealing with a file from the perspective of a compiler.
module watt.text.source;
//! A container for iterating over UTF-8 source code.
class Source
{
public:
alias eof = empty;
public:
//! The location of the current character front.
loc: Location;
public:
//! Sets this Source to s and the current location and validate it as a
//! utf8 source.
this(s: string, filename: string) { }
//! Have we reached EOF, if we have current = dchar.default.
fn empty() dchar { }
//! Returns the current utf8 char.
fn front() dchar { }
//! Returns the following utf8 char after front.
fn following() dchar { }
//! Advance the source one character.
fn popFront() { }
//! Advance the source n character.
fn popFrontN(n: size_t) { }
//! Used to skip whitespace in the source file, as defined by
//! watt.text.ascii.isWhite.
fn skipWhitespace() { }
//! Skips till character after next end of line or eof.
fn skipEndOfLine() { }
//! Return the unicode character n chars forwards. lookaheadEOF set to true
//! if we reached EOF, otherwise false.
fn lookahead(n: size_t, lookaheadEOF: bool) dchar { }
//! Return the index of the current character.
fn save() size_t { }
//! Slices the source from the given mark to (but not including) the
//! current character. Use save for indicies.
fn sliceFrom(mark: size_t) string { }
//! Slice the source from a to b.
fn slice(a: size_t, b: size_t) string { }
}
//! A simple container for iterating over UTF-8 source code.
struct SimpleSource
{
public:
alias eof = empty;
public:
//! Have we reached EOF, if we have front = dchar.default.
empty: bool;
public:
//! Setup this simple source and return the full source.
fn source(src: string) string { }
//! Return the full source.
fn source() string { }
//! Returns the current utf8 char.
fn front() dchar { }
//! Returns the following utf8 char after front.
fn following() dchar { }
//! Advance the source one character.
fn popFront() { }
//! Advance the source n character.
fn popFrontN(n: size_t) { }
//! Return the unicode character n chars forwards. lookaheadEOF set to true
//! if we reached EOF, otherwise false.
fn lookahead(n: size_t, lookaheadEmpty: bool) dchar { }
//! Used to skip whitespace in the source file, as defined by
//! watt.text.ascii.isWhite.
fn skipWhitespace() { }
//! Return the index of the current character.
fn save() size_t { }
//! Slices the source from the given mark to (but not including) the
//! current character. Use save for indicies.
fn sliceFrom(mark: size_t) string { }
//! Slices two points.
fn slice(a: size_t, b: size_t) string { }
//! Decodes a single utf8 code point at index in the given source.
fn decodeChar(index: size_t) dchar { }
}
//! Struct representing a location in a source file.
struct Location
{
public:
//! The file from pointed to this locatiom.
filename: string;
//! Line number starting at 1.
line: size_t;
//! Column starting at 1.
column: size_t;
//! Length in characers.
length: size_t;
public:
//! Format into a location string.
fn toString() string { }
//! Difference between two locations. end - begin == begin ... end
fn opSub(begin: Location) Location { }
//! See difference.
fn spanTo(end: Location) { }
public:
//! Difference between two locations. end - begin == begin ... end
static fn difference(end: Location, begin: Location, _default: Location) Location { }
}
//! Construct long strings of text efficiently.
module watt.text.sink;
//! A Sink is a delegate that accepts strings and concatenates them
//! efficiently.
alias Sink = core.rt.format.Sink;
//! A SinkArg is shorthand for the string argument to a Sink.
alias SinkArg = core.rt.format.SinkArg;
//! Helps construct long strings efficiently.
struct StringSink
{
public:
//! Add str to this sink.
fn sink(str: scope (SinkArg)) { }
//! Get the contents of this sink as a string.
fn toString() string { }
//! Get the contents of this sink as a mutable array of characters.
fn toChar() char[] { }
//! Safely get the backing storage from the sink without copying.
fn toSink(sink: scope (Sink)) { }
//! Clear this sink.
fn reset() { }
fn length() size_t { }
}
struct StringsSink
{
public:
enum MinSize;
enum MaxSize;
public:
alias Sink = void delegate(scope (SinkArg));
alias SinkArg = scope (scope (T)[]);
public:
fn length() size_t { }
fn sink(type: T) { }
fn append(arr: scope (scope (T)[])) { }
fn append(s: SinkStruct) { }
fn popLast() T { }
fn getLast() T { }
fn get(i: size_t) T { }
fn set(i: size_t, n: T) { }
fn setLast(i: T) { }
fn toSink(sink: Sink) { }
fn toArray() T[] { }
fn borrowUnsafe() T[] { }
fn reset() { }
}
//! Functions for dealing with path strings.
module watt.text.path;
//! Given a path, return a representation of that path that is universal.
fn normalisePath(path: scope (SinkArg)) string { }
//! Given two paths, return a path composed of both.
fn concatenatePath(base: string, tail: string) string { }
//! Given a path, return a path that could be a subpath.
fn makePathAppendable(s: string) string { }
//! Normalise a path using POSIX rules, regardless of the current
//! platform.
fn normalisePathPosix(path: scope (SinkArg)) string { }
//! Normalise a path using Windows rules, regardless of the current
//! platform.
fn normalisePathWindows(path: scope (SinkArg)) string { }
//! Structured string formatting.
module watt.text.format;
//! Formats various arguments into a string by interpreting formatString.
fn format(formatString: const(char)[]) string { }
//! Format using the above rules, but into a Sink.
fn format(sink: scope (Sink), formatString: const(char)[]) { }
//! Format using the above rules, but into a Sink, with an explicit list of
//! TypeInfos, and an explicit va_list.
fn formatImpl(sink: scope (Sink), formatString: const(char)[], _typeids: TypeInfo[], vl: va_list) { }
//! Functions for decoding and encoding UTF-8 strings and characters.
module watt.text.utf;
//! Encode c as UTF-8.
alias encodeNoGC = vrt_encode_static_u8;
//! Retrieve a UTF-8 character from a particular index.
fn decode(str: scope (StrArg), index: size_t) dchar { }
//! Determine how many codepoints are in a given UTF-8 string.
fn count(s: scope (StrArg)) size_t { }
//! Throws a MalformedUTF8Exception if s is not valid UTF-8.
fn validate(s: scope (StrArg)) { }
//! Encode c onto the end of buf.
fn encode(buf: char[], c: dchar) { }
//! Encode an array of codepoints into a string.
fn encode(arr: dchar[]) string { }
//! Encode c as UTF-8 and add it to arr, starting at index.
fn encode(arr: char[], index: size_t, c: dchar) { }
//! Encode c as UTF-8.
fn encode(c: dchar) string { }
//! Add c to a sink.
fn encode(dgt: scope (Sink), c: dchar) { }
//! Functions implementing generally applicable algorithms.
module watt.algorithm;
//! Takes two indices of elements to compare. Return true if the first
//! parameter should go before the second.
alias CmpDg = scope (bool delegate(size_t, size_t));
//! Takes two indices of elements to swap.
alias SwapDg = scope (void delegate(size_t, size_t));
//! Sort something via delegates.
fn runSort(numElements: size_t, cmp: scope (CmpDg), swap: scope (SwapDg)) { }
//! Sort an array of integers in place.
fn sort(ints: i32[]) { }
//! Return the maximum of two values.
fn max(a: i32, b: i32) i32 { }
//! Return the maximum of two values.
fn max(a: i64, b: i64) i64 { }
//! Return the maximum of two values.
fn max(a: u32, b: u32) u32 { }
//! Return the maximum of two values.
fn max(a: u64, b: u64) u64 { }
//! Return the maximum of two values.
fn max(f64, f64) f64;
//! Return the minimum of two values.
fn min(a: i32, b: i32) i32 { }
//! Return the minimum of two values.
fn min(a: i64, b: i64) i64 { }
//! Return the minimum of two values.
fn min(a: u32, b: u32) u32 { }
//! Return the minimum of two values.
fn min(a: u64, b: u64) u64 { }
//! Return the minimum of two values.
fn min(f64, f64) f64;
//! Ensures the license is embedded in binaries.
module watt.license;
//! Identifier for this version of Watt.
enum ident;
//! This is the license for the watt library.
enum license;
//! Load functions from shared objects.
module watt.library;
//! A delegate that loads an address from a name. Usually loads a
//! function.
alias Loader = void* delegate(string);
//! Represents a loadable module.
class Library
{
public:
//! Return a pointer to the requested symbol name.
fn symbol(symbol: string) void* { }
//! Close the library.
fn free() { }
public:
//! Given a list of shared objects, return the first one that loads.
static fn loads(files: string[]) Library { }
//! Create a Library from a path to a shared object.
static fn load(filename: string) Library { }
}
//! Streams that interact with *nix FDs.
module watt.io.streams.fd;
//! Size of the internal read/write buffer.
enum BufferSize;
//! An OutputStream in which the sink is a file.
class OutputFDStream : OutputStream
{
public:
//! The file descriptor this stream wraps.
fd: i32;
public:
//! Construct a new OutputFDStream from a filename.
this(filename: const(char)[]) { }
//! Close the underlying file descriptor.
fn close() { }
//! Is this a valid stream?
fn isOpen() bool { }
//! Output c to the stream.
fn put(c: dchar) { }
//! Write s to the stream.
fn write(s: scope (const(scope (char)[])) { }
//! Ensure that all buffered output is written.
fn flush() { }
}
//! An InputStream in which the source is a file.
class InputFDStream : InputStream
{
public:
//! The underlying file descriptor.
fd: i32;
public:
//! Construct a new InputFDStream from a filename.
this(filename: const(char)[]) { }
//! Close the underlying file descriptor.
fn close() { }
//! Is this wrapping a valid file descriptor?
fn isOpen() bool { }
//! Read the first character from the file descriptor.
fn get() dchar { }
//! Read from the stream into buffer.
fn read(buffer: u8[]) u8[] { }
//! Has this descriptor reached EOF?
fn eof() bool { }
}
//! Stream implementations in which the underlying implementation is libc
//! FILEs.
module watt.io.streams.stdc;
//! An OutputStream in which the sink is a file.
class OutputStdcStream : OutputStream
{
public:
//! The underlying FILE handle.
handle: FILE*;
public:
//! Construct a new OutputStdcStream from a filename. This will use the
//! mode string "w", so will overwrite any file with the given name that
//! already exists.
this(filename: const(char)[]) { }
//! Construct a new OutputStdcStream with a filename, using the given mode
//! string.
this(filename: const(char)[], flags: const(char)[]) { }
//! Close the underlying FILE handle.
fn close() { }
//! Is this stream open?
fn isOpen() bool { }
//! Write a single character to the stream.
fn put(c: dchar) { }
//! Write a string to the stream.
fn write(s: scope (const(scope (char)[])) { }
//! Ensure all buffered input is written to the stream.
fn flush() { }
}
//! An InputStream in which the source is a file.
class InputStdcStream : InputStream
{
public:
//! The underlying FILE handle.
handle: FILE*;
public:
//! Construct a new stream from a filename.
this(filename: const(char)[]) { }
//! Construct a new InputStdcStream with a filename, using the given mode
//! string.
this(filename: const(char)[], flags: const(char)[]) { }
//! Close the underlying FILE handle.
fn close() { }
//! Is this stream open?
fn isOpen() bool { }
//! Read a single character from this stream.
fn get() dchar { }
//! Read from the stream into buffer.
fn read(buffer: u8[]) u8[] { }
//! Has this stream reached EOF?
fn eof() bool { }
}
//! Stream interfaces for input and output.
module watt.io.streams;
public import watt.io.streams.fd;
public import watt.io.streams.stdc;
//! An implementation of the InputStream for files.
alias InputFileStream = InputFDStream;
//! An implementation of the OutputStream for files.
alias OutputFileStream = OutputFDStream;
//! OutputStreams write data to a destination (file, console, etc) in
//! characters.
class OutputStream
{
public:
this() { }
//! Close the stream.
fn close();
//! Determine the stream state.
fn isOpen() bool;
//! Write a single character out to the sink.
fn put(c: dchar);
//! Write a series of characters to the sink.
fn write(s: scope (const(scope (char)[])) { }
//! Ensure that all pending writes (from the put and write functions) are
//! completed.
fn flush();
//! Write a series of characters then a newline.
fn writeln(s: const(char)[]) { }
fn vwritef(formatString: const(char)[], typeids: TypeInfo[], vl: va_list) { }
//! Write a formatted string.
fn writef(formatString: const(char)[]) { }
fn vwritefln(formatString: const(char)[], typeids: TypeInfo[], vl: va_list) { }
//! Write a formatted string and then a newline.
fn writefln(formatString: const(char)[]) { }
}
//! InputStreams read data in characters from a source (file, device,
//! etc).
class InputStream
{
public:
this() { }
//! Close this stream.
fn close();
//! Determine this stream's state.
fn isOpen() bool;
//! Read a single character from the source.
fn get() dchar;
//! Read as much data as possible into buffer.
fn read(buffer: u8[]) u8[];
//! Is the source out of data?
fn eof() bool;
//! Read input until a newline character is encountered.
fn readln() string { }
}
//! Get a random 32 bit number from the Operating System.
module watt.io.seed;
//! Get a random unsigned 32 bit integer.
fn getHardwareSeedU32() u32 { }
//! The io package deals with input and output.
module watt.io;
public import watt.io.std;
//! Standard streams and simple utility functions.
module watt.io.std;
//! An OutputFileStream that outputs to stdout.
global output: OutputFileStream;
//! An OutputFileStream that outputs to stderr.
global error: OutputFileStream;
//! An InputFileStream that reads from stdin.
global input: InputFileStream;
//! Write s to output.
fn write(s: const(char)[]) { }
//! Write s to output, then write a newline character.
fn writeln(s: const(char)[]) { }
//! Write the string representation of an i32 to output.
fn writeln(i: i32) { }
//! Write the string representation of a size_t to output.
fn writeln(i: size_t) { }
//! Write the string representation of a bool to output.
fn writeln(b: bool) { }
//! Write a newline to output.
fn writeln() { }
//! Format a string and write it to output.
fn writef(s: const(char)[]) { }
//! Format a string, write it to output, then output a newline.
fn writefln(s: const(char)[]) { }
//! Read text from input.
fn readln() string { }
//! Get precise timing information from the OS.
module watt.io.monotonic;
//! Get the ticks from the OS in an i64.
alias ticks = vrt_monotonic_ticks;
//! How many ticks (from the ticks function) are in a second.
global ticksPerSecond: i64;
//! Convert a time from one frequency to another.
fn convClockFreq(ticks: i64, srcTicksPerSecond: i64, dstTicksPerSecond: i64) i64 { }
//! Initialises the ticksPerSecond value.
fn __ctor() { }
//! Simple file handling functions.
module watt.io.file;
//! Tell searchDir what to do after calling your delegate.
enum SearchStatus
{
//! Call the delegate for any further entries.
Continue,
//! Stop searching; don't call the delegate further.
Halt,
}
//! Thrown when a filesystem operation fails.
class FileException : Exception
{
public:
this(msg: string) { }
}
//! Read a file into an array.
fn read(filename: scope (SinkArg)) void[] { }
//! Write an array of data to a file.
fn write(data: void[], filename: scope (SinkArg)) { }
//! Get the size of a file.
fn size(filename: scope (SinkArg)) size_t { }
//! Check if path matches pattern.
fn globMatch(path: string, pattern: string) bool { }
//! Call a delegate for a file in a directory that matches a given
//! pattern.
fn searchDir(dirName: string, glob: string, dgt: scope (SearchStatus delegate(string))) { }
//! Is a given path a file?
fn isFile(path: scope (SinkArg)) bool { }
//! Is a given path a directory?
fn isDir(path: scope (const(scope (char)[])) bool { }
//! Does a given path exist?
fn exists(path: const(char)[]) bool { }
//! Rename a file or directory.
fn rename(oldname: string, newname: string) { }
//! Delete a file pointed to by a given path.
fn remove(path: const(char)[]) { }
//! Change the current working directory of the calling process.
fn chdir(path: const(char)[]) { }
//! Get the current working directory of the calling process.
fn getcwd() string { }
//! A psuedo-random number generator.
module watt.math.random;
//! The default RandomGenerator.
alias RandomGenerator = MersenneTwisterEngine;
//! A psuedorandom number generator implemented with the Mersenne Twister
//! algorithm.
struct MersenneTwisterEngine
{
public:
//! The smallest unsigned value this generator can generate.
enum min;
//! The largest unsigned value this generator can generate.
enum max;
public:
//! Seed this generator with the given 32 bit value.
fn seed(value: u32) { }
//! Advance this generator.
fn popFront() { }
//! This generator's current value.
fn front() u32 { }
//! Copy this generator.
fn save() MersenneTwisterEngine { }
//! Is this generator out of values?
fn empty() bool { }
//! Generate a u32 value within a range.
fn uniformU32(lower: u32, upper: u32) u32 { }
//! Generate an i32 value within a range.
fn uniformI32(lower: i32, upper: i32) i32 { }
//! Generate a random string.
fn randomString(length: size_t) string { }
}
//! Integer maths functions.
module watt.math.integer;
//! Returns the log2 fo the given unsigned integer, does not throw on 0.
fn log2(x: u32) u32 { }
//! Returns the absolute value of a signed integer.
fn abs(x: i32) i32 { }
//! Determine if floating points are special constants.
module watt.math.introspection;
//! Is the given value signalling NaN?
fn isnan(d: f64) i32 { }
//! Is the given value signalling NaN?
fn isnan(f: f32) i32 { }
//! Is the given value signalling infinity?
fn isinf(d: f64) i32 { }
//! Is the given value signalling infinity?
fn isinf(f: f32) i32 { }
//! Fundamental math functions.
module watt.math;
public import watt.math.integer;
public import watt.math.floating;
public import watt.math.introspection;
//! Floating point maths functions.
module watt.math.floating;
//! The number PI as a constant.
enum PIf;
//! The number PI as a constant.
enum PI;
//! Calculate the sine function of a number.
alias sin = sinf;
//! Calculate the arc sine function of a number.
alias asin = asinf;
//! Calculate the cosine function of a number.
alias cos = cosf;
//! Calculate the arc cosine function of a number.
alias acos = acosf;
//! Calculate the tangent function of a number.
alias tan = tanf;
//! Calculate the arc tangent function of a number.
alias atan = atanf;
//! Calculate the square root of a number.
alias sqrt = sqrtf;
//! Calculate the sine function of a number.
fn sin(f64) f64;
//! Calculate the sine function of a number.
fn sinf(f32) f32;
//! Calculate the arc sine function of a number.
fn asin(f64) f64;
//! Calculate the arc sine function of a number.
fn asinf(f32) f32;
//! Calculate the cosine function of a number.
fn cos(f64) f64;
//! Calculate the cosine function of a number.
fn cosf(f32) f32;
//! Calculate the arc cosine function of a number.
fn acos(f64) f64;
//! Calculate the arc cosine function of a number.
fn acosf(f32) f32;
//! Calculate the tangent function of a number.
fn tan(f64) f64;
//! Calculate the tangent function of a number.
fn tanf(f32) f32;
//! Calculate the arc tangent function of a number.
fn atan(f64) f64;
//! Calculate the arc tangent function of a number.
fn atanf(f32) f32;
//! Calculate the square root of a number.
fn sqrt(f64) f64;
//! Calculate the square root of a number.
fn sqrtf(f32) f32;
//! Convert radians into degrees.
fn radians(degs: f64) f64 { }
//! Convert degrees into radians.
fn degrees(rads: f64) f64 { }
//! Round a value down.
fn floor(f32) f32;
//! Round a value down.
fn floor(f64) f64;
//! Round a value up.
fn ceil(f32) f32;
//! Round a value up.
fn ceil(f64) f64;
//! Round a value to the nearest integer.
fn round(f32) f32;
//! Round a value to the nearest integer.
fn round(f64) f64;
//! Raise the value to the given (positive or negative) power.
fn pow(value: f32, power: f32) f32;
//! Raise the value to the given (positive or negative) power.
fn pow(value: f64, power: f64) f64;
fn abs(f32) f32;
fn abs(f64) f64;
//! Retrieve paths to XDG standard directories.
module watt.xdg.basedir;
//! Get the config dirs values.
fn getConfigDirs() string[] { }
//! Get the configuration home value.
fn getConfigHome() string { }
//! Get the data dirs values.
fn getDataDirs() string[] { }
//! Get the data home value.
fn getDataHome() string { }
//! Find a configuration file.
fn findConfigFile(tail: string) string[] { }
//! Functions for dealing with pipes.
module watt.process.pipe;
enum BufferSize;
//! Run the given command and read back the output/error into a string.
fn getOutput(cmd: string, args: string[]) string { }
//! Run the given command and read back the output/error into a string.
fn getOutput(cmd: string, args: string[], retval: u32) string { }
//! Functions for dealing with environmental variables.
module watt.process.environment;
//! Holds environment values.
class Environment
{
public:
store: string[string];
public:
this() { }
//! Is the given key set?
fn isSet(key: string) bool { }
//! Get the given key, or return null.
fn getOrNull(key: string) string { }
//! Set a key in this environment.
fn set(key: string, value: string) { }
//! Remove a key from this environment.
fn remove(key: string) { }
}
//! Returns an environment that is a copy of the running process'
//! environment.
fn retrieveEnvironment() Environment { }
//! Functions for starting a process.
module watt.process.spawn;
//! Serves as a handle to a spawned process.
class Pid
{
public:
alias OsHandle = pid_t;
alias _pid = osHandle;
alias NativeID = OsHandle;
public:
osHandle: OsHandle;
public:
this(osHandle: OsHandle) { }
//! Wait for this process to finish, and get the return value.
fn wait() i32 { }
}
//! Thrown if a process could not be spawned.
class ProcessException : Exception
{
public:
this(msg: string) { }
}
//! Search the current working directory and PATH for the given command.
fn getCommandFromName(name: string) string { }
//! Start a process from the executable name and with the given args.
fn spawnProcess(name: string, args: string[]) Pid { }
//! Start a process from an executable.
fn spawnProcess(name: string, args: string[], inputStream: InputStdcStream, outputStream: OutputStdcStream, errorStream: OutputStdcStream, env: Environment) Pid { }
//! Start a process from an executable.
fn spawnProcess(name: string, args: string[], inputStream: InputFDStream, outputStream: OutputFDStream, errorStream: OutputFDStream, env: Environment) Pid { }
fn spawnProcess(name: string, args: string[], _stdin: FILE*, _stdout: FILE*, _stderr: FILE*, env: Environment) Pid { }
//! Search a PATH string for a command. If one is not given, PATH will be
//! retrieved and used.
fn searchPath(cmd: string, path: string) string { }
//! Get an environmental variable, or "" if it doesn't exist.
fn getEnv(env: string) string { }
//! Run a command through the libc system function.
fn system(name: string) i32 { }
fn spawnProcessPosix(name: string, args: string[], stdinFD: i32, stdoutFD: i32, stderrFD: i32, env: Environment) i32 { }
//! Wait for a specific process.
fn waitPosix(pid: pid_t) i32 { }
//! Wait for a process.
fn waitManyPosix(pid: pid_t) i32 { }
//! Functions for parsing a command string.
module watt.process.cmd;
//! Surround the string with " and escape " and /.
fn escapeAndAddQuotation(sink: scope (Sink), str: scope (SinkArg)) { }
//! Returns a textual representation of cmd and args that can be passed to
//! "/bin/sh -c".
fn toArgsPosix(cmd: scope (SinkArg), args: scope (SinkArg)[]) char* { }
//! As normal toArgsPosix, but adds redirect after cmd with no processing.
fn toArgsPosix(cmd: scope (SinkArg), args: scope (SinkArg)[], redirect: scope (SinkArg)) char* { }
//! Parse a string as a series of arguments, like bash/make does.
fn parseArguments(str: scope (SinkArg)) string[] { }
//! Modules for spawning new processes, reading environmental variables,
//! running and capturing the output of a command.
module watt.process;
public import watt.process.cmd;
public import watt.process.pipe;
public import watt.process.spawn;
public import watt.process.group;
public import watt.process.environment;
public import watt.process.util;
module watt.process.util;
//! Get the process id of the calling process.
fn getpid() u32 { }
//! Launch and manage multiple processes.
module watt.process.group;
//! Helper class to launch one or more processes to run along side the main
//! process.
class Group
{
public:
//! Is called with the retval of the completed command.
alias DoneDg = void delegate(i32);
public:
this(maxWaiting: u32) { }
fn run(name: string, args: string[], done: DoneDg) Pid { }
fn run(name: string, args: string[], inputStream: InputStdcStream, outputStream: OutputStdcStream, errorStream: OutputStdcStream, env: Environment, done: DoneDg) Pid { }
fn run(name: string, args: string[], inputStream: FILE*, outputStream: FILE*, errorStream: FILE*, env: Environment, done: DoneDg) Pid { }
fn run(name: string, args: string[], inputStream: InputFDStream, outputStream: OutputFDStream, errorStream: OutputFDStream, env: Environment, done: DoneDg) Pid { }
fn run(name: string, args: string[], inputFD: i32, outputFD: i32, errorFD: i32, env: Environment, done: DoneDg) Pid { }
fn waitOne() { }
//! Wait for all currently dispatched processes to complete.
fn waitAll() { }
}
module watt.process.sink;
struct CStrSink
{
public:
strStorage: char[262144];
ptrStorage: char*[4096];
strLoc: size_t;
ptrLoc: size_t;
public:
fn addArgz(str: scope (SinkArg)) bool { }
fn addEnvz(key: scope (SinkArg), value: scope (SinkArg)) bool { }
}
//! Functions dealing with converting strings to integers, integers to
//! strings, integers to different types of integers, and so on.
module watt.conv;
//! Thrown when a conversion fails.
class ConvException : Exception
{
public:
this(msg: string) { }
}
//! Get the lowercase representation of a string.
fn toLower(s: scope (StrArg)) string { }
//! Get the uppercase representation of a string.
fn toUpper(s: scope (StrArg)) string { }
//! Parse s as an integer, and return it as a u64.
fn toUlong(s: const(char)[], base: i32) u64 { }
//! Parse s as an integer, and return it as an i64.
fn toLong(s: const(char)[], base: i32) i64 { }
//! Parse s as an integer, and return it as an i32.
fn toInt(s: const(char)[], base: i32) i32 { }
//! Parse s as an integer, and return it as a u32.
fn toUint(s: const(char)[], base: i32) u32 { }
//! Get a string from a given u8.
fn toString(val: u8) string { }
//! Return an i8 as a string.
fn toString(val: i8) string { }
//! Return a u16 as a string.
fn toString(val: u16) string { }
//! Return an i16 as a string.
fn toString(val: i16) string { }
//! Return a u32 as a string.
fn toString(val: u32) string { }
//! Return an i32 as a string.
fn toString(val: i32) string { }
//! Return a u64 as a string.
fn toString(val: u64) string { }
//! Return an i64 as a string.
fn toString(val: i64) string { }
//! Return an f32 as a string.
fn toString(f: f32) string { }
//! Return an f64 as a string.
fn toString(f: f64) string { }
//! Return a pointer as a string.
fn toString(p: void*) string { }
//! Return a bool as "true" or "false".
fn toString(b: bool) string { }
//! Returns an upper case hex string from the given unsigned long.
fn toStringHex(val: u64) string { }
//! Given a u8, return a binary string.
fn toStringBinary(val: u8) string { }
//! Given a u16, return a binary string.
fn toStringBinary(val: u16) string { }
//! Given a u32, return a binary string.
fn toStringBinary(val: u32) string { }
//! Given a u64, return a binary string.
fn toStringBinary(val: u64) string { }
//! Given an i8, return a binary string.
fn toStringBinary(val: i8) string { }
//! Given an i16, return a binary string.
fn toStringBinary(val: i16) string { }
//! Given an i32, return a binary string.
fn toStringBinary(val: i32) string { }
//! Given an i64, return a binary string.
fn toStringBinary(val: i64) string { }
//! Given a Volt utf-8 string s, return a pointer to a null terminated
//! string.
fn toStringz(s: scope (SinkArg)) const(char)* { }
//! Given a Volt utf-16 string s, return a pointer to a null terminated
//! wchar string.
fn toStringz(s: const(wchar)[]) const(wchar)* { }
//! Given a null terminated string s, return a Volt string.
fn toString(s: scope (const(scope (char)*)) string { }
//! Return a string as an f32.
fn toFloat(s: string) f32 { }
//! Return a string as an f64.
fn toDouble(s: string) f64 { }
//! Simple functions for dealing with paths, finding the path to the
//! currently running executable, returning the extension of a filename,
//! getting a full path from a relative path, and so on.
module watt.path;
enum dirSeparator;
enum pathSeparator;
//! Create a directory.
//! If the given directory exists, this function succeeds.
fn mkdir(dir: const(char)[]) { }
//! Create a directory and any intermediate directories.
//! Uses the dirSeparator string for the appropriate platform.
fn mkdirP(dir: const(char)[]) { }
//! Is c a path separator for this platform?
//! This is different to checking against dirSeparator because Windows
//! allows both forward and backward slashes in paths, whereas *nix only
//! allows forward ones.
fn isSlash(c: char) bool { }
//! Count how many path separators are in a given string.
fn countSlashes(s: const(char)[]) size_t { }
//! Remove any trailing path separators from s.
fn removeTrailingSlashes(s: const(char)[]) { }
//! Return the directory portion of a pathname.
fn dirName(path: const(char)[]) string { }
//! Return the non-directory portion of a pathname.
fn baseName(path: const(char)[], suffix: const(char)[]) string { }
//! Return the file extension of a path, or an empty string.
fn extension(path: const(char)[]) string { }
//! Get a temporary filename in the temp directory for the current
//! platform.
fn temporaryFilename(extension: string, subdir: string) string { }
//! Given a path, return an absolute path.
fn fullPath(file: string) string { }
//! Get the path to the executable.
fn getExecFile() string { }
//! Get the directory that the current executable is in.
fn getExecDir() string { }
//! A simple interface for making HTTP requests.
module watt.http;
public import watt.http.curl;
enum Status
{
Continue,
Abort,
}
//! Manage multiple HTTP requests.
interface HttpInterface
{
public:
fn isEmpty() bool;
//! Launch new requests, and mark requests that are complete.
fn perform();
//! Complete all requests.
fn loop(cb: Status delegate());
}
//! An HTTP request.
class RequestInterface
{
public:
//! The address of the server to connect to.
server: string;
//! The url to connect to on the server.
url: string;
//! The port to connect to the remote server with.
port: u16;
//! Should this request use HTTPS?
secure: bool;
public:
//! Construct a new Request that is managed by http.
this(http: HttpInterface) { }
//! Get the result of the request.
fn getData() void[];
//! Get the result of the request as a string.
fn getString() string;
//! Has this request completed?
fn completed() bool;
//! Was an error generated for this request?
fn errorGenerated() bool;
//! Get an error string.
fn errorString() string;
//! How many bytes have been downloaded so far?
fn bytesDownloaded() size_t;
//! How big is the content? If unknown, this is zero.
fn contentLength() size_t;
}
//! Windows implementation of Http requests.
module watt.http.windows;
//! A libcurl implementation of HTTP requests.
module watt.http.curl;
//! Curl implementation of HttpInterface.
class Http : HttpInterface
{
public:
this() { }
fn isEmpty() bool { }
fn perform() { }
fn loop(cb: Status delegate()) { }
}
//! Curl implementation of RequestInterface.
class Request : RequestInterface
{
public:
this(http: Http) { }
fn getData() void[] { }
fn getString() string { }
fn completed() bool { }
fn errorGenerated() bool { }
fn errorString() string { }
fn bytesDownloaded() size_t { }
fn contentLength() size_t { }
}
fn request_progress(clientp: void*, dltotal: curl_off_t, dlnow: curl_off_t, ultotal: curl_off_t, ulnow: curl_off_t) i32 { }
//! Parse a JSON file into memory.
module watt.json.dom;
//! Identifies the JSON type of a Value.
enum DomType
{
//! A JSON value of null.
Null,
//! A JSON value of true or false.
Boolean,
//! A JSON value of a number with a decimal portion.
Double,
//! A JSON value of a signed integer.
Long,
//! A JSON value of an unsigned integer.
Ulong,
//! A JSON string.
String,
//! A JSON object, everything between {}.
Object,
//! A JSON array, everything between [].
Array,
}
//! Thrown upon a parsing error.
class DOMException : JSONException
{
public:
this(msg: string, location: string) { }
}
//! A JSON value.
struct Value
{
public:
union Store
{
public:
boolean: bool;
str: immutable(char)[];
integer: i64;
unsigned: u64;
floating: f64;
}
public:
fn type() DomType { }
//! Is this Value a JSON null type?
fn isNull() bool { }
//! Set the type to null.
fn setNull() { }
//! Get this as a boolean value.
fn boolean() bool { }
//! Set this Value as a DomType.Boolean, and give it the value b.
fn boolean(b: bool) { }
//! Get this as a string value.
fn str() string { }
//! Set this Value as a DomType.String, and give it the value s.
fn str(s: const(char)[]) { }
//! Get this as an integer value.
fn integer() i64 { }
//! Set this Value as a DomType.Long, and give it the value l.
fn integer(l: i64) { }
//! Get this as an unsigned integer value.
fn unsigned() u64 { }
//! Set this Value as a DomType.Ulong, and give it the value l.
fn unsigned(l: u64) { }
//! Get this as a floating point value.
fn floating() f64 { }
//! Set this Value as a DomType.Double, and give it the value d.
fn floating(d: f64) { }
//! Get this as an array of Value.
fn array() Value[] { }
//! Set this Value as a DomType.Array, and give it the value array.
fn array(array: Value[]) { }
//! Add val to this Value's array.
fn arrayAdd(val: Value) { }
//! Set type as DomType.Array.
fn setArray() { }
//! Retrieve a key from this Value.
fn lookupObjectKey(s: string) Value { }
//! Does this object have a key s?
fn hasObjectKey(s: string) bool { }
//! Set this Value as an object, and set a key.
fn setObjectKey(k: string, v: Value) { }
//! Set type as DomType.Object.
fn setObject() { }
//! Retrieve all the keys associated with this Value.
fn keys() string[] { }
//! Retrieve all the values associated with this Value.
fn values() Value[] { }
}
//! Parse a JSON string into a Value.
fn parse(s: string) Value { }
//! Modules for parsing JSON.
module watt.json;
public import watt.json.util;
public import watt.json.sax;
public import watt.json.dom;
//! Parse JSON as a stream.
module watt.json.sax;
//! Type of a JSON value.
enum Type
{
//! A JSON null value.
NULL,
//! A JSON true or false value.
BOOLEAN,
//! A JSON number.
NUMBER,
//! A JSON string.
STRING,
//! A JSON object, everything between {}.
OBJECT,
//! A JSON array, everything between [].
ARRAY,
}
//! Events which will be produced by get.
enum Event
{
//! The first event, marks the start of the JSON data.
START,
//! The last event, marks the end of the JSON data.
END,
//! Event which will occour if invalid JSON is encountered.
ERROR,
//! A null was encountered.
NULL,
//! A boolean was encountered.
BOOLEAN,
//! A number was encountered.
NUMBER,
//! A string was encountered.
STRING,
//! The start of a JSON object was encountered.
OBJECT_START,
//! A JSON object key was encountered (this is a string and still needs to
//! be unescaped).
OBJECT_KEY,
//! The end of a JSON object was encountered.
OBJECT_END,
//! The start of a JSON array was encountered.
ARRAY_START,
//! The end of a JSON array was encountered.
ARRAY_END,
}
//! Thrown when an error occurs during building.
class BuilderException : util.JSONException
{
public:
this(msg: string, location: string) { }
}
//! Parses JSON from a given InputStream.
class SAX
{
public:
//! Ignore garbage/left over data after the root element is parsed.
ignoreGarbage: bool;
public:
//! Creates a JSON object from an InputStream.
this(source: InputStream, bufferSize: size_t, reallocSize: size_t) { }
//! Creates a JSON object from an array.
this(data: const(u8)[]) { }
//! Creates a JSON object from a string.
this(data: const(char)[]) { }
//! Continues parsing the input data and calsl the callback with the
//! appropriate data.
fn get(callback: scope (void delegate(Event, const(u8)[]))) { }
protected:
source: InputStream;
buffer: u8[];
reallocSize: size_t;
current: const(u8)[];
index: size_t;
savedMark: size_t;
isMarked: bool;
state: ParserStack;
lastError: string;
protected:
fn error(message: string, file: string, line: const(i32)) { }
fn eof() bool { }
fn mark() { }
fn retrieve() const(u8)[] { }
fn getImpl(c: char, skip: bool, advance: bool) bool { }
fn unget() { }
fn skipWhite() { }
fn skipDigits() bool { }
fn expect(c: char, skip: bool) bool { }
fn getString(array: const(u8)[]) bool { }
fn getNumber(array: const(u8)[]) bool { }
fn getBoolean(array: const(u8)[]) bool { }
fn getNull(array: const(u8)[]) bool { }
}
//! The main class to build/write JSON.
class Builder
{
public:
//! Creates a new JSONBuilder object.
this(output: OutputStream, prettyPrint: bool, indent: const(char)[]) { }
//! Writes a null value.
fn buildNull() { }
//! Writes a number.
fn buildNumber(number: f64) { }
//! Writes a number.
fn buildNumber(number: i32) { }
//! Writes a number.
fn buildNumber(number: i64) { }
//! Writes a string.
fn buildString(str: const(char)[], escape: bool) { }
//! Writes a boolean.
fn buildBoolean(b: bool) { }
//! Writes the start of a JSON object.
fn buildObjectStart() { }
//! Writes the end of a JSON object.
fn buildObjectEnd() { }
//! Writes the start of a JSON array.
fn buildArrayStart() { }
//! Writes the end of a JSON array.
fn buildArrayEnd() { }
//! Finalizes the JSON.
fn finalize() { }
protected:
output: OutputStream;
prettyPrint: bool;
indent: const(char)[];
indentLevel: size_t;
buffer: char[];
state: ParserStack;
protected:
fn prepareAndCheck(isString: bool) { }
}
//! Turn an Event into a human readable string.
fn eventToString(event: Event) string { }
//! Useful functions when dealing with JSON.
module watt.json.util;
//! Base Exception for the whole json package.
class JSONException : Exception
{
public:
this(msg: string, location: string) { }
}
//! Exception thrown when an error occurs during parsing.
class ParseException : JSONException
{
public:
this(msg: string, location: string) { }
}
fn canBeInteger(data: const(char)[], signed: bool) bool { }
//! Parse a u64 from a JSON number string.
fn parseUlong(data: const(char)[], l: u64) bool { }
//! Parse an i64 from a JSON number string. Returns true if a double was
//! parsed.
fn parseLong(data: const(char)[], l: i64) bool { }
//! Parse a double from a JSON number string.
fn parseDouble(data: const(char)[], d: f64) bool { }
//! Parse a double from a JSON number string, using a pre allocated
//! buffer, resizing it if needed.
fn parseDouble(data: const(char)[], d: f64, buffer: char[]) bool { }
fn parseBool(data: const(char)[]) bool { }
//! Unescape a JSON string and return it.
fn unescapeString(str: const(char)[]) const(char)[] { }
//! Unescape a JSON string and return it.
fn unescapeString(str: const(u8)[]) const(char)[] { }
//! Unescape a JSON string and return it, using a pre allocated buffer and
//! resizing it if needed.
fn unescapeString(str: const(char)[], buffer: char[]) const(char)[] { }
//! Escape a JSON string and return it.
fn escapeString(str: const(char)[]) const(char)[] { }
//! Escape a JSON string and return it, using a pre allocated buffer and
//! resizing it if needed.
fn escapeString(str: const(char)[], buffer: char[]) const(char)[] { }
//! Uses the event parser to parse TOML into a tree in memory.
module watt.toml.tree;
//! A TOML Value.
class Value
{
public:
//! Each TOML Value is typed with one of these types.
enum Type
{
//! A series of characters.
String,
//! A 64 bit signed integer.
Integer,
//! A 64 bit floating point number.
Float,
//! A boolean value is true or false.
Boolean,
//! An array of Values of the same type.
Array,
//! A table of Values, indexed by string.
Table,
}
public:
//! The type of this Value.
type: Type;
//! Any comments that appeared before this value.
comment: string;
//! If this is a table, was it inline? (Affects toString functions).
inline: bool;
//! If this is an array, should it appear before the table it's nested in?
hoist: bool;
public:
//! Construct a Value with no type.
this() { }
//! Construct a Value with a string type.
this(v: string) { }
//! Construct a Value with an integer type.
this(v: i64) { }
//! Construct a Value with an integer type.
this(v: i32) { }
//! Construct a Value with a floating point type.
this(v: f64) { }
//! Construct a Value with a boolean type.
this(v: bool) { }
//! Construct an array of Values.
this(v: Value[]) { }
//! Get the keys for this table.
fn tableKeys() string[] { }
//! Get the Values set for this table.
fn tableValues() Value[] { }
//! If this is a table, remove the given key, if it is set.
fn removeKey(key: string) { }
//! Get a string representation of the value.
fn toString() string { }
//! Add the string representation of this Value to the given sink.
fn toString(sink: scope (sink.Sink), parent: string) { }
//! Retrieve the string value.
fn str() string { }
//! Set the string value.
fn str(val: string) { }
//! Retrieve the integer value.
fn integer() i64 { }
fn integer(val: i64) { }
//! Retrieve the floating value.
fn floating() f64 { }
//! Set the floating value.
fn floating(val: f64) { }
//! Retrieve the boolean value.
fn boolean() bool { }
//! Set the boolean value.
fn boolean(val: bool) { }
//! Retrieve the array value.
fn array() Value[] { }
//! Set a table entry.
fn tableEntry(k: string, v: Value) { }
//! Set the array value.
fn array(vals: Value[]) { }
//! How many keys does this table have set?
fn countKeys() size_t { }
//! Does this table have a key?
fn hasKey(key: string) bool { }
//! Retrieve a key from this table.
fn opIndex(key: string) Value { }
}
//! Given a TOML document, return a Value that represents that document.
fn parse(src: string) Value { }
//! Package module for Watt's TOML parser.
module watt.toml;
public import watt.toml.event;
public import watt.toml.tree;
public import watt.toml.util;
module watt.toml.util;
//! Thrown on input error.
class TomlException : rt.Exception
{
public:
this(msg: string) { }
}
fn match(src: source.SimpleSource, c: dchar) { }
//! If p.src is at c, eat it and return true. Otherwise, return false.
fn matchIf(src: source.SimpleSource, c: dchar) bool { }
fn atTripleString(src: source.SimpleSource) bool { }
fn skipIfNewline(src: source.SimpleSource) { }
fn parseMultilineString(src: source.SimpleSource) string { }
fn parseString(src: source.SimpleSource) string { }
fn escapeString(unescaped: string, multiline: bool) string { }
//! Event driven TOML parser, a la SAX.
module watt.toml.event;
//! Interface for toml string consumers.
interface EventSink
{
public:
//! Signals the start of content.
fn start();
//! Signals the end of content.
fn end();
//! Signals the start of a comment. Comment value is sent via
//! stringContent.
fn commentStart();
//! Signals the end of a comment.
fn commentEnd();
//! Signals the start of a key/value pair.
fn keyValueStart(key: string);
//! Signals the end of a key/value pair.
fn keyValueEnd(key: string);
//! Signals the start of a table.
fn tableStart(name: string);
//! Signals the end of a table.
fn tableEnd(name: string);
//! Signals a table array.
fn tableArray(name: string);
//! Signals an inline table value start.
fn inlineTableStart();
//! Signals the end of an inline table value.
fn inlineTableEnd();
//! Signals the start of an array.
fn arrayStart();
//! Signals the end of an array.
fn arrayEnd();
//! Regular text content, used by multiple events.
fn stringContent(str: string);
//! Signed integer content.
fn integerContent(i: i64);
//! Boolean content.
fn boolContent(b: bool);
//! Floating point content.
fn floatContent(n: f64);
}
//! A class that implements all the methods of EventSink by doing nothing.
class NullEventSink : EventSink
{
public:
this() { }
fn start() { }
fn end() { }
fn commentStart() { }
fn commentEnd() { }
fn keyValueStart(key: string) { }
fn keyValueEnd(key: string) { }
fn tableStart(name: string) { }
fn tableEnd(name: string) { }
fn tableArray(name: string) { }
fn inlineTableStart() { }
fn inlineTableEnd() { }
fn arrayStart() { }
fn arrayEnd() { }
fn stringContent(str: string) { }
fn integerContent(i: i64) { }
fn boolContent(b: bool) { }
fn floatContent(n: f64) { }
}
//! Given a TOML string input, call the appropriate methods on the given
//! EventSink.
fn runEventSink(txt: string, esink: EventSink) { }
//! Markdown HTML printer.
module watt.markdown.html;
//! Prints Markdown documents in format HTML.
class Html : Visitor
{
public:
//! Are we in plain mode. This is used for images and links.
plain: Node;
//! Track if the last character written was a newline.
lastNl: bool;
public:
this() { }
fn enter(n: Document, sink: scope (Sink)) { }
fn leave(n: Document, sink: scope (Sink)) { }
fn enter(n: BlockQuote, sink: scope (Sink)) { }
fn leave(n: BlockQuote, sink: scope (Sink)) { }
fn enter(n: Paragraph, sink: scope (Sink)) { }
fn leave(n: Paragraph, sink: scope (Sink)) { }
fn enter(n: Heading, sink: scope (Sink)) { }
fn leave(n: Heading, sink: scope (Sink)) { }
fn enter(n: List, sink: scope (Sink)) { }
fn leave(n: List, sink: scope (Sink)) { }
fn enter(n: Item, sink: scope (Sink)) { }
fn leave(n: Item, sink: scope (Sink)) { }
fn enter(n: Link, sink: scope (Sink)) { }
fn leave(n: Link, sink: scope (Sink)) { }
fn enter(n: Image, sink: scope (Sink)) { }
fn leave(n: Image, sink: scope (Sink)) { }
fn enter(n: Emph, sink: scope (Sink)) { }
fn leave(n: Emph, sink: scope (Sink)) { }
fn enter(n: Strong, sink: scope (Sink)) { }
fn leave(n: Strong, sink: scope (Sink)) { }
fn visit(n: HtmlBlock, sink: scope (Sink)) { }
fn visit(n: CodeBlock, sink: scope (Sink)) { }
fn visit(n: Text, sink: scope (Sink)) { }
fn visit(n: Code, sink: scope (Sink)) { }
fn visit(n: HtmlInline, sink: scope (Sink)) { }
fn visit(n: Softbreak, sink: scope (Sink)) { }
fn visit(n: Linebreak, sink: scope (Sink)) { }
fn visit(n: ThematicBreak, sink: scope (Sink)) { }
protected:
fn ln(sink: scope (Sink)) { }
fn w(sink: scope (Sink), str: string) { }
fn wln(sink: scope (Sink), str: string) { }
fn getGrandparent() Node { }
fn isGrandparentTightList() bool { }
fn push(n: Document) { }
fn push(n: BlockQuote) { }
fn push(n: List) { }
fn push(n: Item) { }
fn push(n: Paragraph) { }
fn push(n: Heading) { }
fn push(n: Emph) { }
fn push(n: Strong) { }
fn push(n: Link) { }
fn push(n: Image) { }
fn pop(n: Document) { }
fn pop(n: BlockQuote) { }
fn pop(n: List) { }
fn pop(n: Item) { }
fn pop(n: Paragraph) { }
fn pop(n: Heading) { }
fn pop(n: Emph) { }
fn pop(n: Strong) { }
fn pop(n: Link) { }
fn pop(n: Image) { }
fn push(n: Node) { }
fn pop(n: Node) { }
}
//! Print the given Markdown document in html format and return it as a
//! string.
fn printHtml(doc: Document) string { }
//! Print the given Markdown document in html format to the given sink.
fn printHtml(doc: Document, sink: scope (Sink)) { }
//! Xml exporter of ast, used for debugging.
module watt.markdown.xml;
//! Pure AST XML printer for Markdown.
class Xml : Visitor
{
public:
indent: u32;
public:
this() { }
fn enter(str: string, sink: scope (Sink)) { }
fn leave(str: string, sink: scope (Sink)) { }
fn visit(str: string, sink: scope (Sink)) { }
fn enter(n: Document, sink: scope (Sink)) { }
fn leave(n: Document, sink: scope (Sink)) { }
fn enter(n: BlockQuote, sink: scope (Sink)) { }
fn leave(n: BlockQuote, sink: scope (Sink)) { }
fn enter(n: Paragraph, sink: scope (Sink)) { }
fn leave(n: Paragraph, sink: scope (Sink)) { }
fn enter(n: Heading, sink: scope (Sink)) { }
fn leave(n: Heading, sink: scope (Sink)) { }
fn enter(n: List, sink: scope (Sink)) { }
fn leave(n: List, sink: scope (Sink)) { }
fn enter(n: Item, sink: scope (Sink)) { }
fn leave(n: Item, sink: scope (Sink)) { }
fn enter(n: Link, sink: scope (Sink)) { }
fn leave(n: Link, sink: scope (Sink)) { }
fn enter(n: Image, sink: scope (Sink)) { }
fn leave(n: Image, sink: scope (Sink)) { }
fn enter(n: Emph, sink: scope (Sink)) { }
fn leave(n: Emph, sink: scope (Sink)) { }
fn enter(n: Strong, sink: scope (Sink)) { }
fn leave(n: Strong, sink: scope (Sink)) { }
fn visit(n: HtmlBlock, sink: scope (Sink)) { }
fn visit(n: CodeBlock, sink: scope (Sink)) { }
fn visit(n: Text, sink: scope (Sink)) { }
fn visit(n: Code, sink: scope (Sink)) { }
fn visit(n: HtmlInline, sink: scope (Sink)) { }
fn visit(n: Softbreak, sink: scope (Sink)) { }
fn visit(n: Linebreak, sink: scope (Sink)) { }
fn visit(n: ThematicBreak, sink: scope (Sink)) { }
}
//! Print the document as a xml ast, return it as a string.
fn printXml(doc: Document) string { }
//! Print the document as a XML AST to the given sink.
fn printXml(doc: Document, sink: scope (Sink)) { }
//! Perform inline translation (headings, links, etc) on partially parsed
//! Markdown.
module watt.markdown.phase2;
//! Perform inline transformation.
class Phase2 : Visitor
{
public:
this(links: LinkReference[string]) { }
fn processEmphasis(children: Node[], stackBottom: DelimiterEntry) { }
fn insert(parent: Parent, start: Text, payload: Node[], outputList: Node[]) { }
fn replaceRange(parent: Parent, start: Text, end: Text, payload: Node[], outputList: Node[]) { }
fn replaceNode(start: Text, node: Node, outputList: Node[]) { }
fn doDelimiters(text: Text, replacement: Node[]) bool { }
fn doDelimiters(children: Node[], sink: scope (Sink)) { }
fn getLabel(src: Source) string { }
fn getInlineReference(src: Source) LinkReference { }
fn eatIfTag(src: Source, tag: string) bool { }
fn eatRun(src: Source, run: string) bool { }
fn enter(n: Document, sink: scope (Sink)) { }
fn leave(n: Document, sink: scope (Sink)) { }
fn enter(n: BlockQuote, sink: scope (Sink)) { }
fn leave(n: BlockQuote, sink: scope (Sink)) { }
fn enter(n: List, sink: scope (Sink)) { }
fn leave(n: List, sink: scope (Sink)) { }
fn enter(n: Item, sink: scope (Sink)) { }
fn leave(n: Item, sink: scope (Sink)) { }
fn enter(n: Paragraph, sink: scope (Sink)) { }
fn leave(n: Paragraph, sink: scope (Sink)) { }
fn enter(n: Heading, sink: scope (Sink)) { }
fn leave(n: Heading, sink: scope (Sink)) { }
fn enter(n: Emph, sink: scope (Sink)) { }
fn leave(n: Emph, sink: scope (Sink)) { }
fn enter(n: Link, sink: scope (Sink)) { }
fn leave(n: Link, sink: scope (Sink)) { }
fn enter(n: Image, sink: scope (Sink)) { }
fn leave(n: Image, sink: scope (Sink)) { }
fn enter(n: Strong, sink: scope (Sink)) { }
fn leave(n: Strong, sink: scope (Sink)) { }
fn visit(n: HtmlBlock, sink: scope (Sink)) { }
fn visit(n: CodeBlock, sink: scope (Sink)) { }
fn visit(n: ThematicBreak, sink: scope (Sink)) { }
fn visit(n: Text, sink: scope (Sink)) { }
fn visit(n: Softbreak, sink: scope (Sink)) { }
fn visit(n: Linebreak, sink: scope (Sink)) { }
fn visit(code: Code, sink: scope (Sink)) { }
fn visit(n: HtmlInline, sink: scope (Sink)) { }
}
//! Split a file into line objects..
module watt.markdown.lines;
//! Represents a line of input.
struct Line
{
public:
iterationCount: size_t;
listCount: size_t;
public:
fn set(str: string, idx: size_t) { }
fn unchanged() bool { }
fn toString() string { }
fn empty() bool { }
//! Length of the advanced portion.
fn length() size_t { }
//! Retrieve the nth character from the start.
fn opIndex(n: size_t) char { }
//! Return a slice of the advanced string, starting from a (inclusive),
//! going to b (exclusive). If the slice is out of range, an empty string
//! will be returned.
fn slice(a: size_t, b: size_t) string { }
//! Advance the line forward by n characters. Tabs encountered will be
//! expanded. If n is greater than the rest of the line, the result will be
//! an empty string.
fn advance(n: size_t) { }
fn leadingWhitespace() size_t { }
fn realLeadingWhitespace() size_t { }
fn realContiguousWhitespace(a: size_t) size_t { }
fn contiguousWhitespace(a: size_t) size_t { }
//! Call advance while this line is non-empty and starts with whitespace.
fn consumeWhitespace() size_t { }
//! Call advance if this line is non-empty and starts with a given
//! character.
fn consumeChar(c: char) bool { }
//! Make this line empty.
fn clear() { }
//! Remove whitespace from both sides of the underlying string. The
//! advanced string index is reset.
fn strip() { }
//! Replace a with b.
fn replace(a: string, b: string) { }
//! Remove (from the underlying string) any trailing whitespace
//! characters.
fn stripRight() { }
fn removeLast() { }
public:
//! Given a string, return a list of Line structures, split by the \n
//! characters present in the string.
static fn split(src: string) Line[] { }
}
//! Parse Markdown into HTML.
module watt.markdown;
//! Given a markdown string, return a string of HTML.
fn filterMarkdown(src: string) string { }
//! Given a markdown string, put a string of HTML in a given Sink.
fn filterMarkdown(sink: scope (Sink), src: string) { }
//! Utils for markdown AST.
module watt.markdown.util;
enum CODE_INDENT;
//! State for email validator.
enum EmailState
{
BeforeAt,
DomainStart,
DomainBody,
}
//! Create a Document node and return it.
fn buildDocument() Document { }
//! Create a BlockQuote node, add it to children and return it.
fn addBlockQuote(children: Node[]) BlockQuote { }
//! Create a List node, add it to children and return it.
fn addList(children: Node[]) List { }
//! Create a Item node, add it to children and return it.
fn addItem(children: Node[]) Item { }
//! Create a CodeBlock node, add it to children and return it.
fn addCodeBlock(children: Node[], str: string, info: string) CodeBlock { }
//! Create a HtmlBlock node, add it to children and return it.
fn addHtmlBlock(children: Node[], str: string) HtmlBlock { }
//! Create an HtmlBlock node.
fn buildHtmlBlock() HtmlBlock { }
//! Create a Paragraph node, add it to children and return it.
fn addParagraph(children: Node[]) Paragraph { }
//! Create a Paragraph node, don't add it anywhere.
fn buildParagraph() Paragraph { }
//! Create a Heading node, add it to children and return it.
fn addHeading(children: Node[], level: u32) Heading { }
//! Create a Heading node, don't add it anywhere.
fn buildHeading(level: u32) Heading { }
//! Create a ThematicBreak node, add it to children and return it.
fn addThematicBreak(children: Node[]) ThematicBreak { }
//! Create a Text node, add it to children and return it.
fn addText(children: Node[], str: string) Text { }
//! Create a Text node, don't add it anywhere.
fn buildText(str: string) Text { }
//! Create a Softbreak node, add it to children and return it.
fn addSoftbreak(children: Node[]) Softbreak { }
//! Create a Linebreak node, add it to children and return it.
fn addLinebreak(children: Node[]) Linebreak { }
//! Create a Code node, add it to children and return it.
fn addCode(children: Node[], str: string) Code { }
//! Create a Code node.
fn buildCode(str: string) Code { }
//! Create an HtmlInline node, add it to children and return it.
fn addHtmlInline(children: Node[], str: string) HtmlInline { }
//! Build an HtmlInline node.
fn buildHtmlInline(str: string) HtmlInline { }
//! Create a Emph node, add it to children and return it.
fn addEmph(children: Node[]) Emph { }
//! Create a Emph node, don't add it anywhere.
fn buildEmph() Emph { }
//! Create a Strong node, don't add it anywhere.
fn buildStrong() Strong { }
//! Create a Strong node, add it to children and return it.
fn addStrong(children: Node[]) Strong { }
//! Create a Link node, add it to children and return it.
fn addLink(children: Node[], url: string, title: string) Link { }
//! Create a Link node.
fn buildLink() Link { }
//! Create a Link node.
fn buildLink(url: string, title: string) Link { }
//! Create a Image node, add it to children and return it.
fn addImage(children: Node[], url: string, title: string) Image { }
//! Build an Image node.
fn buildImage(url: string, alt: string, title: string) Image { }
//! Consume characters until a character is found.
fn consumeUntilChar(str: string, outStr: string, c: char) bool { }
//! Consume a link tag.
fn consumeTag(str: string, tag: string) bool { }
//! Consume one character.
fn consumeChar(str: string, c: char) bool { }
//! Consume whitespace.
fn consumeWhitespace(str: string) { }
//! Consume a URL.
fn consumeUrl(str: string, url: string) bool { }
//! Count the whitespace at the beginning of a string.
fn countLeadingWhitespace(str: string) size_t { }
//! Starting from i, count how much whitespace until the first
//! nonwhitespace character. If as much or more whitespace than maxLength
//! is counted, return immediately. Tabs count as 4.
fn countContiguousWhitespace(str: string, maxLength: size_t, i: size_t) size_t { }
//! Remove a delimiter length worth of characters from the front of str.
//! Taking into account tabs etc.
fn removeDelimiter(str: string, delimiter: size_t, forceFourTab: bool) string { }
//! Create a string filled with spaces len characters long.
fn emptyString(len: size_t) string { }
//! Create a string len characters long, filled with c characters.
fn uniformString(len: size_t, c: char) string { }
//! Get the string representation of a paragraph.
fn paragraphToString(p: Paragraph) string { }
fn markdownPunctuation(c: dchar) bool { }
//! Turn consecutive whitespace into a single whitespace.
fn collapseWhitespace(str: string) string { }
//! Escape a string using markdown escape rules.
fn markdownEscape(str: string) string { }
//! Build an AutoLink node.
fn makeAutoLink(url: string) Node { }
//! Build an EmailLink node.
fn makeEmailLink(url: string) Node { }
//! Build an AutoLinkNode.
fn makeStandaloneAutoLink(url: string) Node { }
fn isAbsoluteURI(str: string) bool { }
//! Percent encode a given url string. This isn't quite 'standard' in a few
//! ways:
fn urlEscape(str: string) string { }
//! Escape HTML entities.
fn htmlEntityEscape(str: string) string { }
fn isEmailAddress(str: string) bool { }
//! Is the string valid to be an HTML block?
fn validBlockHtml(str: string) bool { }
fn validInlineHtml(str: string) bool { }
//! Strip characters from a string hat are not allowed in image link
//! titles.
fn altStringPresentation(str: string) string { }
//! Replace an HTML entity with the correct unicode character.
fn replaceEntity(str: string) string { }
//! Main importer for markdown parser.
module watt.markdown.ast;
//! The type of node.
enum Type
{
Document,
BlockQuote,
List,
Item,
CodeBlock,
HtmlBlock,
Paragraph,
Heading,
ThematicBreak,
Text,
Softbreak,
Linebreak,
Code,
HtmlInline,
Emph,
Strong,
Link,
Image,
}
//! Base struct for all nodes.
class Node
{
public:
type: Type;
public:
this() { }
fn toDocument() Document { }
fn toBlockQuote() BlockQuote { }
fn toList() List { }
fn toItem() Item { }
fn toCodeBlock() CodeBlock { }
fn toHtmlBlock() HtmlBlock { }
fn toParagraph() Paragraph { }
fn toHeading() Heading { }
fn toThematicBreak() ThematicBreak { }
fn toText() Text { }
fn toSoftbreak() Softbreak { }
fn toLinebreak() Linebreak { }
fn toCode() Code { }
fn toHtmlInline() HtmlInline { }
fn toEmph() Emph { }
fn toStrong() Strong { }
fn toLink() Link { }
fn toImage() Image { }
fn toParent() Parent { }
fn toDocumentFast() Document { }
fn toBlockQuoteFast() BlockQuote { }
fn toListFast() List { }
fn toItemFast() Item { }
fn toCodeBlockFast() CodeBlock { }
fn toHtmlBlockFast() HtmlBlock { }
fn toParagraphFast() Paragraph { }
fn toHeadingFast() Heading { }
fn toThematicBreakFast() ThematicBreak { }
fn toTextFast() Text { }
fn toSoftbreakFast() Softbreak { }
fn toLinebreakFast() Linebreak { }
fn toCodeFast() Code { }
fn toHtmlInlineFast() HtmlInline { }
fn toEmphFast() Emph { }
fn toStrongFast() Strong { }
fn toLinkFast() Link { }
fn toImageFast() Image { }
fn toParentFast() Parent { }
}
//! A Parent node can have children nodes.
class Parent : Node
{
public:
children: Node[];
public:
this() { }
}
//! A Document node represents the entire markdown text.
class Document : Parent
{
public:
this() { }
}
//! A Parent block from lines that start with >.
class BlockQuote : Parent
{
public:
lastLineBlank: bool;
public:
this() { }
}
//! A Parent block that lists its children, either ordered or unordered.
class List : Parent
{
public:
enum Kind
{
Bullet,
Ordered,
}
public:
alias Bullet = Kind.Bullet;
alias Ordered = Kind.Ordered;
public:
kind: Kind;
isTight: bool;
blankLinePending: bool;
leadingWhitespace: size_t;
empty: bool;
delimiter: string;
separator: char;
start: i32;
public:
this() { }
}
//! An element in a List.
class Item : Parent
{
public:
childPoint: size_t;
public:
this() { }
}
//! A Block that contains text that is to be displayed as-is in a
//! monospace font.
class CodeBlock : Node
{
public:
str: string;
info: string;
fenceIndentation: size_t;
public:
this() { }
}
//! A block of raw HTML.
class HtmlBlock : Node
{
public:
enum Kind
{
Script,
Comment,
Question,
Bang,
CData,
Normal,
Other,
}
public:
str: string;
kind: Kind;
parent: Parent;
public:
this() { }
}
//! A Paragraph is the simplest parent block, usually containing text.
class Paragraph : Parent
{
public:
this() { }
}
//! Demarks a section with text in a special style. Can be generated in
//! multiple ways.
class Heading : Parent
{
public:
level: u32;
public:
this() { }
}
//! Breaks a document into sections. Rendered with an node in HTML.
class ThematicBreak : Node
{
public:
this() { }
}
//! A written method of human communication.
class Text : Node
{
public:
str: string;
leadingWhitespace: size_t;
slashToBreak: bool;
run: string;
public:
this() { }
}
//! A newline.
class Softbreak : Node
{
public:
this() { }
}
//! Harder form of break than Softbreak, rendered with
in HTML.
class Linebreak : Node
{
public:
slashBreak: bool;
public:
this() { }
}
//! Like CodeBlock but inline.
class Code : Node
{
public:
str: string;
public:
this() { }
}
//! An inline HTML tag.
class HtmlInline : Node
{
public:
str: string;
public:
this() { }
}
//! First level of text emphasis. Rendered as italics.
class Emph : Parent
{
public:
this() { }
}
//! Second level of text emphasis. Rendered as bold.
class Strong : Parent
{
public:
this() { }
}
//! A Link to a URL.
class Link : Parent
{
public:
url: string;
title: string;
fromHtml: bool;
public:
this() { }
}
//! A Link to an image, intended for inline display.
class Image : Parent
{
public:
url: string;
alt: string;
title: string;
public:
this() { }
}
//! Visitor base class.
class Visitor
{
public:
this() { }
fn enter(n: Document, sink: scope (Sink)) { }
fn leave(n: Document, sink: scope (Sink)) { }
fn enter(n: BlockQuote, sink: scope (Sink)) { }
fn leave(n: BlockQuote, sink: scope (Sink)) { }
fn enter(n: List, sink: scope (Sink)) { }
fn leave(n: List, sink: scope (Sink)) { }
fn enter(n: Item, sink: scope (Sink)) { }
fn leave(n: Item, sink: scope (Sink)) { }
fn enter(n: Paragraph, sink: scope (Sink)) { }
fn leave(n: Paragraph, sink: scope (Sink)) { }
fn enter(n: Heading, sink: scope (Sink)) { }
fn leave(n: Heading, sink: scope (Sink)) { }
fn enter(n: Emph, sink: scope (Sink)) { }
fn leave(n: Emph, sink: scope (Sink)) { }
fn enter(n: Link, sink: scope (Sink)) { }
fn leave(n: Link, sink: scope (Sink)) { }
fn enter(n: Image, sink: scope (Sink)) { }
fn leave(n: Image, sink: scope (Sink)) { }
fn enter(n: Strong, sink: scope (Sink)) { }
fn leave(n: Strong, sink: scope (Sink)) { }
fn visit(n: HtmlBlock, sink: scope (Sink)) { }
fn visit(n: CodeBlock, sink: scope (Sink)) { }
fn visit(n: ThematicBreak, sink: scope (Sink)) { }
fn visit(n: Text, sink: scope (Sink)) { }
fn visit(n: Softbreak, sink: scope (Sink)) { }
fn visit(n: Linebreak, sink: scope (Sink)) { }
fn visit(n: Code, sink: scope (Sink)) { }
fn visit(n: HtmlInline, sink: scope (Sink)) { }
}
//! Dispatch to correct visitor function.
fn accept(n: Node, v: Visitor, sink: scope (Sink)) { }
//! Markdown parser.
module watt.markdown.parser;
//! Internal representation of a link.
class LinkReference
{
public:
enum Stage
{
Opening,
Label,
ClosingColon,
Url,
Title,
Done,
}
public:
label: string;
url: string;
title: string;
titleSentinel: dchar;
stage: Stage;
lines: string[];
public:
this() { }
fn addLines(p: Parser) { }
}
//! Parse a string of markdown, ready for processing into output.
fn parse(str: string) Document { }