git.fiddlerwoaroof.com
Browse code

adding various utility scripts

fiddlerwoaroof authored on 15/07/2014 19:23:59
Showing 16 changed files
1 1
new file mode 100755
... ...
@@ -0,0 +1,51 @@
1
+#!/usr/bin/python3
2
+import sys
3
+import email
4
+import html2text
5
+import markdown
6
+
7
+data = sys.stdin.read()
8
+msg = email.message_from_string(data)
9
+
10
+payload = msg.get_payload()
11
+text = payload
12
+verbatim = False
13
+
14
+if hasattr(payload, '__iter__'):
15
+    if msg.get_content_maintype() == 'multipart':
16
+        if msg.get_content_subtype == 'mixed':
17
+            verbatim = True
18
+        elif msg.get_content_subtype == 'alternative':
19
+            print(text)
20
+            for pl in payload:
21
+                if pl.get_content_maintype == 'text':
22
+                    text = pl.get_payload()
23
+                    if pl.get_content_subtype == 'html':
24
+                        text = html2text.html2text(text)
25
+                else:
26
+                    verbatim = True # Just because I don't want to handle it any more
27
+else:
28
+    if msg.get_content_maintype() == 'text' and msg.get_content_subtype() == 'html':
29
+        text = html2text.html2text(text)
30
+
31
+import email.mime.multipart
32
+import email.mime.text
33
+import email.mime.application
34
+import subprocess
35
+import tempfile
36
+
37
+if verbatim == False:
38
+    outer = email.mime.multipart.MIMEMultipart()
39
+    for header, value in msg.items():
40
+        outer[header] = value
41
+    outer.attach(msg)
42
+    tempfile = tempfile.NamedTemporaryFile()
43
+    converter = subprocess.Popen(['/home/edwlan/.cabal/bin/pandoc', '-f', 'markdown', '-t', 'epub', '-o', tempfile.name], stdin=subprocess.PIPE)
44
+    converter.communicate(text)
45
+    with open(tempfile.name) as f:
46
+        file = email.mime.application.MIMEApplication(f.read(), 'epub+zip')
47
+        outer.attach(file)
48
+    tempfile.close()
49
+    msg = outer
50
+
51
+print(msg)
0 52
new file mode 100755
... ...
@@ -0,0 +1,14 @@
1
+#!/usr/bin/env python
2
+"""Translate Corpus Thomisticum files to LaTeX"""
3
+
4
+import lxml.etree
5
+import lxml.html
6
+import sys
7
+
8
+b = lxml.etree.parse('/home/edwlan/bin/ct.xsl')
9
+with file(sys.argv[1], 'w') as f:
10
+  for fil in sys.argv[2:]:
11
+    a = lxml.html.parse(fil)
12
+    d = a.xslt(b)
13
+    print >>f, d
14
+
0 15
new file mode 100644
... ...
@@ -0,0 +1,38 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<xsl:stylesheet 
3
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
4
+	<xsl:param name="vendor" select="'NIST'"/>
5
+    <xsl:output method="text"/>   
6
+
7
+    <xsl:template match="/">
8
+      <xsl:apply-templates />
9
+    </xsl:template>
10
+  
11
+
12
+  <xsl:template match="div">
13
+    <xsl:choose>
14
+      <xsl:when test="@class='B'">\chapter{</xsl:when>
15
+      <xsl:when test="@class='D'">\section{</xsl:when> 
16
+      <!--<xsl:when test="@class='D'">\chapter{</xsl:when>
17
+      <xsl:when test="@class='G'">\section{</xsl:when> 
18
+      <xsl:when test="@class='E'">\section{</xsl:when>
19
+      <xsl:when test="@class='G'">\subsection{</xsl:when>
20
+      <xsl:when test="@class='E'">\subsection{</xsl:when>-->
21
+    </xsl:choose><xsl:value-of select="."/>
22
+    <xsl:if test="following::div[@class='cuatro' and position() = 1]/text() != ''"> - <xsl:copy-of select="following::div[@class='cuatro' and position()=1]/text()" /></xsl:if>
23
+    <xsl:if test="@class='B' or @class='C' or @class='D' or @class='G' or @class='E'">}</xsl:if>
24
+  </xsl:template>
25
+
26
+   
27
+
28
+   
29
+
30
+  <xsl:template match="p">
31
+   <xsl:value-of select="." />
32
+   <xsl:text>
33
+   </xsl:text>
34
+  </xsl:template>
35
+  
36
+ <xsl:template match="div[@class='centro']|div[@class='uno']|div[@class='dos']|div[@class='tres']"></xsl:template>
37
+
38
+</xsl:stylesheet>
0 39
new file mode 100755
... ...
@@ -0,0 +1,5 @@
1
+#!/usr/bin/zsh
2
+
3
+chosen=`mpc playlist -f "[%position%: %artist% - %album% - %title%]" | dmenu -l 15 -i | cut -d: -f 1`
4
+mpc play $chosen
5
+
0 6
new file mode 100755
... ...
@@ -0,0 +1,7 @@
1
+#!/usr/bin/zsh
2
+
3
+chosen=`mpc playlist -f "[%position%: %artist% - %album% - %title%]" | dmenu -l 15 -i | cut -d: -f 1`
4
+(( target=(`mpc current -f "[%position%]"` + 1) ))
5
+
6
+mpc move $chosen $target
7
+
0 8
new file mode 100755
... ...
@@ -0,0 +1,8 @@
1
+#!/usr/bin/zsh
2
+
3
+chosen=`mpc playlist -f "[%position%: %artist% - %album% - %title%]" | dmenu -l 15 -i | cut -d: -f 1`
4
+(( target=(`mpc current -f "[%position%]"` + 1) ))
5
+
6
+mpc move $chosen $target
7
+mpc next
8
+
0 9
new file mode 100755
... ...
@@ -0,0 +1,3 @@
1
+#!/usr/bin/zsh
2
+
3
+mpc status | dmenu -l 3
0 4
new file mode 100755
... ...
@@ -0,0 +1,37 @@
1
+#!/usr/bin/python3
2
+"""Sort output from 'du' command
3
+
4
+
5
+<FileSize> file"""
6
+#/opt/local/bin/python3.1
7
+from __future__ import print_function
8
+import sys
9
+import re
10
+import collections
11
+
12
+
13
+SPLITTER = re.compile(r'([0-9.]+)([KMGT]?)')
14
+def munge(line):
15
+	size,_, fn = line.partition('\t')
16
+	size = size.strip()
17
+	if size:
18
+		try:
19
+			s,units = SPLITTER.match(size).groups()
20
+			return units, float(s), fn.rstrip()
21
+		except AttributeError:
22
+			print(size,fn)
23
+			return 'B', 0.0, fn.rstrip()
24
+	else:
25
+		return 'B', 0.0, fn.rstrip()
26
+
27
+inp =  inp = collections.defaultdict(list)
28
+for x in sys.stdin:
29
+	k,v,line = munge(x)
30
+	inp[k].append((v,line))
31
+
32
+[
33
+	print('%s%s\t%s' % (size,units,line))
34
+		for units in ['', 'K', 'M', 'G', 'T']
35
+		for (size, line) in sorted(inp[units])
36
+	if (units in inp)
37
+]
0 38
new file mode 100755
... ...
@@ -0,0 +1,42 @@
1
+#!/usr/bin/python -u
2
+import sys
3
+import argparse
4
+
5
+parser = argparse.ArgumentParser()
6
+parser.add_argument('old_range')
7
+parser.add_argument('new_range')
8
+parser.add_argument('items', nargs='*')
9
+args = parser.parse_args()
10
+
11
+omin, omax = map(float, args.old_range.split('-'))
12
+nmin, nmax = map(float, args.new_range.split('-'))
13
+items = None
14
+if args.items:
15
+    items = map(int, args.items)
16
+
17
+from functools import partial
18
+def scale(orange, nrange, num):
19
+    omin, omax = orange
20
+    nmin, nmax = nrange
21
+
22
+    num = float(num)
23
+    num -= omin
24
+    num /= (omax - omin)
25
+    num *= (nmax - nmin)
26
+    num += nmin
27
+
28
+    return num
29
+
30
+if items is not None:
31
+  for arg in items:
32
+     print scale( (omin, omax), (nmin, nmax), arg )
33
+else: 
34
+    while True:
35
+	line = sys.stdin.readline()
36
+	if line == '': break
37
+
38
+	x = [float(y) for y in line.split()]
39
+	x = map(partial(scale, (omin,omax), (nmin,nmax)), x)
40
+
41
+	print ' '.join('%f' % y for y in x)
42
+
0 43
new file mode 100644
... ...
@@ -0,0 +1,11 @@
1
+import sys
2
+
3
+ox = 0
4
+while True:
5
+   line = sys.stdin.readline()
6
+   x = float(line)
7
+   if abs(x-ox) < 0.25*ox: continue
8
+   print abs(x-ox),
9
+   ox = x
10
+   print x
11
+   
0 12
new file mode 100755
... ...
@@ -0,0 +1,23 @@
1
+#!/usr/bin/env python3
2
+
3
+import sys
4
+
5
+lines = []
6
+for line in sys.stdin:
7
+	line = line.split()
8
+	if line == []: continue
9
+	elif line[0] == 'import':
10
+		qualified = line[1] == 'qualified'
11
+		module = line[1]
12
+		if qualified: module = line[2]
13
+		lines.append(((1 if qualified else 0), module, len(module.split('.')), line))
14
+	else:
15
+		raise ValueError('Can\'t handle lines without import statements')
16
+
17
+otoplevel = lines[0][1].split('.',1)[0]
18
+for line in sorted(lines):
19
+	toplevel = line[1].split('.',1)[0]
20
+	if toplevel != otoplevel:
21
+		print()
22
+	print(' '.join(line[-1]))
23
+	otoplevel = toplevel
0 24
new file mode 100644
... ...
@@ -0,0 +1,29 @@
1
+#!/usr/bin/python -u
2
+from __future__ import print_function, division
3
+
4
+import sys
5
+import os
6
+
7
+def line_iter(fil):
8
+    line = 0
9
+    counter = 0
10
+    while line != '':
11
+        line = fil.readline()
12
+        counter += 1
13
+        yield (counter, line)
14
+
15
+
16
+if __name__ == '__main__':
17
+    import argparse
18
+    parser = argparse.ArgumentParser()
19
+    parser.add_argument('order', nargs='+')
20
+    args = parser.parse_args()
21
+
22
+    input = raw_input
23
+    lines = {}
24
+    for line in line_iter(sys.stdin):
25
+        counter, txt = line
26
+        txt = txt.strip()
27
+        lines[counter] = txt
28
+    for i in args.order:
29
+        print(lines[int(i)])
0 30
new file mode 100755
... ...
@@ -0,0 +1,20 @@
1
+#!/bin/zsh
2
+
3
+INTERPRETER=`which "$1"`
4
+SCRIPTNAME="$2"
5
+
6
+FULLPATH="$HOME/bin/$SCRIPTNAME"
7
+if [ -e "$FULLPATH" ]; then
8
+   echo "Script $SCRIPTNAME already exists"
9
+else
10
+   echo "Creating new script $SCRIPTNAME with interpreter $INTERPRETER in $HOME/bin"
11
+   echo '#!'"$INTERPRETER" > "$FULLPATH"
12
+   echo  >> "$FULLPATH"
13
+   echo  >> "$FULLPATH"
14
+   TEMPLATE="$HOME/templates/`basename "$INTERPRETER"`"
15
+   if [ -e $TEMPLATE ]; then
16
+      cat "$TEMPLATE" >> "$FULLPATH"
17
+   fi
18
+   chmod +x "$FULLPATH"
19
+fi
20
+vim + +star "$FULLPATH"
0 21
new file mode 100755
... ...
@@ -0,0 +1,23 @@
1
+#!/usr/bin/python
2
+
3
+import argparse
4
+import os.path
5
+import os
6
+
7
+parser = argparse.ArgumentParser()
8
+parser.add_argument("-n", "--new", action="store_true")
9
+parser.add_argument("-r", "--read", action="store_true")
10
+parser.add_argument("name", action="store", nargs=1)
11
+args = parser.parse_args()
12
+GPG = "/usr/bin/gpg"
13
+base = os.path.join(os.environ.get("HOME"), "Dropbox", "secure_notes")
14
+print base
15
+
16
+import subprocess
17
+if args.new:
18
+	print args.name
19
+	proc = subprocess.call([GPG, "-r", "Fiddlerwoaroof <fiddler.wo.a.roof@gmail.com>", "-o", os.path.join(base, args.name[0]), "-e"])
20
+elif args.read:
21
+	proc = subprocess.call([GPG, "-r", "Fiddlerwoaroof <fiddler.wo.a.roof@gmail.com>", "-d", os.path.join(base, args.name[0])])
22
+
23
+
0 24
new file mode 100755
... ...
@@ -0,0 +1,99 @@
1
+#!/bin/zsh
2
+
3
+DEST_DIR=$1
4
+
5
+mkdir $DEST_DIR || exit 1
6
+
7
+(base64 -d | tar jxf - -C $DEST_DIR --strip-components=1 --transform="s/paper_template/$DEST_DIR/g") <<EOF
8
+
9
+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
98
+vRH4
99
+EOF
0 100
new file mode 100644
... ...
@@ -0,0 +1,8 @@
1
+#!/bin/zsh
2
+
3
+DEST_DIR=$1
4
+
5
+mkdir $DEST_DIR || exit 1
6
+
7
+(base64 -d | tar jxf - -C $DEST_DIR --strip-components=1 --transform="s/paper_template/$DEST_DIR/g") <<EOF
8
+