about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/log2xml/log2html.xsl20
-rw-r--r--src/log2xml/log2xml.cc29
-rw-r--r--src/log2xml/treebits.js6
3 files changed, 46 insertions, 9 deletions
diff --git a/src/log2xml/log2html.xsl b/src/log2xml/log2html.xsl
index 667eb5998135..f75b2eb86fb5 100644
--- a/src/log2xml/log2html.xsl
+++ b/src/log2xml/log2html.xsl
@@ -24,11 +24,25 @@
   </xsl:template>
 
   <xsl:template match="nest">
-    <script type='text/javascript'>showTreeToggle("show","hide")</script>
+
+    <!-- The tree should be collapsed by default if all children are
+         unimportant or if the header is unimportant. -->
+    <xsl:variable name="collapsed"
+                  select="count(.//line[not(@priority = 3)]) = 0 or ./head[@priority = 3]" />
+                  
+    <xsl:variable name="style"><xsl:if test="$collapsed">display: none;</xsl:if></xsl:variable>
+    <xsl:variable name="arg"><xsl:choose><xsl:when test="$collapsed">true</xsl:when><xsl:otherwise>false</xsl:otherwise></xsl:choose></xsl:variable>
+    
+    <script type='text/javascript'>showTreeToggle(<xsl:value-of select="$collapsed"/>)</script>
     <xsl:apply-templates select='head'/>
-    <ul class='nesting'>
+    
+    <ul class='nesting' style="{$style}">
       <xsl:for-each select='line|nest'>
-        <xsl:param name="class"><xsl:choose><xsl:when test="position() != last()">line</xsl:when><xsl:otherwise>lastline</xsl:otherwise></xsl:choose></xsl:param>
+
+        <!-- Is this the last line?  If so, mark it as such so that it
+             can be rendered differently. -->
+        <xsl:variable  name="class"><xsl:choose><xsl:when test="position() != last()">line</xsl:when><xsl:otherwise>lastline</xsl:otherwise></xsl:choose></xsl:variable>
+        
         <li class='{$class}'>
           <span class='lineconn' />
           <span class='linebody'>
diff --git a/src/log2xml/log2xml.cc b/src/log2xml/log2xml.cc
index f3e976fd916f..cf56374cb407 100644
--- a/src/log2xml/log2xml.cc
+++ b/src/log2xml/log2xml.cc
@@ -1,3 +1,4 @@
+#include <vector>
 #include <iostream>
 #include <cstdio>
 #include <string>
@@ -11,6 +12,9 @@ struct Decoder
     string line;
     bool inHeader;
     int level;
+    vector<int> args;
+    bool newNumber;
+    int priority;
 
     Decoder()
     {
@@ -18,6 +22,7 @@ struct Decoder
         line = "";
         inHeader = false;
         level = 0;
+        priority = 1;
     }
 
     void pushChar(char c);
@@ -39,9 +44,11 @@ void Decoder::pushChar(char c)
             break;
 
         case stEscape:
-            if (c == '[')
+            if (c == '[') {
                 state = stCSI;
-            else
+                args.clear();
+                newNumber = true;
+            } else
                 state = stTop; /* !!! wrong */
             break;
 
@@ -54,6 +61,7 @@ void Decoder::pushChar(char c)
                         level++;
                         inHeader = true;
                         cout << "<nest>" << endl;
+                        priority = args.size() >= 1 ? args[0] : 1;
                         break;
                     case 'q':
                         if (line.size()) finishLine();
@@ -63,7 +71,19 @@ void Decoder::pushChar(char c)
                         } else
                             cerr << "not enough nesting levels" << endl;
                         break;
+                    case 's':
+                        if (line.size()) finishLine();
+                        priority = args.size() >= 1 ? args[0] : 1;
+                        break;
+                }
+            } else if (c >= '0' && c <= '9') {
+                int n = 0;
+                if (!newNumber) {
+                    n = args.back() * 10;
+                    args.pop_back();
                 }
+                n += c - '0';
+                args.push_back(n);
             }
             break;
             
@@ -76,7 +96,9 @@ void Decoder::finishLine()
     string storeDir = "/nix/store/";
     int sz = storeDir.size();
     string tag = inHeader ? "head" : "line";
-    cout << "<" << tag << ">";
+    cout << "<" << tag;
+    if (priority != 1) cout << " priority='" << priority << "'";
+    cout << ">";
 
     for (int i = 0; i < line.size(); i++) {
 
@@ -113,6 +135,7 @@ void Decoder::finishLine()
     cout << "</" << tag << ">" << endl;
     line = "";
     inHeader = false;
+    priority = 1;
 }
 
 
diff --git a/src/log2xml/treebits.js b/src/log2xml/treebits.js
index ffd18fbb18ec..3011b391d88b 100644
--- a/src/log2xml/treebits.js
+++ b/src/log2xml/treebits.js
@@ -5,13 +5,13 @@
 var idCounter = 0;
 
 
-function showTreeToggle(show,hide) {
+function showTreeToggle(isHidden) {
     if (document.getElementById) {
         var id = "toggle_" + idCounter;
         document.writeln(
             '<a href="javascript:toggleTree(\'' + id + '\')" class="toggle" id="' + id + '">' +
-            '<span class="showTree" style="display: none;">+</span>' +
-            '<span class="hideTree">-</span>' +
+            '<span class="showTree" ' + (isHidden ? '' : 'style="display: none;"') + '>+</span>' +
+            '<span class="hideTree" ' + (isHidden ? 'style="display: none;"' : '') + '>-</span>' +
             '</a>');
         idCounter = idCounter + 1;
     }