Passed
Push — master ( 26f7bc...11a32a )
by Christophe
55s
created

fontsize()   B

Complexity

Conditions 5

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 5
c 2
b 0
f 0
dl 0
loc 13
rs 8.5454
1
#!/usr/bin/env python
2
3
"""
4
Pandoc filter for changing font size in LaTeX
5
"""
6
7
from panflute import *
8
9
def fontsize(elem, doc):
10
    # Is it in the right format and is it a Span, Div, Code or CodeBlock?
11
    if doc.format == 'latex' and elem.tag in ['Span', 'Div', 'Code', 'CodeBlock']:
12
13
        # Get the classes
14
        classes = set(elem.classes)
15
16
        # Loop on all fontsize definition
17
        for definition in doc.defined:
18
19
            # Is the classes correct?
20
            if classes >= definition['classes']:
21
                return add_latex(elem, definition)
22
23
def add_latex(elem, definition):
24
    # Is it a span?
25
    if isinstance(elem, Span):
26
        elem.content.insert(0, RawInline(definition['latex'], 'tex'))
27
28
    # Is it a Div?
29
    elif isinstance(elem, Div):
30
        elem.content.insert(0, RawBlock('{' + definition['latex'], 'tex'))
31
        elem.content.append(RawBlock('}', 'tex'))
32
33
    # Is it a Code?
34
    elif isinstance(elem, Code):
35
        return [RawInline('{' + definition['latex'], 'tex'), elem, RawInline('}', 'tex')]
36
37
    # Is it a CodeBlock?
38
    elif isinstance(elem, CodeBlock):
39
        return [RawBlock('{' + definition['latex'], 'tex'), elem, RawBlock('}', 'tex')]
40
41
def prepare(doc):
42
    # Prepare the definitions
43
    doc.defined = []
44
45
    # Get the meta data
46
    meta = doc.get_metadata('pandoc-latex-fontsize')
47
48
    if isinstance(meta, list):
49
50
        # Loop on all definitions
51
        for definition in meta:
52
53
            # Verify the definition
54
            if isinstance(definition, dict) and 'classes' in definition and isinstance(definition['classes'], list):
55
56
                # Get the classes
57
                classes = definition['classes']
58
59
                # Get the size
60
                if 'size' in definition and definition['size'] in ['Huge', 'huge', 'LARGE', 'Large', 'large', 'normalsize', 'small', 'footnotesize', 'scriptsize', 'tiny']:
61
                    size = definition['size']
62
                else:
63
                    size = 'normalsize'
64
65
                # Add a definition
66
                doc.defined.append({'classes' : set(classes), 'latex': '\\' + size + ' '})
67
68
def main(doc = None):
69
    run_filter(fontsize, prepare = prepare, doc = doc)
70
71
if __name__ == '__main__':
72
    main()
73
74