about summary refs log tree commit diff
path: root/src/log2xml
diff options
context:
space:
mode:
Diffstat (limited to 'src/log2xml')
-rw-r--r--src/log2xml/log2html.xsl17
-rw-r--r--src/log2xml/log2xml.cc43
-rw-r--r--src/log2xml/logfile.css42
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 += "&lt;";
-            else if (c == '&')
-                line += "&amp;";
-            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 << "&lt;";
+        else if (line[i] == '&') cout << "&amp;";
+        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;
+}