diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/log2xml/log2html.xsl | 17 | ||||
-rw-r--r-- | src/log2xml/log2xml.cc | 43 | ||||
-rw-r--r-- | src/log2xml/logfile.css | 42 |
3 files changed, 89 insertions, 13 deletions
diff --git a/src/log2xml/log2html.xsl b/src/log2xml/log2html.xsl index 96691a6aefd7..be4af66ce3c7 100644 --- a/src/log2xml/log2html.xsl +++ b/src/log2xml/log2html.xsl @@ -17,9 +17,7 @@ <xsl:template match="nest"> <div class='nesting'> <div class='head'> - <code> - <xsl:value-of select="head"/> - </code> + <xsl:apply-templates select='head'/> </div> <blockquote class='body'> <xsl:for-each select='line|nest'> @@ -52,10 +50,17 @@ </div> </xsl:template> - <xsl:template match="line"> - <code class='line'> - <xsl:value-of select="."/> + <xsl:template match="head|line"> + <code> + <xsl:apply-templates/> </code> </xsl:template> + + <xsl:template match="storeref"> + <em class='storeref'> + <span class='z'><span class='popup'><xsl:apply-templates/></span></span> + <span class='elided'>(...)</span><xsl:apply-templates select='name'/><xsl:apply-templates select='path'/> + </em> + </xsl:template> </xsl:stylesheet> \ No newline at end of file diff --git a/src/log2xml/log2xml.cc b/src/log2xml/log2xml.cc index 711fc82b89cf..f3e976fd916f 100644 --- a/src/log2xml/log2xml.cc +++ b/src/log2xml/log2xml.cc @@ -35,12 +35,7 @@ void Decoder::pushChar(char c) state = stEscape; } else if (c == '\n') { finishLine(); - } else if (c == '<') - line += "<"; - else if (c == '&') - line += "&"; - else - line += c; + } else line += c; break; case stEscape: @@ -78,9 +73,43 @@ void Decoder::pushChar(char c) void Decoder::finishLine() { + string storeDir = "/nix/store/"; + int sz = storeDir.size(); string tag = inHeader ? "head" : "line"; cout << "<" << tag << ">"; - cout << line; + + for (int i = 0; i < line.size(); i++) { + + if (line[i] == '<') cout << "<"; + else if (line[i] == '&') cout << "&"; + else if (i + sz + 33 < line.size() && + string(line, i, sz) == storeDir && + line[i + sz + 32] == '-') + { + int j = i + sz + 32; + /* skip name */ + while (!strchr("/\n\r\t ()[]:;?<>", line[j])) j++; + int k = j; + while (!strchr("\n\r\t ()[]:;?<>", line[k])) k++; + // !!! escaping + cout << "<storeref>" + << "<storedir>" + << string(line, i, sz) + << "</storedir>" + << "<hash>" + << string(line, i + sz, 32) + << "</hash>" + << "<name>" + << string(line, i + sz + 32, j - (i + sz + 32)) + << "</name>" + << "<path>" + << string(line, j, k - j) + << "</path>" + << "</storeref>"; + i = k - 1; + } else cout << line[i]; + } + cout << "</" << tag << ">" << endl; line = ""; inHeader = false; diff --git a/src/log2xml/logfile.css b/src/log2xml/logfile.css index e240eb381520..342cf25839d2 100644 --- a/src/log2xml/logfile.css +++ b/src/log2xml/logfile.css @@ -64,3 +64,45 @@ tr.y > td.dummy > div.dummy border-left: 3px solid #6185a0; border-bottom: 3px solid #6185a0; } + + +em.storeref +{ + color: #500000; +} + + +em.storeref:hover +{ + background-color: #eeeeee; +} + + +*.popup { + display: none; +/* background: url('http://losser.st-lab.cs.uu.nl/~mbravenb/menuback.png') repeat; */ + background: #ffffcd; + border: solid #555555 1px; + position: absolute; + top: 1.5em; + left: 0.5em; + margin: 0; + padding: 0; + z-index: 100; +} + + +em.storeref { + position: static; +} + + +span.z { + position: absolute; + width: 100%; +} + + +em.storeref:hover > span.z > *.popup { + display: block; +} |