使用git diff查看不同文件或者不同commit之间的区别
<h2 class="no_toc" id="目录">目录</h2>
<ul id="markdown-toc">
<li><a href="#1-查看不同文件的区别" id="markdown-toc-1-查看不同文件的区别">1. 查看不同文件的区别</a></li>
<li><a href="#2-查看不同commit之间的修改" id="markdown-toc-2-查看不同commit之间的修改">2. 查看不同commit之间的修改</a></li>
<li><a href="#3-把diff的转换为html保存" id="markdown-toc-3-把diff的转换为html保存">3. 把diff的转换为html保存</a></li>
<li><a href="#4-ansi2htmlsh文件内容" id="markdown-toc-4-ansi2htmlsh文件内容">4. ansi2html.sh文件内容</a></li>
</ul>
<h2 id="1-查看不同文件的区别">1. 查看不同文件的区别</h2>
<p><code class="language-plaintext highlighter-rouge">a.txt</code>和<code class="language-plaintext highlighter-rouge">b.txt</code>不在版本控制系统中:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git diff <span class="nt">--color-words</span> <span class="nt">--no-index</span> a.txt b.txt
</code></pre></div></div>
<h2 id="2-查看不同commit之间的修改">2. 查看不同commit之间的修改</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git diff <span class="nt">--color-words</span> HEAD~4 HEAD~3
git diff <span class="nt">--color-words</span> ac238c26 5d449a61
</code></pre></div></div>
<h2 id="3-把diff的转换为html保存">3. 把diff的转换为html保存</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 首先安装ansi2html</span>
<span class="c"># https://github.com/pixelb/scripts/blob/master/scripts/ansi2html.sh</span>
wget <span class="s2">"http://www.pixelbeat.org/scripts/ansi2html.sh"</span> <span class="nt">-O</span> ansi2html.sh
<span class="nb">chmod</span> +x ansi2html.sh
git diff <span class="nt">--color-words</span> HEAD~4 HEAD~3 | ansi2html.sh <span class="o">></span> docs/diff.html
</code></pre></div></div>
<p>然后可以用浏览器打开<code class="language-plaintext highlighter-rouge">docs/diff.html</code>查看,打印成pdf文件也可以</p>
<h2 id="4-ansi2htmlsh文件内容">4. ansi2html.sh文件内容</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/sh</span>
<span class="c"># Convert ANSI (terminal) colours and attributes to HTML</span>
<span class="c"># Licence: LGPLv2</span>
<span class="c"># Author:</span>
<span class="c"># http://www.pixelbeat.org/docs/terminal_colours/</span>
<span class="c"># Examples:</span>
<span class="c"># ls -l --color=always | ansi2html.sh > ls.html</span>
<span class="c"># git show --color | ansi2html.sh > last_change.html</span>
<span class="c"># Generally one can use the `script` util to capture full terminal output.</span>
<span class="c"># Changes:</span>
<span class="c"># V0.1, 24 Apr 2008, Initial release</span>
<span class="c"># V0.2, 01 Jan 2009, Phil Harnish <philharnish@gmail.com></span>
<span class="c"># Support `git diff --color` output by</span>
<span class="c"># matching ANSI codes that specify only</span>
<span class="c"># bold or background colour.</span>
<span class="c"># P@draigBrady.com</span>
<span class="c"># Support `ls --color` output by stripping</span>
<span class="c"># redundant leading 0s from ANSI codes.</span>
<span class="c"># Support `grep --color=always` by stripping</span>
<span class="c"># unhandled ANSI codes (specifically ^[[K).</span>
<span class="c"># V0.3, 20 Mar 2009, http://eexpress.blog.ubuntu.org.cn/</span>
<span class="c"># Remove cat -v usage which mangled non ascii input.</span>
<span class="c"># Cleanup regular expressions used.</span>
<span class="c"># Support other attributes like reverse, ...</span>
<span class="c"># P@draigBrady.com</span>
<span class="c"># Correctly nest <span> tags (even across lines).</span>
<span class="c"># Add a command line option to use a dark background.</span>
<span class="c"># Strip more terminal control codes.</span>
<span class="c"># V0.4, 17 Sep 2009, P@draigBrady.com</span>
<span class="c"># Handle codes with combined attributes and color.</span>
<span class="c"># Handle isolated <bold> attributes with css.</span>
<span class="c"># Strip more terminal control codes.</span>
<span class="c"># V0.26, 16 Nov 2019</span>
<span class="c"># http://github.com/pixelb/scripts/commits/master/scripts/ansi2html.sh</span>
gawk <span class="nt">--version</span> <span class="o">></span>/dev/null <span class="o">||</span> <span class="nb">exit </span>1
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--version"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nb">printf</span> <span class="s1">'0.26\n'</span> <span class="o">&&</span> <span class="nb">exit
</span><span class="k">fi
</span>usage<span class="o">()</span>
<span class="o">{</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="se">\</span>
<span class="s1">'This utility converts ANSI codes in data passed to stdin
It has 4 optional parameters:
--bg=dark --palette=linux|solarized|tango|xterm --css-only|--body-only
E.g.: ls -l --color=always | ansi2html.sh --bg=dark > ls.html'</span> <span class="o">></span>&2
<span class="nb">exit</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--help"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span>usage
<span class="k">fi
</span>processArg<span class="o">()</span>
<span class="o">{</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--bg=dark"</span> <span class="o">]</span> <span class="o">&&</span> <span class="o">{</span> <span class="nv">dark_bg</span><span class="o">=</span><span class="nb">yes</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span> <span class="o">}</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--css-only"</span> <span class="o">]</span> <span class="o">&&</span> <span class="o">{</span> <span class="nv">css_only</span><span class="o">=</span><span class="nb">yes</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span> <span class="o">}</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--body-only"</span> <span class="o">]</span> <span class="o">&&</span> <span class="o">{</span> <span class="nv">body_only</span><span class="o">=</span><span class="nb">yes</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span> <span class="o">}</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--palette=solarized"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="c"># See http://ethanschoonover.com/solarized</span>
<span class="nv">P0</span><span class="o">=</span>073642<span class="p">;</span> <span class="nv">P1</span><span class="o">=</span>D30102<span class="p">;</span> <span class="nv">P2</span><span class="o">=</span>859900<span class="p">;</span> <span class="nv">P3</span><span class="o">=</span>B58900<span class="p">;</span>
<span class="nv">P4</span><span class="o">=</span>268BD2<span class="p">;</span> <span class="nv">P5</span><span class="o">=</span>D33682<span class="p">;</span> <span class="nv">P6</span><span class="o">=</span>2AA198<span class="p">;</span> <span class="nv">P7</span><span class="o">=</span>EEE8D5<span class="p">;</span>
<span class="nv">P8</span><span class="o">=</span>002B36<span class="p">;</span> <span class="nv">P9</span><span class="o">=</span>CB4B16<span class="p">;</span> <span class="nv">P10</span><span class="o">=</span>586E75<span class="p">;</span> <span class="nv">P11</span><span class="o">=</span>657B83<span class="p">;</span>
<span class="nv">P12</span><span class="o">=</span>839496<span class="p">;</span> <span class="nv">P13</span><span class="o">=</span>6C71C4<span class="p">;</span> <span class="nv">P14</span><span class="o">=</span>93A1A1<span class="p">;</span> <span class="nv">P15</span><span class="o">=</span>FDF6E3<span class="p">;</span>
<span class="k">return</span><span class="p">;</span>
<span class="k">elif</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--palette=solarized-xterm"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="c"># Above mapped onto the xterm 256 color palette</span>
<span class="nv">P0</span><span class="o">=</span>262626<span class="p">;</span> <span class="nv">P1</span><span class="o">=</span>AF0000<span class="p">;</span> <span class="nv">P2</span><span class="o">=</span>5F8700<span class="p">;</span> <span class="nv">P3</span><span class="o">=</span>AF8700<span class="p">;</span>
<span class="nv">P4</span><span class="o">=</span>0087FF<span class="p">;</span> <span class="nv">P5</span><span class="o">=</span>AF005F<span class="p">;</span> <span class="nv">P6</span><span class="o">=</span>00AFAF<span class="p">;</span> <span class="nv">P7</span><span class="o">=</span>E4E4E4<span class="p">;</span>
<span class="nv">P8</span><span class="o">=</span>1C1C1C<span class="p">;</span> <span class="nv">P9</span><span class="o">=</span>D75F00<span class="p">;</span> <span class="nv">P10</span><span class="o">=</span>585858<span class="p">;</span> <span class="nv">P11</span><span class="o">=</span>626262<span class="p">;</span>
<span class="nv">P12</span><span class="o">=</span>808080<span class="p">;</span> <span class="nv">P13</span><span class="o">=</span>5F5FAF<span class="p">;</span> <span class="nv">P14</span><span class="o">=</span>8A8A8A<span class="p">;</span> <span class="nv">P15</span><span class="o">=</span>FFFFD7<span class="p">;</span>
<span class="k">return</span><span class="p">;</span>
<span class="k">elif</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--palette=tango"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="c"># Gnome default</span>
<span class="nv">P0</span><span class="o">=</span>000000<span class="p">;</span> <span class="nv">P1</span><span class="o">=</span>CC0000<span class="p">;</span> <span class="nv">P2</span><span class="o">=</span>4E9A06<span class="p">;</span> <span class="nv">P3</span><span class="o">=</span>C4A000<span class="p">;</span>
<span class="nv">P4</span><span class="o">=</span>3465A4<span class="p">;</span> <span class="nv">P5</span><span class="o">=</span>75507B<span class="p">;</span> <span class="nv">P6</span><span class="o">=</span>06989A<span class="p">;</span> <span class="nv">P7</span><span class="o">=</span>D3D7CF<span class="p">;</span>
<span class="nv">P8</span><span class="o">=</span>555753<span class="p">;</span> <span class="nv">P9</span><span class="o">=</span>EF2929<span class="p">;</span> <span class="nv">P10</span><span class="o">=</span>8AE234<span class="p">;</span> <span class="nv">P11</span><span class="o">=</span>FCE94F<span class="p">;</span>
<span class="nv">P12</span><span class="o">=</span>729FCF<span class="p">;</span> <span class="nv">P13</span><span class="o">=</span>AD7FA8<span class="p">;</span> <span class="nv">P14</span><span class="o">=</span>34E2E2<span class="p">;</span> <span class="nv">P15</span><span class="o">=</span>EEEEEC<span class="p">;</span>
<span class="k">return</span><span class="p">;</span>
<span class="k">elif</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--palette=xterm"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nv">P0</span><span class="o">=</span>000000<span class="p">;</span> <span class="nv">P1</span><span class="o">=</span>CD0000<span class="p">;</span> <span class="nv">P2</span><span class="o">=</span>00CD00<span class="p">;</span> <span class="nv">P3</span><span class="o">=</span>CDCD00<span class="p">;</span>
<span class="nv">P4</span><span class="o">=</span>0000EE<span class="p">;</span> <span class="nv">P5</span><span class="o">=</span>CD00CD<span class="p">;</span> <span class="nv">P6</span><span class="o">=</span>00CDCD<span class="p">;</span> <span class="nv">P7</span><span class="o">=</span>E5E5E5<span class="p">;</span>
<span class="nv">P8</span><span class="o">=</span>7F7F7F<span class="p">;</span> <span class="nv">P9</span><span class="o">=</span>FF0000<span class="p">;</span> <span class="nv">P10</span><span class="o">=</span>00FF00<span class="p">;</span> <span class="nv">P11</span><span class="o">=</span>FFFF00<span class="p">;</span>
<span class="nv">P12</span><span class="o">=</span>5C5CFF<span class="p">;</span> <span class="nv">P13</span><span class="o">=</span>FF00FF<span class="p">;</span> <span class="nv">P14</span><span class="o">=</span>00FFFF<span class="p">;</span> <span class="nv">P15</span><span class="o">=</span>FFFFFF<span class="p">;</span>
<span class="k">return</span><span class="p">;</span>
<span class="k">else</span> <span class="c"># linux console</span>
<span class="nv">P0</span><span class="o">=</span>000000<span class="p">;</span> <span class="nv">P1</span><span class="o">=</span>AA0000<span class="p">;</span> <span class="nv">P2</span><span class="o">=</span>00AA00<span class="p">;</span> <span class="nv">P3</span><span class="o">=</span>AA5500<span class="p">;</span>
<span class="nv">P4</span><span class="o">=</span>0000AA<span class="p">;</span> <span class="nv">P5</span><span class="o">=</span>AA00AA<span class="p">;</span> <span class="nv">P6</span><span class="o">=</span>00AAAA<span class="p">;</span> <span class="nv">P7</span><span class="o">=</span>AAAAAA<span class="p">;</span>
<span class="nv">P8</span><span class="o">=</span>555555<span class="p">;</span> <span class="nv">P9</span><span class="o">=</span>FF5555<span class="p">;</span> <span class="nv">P10</span><span class="o">=</span>55FF55<span class="p">;</span> <span class="nv">P11</span><span class="o">=</span>FFFF55<span class="p">;</span>
<span class="nv">P12</span><span class="o">=</span>5555FF<span class="p">;</span> <span class="nv">P13</span><span class="o">=</span>FF55FF<span class="p">;</span> <span class="nv">P14</span><span class="o">=</span>55FFFF<span class="p">;</span> <span class="nv">P15</span><span class="o">=</span>FFFFFF<span class="p">;</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--palette=linux"</span> <span class="o">]</span> <span class="o">&&</span> <span class="k">return</span><span class="p">;</span>
<span class="k">fi</span>
<span class="o">}</span>
processArg <span class="c">#defaults</span>
<span class="k">for </span>var <span class="k">in</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span><span class="p">;</span> <span class="k">do </span>processArg <span class="nv">$var</span><span class="p">;</span> <span class="k">done</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$css_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> usage
<span class="c"># Mac OSX's GNU sed is installed as gsed</span>
<span class="c"># use e.g. homebrew 'gnu-sed' to get it</span>
<span class="k">if</span> <span class="o">!</span> <span class="nb">sed</span> <span class="nt">--version</span> <span class="o">></span>/dev/null 2>&1<span class="p">;</span> <span class="k">then
if </span>gsed <span class="nt">--version</span> <span class="o">></span>/dev/null 2>&1<span class="p">;</span> <span class="k">then
</span><span class="nb">alias sed</span><span class="o">=</span>gsed
<span class="k">else
</span><span class="nb">echo</span> <span class="s2">"Error, can't find an acceptable GNU sed."</span> <span class="o">></span>&2
<span class="nb">exit </span>1
<span class="k">fi
fi</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$css_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s1">'%s'</span> <span class="s2">"<html>
<head>
<meta http-equiv=</span><span class="se">\"</span><span class="s2">Content-Type</span><span class="se">\"</span><span class="s2"> content=</span><span class="se">\"</span><span class="s2">text/html; charset=utf-8</span><span class="se">\"</span><span class="s2">/>
<style type=</span><span class="se">\"</span><span class="s2">text/css</span><span class="se">\"</span><span class="s2">>
pre { white-space: pre-wrap; }
"</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">".ef0,.f0 { color: #</span><span class="nv">$P0</span><span class="s2">; } .eb0,.b0 { background-color: #</span><span class="nv">$P0</span><span class="s2">; }
.ef1,.f1 { color: #</span><span class="nv">$P1</span><span class="s2">; } .eb1,.b1 { background-color: #</span><span class="nv">$P1</span><span class="s2">; }
.ef2,.f2 { color: #</span><span class="nv">$P2</span><span class="s2">; } .eb2,.b2 { background-color: #</span><span class="nv">$P2</span><span class="s2">; }
.ef3,.f3 { color: #</span><span class="nv">$P3</span><span class="s2">; } .eb3,.b3 { background-color: #</span><span class="nv">$P3</span><span class="s2">; }
.ef4,.f4 { color: #</span><span class="nv">$P4</span><span class="s2">; } .eb4,.b4 { background-color: #</span><span class="nv">$P4</span><span class="s2">; }
.ef5,.f5 { color: #</span><span class="nv">$P5</span><span class="s2">; } .eb5,.b5 { background-color: #</span><span class="nv">$P5</span><span class="s2">; }
.ef6,.f6 { color: #</span><span class="nv">$P6</span><span class="s2">; } .eb6,.b6 { background-color: #</span><span class="nv">$P6</span><span class="s2">; }
.ef7,.f7 { color: #</span><span class="nv">$P7</span><span class="s2">; } .eb7,.b7 { background-color: #</span><span class="nv">$P7</span><span class="s2">; }
.ef8, .f0 > .bold,.bold > .f0 { color: #</span><span class="nv">$P8</span><span class="s2">; font-weight: normal; }
.ef9, .f1 > .bold,.bold > .f1 { color: #</span><span class="nv">$P9</span><span class="s2">; font-weight: normal; }
.ef10,.f2 > .bold,.bold > .f2 { color: #</span><span class="nv">$P10</span><span class="s2">; font-weight: normal; }
.ef11,.f3 > .bold,.bold > .f3 { color: #</span><span class="nv">$P11</span><span class="s2">; font-weight: normal; }
.ef12,.f4 > .bold,.bold > .f4 { color: #</span><span class="nv">$P12</span><span class="s2">; font-weight: normal; }
.ef13,.f5 > .bold,.bold > .f5 { color: #</span><span class="nv">$P13</span><span class="s2">; font-weight: normal; }
.ef14,.f6 > .bold,.bold > .f6 { color: #</span><span class="nv">$P14</span><span class="s2">; font-weight: normal; }
.ef15,.f7 > .bold,.bold > .f7 { color: #</span><span class="nv">$P15</span><span class="s2">; font-weight: normal; }
.eb8 { background-color: #</span><span class="nv">$P8</span><span class="s2">; }
.eb9 { background-color: #</span><span class="nv">$P9</span><span class="s2">; }
.eb10 { background-color: #</span><span class="nv">$P10</span><span class="s2">; }
.eb11 { background-color: #</span><span class="nv">$P11</span><span class="s2">; }
.eb12 { background-color: #</span><span class="nv">$P12</span><span class="s2">; }
.eb13 { background-color: #</span><span class="nv">$P13</span><span class="s2">; }
.eb14 { background-color: #</span><span class="nv">$P14</span><span class="s2">; }
.eb15 { background-color: #</span><span class="nv">$P15</span><span class="s2">; }
"</span>
<span class="c"># The default xterm 256 colour palette</span>
<span class="k">for </span>red <span class="k">in </span>0 1 2 3 4 5 <span class="p">;</span> <span class="k">do
for </span>green <span class="k">in </span>0 1 2 3 4 5 <span class="p">;</span> <span class="k">do
for </span>blue <span class="k">in </span>0 1 2 3 4 5 <span class="p">;</span> <span class="k">do
</span><span class="nv">c</span><span class="o">=</span><span class="k">$((</span><span class="m">16</span> <span class="o">+</span> <span class="o">(</span><span class="nv">$red</span> <span class="o">*</span> <span class="m">36</span><span class="o">)</span> <span class="o">+</span> <span class="o">(</span><span class="nv">$green</span> <span class="o">*</span> <span class="m">6</span><span class="o">)</span> <span class="o">+</span> <span class="nv">$blue</span><span class="k">))</span>
<span class="nv">r</span><span class="o">=</span><span class="k">$((</span><span class="o">(</span><span class="nv">$red</span> <span class="o">*</span> <span class="m">40</span> <span class="o">+</span> <span class="m">55</span><span class="o">)</span> <span class="o">*</span> <span class="o">(</span><span class="nv">$red</span> <span class="o">></span> <span class="m">0</span><span class="k">))</span><span class="o">)</span>
<span class="nv">g</span><span class="o">=</span><span class="k">$((</span><span class="o">(</span><span class="nv">$green</span> <span class="o">*</span> <span class="m">40</span> <span class="o">+</span> <span class="m">55</span><span class="o">)</span> <span class="o">*</span> <span class="o">(</span><span class="nv">$green</span> <span class="o">></span> <span class="m">0</span><span class="k">))</span><span class="o">)</span>
<span class="nv">b</span><span class="o">=</span><span class="k">$((</span><span class="o">(</span><span class="nv">$blue</span> <span class="o">*</span> <span class="m">40</span> <span class="o">+</span> <span class="m">55</span><span class="o">)</span> <span class="o">*</span> <span class="o">(</span><span class="nv">$blue</span> <span class="o">></span> <span class="m">0</span><span class="k">))</span><span class="o">)</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">".ef%d { color: #%2.2x%2.2x%2.2x; } "</span> <span class="nv">$c</span> <span class="nv">$r</span> <span class="nv">$g</span> <span class="nv">$b</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">".eb%d { background-color: #%2.2x%2.2x%2.2x; }</span><span class="se">\n</span><span class="s2">"</span> <span class="nv">$c</span> <span class="nv">$r</span> <span class="nv">$g</span> <span class="nv">$b</span>
<span class="k">done
done
done
for </span>gray <span class="k">in</span> <span class="si">$(</span><span class="nb">seq </span>0 23<span class="si">)</span><span class="p">;</span> <span class="k">do
</span><span class="nv">c</span><span class="o">=</span><span class="k">$((</span><span class="nv">$gray</span><span class="o">+</span><span class="m">232</span><span class="k">))</span>
<span class="nv">l</span><span class="o">=</span><span class="k">$((</span><span class="nv">$gray</span><span class="o">*</span><span class="m">10</span> <span class="o">+</span> <span class="m">8</span><span class="k">))</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">".ef%d { color: #%2.2x%2.2x%2.2x; } "</span> <span class="nv">$c</span> <span class="nv">$l</span> <span class="nv">$l</span> <span class="nv">$l</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">".eb%d { background-color: #%2.2x%2.2x%2.2x; }</span><span class="se">\n</span><span class="s2">"</span> <span class="nv">$c</span> <span class="nv">$l</span> <span class="nv">$l</span> <span class="nv">$l</span>
<span class="k">done</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s1">'%s'</span> <span class="s1">'
.f9 { color: '</span><span class="sb">`</span><span class="o">[</span> <span class="s2">"</span><span class="nv">$dark_bg</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">printf</span> <span class="s2">"#</span><span class="nv">$P7</span><span class="s2">;"</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">"#</span><span class="nv">$P0</span><span class="s2">;"</span><span class="sb">`</span><span class="s1">' }
.b9 { background-color: #'</span><span class="sb">`</span><span class="o">[</span> <span class="s2">"</span><span class="nv">$dark_bg</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">printf</span> <span class="nv">$P0</span> <span class="o">||</span> <span class="nb">printf</span> <span class="nv">$P15</span><span class="sb">`</span><span class="s1">'; }
.f9 > .bold,.bold > .f9, body.f9 > pre > .bold {
/* Bold is heavy black on white, or bright white
depending on the default background */
color: '</span><span class="sb">`</span><span class="o">[</span> <span class="s2">"</span><span class="nv">$dark_bg</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">printf</span> <span class="s2">"#</span><span class="nv">$P15</span><span class="s2">;"</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s2">"#</span><span class="nv">$P0</span><span class="s2">;"</span><span class="sb">`</span><span class="s1">'
font-weight: '</span><span class="sb">`</span><span class="o">[</span> <span class="s2">"</span><span class="nv">$dark_bg</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">printf</span> <span class="s1">'normal;'</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s1">'bold;'</span><span class="sb">`</span><span class="s1">'
}
.reverse {
/* CSS does not support swapping fg and bg colours unfortunately,
so just hardcode something that will look OK on all backgrounds. */
'</span><span class="s2">"color: #</span><span class="nv">$P0</span><span class="s2">; background-color: #</span><span class="nv">$P7</span><span class="s2">;"</span><span class="s1">'
}
.underline { text-decoration: underline; }
.line-through { text-decoration: line-through; }
.blink { text-decoration: blink; }
/* Avoid pixels between adjacent span elements.
Note this only works for lines less than 80 chars
where we close span elements on the same line.
span { display: inline-block; }
*/
'</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$css_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="se">\</span>
<span class="s1">'To use the css generated from --css-only, do: '</span><span class="se">\</span>
<span class="s1">'<head><link rel="stylesheet" type="text/css" href="style.css"></head>'</span> <span class="o">></span>&2
<span class="o">[</span> <span class="s2">"</span><span class="nv">$css_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">exit</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s1">'%s'</span> <span class="s1">'</style>
</head>
<body class="f9 b9">
<pre>
'</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="s1">'Be sure to use <body class="f9 b9"> and <pre>'</span> <span class="o">></span>&2
<span class="nv">p</span><span class="o">=</span><span class="s1">'\x1b\['</span> <span class="c">#shortcut to match escape codes</span>
<span class="c"># Handle various xterm control sequences.</span>
<span class="c"># See /usr/share/doc/xterm-*/ctlseqs.txt</span>
<span class="nb">sed</span> <span class="s2">"
# escape ampersand and quote
s#&#</span><span class="se">\&</span><span class="s2">amp;#g; s#</span><span class="se">\"</span><span class="s2">#</span><span class="se">\&</span><span class="s2">quot;#g;
s#</span><span class="se">\x</span><span class="s2">1b[^</span><span class="se">\x</span><span class="s2">1b]*</span><span class="se">\x</span><span class="s2">1b</span><span class="se">\\\#</span><span class="s2">#g # strip anything between </span><span class="se">\e</span><span class="s2"> and ST
s#</span><span class="se">\x</span><span class="s2">1b][0-9]*;[^</span><span class="se">\a</span><span class="s2">]*</span><span class="se">\a</span><span class="s2">##g # strip any OSC (xterm title etc.)
s#</span><span class="se">\r\$</span><span class="s2">## # strip trailing </span><span class="se">\r</span><span class="s2">
# strip other non SGR escape sequences
s#[</span><span class="se">\x</span><span class="s2">07]##g
s#</span><span class="se">\x</span><span class="s2">1b[]>=</span><span class="se">\]</span><span class="s2">[0-9;]*##g
s#</span><span class="se">\x</span><span class="s2">1bP+.</span><span class="se">\{</span><span class="s2">5</span><span class="se">\}</span><span class="s2">##g
# Mark cursor positioning codes </span><span class="se">\"</span><span class="s2">Jr;c;
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,2</span><span class="se">\}\)</span><span class="s2">G#</span><span class="se">\"</span><span class="s2">J;</span><span class="se">\1</span><span class="s2">;#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,2</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,2</span><span class="se">\}\)</span><span class="s2">H#</span><span class="se">\"</span><span class="s2">J</span><span class="se">\1</span><span class="s2">;</span><span class="se">\2</span><span class="s2">;#g
# Mark clear as </span><span class="se">\"</span><span class="s2">Cn where n=1 is screen and n=0 is to end-of-line
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">H#</span><span class="se">\"</span><span class="s2">C1;#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">K#</span><span class="se">\"</span><span class="s2">C0;#g
# Mark Cursor move columns as </span><span class="se">\"</span><span class="s2">Mn where n is +ve for right, -ve for left
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">C#</span><span class="se">\"</span><span class="s2">M1;#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,</span><span class="se">\}\)</span><span class="s2">C#</span><span class="se">\"</span><span class="s2">M</span><span class="se">\1</span><span class="s2">;#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,</span><span class="se">\}\)</span><span class="s2">D#</span><span class="se">\"</span><span class="s2">M-</span><span class="se">\1</span><span class="s2">;#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,</span><span class="se">\}\)</span><span class="s2">P#</span><span class="se">\"</span><span class="s2">X</span><span class="se">\1</span><span class="s2">;#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">[0-9;?]*[^0-9;?m]##g
"</span> |
<span class="c"># Normalize the input before transformation</span>
<span class="nb">sed</span> <span class="s2">"
# escape HTML (ampersand and quote done above)
s#>#</span><span class="se">\&</span><span class="s2">gt;#g; s#<#</span><span class="se">\&</span><span class="s2">lt;#g;
# handle truecolor
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">38;2;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#</span><span class="se">\</span><span class="s2">
<span style=</span><span class="se">\"</span><span class="s2">color:rgb(</span><span class="se">\1\,\2\,\3\)\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">48;2;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#</span><span class="se">\</span><span class="s2">
<span style=</span><span class="se">\"</span><span class="s2">background-color:rgb(</span><span class="se">\1\,\2\,\3\)\"</span><span class="s2">>#g
# normalize SGR codes a little
# split 256 colors out and mark so that they're not
# recognised by the following 'split combined' line
:e
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9;]</span><span class="se">\{</span><span class="s2">1,</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[34]8;5;[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\1</span><span class="s2">m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">¬</span><span class="se">\2</span><span class="s2">m#g; t e
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[34]8;5;[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">¬</span><span class="se">\1</span><span class="s2">m#g;
:c
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,</span><span class="se">\}\)</span><span class="s2">;</span><span class="se">\(</span><span class="s2">[0-9;]</span><span class="se">\{</span><span class="s2">1,</span><span class="se">\}\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\1</span><span class="s2">m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\2</span><span class="s2">m#g; t c # split combined
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">0</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\1</span><span class="s2">#g #strip leading 0
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">1m</span><span class="se">\(\(</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">[4579]m</span><span class="se">\)</span><span class="s2">*</span><span class="se">\)</span><span class="s2">#</span><span class="se">\1</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">1m#g #bold last (with clr)
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">0m#g #add leading 0 to norm
# undo any 256 color marking
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">¬</span><span class="se">\(</span><span class="s2">[34]8;5;[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="se">\1</span><span class="s2">m#g;
# map 16 color codes to color + bold
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">9</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3</span><span class="se">\1</span><span class="s2">m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">1m#g;
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">10</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4</span><span class="se">\1</span><span class="s2">m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">1m#g;
# change 'reset' code to </span><span class="se">\"</span><span class="s2">R
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">0m#</span><span class="se">\"</span><span class="s2">R;#g
"</span> |
<span class="c"># Convert SGR sequences to HTML</span>
<span class="nb">sed</span> <span class="s2">"
# common combinations to minimise html (optional)
:f
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3[0-7]m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3</span><span class="se">\1</span><span class="s2">m#g; t f
:b
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4[0-7]m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4</span><span class="se">\1</span><span class="s2">m#g; t b
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m#<span class=</span><span class="se">\"</span><span class="s2">f</span><span class="se">\1</span><span class="s2"> b</span><span class="se">\2\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3</span><span class="se">\(</span><span class="s2">[0-7]</span><span class="se">\)</span><span class="s2">m#<span class=</span><span class="se">\"</span><span class="s2">f</span><span class="se">\2</span><span class="s2"> b</span><span class="se">\1\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">1m#<span class=</span><span class="se">\"</span><span class="s2">bold</span><span class="se">\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4m#<span class=</span><span class="se">\"</span><span class="s2">underline</span><span class="se">\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">5m#<span class=</span><span class="se">\"</span><span class="s2">blink</span><span class="se">\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">7m#<span class=</span><span class="se">\"</span><span class="s2">reverse</span><span class="se">\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">9m#<span class=</span><span class="se">\"</span><span class="s2">line-through</span><span class="se">\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">3</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\)</span><span class="s2">m#<span class=</span><span class="se">\"</span><span class="s2">f</span><span class="se">\1\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">4</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\)</span><span class="s2">m#<span class=</span><span class="se">\"</span><span class="s2">b</span><span class="se">\1\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">38;5;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#<span class=</span><span class="se">\"</span><span class="s2">ef</span><span class="se">\1\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">48;5;</span><span class="se">\(</span><span class="s2">[0-9]</span><span class="se">\{</span><span class="s2">1,3</span><span class="se">\}\)</span><span class="s2">m#<span class=</span><span class="se">\"</span><span class="s2">eb</span><span class="se">\1\"</span><span class="s2">>#g
s#</span><span class="k">${</span><span class="nv">p</span><span class="k">}</span><span class="s2">[0-9;]*m##g # strip unhandled codes
"</span> |
<span class="c"># Convert alternative character set and handle cursor movement codes</span>
<span class="c"># Note we convert here, as if we do at start we have to worry about avoiding</span>
<span class="c"># conversion of SGR codes etc., whereas doing here we only have to</span>
<span class="c"># avoid conversions of stuff between &...; or <...></span>
<span class="c">#</span>
<span class="c"># Note we could use sed to do this based around:</span>
<span class="c"># sed 'y/abcdefghijklmnopqrstuvwxyz{}`~/▒␉␌␍␊°±␋┘┐┌└┼⎺⎻─⎼⎽├┤┴┬│≤≥π£◆·/'</span>
<span class="c"># However that would be very awkward as we need to only conv some input.</span>
<span class="c"># The basic scheme that we do in the awk script below is:</span>
<span class="c"># 1. enable transliterate once "T1; is seen</span>
<span class="c"># 2. disable once "T0; is seen (may be on diff line)</span>
<span class="c"># 3. never transliterate between &; or <> chars</span>
<span class="c"># 4. track x,y movements and active display mode at each position</span>
<span class="c"># 5. buffer line/screen and dump when required</span>
<span class="nb">sed</span> <span class="s2">"
# change 'smacs' and 'rmacs' to </span><span class="se">\"</span><span class="s2">T1 and </span><span class="se">\"</span><span class="s2">T0 to simplify matching.
s#</span><span class="se">\x</span><span class="s2">1b(0#</span><span class="se">\"</span><span class="s2">T1;#g;
s#</span><span class="se">\x</span><span class="s2">0E#</span><span class="se">\"</span><span class="s2">T1;#g;
s#</span><span class="se">\x</span><span class="s2">1b(B#</span><span class="se">\"</span><span class="s2">T0;#g
s#</span><span class="se">\x</span><span class="s2">0F#</span><span class="se">\"</span><span class="s2">T0;#g
"</span> |
<span class="o">(</span>
gawk <span class="s1">'
function dump_line(l,del,c,blanks,ret) {
for(c=1;c<maxX;c++) {
if ((c SUBSEP l) in attr || alength(cur)) {
ret = ret blanks fixas(cur,attr[c,l])
if(del) delete attr[c,l]
blanks=""
}
if ((c SUBSEP l) in dump) {
ret=ret blanks dump[c,l]
if(del) delete dump[c,l]
blanks=""
} else blanks=blanks " "
}
if(alength(cur)) ret=ret blanks
return ret
}
function dump_screen(l,ret) {
for(l=1;l<=maxY;l++)
ret=ret dump_line(l,0) "\n"
return ret fixas(cur, "")
}
function atos(a,i,ret) {
for(i=1;i<=alength(a);i++) if(i in a) ret=ret a[i]
return ret
}
function alength(a, i, k) {
k = 0
for(i in a) k++
return k
}
function fixas(a,s,spc,i,attr,rm,ret) {
spc=alength(a)
l=split(s,attr,">")
for(i=1;i<=spc;i++) {
rm=rm?rm:(a[i]!=attr[i]">")
if(rm) {
ret=ret "</span>"
delete a[i];
}
}
for(i=1;i<l;i++) {
attr[i]=attr[i]">"
if(a[i]!=attr[i]) {
a[i]=attr[i]
ret = ret attr[i]
}
}
return ret
}
function encode(string,start,end,i,ret,pos,sc,buf) {
if(!end) end=length(string);
if(!start) start=1;
state=3
for(i=1;i<=length(string);i++) {
c=substr(string,i,1)
if(state==2) {
sc=sc c
if(c==";") {
c=sc
state=last_mode
} else continue
} else {
if(c=="\r") { x=1; continue }
if(c=="<") {
# Change attributes - store current active
# attributes in span array
split(substr(string,i),cord,">");
i+=length(cord[1])
span[++spc]=cord[1] ">"
continue
}
else if(c=="&") {
# All goes to single position till we see a semicolon
sc=c
state=2
continue
}
else if(c=="\b") {
# backspace move insertion point back 1
if(spc) attr[x,y]=atos(span)
x=x>1?x-1:1
continue
}
else if(c=="\"") {
split(substr(string,i+2),cord,";")
cc=substr(string,i+1,1);
if(cc=="T") {
# Transliterate on/off
if(cord[1]==1&&state==3) last_mode=state=4
if(cord[1]==0&&state==4) last_mode=state=3
}
else if(cc=="C") {
# Clear
if(cord[1]+0) {
# Screen - if Recording dump screen
if(dumpStatus==dsActive) ret=ret dump_screen()
dumpStatus=dsActive
delete dump
delete attr
x=y=1
} else {
# To end of line
for(pos=x;pos<maxX;pos++) {
dump[pos,y]=" "
if (!spc) delete attr[pos,y]
else attr[pos,y]=atos(span)
}
}
}
else if(cc=="J") {
# Jump to x,y
i+=length(cord[2])+1
# If line is higher - dump previous screen
if(dumpStatus==dsActive&&cord[1]<y) {
ret=ret dump_screen();
dumpStatus=dsNew;
}
x=cord[2]
if(length(cord[1]) && y!=cord[1]){
y=cord[1]
if(y>maxY) maxY=y
# Change y - start recording
dumpStatus=dumpStatus?dumpStatus:dsReset
}
}
else if(cc=="M") {
# Move left/right on current line
x+=cord[1]
}
else if(cc=="X") {
# delete on right
for(pos=x;pos<=maxX;pos++) {
nx=pos+cord[1]
if(nx<maxX) {
if((nx SUBSEP y) in attr) attr[pos,y] = attr[nx,y]
else delete attr[pos,y]
if((nx SUBSEP y) in dump) dump[pos,y] = dump[nx,y]
else delete dump[pos,y]
} else if(spc) {
attr[pos,y]=atos(span)
dump[pos,y]=" "
}
}
}
else if(cc=="R") {
# Reset attributes
while(spc) delete span[spc--]
}
i+=length(cord[1])+2
continue
}
else if(state==4&&i>=start&&i<=end&&c in Trans) c=Trans[c]
}
if(dumpStatus==dsReset) {
delete dump
delete attr
ret=ret"\n"
dumpStatus=dsActive
}
if(dumpStatus==dsNew) {
# After moving/clearing we are now ready to write
# somthing to the screen so start recording now
ret=ret"\n"
dumpStatus=dsActive
}
if(dumpStatus==dsActive||dumpStatus==dsOff) {
dump[x,y] = c
if(!spc) delete attr[x,y]
else attr[x,y] = atos(span)
if(++x>maxX) maxX=x;
}
}
# End of line if dumping increment y and set x back to first col
x=1
if(!dumpStatus) return ret dump_line(y,1);
else if(++y>maxY) maxY=y;
return ret
}
BEGIN{
OFS=FS
# dump screen status
dsOff=0 # Not dumping screen contents just write output direct
dsNew=1 # Just after move/clear waiting for activity to start recording
dsReset=2 # Screen cleared build new empty buffer and record
dsActive=3 # Currently recording
F="abcdefghijklmnopqrstuvwxyz{}`~"
T="▒␉␌␍␊°±␋┘┐┌└┼⎺⎻─⎼⎽├┤┴┬│≤≥π£◆·"
maxX=80
delete cur;
x=y=1
for(i=1;i<=length(F);i++)Trans[substr(F,i,1)]=substr(T,i,1);
}
{ $0=encode($0) }
1
END {
if(dumpStatus) {
print dump_screen();
}
}'</span>
<span class="o">)</span>
<span class="o">[</span> <span class="s2">"</span><span class="nv">$body_only</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">printf</span> <span class="s1">'</pre>
</body>
</html>\n'</span>
</code></pre></div></div>