1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
2 <!--get head from index.html-->
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">
13 40404040404040404040404
16 <a href=
"index.html">home
</a>
17 <a href=
"work.html">creations
</a>
18 <a href=
"pub">files
</a>
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 />
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
<hut
@lavabit.com
></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">"""</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
<!-- COMMAND [ARGS] --
></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"> <!-- run ls -l --
></span>
39 <span style=
"color:#afe091"> <!-- /run --
></span>
40 <span style=
"color:#afe091"></span>
41 <span style=
"color:#afe091"> This will execute
"ls -l
" 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"> <!-- head --
></span>
47 <span style=
"color:#afe091"> <head
><title
>boobies
</title
></head
></span>
48 <span style=
"color:#afe091"> <!-- /head --
></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"> <!-- get head from index.html --
></span>
53 <span style=
"color:#afe091"> foo
</span>
54 <span style=
"color:#afe091"> <!-- /get --
></span>
55 <span style=
"color:#afe091"></span>
56 <span style=
"color:#afe091"> and foo will be replaced by
<head
><title
>boobies
</title
></head
>.
</span>
57 <span style=
"color:#afe091"></span>
58 <span style=
"color:#afe091">relative:
</span>
59 <span style=
"color:#afe091"> <!-- relative --
></span>
60 <span style=
"color:#afe091"> <a href=
"about.html
">about
</a
></span>
61 <span style=
"color:#afe091"> <!-- /relative --
></span>
62 <span style=
"color:#afe091"></span>
63 <span style=
"color:#afe091"> If you use this in a
"get
"-block, it will fix URLs with relative paths.
</span>
64 <span style=
"color:#afe091">"""</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">'(
<!--\s*get\s+(\w+)\s+from\s+([^\s]+)\s*--
>\n?)(.*?)(
<!--\s*/get\s*--
>)'
</span>
72 PATTERN_RUN
<span style=
"color:#dcdccc">=
</span> r
<span style=
"color:#afe091">'(
<!--\s*run\s+(.*?)\s*--
>(\n?))(.*?)(
<!--\s*/run\s*--
>)'
</span>
73 PATTERN_RELATIVE
<span style=
"color:#dcdccc">=
</span> r
<span style=
"color:#afe091">'(
<!--\s*relative\s*--
>\n?)(.*?)(
<!--\s*/relative\s*--
>)'
</span>
74 PATTERN_GETURL
<span style=
"color:#dcdccc">=
</span> r
<span style=
"color:#afe091">'href=
"([^
"]+?\.[^
"]+?)
"'
</span>
75 PATTERN_GETKEYWORD
<span style=
"color:#dcdccc">=
</span> r
<span style=
"color:#afe091">'
<!--\s*{
0}\s*--
>\n?(.*?)
<!--\s*/{
0}\s*--
>'
</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">)
<=
</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">"usage: boobies.py [--dry] [-h|--help] files...
</span><span style=
"color:#d4b064">\n
</span><span style=
"color:#afe091">"</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">".__new
"</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">"unchanged: %s
"</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">"w
"</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">"writing: %s
"</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">"Could not find keyword {
0} in {
1}
</span><span style=
"color:#d4b064">\n
</span><span style=
"color:#afe091">"</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=
"'
</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">'
"'
</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">"</span><span style=
"color:#d4b064">\n
</span><span style=
"color:#afe091">"</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-->
145 <!--get foot from index.html-->