bla
[hutstaender.git] / boobies.html
blobfa35c2828fe3f058c652ac586babd2b1c8be8632
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2 <!--get head from index.html-->
3 <html>
4 <head>
5 <title>hut</title>
6 <meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />
7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8 <link rel="stylesheet" href="barium.css" type="text/css">
9 </head>
10 <body>
11 <div class="main">
12 <h1 class="title">
13 40404040404040404040404
14 </h1>
15 <div class="padMenu">
16 <a href="index.html">home</a>
17 <a href="work.html">creations</a>
18 <a href="pub">files</a>
19 </div>
20 <hr />
21 <div class="content">
22 <!--/get-->
23 <h1>boobies.py</h1>
24 The most recent version is on <a href="https://github.com/hut/boobies">github</a>.<br />
25 <a href="pub/boobies.py">raw</a><br />
26 <br />
27 <div class="code" style="white-space: pre; font-family:monospace"><!--run highlight -I --inline-css -f --style freya -O html pub/boobies.py--><span style="color:#c2b680">#!/usr/bin/python</span>
28 <span style="color:#c2b680"># Copyright (C) 2012 Roman Zimbelmann &lt;hut&#64;lavabit.com&gt;</span>
29 <span style="color:#c2b680"># This software is distributed under the terms of the GNU GPL version 3.</span>
30 <span style="color:#afe091">&quot;&quot;&quot;</span>
31 <span style="color:#afe091">boobies.py is a html preprocessor for pre-generated static websites.</span>
32 <span style="color:#afe091"></span>
33 <span style="color:#afe091">It searches your html files for commands in the form of &lt;!-- COMMAND [ARGS] --&gt;</span>
34 <span style="color:#afe091">and evaluates them IN-PLACE. NESTING COMMANDS IS NOT SUPPORTED.</span>
35 <span style="color:#afe091">The following commands exist:</span>
36 <span style="color:#afe091"></span>
37 <span style="color:#afe091">run:</span>
38 <span style="color:#afe091"> &lt;!-- run ls -l --&gt;</span>
39 <span style="color:#afe091"> &lt;!-- /run --&gt;</span>
40 <span style="color:#afe091"></span>
41 <span style="color:#afe091"> This will execute &quot;ls -l&quot; in the shell and insert the output into the block</span>
42 <span style="color:#afe091"></span>
43 <span style="color:#afe091">get:</span>
44 <span style="color:#afe091"> You can write this in index.html:</span>
45 <span style="color:#afe091"></span>
46 <span style="color:#afe091"> &lt;!-- head --&gt;</span>
47 <span style="color:#afe091"> &lt;head&gt;&lt;title&gt;boobies&lt;/title&gt;&lt;/head&gt;</span>
48 <span style="color:#afe091"> &lt;!-- /head --&gt;</span>
49 <span style="color:#afe091"></span>
50 <span style="color:#afe091"> and this in another file:</span>
51 <span style="color:#afe091"> </span>
52 <span style="color:#afe091"> &lt;!-- get head from index.html --&gt;</span>
53 <span style="color:#afe091"> foo</span>
54 <span style="color:#afe091"> &lt;!-- /get --&gt;</span>
55 <span style="color:#afe091"></span>
56 <span style="color:#afe091"> and foo will be replaced by &lt;head&gt;&lt;title&gt;boobies&lt;/title&gt;&lt;/head&gt;.</span>
57 <span style="color:#afe091"></span>
58 <span style="color:#afe091">relative:</span>
59 <span style="color:#afe091"> &lt;!-- relative --&gt;</span>
60 <span style="color:#afe091"> &lt;a href=&quot;about.html&quot;&gt;about&lt;/a&gt;</span>
61 <span style="color:#afe091"> &lt;!-- /relative --&gt;</span>
62 <span style="color:#afe091"></span>
63 <span style="color:#afe091"> If you use this in a &quot;get&quot;-block, it will fix URLs with relative paths.</span>
64 <span style="color:#afe091">&quot;&quot;&quot;</span>
66 <span style="color:#e0af91; font-weight:bold">import</span> os<span style="color:#dcdccc">.</span>path
67 <span style="color:#e0af91; font-weight:bold">import</span> re
68 <span style="color:#e0af91; font-weight:bold">import</span> sys
69 <span style="color:#e0af91; font-weight:bold">from</span> subprocess <span style="color:#e0af91; font-weight:bold">import</span> Popen<span style="color:#dcdccc">,</span> PIPE<span style="color:#dcdccc">,</span> call
71 PATTERN_GET <span style="color:#dcdccc">=</span> r<span style="color:#afe091">'(&lt;!--\s*get\s+(\w+)\s+from\s+([^\s]+)\s*--&gt;\n?)(.*?)(&lt;!--\s*/get\s*--&gt;)'</span>
72 PATTERN_RUN <span style="color:#dcdccc">=</span> r<span style="color:#afe091">'(&lt;!--\s*run\s+(.*?)\s*--&gt;(\n?))(.*?)(&lt;!--\s*/run\s*--&gt;)'</span>
73 PATTERN_RELATIVE <span style="color:#dcdccc">=</span> r<span style="color:#afe091">'(&lt;!--\s*relative\s*--&gt;\n?)(.*?)(&lt;!--\s*/relative\s*--&gt;)'</span>
74 PATTERN_GETURL <span style="color:#dcdccc">=</span> r<span style="color:#afe091">'href=&quot;([^&quot;]+?\.[^&quot;]+?)&quot;'</span>
75 PATTERN_GETKEYWORD <span style="color:#dcdccc">=</span> r<span style="color:#afe091">'&lt;!--\s*{0}\s*--&gt;\n?(.*?)&lt;!--\s*/{0}\s*--&gt;'</span>
77 <span style="color:#e0af91; font-weight:bold">def</span> <span style="color:#a6e1ff">main</span><span style="color:#dcdccc">():</span>
78 <span style="color:#e0af91; font-weight:bold">if</span> <span style="color:#afe091">'-h'</span> <span style="color:#e0af91; font-weight:bold">in</span> sys<span style="color:#dcdccc">.</span>argv <span style="color:#e0af91; font-weight:bold">or</span> <span style="color:#afe091">'--help'</span> <span style="color:#e0af91; font-weight:bold">in</span> sys<span style="color:#dcdccc">.</span>argv <span style="color:#e0af91; font-weight:bold">or</span> <span style="color:#dabfa5; font-weight:bold">len</span><span style="color:#dcdccc">(</span>sys<span style="color:#dcdccc">.</span>argv<span style="color:#dcdccc">) &lt;=</span> <span style="color:#afe091">1</span><span style="color:#dcdccc">:</span>
79 <span style="color:#e0af91; font-weight:bold">return</span> sys<span style="color:#dcdccc">.</span>stdout<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">write</span><span style="color:#dcdccc">(</span><span style="color:#afe091">&quot;usage: boobies.py [--dry] [-h|--help] files...</span><span style="color:#d4b064">\n</span><span style="color:#afe091">&quot;</span><span style="color:#dcdccc">)</span>
81 <span style="color:#e0af91; font-weight:bold">for</span> filename <span style="color:#e0af91; font-weight:bold">in</span> <span style="color:#dcdccc">[</span>s <span style="color:#e0af91; font-weight:bold">for</span> s <span style="color:#e0af91; font-weight:bold">in</span> sys<span style="color:#dcdccc">.</span>argv<span style="color:#dcdccc">[</span><span style="color:#afe091">1</span><span style="color:#dcdccc">:]</span> <span style="color:#e0af91; font-weight:bold">if not</span> s<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">startswith</span><span style="color:#dcdccc">(</span><span style="color:#afe091">'-'</span><span style="color:#dcdccc">)]:</span>
82 tmpname <span style="color:#dcdccc">=</span> filename <span style="color:#dcdccc">+</span> <span style="color:#afe091">&quot;.__new&quot;</span>
84 f <span style="color:#dcdccc">=</span> <span style="color:#dabfa5; font-weight:bold">open</span><span style="color:#dcdccc">(</span>filename<span style="color:#dcdccc">,</span> <span style="color:#afe091">'r'</span><span style="color:#dcdccc">)</span>
85 content <span style="color:#dcdccc">=</span> f<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">read</span><span style="color:#dcdccc">()</span>
86 f<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">close</span><span style="color:#dcdccc">()</span>
87 processed_content <span style="color:#dcdccc">=</span> <span style="color:#a6e1ff">process</span><span style="color:#dcdccc">(</span>content<span style="color:#dcdccc">,</span> filename<span style="color:#dcdccc">)</span>
88 <span style="color:#e0af91; font-weight:bold">if</span> processed_content <span style="color:#dcdccc">==</span> content<span style="color:#dcdccc">:</span>
89 <span style="color:#e0af91; font-weight:bold">print</span><span style="color:#dcdccc">(</span><span style="color:#afe091">&quot;unchanged: %s&quot;</span> <span style="color:#dcdccc">%</span> filename<span style="color:#dcdccc">)</span>
90 <span style="color:#e0af91; font-weight:bold">continue</span>
92 tmp <span style="color:#dcdccc">=</span> <span style="color:#dabfa5; font-weight:bold">open</span><span style="color:#dcdccc">(</span>tmpname<span style="color:#dcdccc">,</span> <span style="color:#afe091">&quot;w&quot;</span><span style="color:#dcdccc">)</span>
93 tmp<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">write</span><span style="color:#dcdccc">(</span>processed_content<span style="color:#dcdccc">)</span>
94 tmp<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">close</span><span style="color:#dcdccc">()</span>
95 <span style="color:#a6e1ff">call</span><span style="color:#dcdccc">([</span><span style="color:#afe091">'diff'</span><span style="color:#dcdccc">,</span> <span style="color:#afe091">'-u'</span><span style="color:#dcdccc">,</span> filename<span style="color:#dcdccc">,</span> tmpname<span style="color:#dcdccc">])</span>
97 <span style="color:#e0af91; font-weight:bold">if</span> <span style="color:#afe091">'--dry'</span> <span style="color:#e0af91; font-weight:bold">in</span> sys<span style="color:#dcdccc">.</span>argv<span style="color:#dcdccc">:</span>
98 os<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">unlink</span><span style="color:#dcdccc">(</span>tmpname<span style="color:#dcdccc">)</span>
99 <span style="color:#e0af91; font-weight:bold">else</span><span style="color:#dcdccc">:</span>
100 <span style="color:#e0af91; font-weight:bold">print</span><span style="color:#dcdccc">(</span><span style="color:#afe091">&quot;writing: %s&quot;</span> <span style="color:#dcdccc">%</span> filename<span style="color:#dcdccc">)</span>
101 os<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">rename</span><span style="color:#dcdccc">(</span>tmpname<span style="color:#dcdccc">,</span> filename<span style="color:#dcdccc">)</span>
103 <span style="color:#e0af91; font-weight:bold">def</span> <span style="color:#a6e1ff">process</span><span style="color:#dcdccc">(</span>content<span style="color:#dcdccc">,</span> filename<span style="color:#dcdccc">):</span>
104 <span style="color:#e0af91; font-weight:bold">global</span> PATH
105 PATH <span style="color:#dcdccc">=</span> os<span style="color:#dcdccc">.</span>path<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">dirname</span><span style="color:#dcdccc">(</span>filename<span style="color:#dcdccc">)</span>
106 content <span style="color:#dcdccc">=</span> re<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">sub</span><span style="color:#dcdccc">(</span>PATTERN_GET<span style="color:#dcdccc">,</span> _command_get<span style="color:#dcdccc">,</span> content<span style="color:#dcdccc">,</span> <span style="color:#afe091">0</span><span style="color:#dcdccc">,</span> re<span style="color:#dcdccc">.</span>S<span style="color:#dcdccc">)</span>
107 content <span style="color:#dcdccc">=</span> re<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">sub</span><span style="color:#dcdccc">(</span>PATTERN_RUN<span style="color:#dcdccc">,</span> _command_run<span style="color:#dcdccc">,</span> content<span style="color:#dcdccc">,</span> <span style="color:#afe091">0</span><span style="color:#dcdccc">,</span> re<span style="color:#dcdccc">.</span>S<span style="color:#dcdccc">)</span>
108 <span style="color:#e0af91; font-weight:bold">return</span> content
111 <span style="color:#e0af91; font-weight:bold">def</span> <span style="color:#a6e1ff">_command_get</span><span style="color:#dcdccc">(</span>m<span style="color:#dcdccc">):</span>
112 filename <span style="color:#dcdccc">=</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">3</span><span style="color:#dcdccc">)</span>
113 keyword <span style="color:#dcdccc">=</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">2</span><span style="color:#dcdccc">)</span>
114 fallback <span style="color:#dcdccc">=</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">4</span><span style="color:#dcdccc">)</span>
116 f <span style="color:#dcdccc">=</span> <span style="color:#dabfa5; font-weight:bold">open</span><span style="color:#dcdccc">(</span>filename<span style="color:#dcdccc">,</span> <span style="color:#afe091">'r'</span><span style="color:#dcdccc">)</span>
117 content <span style="color:#dcdccc">=</span> f<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">read</span><span style="color:#dcdccc">()</span>
118 f<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">close</span><span style="color:#dcdccc">()</span>
119 match <span style="color:#dcdccc">=</span> re<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">search</span><span style="color:#dcdccc">(</span>PATTERN_GETKEYWORD<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">format</span><span style="color:#dcdccc">(</span>keyword<span style="color:#dcdccc">),</span> content<span style="color:#dcdccc">,</span> re<span style="color:#dcdccc">.</span>DOTALL<span style="color:#dcdccc">)</span>
120 <span style="color:#e0af91; font-weight:bold">if</span> match <span style="color:#e0af91; font-weight:bold">is None</span><span style="color:#dcdccc">:</span>
121 sys<span style="color:#dcdccc">.</span>stderr<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">write</span><span style="color:#dcdccc">(</span><span style="color:#afe091">&quot;Could not find keyword {0} in {1}</span><span style="color:#d4b064">\n</span><span style="color:#afe091">&quot;</span><span style="color:#dcdccc">.</span><span style="color:#a6e1ff">format</span><span style="color:#dcdccc">(</span>keyword<span style="color:#dcdccc">,</span> filename<span style="color:#dcdccc">))</span>
122 result <span style="color:#dcdccc">=</span> fallback
123 <span style="color:#e0af91; font-weight:bold">else</span><span style="color:#dcdccc">:</span>
124 result <span style="color:#dcdccc">=</span> re<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">sub</span><span style="color:#dcdccc">(</span>PATTERN_RELATIVE<span style="color:#dcdccc">,</span> _command_relative<span style="color:#dcdccc">,</span> match<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">1</span><span style="color:#dcdccc">),</span> <span style="color:#afe091">0</span><span style="color:#dcdccc">,</span> re<span style="color:#dcdccc">.</span>S<span style="color:#dcdccc">)</span>
126 <span style="color:#e0af91; font-weight:bold">return</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">1</span><span style="color:#dcdccc">) +</span> result <span style="color:#dcdccc">+</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">5</span><span style="color:#dcdccc">)</span>
129 <span style="color:#e0af91; font-weight:bold">def</span> <span style="color:#a6e1ff">_command_relative</span><span style="color:#dcdccc">(</span>m<span style="color:#dcdccc">):</span>
130 <span style="color:#e0af91; font-weight:bold">return</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">1</span><span style="color:#dcdccc">) +</span> re<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">sub</span><span style="color:#dcdccc">(</span>PATTERN_GETURL<span style="color:#dcdccc">,</span>
131 <span style="color:#e0af91; font-weight:bold">lambda</span> match<span style="color:#dcdccc">:</span> <span style="color:#afe091">'href=&quot;'</span> <span style="color:#dcdccc">+</span> os<span style="color:#dcdccc">.</span>path<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">relpath</span><span style="color:#dcdccc">(</span>match<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">1</span><span style="color:#dcdccc">),</span> PATH<span style="color:#dcdccc">) +</span> <span style="color:#afe091">'&quot;'</span><span style="color:#dcdccc">,</span>
132 m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">2</span><span style="color:#dcdccc">)) +</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">3</span><span style="color:#dcdccc">)</span>
135 <span style="color:#e0af91; font-weight:bold">def</span> <span style="color:#a6e1ff">_command_run</span><span style="color:#dcdccc">(</span>m<span style="color:#dcdccc">):</span>
136 output <span style="color:#dcdccc">=</span> <span style="color:#a6e1ff">Popen</span><span style="color:#dcdccc">(</span>m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">2</span><span style="color:#dcdccc">),</span> shell<span style="color:#dcdccc">=</span><span style="color:#e0af91; font-weight:bold">True</span><span style="color:#dcdccc">,</span> stdout<span style="color:#dcdccc">=</span>PIPE<span style="color:#dcdccc">).</span><span style="color:#a6e1ff">communicate</span><span style="color:#dcdccc">()[</span><span style="color:#afe091">0</span><span style="color:#dcdccc">]</span>
137 <span style="color:#e0af91; font-weight:bold">if</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">3</span><span style="color:#dcdccc">) !=</span> <span style="color:#afe091">&quot;</span><span style="color:#d4b064">\n</span><span style="color:#afe091">&quot;</span><span style="color:#dcdccc">:</span>
138 output <span style="color:#dcdccc">=</span> output<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">strip</span><span style="color:#dcdccc">()</span>
139 <span style="color:#e0af91; font-weight:bold">return</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">1</span><span style="color:#dcdccc">) +</span> output<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">decode</span><span style="color:#dcdccc">(</span><span style="color:#afe091">'utf-8'</span><span style="color:#dcdccc">) +</span> m<span style="color:#dcdccc">.</span><span style="color:#a6e1ff">group</span><span style="color:#dcdccc">(</span><span style="color:#afe091">5</span><span style="color:#dcdccc">)</span>
142 <span style="color:#e0af91; font-weight:bold">if</span> __name__ <span style="color:#dcdccc">==</span> <span style="color:#afe091">'__main__'</span><span style="color:#dcdccc">:</span>
143 <span style="color:#a6e1ff">main</span><span style="color:#dcdccc">()</span><!--/run-->
144 </div>
145 <!--get foot from index.html-->
146 </div>
147 </div>
148 </body>
149 </html>
150 <!--/get-->