diff --git a/configure.ac b/configure.ac index 093812e7ac..f07dd6dd7b 100644 --- a/configure.ac +++ b/configure.ac @@ -118,6 +118,7 @@ AC_CONFIG_FILES([Makefile src/libexpr/Makefile src/nix-instantiate/Makefile src/nix-env/Makefile + src/log2xml/Makefile scripts/Makefile corepkgs/Makefile corepkgs/fetchurl/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 0f1273426e..29bd535f6e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,2 +1,2 @@ SUBDIRS = bin2c boost libutil libstore libmain nix-store nix-hash \ - libexpr nix-instantiate nix-env + libexpr nix-instantiate nix-env log2xml diff --git a/src/log2xml/Makefile.am b/src/log2xml/Makefile.am new file mode 100644 index 0000000000..b439f5e10d --- /dev/null +++ b/src/log2xml/Makefile.am @@ -0,0 +1,9 @@ +bin_PROGRAMS = log2xml + +log2xml_SOURCES = log2xml.cc + +%.xml: %.log log2xml + ./log2xml < $< > $@ + +%.html: %.xml log2html.xsl + xsltproc log2html.xsl $< > $@ \ No newline at end of file diff --git a/src/log2xml/log2html.xsl b/src/log2xml/log2html.xsl new file mode 100644 index 0000000000..96691a6aef --- /dev/null +++ b/src/log2xml/log2html.xsl @@ -0,0 +1,61 @@ + + + + + + + + + Log File + + + + + + + + +
+
+ + + +
+
+ + + + + + + +
+
+
+ +
+
+ + + + + + +
+
+
+ +
+
+
+
+
+
+ + + + + + + +
\ No newline at end of file diff --git a/src/log2xml/log2xml.cc b/src/log2xml/log2xml.cc new file mode 100644 index 0000000000..711fc82b89 --- /dev/null +++ b/src/log2xml/log2xml.cc @@ -0,0 +1,102 @@ +#include +#include +#include + +using namespace std; + + +struct Decoder +{ + enum { stTop, stEscape, stCSI } state; + string line; + bool inHeader; + int level; + + Decoder() + { + state = stTop; + line = ""; + inHeader = false; + level = 0; + } + + void pushChar(char c); + + void finishLine(); +}; + + +void Decoder::pushChar(char c) +{ + switch (state) { + + case stTop: + if (c == '\e') { + state = stEscape; + } else if (c == '\n') { + finishLine(); + } else if (c == '<') + line += "<"; + else if (c == '&') + line += "&"; + else + line += c; + break; + + case stEscape: + if (c == '[') + state = stCSI; + else + state = stTop; /* !!! wrong */ + break; + + case stCSI: + if (c >= 0x40 && c != 0x7e) { + state = stTop; + switch (c) { + case 'p': + if (line.size()) finishLine(); + level++; + inHeader = true; + cout << "" << endl; + break; + case 'q': + if (line.size()) finishLine(); + if (level > 0) { + level--; + cout << "" << endl; + } else + cerr << "not enough nesting levels" << endl; + break; + } + } + break; + + } +} + + +void Decoder::finishLine() +{ + string tag = inHeader ? "head" : "line"; + cout << "<" << tag << ">"; + cout << line; + cout << "" << endl; + line = ""; + inHeader = false; +} + + +int main(int argc, char * * argv) +{ + Decoder dec; + int c; + + cout << "" << endl; + + while ((c = getchar()) != EOF) { + dec.pushChar(c); + } + + cout << "" << endl; +} diff --git a/src/log2xml/logfile.css b/src/log2xml/logfile.css new file mode 100644 index 0000000000..e240eb3815 --- /dev/null +++ b/src/log2xml/logfile.css @@ -0,0 +1,66 @@ +body +{ + font-family: sans-serif; + background: white; +} + + +blockquote.body +{ + padding: 6px 0px; + margin: 0px 1px; +} + + +table.x, tr.x +{ + border-collapse: separate; + border-spacing: 0pt; + margin: 0em 0em 0em 0em; + padding: 0em 0em 0em 0em; +} + + +tr.x > td.dummy +{ + vertical-align: top; + margin: 0em 0em 0em 0em; + padding: 0.5em 0em 0em 0em; + border-left: 3px solid #6185a0; +} + + +tr.x > td.dummy > div.dummy +{ + width: 1.5em; + height: 3px; + margin: 0em 0em 0em 0em; + border-top: 3px solid #6185a0; +} + + +table.y, tr.y +{ + border-collapse: separate; + border-spacing: 0pt; + margin: 0em 0em 0em 0em; + padding: 0em 0em 0em 0em; +} + + +tr.y > td.dummy +{ + vertical-align: top; + margin: 0em 0em 0em 0em; + padding: 0em 0em 0em 0em; +} + + +tr.y > td.dummy > div.dummy +{ + width: 1.5em; + height: 6px; + margin: 0em 0em 0em 0em; + border-left: 3px solid #6185a0; + border-bottom: 3px solid #6185a0; +}