2014-04-09 17:43:14 +04:00
|
|
|
/**
|
|
|
|
* LaTeX view.
|
|
|
|
*
|
|
|
|
* Public system of data view in the LaTeX format.
|
|
|
|
*/
|
2014-01-05 16:59:27 +04:00
|
|
|
namespace LAview {
|
|
|
|
|
2014-04-09 17:43:14 +04:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2014-01-05 16:59:27 +04:00
|
|
|
|
2014-04-09 17:43:14 +04:00
|
|
|
return str.str;
|
2014-01-05 16:59:27 +04:00
|
|
|
}
|
|
|
|
}
|