/TODO/srcOld/Reader.cpp
C++ | 2460 lines | 1938 code | 315 blank | 207 comment | 557 complexity | aa4099a39f71084def466fc9c0357655 MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- #include "Reader.h"
- //READ
- void Reader::read(const QString& sourceFilePath)
- {
- //preprocess
- currentPosition = 0;
- preprocess();
- //process
- currentPosition = 0;
- buffers.clear();
- enter(Document);
- process();
- //post process
- postprocess();
- }
- //PREPROCESS
- void Reader::preprocess()
- {
- while(!eof())
- {
- //ignore everything in script and style
- if(isLast("\n") && (is("@@") || is("!!")))
- {
- skip(2);
- skipWhileIsSpaceOrTab();
- bool inCurlyBraces = false;
- if(is("{"))
- {
- skip();
- inCurlyBraces = true;
- }
- while(true)
- {
- if(inCurlyBraces)
- {
- static int braceDepth = 1;
- if(is("{")) braceDepth++;
- else if(is("}"))
- {
- //!!!!WHAT IS IF BRACE IS IN A "" OR IF IT IS COMMENTED?!?!?!
- braceDepth--;
- if(braceDepth == 0)
- {
- next();
- break;
- }
- }
- }
- else //indented
- if(isNext("\n") && !(isNext("\n ") || isNext("\n\t") || isNext("\n\n")))
- break;
- next();
- }
- continue;
- }
- //ignore everything in code
- if(is("\\´"))
- {
- text.replace(currentPosition, 1, "");
- skip();
- continue;
- }
- if(is("´"))
- {
- skip();
- while(!is("´") && !eof()) next();
- skip();
- continue;
- }
- //single line commands
- if(is("\\//"))
- {
- text.replace(currentPosition, 1, "");
- skip(2);
- continue;
- }
- if(!(isLast("http:") || isLast("https:") || isLast("ftp:"))
- && is("//"))
- {
- int i = 2; while(!is("\n", i) && !eof(i)) i++;
- text.replace(currentPosition, i, "");
- continue;
- }
- //multiline comments
- if(is("\\/*"))
- {
- text.replace(currentPosition, 1, "");
- skip(2);
- continue;
- }
- if(is("/*"))
- {
- int i = 2; while(!is("*/", i) && !eof(i)) i++;
- text.replace(currentPosition, i + 2, "");
- }
- //newline escape
- if(is("\\\n"))
- {
- text.replace(currentPosition, 2, "");
- continue;
- }
- //file include (to be interpreted)
- if(is("\n") && isNext("\\<=="))
- {
- skip();
- text.replace(currentPosition, 1, "");
- skip(3);
- continue;
- }
- if(isLast("\n") && is("<=="))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(3);
- QString filePath;
- while(!eof(i))
- {
- int j = lookAheadWhileIsSpaceOrTabAt(i);
- if(is("\n", j))
- {
- i = j;
- break;
- }
- filePath += c(i);
- i++;
- }
- if(!filePath.startsWith("/")) filePath = sourceDirPath + filePath;
- QFile file(filePath);
- if(file.open(QIODevice::ReadOnly))
- {
- text.replace(currentPosition, i, QString::fromUtf8(file.readAll()));
- file.close();
- continue;
- }
- // else
- // ; //!!!ERROR
- }
- //next
- next();
- }
- }
- //PROCESS
- void Reader::process()
- {
- while(!eof())
- {
- //not to be interpreted file inclusions
- if(includeFileWithoutInterpretation()) continue;
- //ordinary document elements
- if(inlineMakro()) continue;
- if(style()) continue;
- if(script()) continue;
- if(head()) continue;
- if(body()) continue;
- if(characterReplace()) continue;
- //append character to current buffer
- if(!isLast(Document) && !isLast(Head) && !isLast(Body) && !isLast(Matter) && !isLast(Part)
- && !isLast(BulletList) && !isLast(ListItem)
- && !isLast(TableRow)
- )
- {
- //enter text if needed
- if(!isIn(Text)) enter(Text);
- append(c());
- }
- //next
- next();
- }
- //tie document buffer
- while(!buffers.last()->is(Document) && !buffers.empty()) leave(buffers.last()->type());
- _documentBuffer = buffers.takeLast();
- }
- bool Reader::includeFileWithoutInterpretation()
- {
- //enter and insert the file
- if(isLast("\n") && is("<--"))
- {
- skip(3);
- skipWhileIsSpaceOrTab();
- QString filePath;
- while(!is("\n") && !eof())
- {
- skipWhileIsSpaceOrTab();
- filePath += c();
- next();
- }
- if(!filePath.startsWith("/")) filePath = sourceDirPath + filePath;
- QFile file(filePath);
- if(file.open(QIODevice::ReadOnly))
- {
- enter(NotInterpretedText);
- append(QString::fromUtf8(file.readAll()));
- file.close();
- leave(NotInterpretedText);
- }
- // else
- // ; //!!!ERROR
- }
- //continue searching
- return false;
- }
- bool Reader::inlineMakro()
- {
- //enter
- if(is("!{"))
- {
- enter(InlineMakro);
- skip(2);
- return true;
- }
- //append character
- if(isIn(InlineMakro))
- {
- if(is("}"))
- {
- skip();
- leave(InlineMakro);
- return true;
- }
- else
- {
- append(c());
- next();
- return true;
- }
- }
- //continue searching
- return false;
- }
- bool Reader::style()
- {
- //enter
- static bool inBraces = false;
- if(isLast("\n") && is("@@"))
- {
- enter(XmlStyle);
- skip(2);
- if(is("{"))
- {
- inBraces = true;
- skip();
- }
- return true;
- }
- //append character or leave
- if(isIn(XmlStyle))
- {
- if(inBraces) //is in braces
- {
- static int braceDepth = 1;
- if(is("{")) braceDepth++;
- else if(is("}"))
- {
- //!!!!WHAT IS IF BRACE IS IN A "" OR IF IT IS COMMENTED?!?!?!
- // EASIEST IDEA: dont use braces, only allow indenting for a style block
- braceDepth--;
- if(braceDepth == 0)
- {
- inBraces = false;
- skip();
- leave(XmlStyle);
- return true;
- }
- }
- }
- else //is indented
- if(is("\n") && !(isNext(" ") || isNext("\t") || isNext("\n")))
- {
- skip();
- leave(XmlStyle);
- return true;
- }
- append(c());
- next();
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::script()
- {
- //enter
- static bool inBraces = false;
- if(isLast("\n") && is("!!"))
- {
- enter(Xml_Script);
- skip(2);
- if(is("{"))
- {
- inBraces = true;
- skip();
- }
- return true;
- }
- //append character or leave
- if(isIn(Xml_Script))
- {
- if(inBraces) //is in braces
- {
- static int braceDepth = 1;
- if(is("{")) braceDepth++;
- else if(is("}"))
- {
- //!!!!WHAT IS IF BRACE IS IN A "" OR IF IT IS COMMENTED?!?!?!
- // EASIEST IDEA: dont use braces, only allow indenting for a style block
- braceDepth--;
- if(braceDepth == 0)
- {
- inBraces = false;
- skip();
- leave(Xml_Script);
- return true;
- }
- }
- }
- else //is indented
- if(is("\n") && !(isNext(" ") || isNext("\t") || isNext("\n")))
- {
- skip();
- leave(Xml_Script);
- return true;
- }
- append(c());
- next();
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::body()
- {
- //body elements
- if(isIn(Body))
- {
- if(xmlClass()) return true;
- if(label()) return true;
- if(inlineStyle()) return true;
- if(makro()) return true;
- if(inlineScript()) return true;
- if(inlineListing()) return true;
- if(matter()) return true;
- if(part()) return true;
- if(imageFigure()) return true;
- if(heading()) return true;
- if(horizontalLine()) return true;
- if(list()) return true;
- if(definitionList()) return true;
- if(quote()) return true;
- if(texMath()) return true;
- if(texMathInline()) return true;
- if(footnote()) return true;
- if(span()) return true;
- if(sub()) return true;
- if(sup()) return true;
- if(strongEmphasised()) return true;
- if(strong()) return true;
- if(emphasise()) return true;
- if(table()) return true;
- if(url()) return true;
- if(ref()) return true;
- if(titleRef()) return true;
- if(pageRef()) return true;
- if(bibRef()) return true;
- if(paragraph()) return true;
- }
- //continue searching
- return false;
- }
- bool Reader::xmlClass()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(XmlClass) && is(".") && (!isNext(" ") && !isNext("\t") && !isNext(".") && !isNext(":")))
- {
- bool enterClass = false;
- if(isIn(Text) && (isLast(" ") || isLast("\t") || isLast("\n")))
- enterClass = true;
- if(enterClass)
- {
- if(isLast(Body) || isLast(Part)) enter(Paragraph);
- enter(XmlClass);
- skip();
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- }
- //append character or leave
- if(isIn(XmlClass))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(is("\"")) {skip(); toBeLeft = true;} break;
- case CurlyBracket: if(is("}")) {skip(); toBeLeft = true;} break;
- case None:
- default: if(is(" ") || is("\t")) toBeLeft = true;
- }
- if(is("\n"))
- toBeLeft = true;
- if(!toBeLeft) {append(c()); next();}
- else leave(XmlClass);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::label()
- {
- //hold
- static Hold hold = None;
- //enter
- if(canEnter(Label) && is("<-") && !(is("<- ") || is("<-\t") || is("<-\n") || is("<->")))
- {
- if(isLast(Body) || isLast(Matter)) enter(Paragraph);
- enter(Label);
- skip(2);
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //append character or leave
- if(isIn(Label))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(is("\"")) {skip(); toBeLeft = true;} break;
- case CurlyBracket: if(is("}")) {skip(); toBeLeft = true;} break;
- case None:
- default: if(is(" ") || is("\t")) toBeLeft = true;
- }
- if(is("\n"))
- toBeLeft = true;
- if(!toBeLeft) {append(c()); next();}
- else leave(Label);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::inlineStyle()
- {
- //hold
- static Hold hold = None;
- //enter
- if(canEnter(XmlInlineStyle) && (isLast(" ") || isLast("\t") || isLast("\n")) && is("@"))
- {
- if(isLast(Body) || isLast(Matter)) enter(Paragraph);
- enter(XmlInlineStyle);
- skip();
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //append character or leave
- if(isIn(XmlInlineStyle))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(is("\"")) {skip(); toBeLeft = true;} break;
- case CurlyBracket: if(is("}")) {skip(); toBeLeft = true;} break;
- case None:
- default: if(is(" ") || is("\t")) toBeLeft = true;
- }
- if(is("\n"))
- toBeLeft = true;
- if(!toBeLeft) {append(c()); next();}
- else leave(XmlInlineStyle);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::makro()
- {
- //enter
- static bool inBraces = false;
- if(isLast("\n") && is("!"))
- {
- enter(Makro);
- skip();
- if(is("{"))
- {
- skip();
- inBraces = true;
- }
- return true;
- }
- //append character or leave
- if(isIn(Makro))
- {
- if(inBraces) //braced
- {
- if(is("}"))
- {
- skip();
- inBraces = false;
- leave(Makro);
- return true;
- }
- }
- else //indented
- {
- if(is("\n") && !(isNext(" ") || isNext("\t") || isNext("\n")))
- {
- skip();
- leave(Makro);
- return true;
- }
- }
- append(c());
- next();
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::inlineScript()
- {
- // //enter
- // static bool inBraces = false;
- // if(isLast("\n") && is("!!"))
- // {
- // enter(Script);
- // skip(2);
- // if(is("{"))
- // {
- // inBraces = true;
- // skip();
- // }
- // return true;
- // }
- // //append character or leave
- // if(isIn(Script))
- // {
- // if(inBraces) //is in braces
- // {
- // static int braceDepth = 1;
- // if(is("{")) braceDepth++;
- // else if(is("}"))
- // {
- // //!!!!WHAT IS IF BRACE IS IN A "" OR IF IT IS COMMENTED?!?!?!
- // // EASIEST IDEA: dont use braces, only allow indenting for a style block
- // braceDepth--;
- // if(braceDepth == 0)
- // {
- // inBraces = false;
- // skip();
- // leave(Script);
- // return true;
- // }
- // }
- // }
- // else //is indented
- // if(is("\n") && !(isNext(" ") || isNext("\t") || isNext("\n")))
- // {
- // skip();
- // leave(Script);
- // return true;
- // }
- // append(c());
- // next();
- // return true;
- // }
- //continue searching
- return false;
- }
- bool Reader::inlineListing()
- {
- //enter
- if(canEnter(InlineListing) && (is("´") || is("`")))
- {
- if(isLast(Body) || isLast(Matter) || isLast(Part)) enter(Paragraph);
- enter(InlineListing);
- skip();
- return true;
- }
- //leave
- if(isIn(InlineListing))
- {
- if(is("´") || is("`"))
- {
- skip();
- leave(InlineListing);
- }
- else
- {
- append(c());
- next();
- }
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::matter()
- {
- //enter
- if(isLast("\n") && is("::"))
- {
- if(isIn(Part)) leave(Part);
- if(isIn(Matter)) leave(Matter);
- int i = 2; while((is(":", i) || is(" ", i) || is("\t", i)) && !eof(i)) i++;
- if(!is("\n", i))
- {
- enter(Matter);
- enter(MatterName);
- }
- skip(i);
- return true;
- }
- //leave
- if(isIn(MatterName))
- {
- if(is(":") || is(" ") || is("\t")) next();
- else if(is("\n")) leave(MatterName);
- else {append(c()); next();}
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::part()
- {
- //enter
- if(isLast("\n") && (is(".") || is(":")))
- {
- int dots = 0;
- int colons = 0;
- int i = 0;
- while((c(i) == '.' || c(i) == ':' || c(i) == ' ' || c(i) == '\t') && !eof(i))
- {
- if(c(i) == '.') dots++;
- if(c(i) == ':') colons++;
- i++;
- }
- if(dots > 0 && colons > 0)
- {
- if(isIn(Part)) leave(Part);
- if(!is("\n", i))
- {
- enter(Part);
- enter(PartName);
- }
- skip(i);
- return true;
- }
- }
- //leave
- if(isIn(PartName))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(0);
- if((c(i) == ':' || c(i) == '.') || (c(i) == '.' && c(i + 1) == ':') || (c(i) == '.' && c(i + 1) == '.'))
- {
- skip(i + 1);
- while((is(":") || is(".")) && !eof()) next();
- }
- if(is("\n")) leave(PartName);
- else {append(c()); next();}
- return true;
- }
- //continue searching
- return false;
- }
- //!!!check
- bool Reader::imageFigure()
- {
- //enter image or subimage
- if(isLast("\n"))
- {
- int i = lookAheadWhileIsSpaceOrTabAt();
- if(is("<=", i) && !is("<=>", i))
- {
- //enter image figure, if not already in
- if(!isIn(ImageFigure)) enter(ImageFigure);
- //check if this is an subimage; if so enter subimage
- int j = i + 2; while(c(j) != '\n') {j++; if(eof(j)) return false;}
- j++; j = lookAheadWhileIsSpaceOrTabAt(j);
- if(is("##", j) || is("#.#", j) || is("<=", j))
- {
- if(isIn(Subimage)) leave(Subimage);
- enter(Subimage);
- }
- //finally enter the image (path)
- enter(Image);
- skip(i + 2);
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- //leave image
- if(isIn(Image) && is("\n"))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(1);
- if(is("#.#", i) || is("##", i))
- {
- leave(Image);
- enter(Caption);
- if(is("#.#", i)) skip(i + 3);
- else if(is("##", i)) skip(i + 2);
- skipWhileIsSpaceOrTab();
- return true;
- }
- else if(is("<=", i))
- {
- leave(Image);
- leave(Subimage);
- enter(Subimage);
- enter(Image);
- skip(i + 2);
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- //enter image caption
- if(isIn(ImageFigure) && is("\n"))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(1);
- if(is("#", i))
- {
- if(isIn(Subimage)) leave(Subimage);
- if(isIn(Image)) leave(Image);
- enter(Caption);
- skip(i + 1);
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- //leave image figure
- if(isIn(ImageFigure) && is("\n"))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(1);
- if(!is("#", i) && !is("<=", i))
- leave(ImageFigure);
- }
- //continue searching
- return false;
- }
- //!!!check
- void Reader::enterTablePart()
- {
- //if there is not only a table body, enter table head
- //go to next line
- int i = 1; while(c(i) != '\n' && !eof(i)) i++;
- //find one time "\n[ \t]*|?=" and there is a head
- while(true)
- {
- if(eof(i)) break;
- if(c(i) == '\n')
- {
- //skip indenting spaces and tabs
- int k = i + 1; while((c(k) == ' ' || c(k) == '\t') && !eof(k)) k++;
- //if now again a \n comes, table ends
- if(c(k) == '\n') break;
- //else if now a "\n[ \t]*|?=" comes, there could be a head ...
- else if(c(k) == '=' || (c(k) == '|' && c(k + 1) == '='))
- {
- //... if right after that line ...
- int j = k + 1; while(c(j) != '\n' && !eof(j)) j++;
- //... and indenting spaces and tabs ...
- j++; while((c(j) == ' ' || c(j) == '\t') && !eof(j)) j++;
- //...again a row comes
- if(c(j) == '|')
- {
- enter(TableHead);
- break;
- }
- }
- }
- i++;
- }
- //else enter table body
- if(!isIn(TableHead))
- enter(TableBody);
- }
- //!!!check
- bool Reader::table()
- {
- //!!!INDENT
- //!!!WATCH FOR ARROWS
- //!!!DONT USE c()
- //!!!also in enterTablePart()
- //enter table
- if(!isIn(TableFigure) && isLast("\n"))
- {
- //caption does not come first
- if(is("|") || (is("=") && !is("=>") && !is("==>")) || (is("-") && !is("->"))) //!!!!EVERYWHERE (arrows!)
- {
- enter(TableFigure);
- enter(Table);
- enterTablePart();
- enter(TableRow);
- if(is("=") || is("|="))
- {
- skip();
- if(is("=")) while(is("=") && !eof()) skip();
- else if(is("-")) while(is("-") && !eof()) skip();
- }
- else
- {
- enter(TableCell);
- skip();
- skipWhileIsSpaceOrTab();
- }
- return true;
- }
- //caption comes first?
- else if(is("#"))
- {
- int i = 1; while(c(i) != '\n' && !eof(i)) i++; i++;
- i = lookAheadWhileIsSpaceOrTabAt(i);
- //tables begins, and caption comes first?
- if(c(i) == '|' || c(i) == '=' || c(i) == '-')
- {
- enter(TableFigure);
- enter(Caption);
- skip();
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- }
- //leave table caption (mondatory if caption comes above the table)
- if(isIn(Caption) && is("\n"))
- {
- leave(Caption);
- //only if caption comes before table, enter table head (or body repectively) and table row
- int i = 1; while((c(i) == ' ' || c(i) == '\t') && !eof(i)) i++;
- if(c(i) == '|' || c(i) == '=' || c(i) == '-')
- {
- enter(Table);
- enterTablePart();
- enter(TableRow);
- i++;
- if(is("=", i) || is("|=", i))
- {
- skip(i);
- if(is("=")) while(is("=") && !eof()) skip();
- else if(is("-")) while(is("-") && !eof()) skip();
- }
- else
- {
- enter(TableCell);
- skip(i);
- skipWhileIsSpaceOrTab();
- }
- return true;
- }
- }
- //leave/enter body and foot
- if(isIn(Table) && isLast("\n") && (is("|=") || is("=")))
- {
- int i = 1; while(c(i) != '\n' && !eof(i)) i++;
- i++; while((c(i) == ' ' || c(i) == '\t') && !eof(i)) i++;
- if(c(i) == '|')
- {
- if(isIn(TableHead))
- {
- leave(TableHead);
- enter(TableBody);
- enter(TableRow);
- }
- else if(isIn(TableBody))
- {
- leave(TableBody);
- enter(TableFoot);
- enter(TableRow);
- }
- skip(); while(is("=") && !eof()) skip();
- return true;
- }
- skip(); while(is("=") && !eof()) skip();
- return true;
- }
- //table row
- if(isIn(TableRow) && isLast("\n") && (is("|-") || is("-")))
- {
- int i = 1; while(c(i) != '\n' && !eof(i)) i++;
- i++; while((c(i) == ' ' || c(i) == '\t') && !eof(i)) i++;
- if(c(i) == '|')
- {
- leave(TableRow);
- enter(TableRow);
- skip(); while(is("-") && !eof()) skip();
- return true;
- }
- skip(); while(is("-") && !eof()) skip();
- return true;
- }
- //table cell
- if(isIn(TableRow) && is("|"))
- {
- if(isIn(TableCell))
- leave(TableCell);
- enter(TableCell);
- skip();
- skipWhileIsSpaceOrTab();
- return true;
- }
- //width
- if(isIn(TableCell) /*&& isLast("|")*/ && is("<>"))
- {
- skip(2);
- enter(Width);
- return true;
- }
- if(isIn(Width))
- {
- if(is(" ") || is("\t") || is("\n"))
- {
- leave(Width);
- if(is(" ") || is("\t"))
- return true;
- }
- else
- {
- append(c()); next();
- return true;
- }
- }
- //col span
- if(isIn(TableCell) /*&& isLast("|")*/ && is(">"))
- {
- enter(ColSpan);
- skip();
- return true;
- }
- if(isIn(ColSpan))
- {
- if(is(" ") || is("\t") || is("\n"))
- {
- leave(ColSpan);
- if(is(" ") || is("\t"))
- return true;
- }
- else
- {
- append(c()); next();
- return true;
- }
- }
- //row span
- if(isIn(TableCell) /*&& isLast("|")*/ && is("^"))
- {
- enter(RowSpan);
- skip();
- return true;
- }
- if(isIn(RowSpan))
- {
- if(is(" ") || is("\t") || is("\n"))
- {
- leave(RowSpan);
- if(is(" ") || is("\t"))
- return true;
- }
- else
- {
- append(c()); next();
- return true;
- }
- }
- //start caption (if caption comes after the table)
- if(isIn(Table) && isLast("\n"))
- {
- //skip indenting spaces and tabs
- int i = 0; while((c(i) == ' ' || c(i) == '\t') && !eof(i)) i++;
- //if now a # comes, caption starts
- if(c(i) == '#')
- {
- leave(Table);
- enter(Caption);
- skip(i);
- skip(); //#
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- //leave table (independendly from whether caption comes first or not)
- if(isIn(TableFigure) && is("\n"))
- {
- //skip indenting spaces and tabs
- int i = 1; while((c(i) == ' ' || c(i) == '\t') && !eof(i)) i++;
- //comes again a newline?
- if(c(i) == '\n')
- {
- leave(TableFigure);
- skip(i);
- return true;
- }
- }
- //continue searching
- return false;
- }
- bool Reader::heading()
- {
- //Heading6
- if(isLast("\n\n") && is("######"))
- {
- enter(Heading6);
- skip(6);
- skipWhileIsSpaceOrTab();
- return true;
- }
- else if(isLast("\n\n") && is("#.#.#.#.#.#"))
- {
- enter(Heading6);
- skip(11);
- skipWhileIsSpaceOrTab();
- return true;
- }
- if(isIn(Heading6) && is("\n"))
- leave(Heading6);
- //Heading5
- if(isLast("\n\n") && is("#####"))
- {
- enter(Heading5);
- skip(5);
- skipWhileIsSpaceOrTab();
- return true;
- }
- else if(isLast("\n\n") && is("#.#.#.#.#"))
- {
- enter(Heading5);
- skip(9);
- skipWhileIsSpaceOrTab();
- return true;
- }
- if(isIn(Heading5) && is("\n"))
- leave(Heading5);
- //Heading4
- if(isLast("\n\n") && is("####"))
- {
- enter(Heading4);
- skip(4);
- skipWhileIsSpaceOrTab();
- return true;
- }
- else if(isLast("\n\n") && is("#.#.#.#"))
- {
- enter(Heading4);
- skip(7);
- skipWhileIsSpaceOrTab();
- return true;
- }
- if(isIn(Heading4) && is("\n"))
- leave(Heading4);
- //Heading3
- if(isLast("\n\n") && is("###"))
- {
- enter(Heading3);
- skip(3);
- skipWhileIsSpaceOrTab();
- return true;
- }
- else if(isLast("\n\n") && is("#.#.#"))
- {
- enter(Heading3);
- skip(5);
- skipWhileIsSpaceOrTab();
- return true;
- }
- if(isIn(Heading3) && is("\n"))
- leave(Heading3);
- //Heading2
- if(isLast("\n\n") && is("##"))
- {
- enter(Heading2);
- skip(2);
- skipWhileIsSpaceOrTab();
- return true;
- }
- else if(isLast("\n\n") && is("#.#"))
- {
- enter(Heading2);
- skip(3);
- skipWhileIsSpaceOrTab();
- return true;
- }
- if(isIn(Heading2) && is("\n"))
- leave(Heading2);
- //Heading1
- if(isLast("\n\n") && is("#"))
- {
- enter(Heading1);
- skip();
- skipWhileIsSpaceOrTab();
- return true;
- }
- if(isIn(Heading1) && is("\n"))
- leave(Heading1);
- //continue searching
- return false;
- }
- bool Reader::horizontalLine()
- {
- //enter
- if(!isIn(ImageFigure) && !isIn(TableFigure)
- && isLast("\n") && (is("___") || is("~~~")))
- {
- enter(HorizontalLine);
- skip(3);
- return true;
- }
- //leave
- if(isIn(HorizontalLine))
- {
- if(!is("\n")) next();
- else leave(HorizontalLine);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::list()
- {
- //indentation depth
- static int currentIndentationDepth = 0;
- START:
- //enter new bullet list
- if(!isLast(BulletList) && isLast("\n") && (is(spaces(currentIndentationDepth)) || is(tabs(currentIndentationDepth))))
- {
- int spacesOrTabs = lookAheadWhileIsSpaceOrTabAt(0);
- if((is("*", spacesOrTabs) || is("o", spacesOrTabs) || is("-", spacesOrTabs))
- && (isNext(" ", spacesOrTabs) || isNext("\t", spacesOrTabs)))
- enter(BulletList);
- }
- //enter new list item in same depth
- if(isLast(BulletList) && (is(spaces(currentIndentationDepth)) || is(tabs(currentIndentationDepth))))
- {
- int spacesOrTabs = lookAheadWhileIsSpaceOrTabAt(0);
- if((is("*", spacesOrTabs) || is("o", spacesOrTabs) || is("-", spacesOrTabs))
- && (isNext(" ", spacesOrTabs) || isNext("\t", spacesOrTabs)))
- {
- enter(ListItem);
- currentIndentationDepth++;
- skip(spacesOrTabs);
- skip();
- skipWhileIsSpaceOrTab();
- enter(Paragraph); //!!!?!?!?!?!?!?!?!?!?!?! WHAT IS IF A TABLE OR BLOCKQUOTE OR NEW LIST OR ... COMES?!?!
- return true;
- }
- }
- //leave bullet list item
- if(isIn(ListItem) && is("\n"))
- {
- // int i = 1;
- // while((is("\n", i)/* || is(spaces(currentIndentationDepth), i) || is(tabs(currentIndentationDepth), i)*/) && !eof(i))
- // i++;
- // int spacesOrTabs = lookAheadWhileIsSpaceOrTabAt(1);
- // if(!is("\n", spacesOrTabs))
- // {
- leave(ListItem);
- currentIndentationDepth--;
- goto START;
- // }
- }
- //leave bullet list
- if(isLast(BulletList) && is("\n"))
- {
- int spacesOrTabs = lookAheadWhileIsSpaceOrTabAt(1);
- if(!is("\n", spacesOrTabs) && !((is("*", spacesOrTabs) || is("o", spacesOrTabs) || is("-", spacesOrTabs))
- && (isNext(" ", spacesOrTabs) || isNext("\t", spacesOrTabs))))
- {
- leave(BulletList);
- // int nextIndentationDepth = currentIndentationDepth;
- // while(!(isNext(spaces(nextIndentationDepth)) || isNext(tabs(nextIndentationDepth))) && nextIndentationDepth >= 0)
- // nextIndentationDepth--;
- // for(int i = 0; i < currentIndentationDepth - nextIndentationDepth; i++) leave(BulletList);
- // if(isIn(ListItem)) leave(ListItem);
- // currentIndentationDepth = nextIndentationDepth;
- }
- }
- //continue searching
- return false;
- }
- bool Reader::definitionList()
- {
- //enter
- if(isLast("\n"))
- {
- int i = 0; while(!is("\n", i) && !is(":", i) && !eof(i)) i++;
- if(is(":", i))
- {
- i++;
- if(is("\n ", i) || is("\n\t", i) || is(":", i))
- {
- if(!isIn(DefinitionList)) enter(DefinitionList);
- enter(Term);
- }
- }
- }
- //leave Term, enter Definition
- if(isIn(Term) && is(":"))
- {
- skip();
- if(is(":")) skip();
- leave(Term);
- enter(Definition);
- return true;
- }
- //leave Definition
- if(isIn(Definition) && is("\n") && !isNext(" ") && !isNext("\t"))
- {
- leave(Definition);
- if(is("\n\n")) leave(DefinitionList);
- }
- //continue searching
- return false;
- }
- bool Reader::quote()
- {
- //enter
- if(!isIn(BlockQuote) && isLast("\n"))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(0);
- if((is("\"", i) || is(">", i)) && (is(" ", i + 1) || is("\t", i + 1)))
- {
- enter(BlockQuote);
- skip(i + 1);
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- //leave
- if(isIn(BlockQuote) && is("\n"))
- {
- //int i = lookAheadWhileIsSpaceOrTabAt(1);
- //if(c(i) == '\n')
- //{
- leave(BlockQuote);
- //skip(i);
- //return true;
- //}
- }
- //continue searching
- return false;
- }
- bool Reader::texMath()
- {
- //enter
- if(!isIn(TexMath) && isLast("\n"))
- {
- int i = lookAheadWhileIsSpaceOrTabAt(0);
- if(is("$", i))
- {
- enter(TexMath);
- skip(i + 1);
- skipWhileIsSpaceOrTab();
- return true;
- }
- }
- //leave
- if(isIn(TexMath))
- {
- if(is("\n") && !(isNext(" ") || isNext("\t") /*|| isNext("\n")*/))
- {
- skip();
- leave(TexMath);
- return true;
- }
- append(c());
- next();
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::texMathInline()
- {
- //enter
- if(!isIn(TexMathInline) && is("$") && !isLast("\\"))
- {
- enter(TexMathInline);
- skip();
- return true;
- }
- //leave
- if(isIn(TexMathInline))
- {
- if(is("$") && !isLast("\\"))
- {
- skip();
- leave(TexMathInline);
- return true;
- }
- else
- {
- append(c());
- next();
- return true;
- }
- }
- //continue searching
- return false;
- }
- bool Reader::span()
- {
- //enter
- if(!isIn(Span) && is("__"))
- {
- if(isLast(Body)) enter(Paragraph);
- enter(Span);
- skip(2);
- return true;
- }
- //leave
- if(isIn(Span) && is("__"))
- {
- skip(2);
- leave(Span);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::footnote()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(Footnote) && is("^^") && (c(2) == '\'' || c(2) == '"' || c(2) == '{'))
- {
- enter(Footnote);
- skip(2);
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- return true;
- }
- //leave
- if(isIn(Footnote))
- {
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); leave(Footnote); return true;} break;
- case DoubleQuote: if(is("\"")) {skip(); leave(Footnote); return true;} break;
- case CurlyBracket: if(is("}")) {skip(); leave(Footnote); return true;} break;
- default: break;
- }
- }
- //continue searching
- return false;
- }
- bool Reader::sub()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(Sub) && is("_"))
- {
- if(isLast(Body) || isLast(Matter) || isLast(Part)) enter(Paragraph);
- enter(Sub);
- skip();
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //leave
- if(isIn(Sub))
- {
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); leave(Sub); return true;} break;
- case DoubleQuote: if(is("\"")) {skip(); leave(Sub); return true;} break;
- case CurlyBracket: if(is("}")) {skip(); leave(Sub); return true;} break;
- case None:
- default:
- //!!!!!!
- if(!isLast("_") /*&& (buffers.last()->type == Sup
- || (buffers.size() - 2 >= 0
- && buffers.at(buffers.size() - 2).type == Sup
- && buffers.last()->type == Text))*/)
- leave(Sub);
- }
- }
- //continue searching
- return false;
- }
- bool Reader::sup()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(Sup) && !isLast("^") && is("^") && !is("^^"))
- {
- if(isLast(Body) || isLast(Matter) || isLast(Part)) enter(Paragraph);
- enter(Sup);
- skip();
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //leave
- if(isIn(Sup))
- {
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); leave(Sup); return true;} break;
- case DoubleQuote: if(is("\"")) {skip(); leave(Sup); return true;} break;
- case CurlyBracket: if(is("}")) {skip(); leave(Sup); return true;} break;
- case None:
- default:
- if(!isLast("^") && (buffers.last()->is(Sup)
- || (buffers.size() - 2 >= 0
- && buffers.at(buffers.size() - 2)->is(Sup)
- && buffers.last()->is(Text))))
- leave(Sup);
- }
- }
- //continue searching
- return false;
- }
- bool Reader::strongEmphasised()
- {
- //enter
- if(!isIn(StrongEmphasised) && is("***"))
- {
- if(isLast(Body) || isLast(Matter) || isLast(Part)) enter(Paragraph);
- enter(StrongEmphasised);
- skip(3);
- return true;
- }
- //leave
- if(isIn(StrongEmphasised) && is("***"))
- {
- skip(3);
- leave(StrongEmphasised);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::strong()
- {
- //enter
- if(!isIn(Strong) && is("**"))
- {
- if(isLast(Body) || isLast(Matter) || isLast(Part)) enter(Paragraph);
- enter(Strong);
- skip(2);
- return true;
- }
- //leave
- if(isIn(Strong) && is("**"))
- {
- skip(2);
- leave(Strong);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::emphasise()
- {
- //enter
- if(!isIn(Emphasise) && is("*"))
- {
- if(isLast(Body) || isLast(Matter) || isLast(Part)) enter(Paragraph);
- enter(Emphasise);
- skip();
- return true;
- }
- //leave
- if(isIn(Emphasise) && is("*"))
- {
- skip();
- leave(Emphasise);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::url()
- {
- //hold
- static Hold hold = None;
- //enter url
- if(!isIn(Url) && !is(" ") && !is("\t") && !is("\n"))
- {
- if(is("'")) hold = Quote;
- else if(is("\"")) hold = DoubleQuote;
- else if(is("{")) hold = CurlyBracket;
- else hold = None;
- int i = 0;
- while(true)
- {
- i++;
- if(is("\n", i) || (hold == None && (is(" ", i) || is("\t", i))) || eof(i)) break;
- if((((hold == Quote && is("'", i))
- || (hold == DoubleQuote && is("\"", i))
- || (hold == CurlyBracket && is("}", i))
- )
- && is("==>", i+1) && !(is("==> ", i+1) || is("==>\t", i+1) || is("==>\n", i+1))
- )
- || (hold == None && is("==>", i) && !(is("==> ", i) || is("==>\t", i) || is("==>\n", i)))
- )
- {
- enter(Url);
- if(hold != None) skip();
- }
- }
- }
- //prepare to enter url link
- if(isIn(Url) && !isIn(UrlLink))
- {
- if((hold == Quote && is("'"))
- || (hold == DoubleQuote && is("\""))
- || (hold == CurlyBracket && is("}")))
- skip();
- }
- //enter url link
- if(!isIn(UrlLink) && is("==>") && !(is("==> ") || is("==>\t") || is("==>\n")))
- {
- if(isLast(Body) || isLast(Matter)) enter(Paragraph);
- if(!isIn(Url)) enter(Url);
- enter(UrlLink);
- skip(3);
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //append character or leave url link
- if(isIn(UrlLink))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(is("\"")) {skip(); toBeLeft = true;} break;
- case CurlyBracket: if(is("}")) {skip(); toBeLeft = true;} break;
- case None:
- default: if(is(" ") || is("\t")) toBeLeft = true;
- }
- if(is("\n"))
- toBeLeft = true;
- if(!toBeLeft) {append(c()); next();}
- else leave(Url);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::ref()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(Ref) && !isLast("<") && is("->") && !(is("-> ") || is("->\t") || is("->\n")))
- {
- if(isLast(Body) || isLast(Matter)) enter(Paragraph);
- enter(Ref);
- skip(2);
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //append character or leave
- if(isIn(Ref))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(is("\"")) {skip(); toBeLeft = true;} break;
- case CurlyBracket: if(is("}")) {skip(); toBeLeft = true;} break;
- case None:
- default: if(is(" ") || is("\t")) toBeLeft = true;
- }
- if(is("\n"))
- toBeLeft = true;
- if(!toBeLeft) {append(c()); next();}
- else leave(Ref);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::titleRef()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(TitleRef) && is("~>") && !(is("~> ") || is("~>\t") || is("~>\n")))
- {
- if(isLast(Body) || isLast(Matter)) enter(Paragraph);
- enter(TitleRef);
- skip(2);
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //append character or leave
- if(isIn(TitleRef))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(is("\"")) {skip(); toBeLeft = true;} break;
- case CurlyBracket: if(is("}")) {skip(); toBeLeft = true;} break;
- case None:
- default: if(is(" ") || is("\t")) toBeLeft = true;
- }
- if(is("\n"))
- toBeLeft = true;
- if(!toBeLeft) {append(c()); next();}
- else leave(TitleRef);
- return true;
- }
- //continue searching
- return false;
- }
- bool Reader::pageRef()
- {
- //hold
- static Hold hold = None;
- //enter
- if(!isIn(PageRef) && !isLast("<") && is("=>") && !(is("=> ") || is("=>\t") || is("=>\n")))
- {
- if(isLast(Body) || isLast(Matter)) enter(Paragraph);
- enter(PageRef);
- skip(2);
- if(is("'")) {hold = Quote; skip();}
- else if(is("\"")) {hold = DoubleQuote; skip();}
- else if(is("{")) {hold = CurlyBracket; skip();}
- else hold = None;
- return true;
- }
- //append character or leave
- if(isIn(PageRef))
- {
- bool toBeLeft = false;
- switch(hold)
- {
- case Quote: if(is("'")) {skip(); toBeLeft = true;} break;
- case DoubleQuote: if(…
Large files files are truncated, but you can click here to view the full file