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