diff options
-rw-r--r-- | src/log2xml/log2html.xsl | 20 | ||||
-rw-r--r-- | src/log2xml/log2xml.cc | 29 | ||||
-rw-r--r-- | src/log2xml/treebits.js | 6 |
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; } |