LAview.LaTeX-Struct/src/latex-struct/main.vala

100 lines
1.7 KiB
Vala

/**
* LaTeX view.
*
* Public system of data view in the LaTeX format.
*/
namespace LAview {
string dos2unix (string dos_string) {
var unistring = new StringBuilder ();
for (var i = 0; dos_string[i] != '\0'; ) {
if ('\r' == dos_string[i]) {
switch (dos_string[i + 1]) {
case '\r':
if ('\n' == dos_string[i + 2])
i += 3;
break;
case '\n':
i += 2;
break;
default:
++i;
break;
}
unistring.append_c ('\n');
} else {
unistring.append_c (dos_string[i++]);
}
}
return unistring.str;
}
/**
* Parses LaTeX plain text from UTF-8 string.
*
* @throws ParseError any error when parsing.
*/
public Glob parse(string text) throws Parsers.ParseError {
/* escaping TeX document */
var escaped_text = text.escape (" \n\r\t");
/* line breaks: dos -> unix */
var u_escaped_text = dos2unix (escaped_text);
/* TeX scanner initialization */
var group = new Parsers.ParserFactory ();
var parser = new Parsers.GlobParser (group.group);
/* parse TeX */
var doc = parser.parse (u_escaped_text, 0, 0);
return doc as Glob;
}
/**
* Converts plain text string to LaTeX string.
*/
public string plain_to_tex(string text) {
var str = new StringBuilder ();
for (var i = 0; text[i] != '\0'; ++i) {
switch (text[i]) {
case '$':
case '&':
case '%':
case '#':
case '_':
case '{':
case '}':
str.append_c ('\\');
str.append_c (text[i]);
break;
case '\\':
str.append ("\\textbackslash ");
break;
case '~':
str.append ("\\~{}");
break;
case '^':
str.append ("\\^{}");
break;
default:
str.append_c (text[i]);
break;
}
}
return str.str;
}
}