baaf5b3f39036f6263a6fa00f98b320a679c966f
[chemdb.git] / chemdb / templatetags / latex.py
1 # Copyright
2
3 import sys as _sys
4
5 from django import template as _template
6
7
8 register = _template.Library()
9
10
11 LATEX_REPLACEMENTS = [('%', '\%'), ('>', '$>$'), ('<', '$<$')]
12 _SUPERSCRIPT_CODEPOINTS = {1: 0x00B9, 2: 0x00B2, 3: 0x00B3}
13 for i in range(9):
14     subscript_codepoint = 0x2080 + i
15     superscript_codepoint = _SUPERSCRIPT_CODEPOINTS.get(i, 0x2070 + i)
16     if _sys.version_info >= (3,):
17         subscript = chr(subscript_codepoint)
18         superscript = chr(superscript_codepoint)
19     else:
20         subscript = unichr(subscript_codepoint)
21         superscript = unichr(superscript_codepoint)
22     LATEX_REPLACEMENTS.extend([
23             (subscript, '$_{{{}}}$'.format(i)),
24             (superscript, '$^{{{}}}$'.format(i)),
25             ])
26 del i, subscript_codepoint, superscript_codepoint, subscript, superscript
27
28 LATEX_SPECIALS = {  # abbrev -> (latex, nfpa_704:firediamond argument)
29     'OX': (r'\oxidizer', 'oxidizer'),
30     '-W-': (r'\nowater', 'nowater'),
31     'SA': (r'\asphixiant', 'asphixiant'),
32     }  # others default to ('{abbrev}', '{abbrev}')
33
34
35 @register.filter
36 def latex_safe(string):
37     for a,b in LATEX_REPLACEMENTS:
38         string = string.replace(a, b)
39     return string
40
41 @register.filter
42 def latex_specials(specials):
43     """Format specials for general LaTeX usage
44     """
45     special_abbrevs = set(special.abbrev for special in specials)
46     latex_specials = []
47     for abbrev in ['OX', '-W-', 'SA']:
48         if abbrev in special_abbrevs:
49             latex_specials.append(LATEX_SPECIALS[abbrev][0])
50             special_abbrevs.remove(abbrev)
51     if special_abbrevs:  # leftovers:
52         special_abbrevs = sorted(special_abbrevs)
53         for abbrev in special_abbrevs:
54             latex_specials.append(
55                 LATEX_SPECIALS.get(abbrev, ('{{{}}}'.format(abbrev), None))[0])
56     return '~'.join(latex_specials)
57
58 @register.filter
59 def latex_special_args(specials):
60     """Format specials for the NFPA firediamond.
61     """
62     special_abbrevs = set(special.abbrev for special in specials)
63     latex_specials = []
64     for abbrev in ['OX', '-W-', 'SA']:
65         if abbrev in special_abbrevs:
66             latex_specials.append(LATEX_SPECIALS[abbrev][1])
67             special_abbrevs.remove(abbrev)
68     if special_abbrevs:  # leftovers:
69         special_abbrevs = sorted(special_abbrevs)
70         latex_specials.append('special={{{}}}'.format(
71                 ','.join(special_abbrevs)))
72     return ', '.join(latex_specials)