Passed
Push — master ( 1ac8e8...b5dc07 )
by Christophe
54s
created

latex_code()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 2
rs 10
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 latex_code(size):
10
    return '\\' + size + ' '
11
12
def get_correct_size(size):
13
    if size in ['Huge', 'huge', 'LARGE', 'Large', 'large', 'normalsize', 'small', 'footnotesize', 'scriptsize', 'tiny']:
14
        return size
15
    else:
16
        return 'normalsize'
17
18
def fontsize(elem, doc):
19
    # Is it in the right format and is it a Span, Div, Code or CodeBlock?
20
    if doc.format == 'latex' and elem.tag in ['Span', 'Div', 'Code', 'CodeBlock']:
21
22
        # Is there a latex-fontsize attribute?
23
        if 'latex-fontsize' in elem.attributes:
24
            return add_latex(elem, latex_code(get_correct_size(elem.attributes['latex-fontsize'])))
25
        else:
26
            # Get the classes
27
            classes = set(elem.classes)
28
29
            # Loop on all fontsize definition
30
            for definition in doc.defined:
31
32
                # Are the classes correct?
33
                if classes >= definition['classes']:
34
                    return add_latex(elem, definition['latex'])
35
36
def add_latex(elem, latex):
37
    # Is it a Span?
38
    if isinstance(elem, Span):
39
        elem.content.insert(0, RawInline(latex, 'tex'))
40
41
    # Is it a Div?
42
    elif isinstance(elem, Div):
43
        elem.content.insert(0, RawBlock('{' + latex, 'tex'))
44
        elem.content.append(RawBlock('}', 'tex'))
45
46
    # Is it a Code?
47
    elif isinstance(elem, Code):
48
        return [RawInline('{' + latex, 'tex'), elem, RawInline('}', 'tex')]
49
50
    # Is it a CodeBlock?
51
    elif isinstance(elem, CodeBlock):
52
        return [RawBlock('{' + latex, 'tex'), elem, RawBlock('}', 'tex')]
53
54
def prepare(doc):
55
    # Prepare the definitions
56
    doc.defined = []
57
58
    # Get the meta data
59
    meta = doc.get_metadata('pandoc-latex-fontsize')
60
61
    if isinstance(meta, list):
62
63
        # Loop on all definitions
64
        for definition in meta:
65
66
            # Verify the definition
67
            if isinstance(definition, dict) and 'classes' in definition and isinstance(definition['classes'], list):
68
                add_definition(doc.defined, definition)
69
70
def add_definition(defined, definition):
71
    # Get the classes
72
    classes = definition['classes']
73
74
    # Get the size
75
    if 'size' in definition:
76
        size = get_correct_size(definition['size'])
77
    else:
78
        size = 'normalsize'
79
80
    # Add a definition
81
    defined.append({'classes' : set(classes), 'latex': latex_code(size)})
82
83
def main(doc = None):
84
    run_filter(fontsize, prepare = prepare, doc = doc)
85
86
if __name__ == '__main__':
87
    main()
88
89