bzr branch
http://gegoxaren.bato24.eu/bzr/%2Bjunk/build-libffmpeg-for-chromium
2
by Gustav Hartvigsson
Added first set of tests. (More to come). |
1 |
#!/usr/bin/env python3
|
2 |
# left shebang empty for you to change. you do you
|
|
3 |
import re |
|
4 |
import sys |
|
5 |
import copy |
|
6 |
||
7 |
########################################################################################
|
|
8 |
# #
|
|
9 |
# License: CC0 -- do whatever the hell you want with this. I hope it works for you! #
|
|
10 |
# Love, Sven. #
|
|
11 |
# #
|
|
12 |
########################################################################################
|
|
13 |
# #
|
|
14 |
# This is *NOT* a pandoc filter. This is to be used if you want to manipulate the #
|
|
15 |
# output of pandoc latex to put verticle rules in the tables. Should work with #
|
|
16 |
# python2 and python3. Your mileage may vary. #
|
|
17 |
# #
|
|
18 |
# Example usage (just copy til end of line and paste in terminal), assuming you called #
|
|
19 |
# this file tex_table_verts.py: #
|
|
20 |
# #
|
|
21 |
# echo -e '\\begin{longtable}[c]{@{}llrrllclrl@{}}\nthis line does not have table\n\\begin{longtable}[c]{@{}llllll@{}}\nno\ntable\nhere\n\\begin{longtable}[c]{@{}l@{}}' | python3 tex_table_verts.py
|
|
22 |
# #
|
|
23 |
# Basically, the design is to just take your pandoc output and pipe it to this script. #
|
|
24 |
# Something like #
|
|
25 |
# #
|
|
26 |
# pandoc -s -f markdown -t latex input.md | python tex_table_verts.py > output.tex #
|
|
27 |
# #
|
|
28 |
# Windows users? No idea if you can benefit. Sorry. #
|
|
29 |
# #
|
|
30 |
########################################################################################
|
|
31 |
# #
|
|
32 |
# We want to turn something like this: #
|
|
33 |
# #
|
|
34 |
# \begin{longtable}[c]{@{}ll@{}} #
|
|
35 |
# #
|
|
36 |
# into something like this: #
|
|
37 |
# #
|
|
38 |
# \begin{longtable}[c]{@{}|l|l|@{}} #
|
|
39 |
# #
|
|
40 |
# We make the assumption that the input format always has #
|
|
41 |
# #
|
|
42 |
# \begin{longtable}[c]{@{}ll@{}} #
|
|
43 |
# |----------------------|XX|--| #
|
|
44 |
# #
|
|
45 |
# That is, the longtable is being searched for, as well as {@{}XXXX@{}} #
|
|
46 |
# where XXXX changes depending on the table you are writing. #
|
|
47 |
# #
|
|
48 |
########################################################################################
|
|
49 |
||
50 |
||
51 |
try: |
|
52 |
orig_input = sys.stdin.read() |
|
53 |
||
54 |
# Important group being saved: the r, c, or l's for the table columns.
|
|
55 |
# vvvvvvvv
|
|
56 |
vert_re = re.compile(r'(\\begin\{longtable\}\[.*\]\{@\{\})([rcl]+)(@\{\}\})', re.MULTILINE) |
|
57 |
# ^ not sure if pandoc changes this ever?
|
|
58 |
# We have three groups captured above:
|
|
59 |
#
|
|
60 |
# 1. \begin{longtable}[c]{@{}
|
|
61 |
# 2. [rcl]+
|
|
62 |
# 3. @{}}
|
|
63 |
#
|
|
64 |
# The below takes these three, turns group 2 into vertically separated columns, and
|
|
65 |
# then appends this to `replacements` joined with 1 and 3 so we can use `sub` below.
|
|
66 |
replacements = [] |
|
67 |
for match in vert_re.finditer(orig_input): |
|
68 |
table_start, cols, table_end = match.groups() |
|
69 |
# Gives you say |r|c|l|
|
|
70 |
# If you forever wanted just r|c|l without the outer ones, set vert_cols to just
|
|
71 |
# be "|".join(cols). Get creative if you don't want every inner one vertically
|
|
72 |
# separated.
|
|
73 |
vert_cols = "|{}|".format("|".join(cols)) |
|
74 |
replacements.append("{}{}{}".format(table_start, vert_cols, table_end)) |
|
75 |
||
76 |
# probably not necessary
|
|
77 |
output = copy.deepcopy(orig_input) |
|
78 |
||
79 |
# if the above loop executed, the same regex will have the matches replaced
|
|
80 |
# according to the order we found them above
|
|
81 |
if replacements: |
|
82 |
output = vert_re.sub(lambda cols: replacements.pop(0), output) |
|
83 |
||
84 |
# Set this to True if pandoc is giving you trouble with no horizontal rules in
|
|
85 |
# tables that have multiple rows
|
|
86 |
if False: |
|
87 |
output = re.sub(r'(\\tabularnewline)(\s+)(\\begin{minipage})', r'\1\2\\midrule\2\3', output) |
|
88 |
||
89 |
# write the conversion to stdout
|
|
90 |
sys.stdout.write(output) |
|
91 |
except Exception as e: |
|
92 |
# you may want to change this to fail out -- if an error was caught you probably
|
|
93 |
# aren't going to actually get any valid output anyway? up to you, just figured
|
|
94 |
# i'd write something *kind of* intelligent.
|
|
95 |
sys.stderr.write( |
|
96 |
"Critical error, printing original stdin to stdout:\n{}".format(e) |
|
97 |
)
|
|
98 |
sys.stdout.write(orig_input) |