pax_global_header00006660000000000000000000000064132472527320014521gustar00rootroot0000000000000052 comment=5a9f8c9cc2239ac08fe3e690ff9ecabb4fe9917e mallard-ducktype-0.4/000077500000000000000000000000001324725273200146265ustar00rootroot00000000000000mallard-ducktype-0.4/.gitignore000066400000000000000000000000641324725273200166160ustar00rootroot00000000000000*~ /__pycache__/ /build/ /dist/ /ducktype.egg-info/ mallard-ducktype-0.4/AUTHORS000066400000000000000000000000411324725273200156710ustar00rootroot00000000000000Shaun McCance mallard-ducktype-0.4/COPYING000066400000000000000000000017771324725273200156750ustar00rootroot00000000000000Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mallard-ducktype-0.4/README.md000066400000000000000000000005521324725273200161070ustar00rootroot00000000000000# mallard-ducktype Parser for the lightweight Ducktype syntax for Mallard ## Install Ducktype Ducktype is Python-3-only, so to build and install: ``` python3 setup.py build sudo python3 setup.py install ``` Or to get the latest version uploaded to pypi: ``` virtualenv --python=python3 venv source venv/bin/activate pip-python3 install mallard-ducktype ``` mallard-ducktype-0.4/bin/000077500000000000000000000000001324725273200153765ustar00rootroot00000000000000mallard-ducktype-0.4/bin/ducktype000077500000000000000000000047411324725273200171620ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- Mode: python; indent-tabs-mode: nil -*- # Copyright (c) 2014 Shaun McCance # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. import argparse import os import sys import mallard.ducktype if __name__ == '__main__': argparser = argparse.ArgumentParser() argparser.add_argument('-o', '--output', nargs='?', help='specify the output file or directory') argparser.add_argument('files', nargs='+', help='list of input duck files') args = argparser.parse_args() if args.output is not None: if len(args.files) > 1 and not os.path.isdir(args.output): sys.stderr.write('Output must be a directory for multiple files\n') sys.exit(1) for file in args.files: try: parser = mallard.ducktype.DuckParser() parser.parse_file(file) parser.finish() except mallard.ducktype.SyntaxError as e: sys.stderr.write(e.fullmessage + '\n') basename = os.path.basename(file) if basename.endswith('.duck'): basename = basename[:-5] if args.output is None: outfile = os.path.join(os.path.dirname(file), basename + '.page') elif os.path.isdir(args.output): # FIXME: try to recreate directory structure? outfile = os.path.join(args.output, basename + '.page') else: outfile = args.output parser.document.write_xml(outfile) mallard-ducktype-0.4/mallard/000077500000000000000000000000001324725273200162425ustar00rootroot00000000000000mallard-ducktype-0.4/mallard/__init__.py000066400000000000000000000021271324725273200203550ustar00rootroot00000000000000# Copyright (c) 2015 Shaun McCance # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. mallard-ducktype-0.4/mallard/ducktype/000077500000000000000000000000001324725273200200725ustar00rootroot00000000000000mallard-ducktype-0.4/mallard/ducktype/__init__.py000077500000000000000000000022111324725273200222020ustar00rootroot00000000000000# Copyright (c) 2014-2015 Shaun McCance # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. from .parser import DuckParser, SyntaxError mallard-ducktype-0.4/mallard/ducktype/entities.py000066400000000000000000004102651324725273200223000ustar00rootroot00000000000000# Copyright (c) 2014 Shaun McCance # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # http://www.w3.org/TR/xml-entity-names/ entities = { 'AElig': 'Æ', # LATIN CAPITAL LETTER AE 'AMP': '&', # AMPERSAND 'Aacgr': 'Ά', # GREEK CAPITAL LETTER ALPHA WITH TONOS 'Aacute': 'Á', # LATIN CAPITAL LETTER A WITH ACUTE 'Abreve': 'Ă', # LATIN CAPITAL LETTER A WITH BREVE 'Acirc': 'Â', # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 'Acy': 'А', # CYRILLIC CAPITAL LETTER A 'Afr': '𝔄', # MATHEMATICAL FRAKTUR CAPITAL A 'Agr': 'Α', # GREEK CAPITAL LETTER ALPHA 'Agrave': 'À', # LATIN CAPITAL LETTER A WITH GRAVE 'Alpha': 'Α', # GREEK CAPITAL LETTER ALPHA 'Amacr': 'Ā', # LATIN CAPITAL LETTER A WITH MACRON 'And': '⩓', # DOUBLE LOGICAL AND 'Aogon': 'Ą', # LATIN CAPITAL LETTER A WITH OGONEK 'Aopf': '𝔸', # MATHEMATICAL DOUBLE-STRUCK CAPITAL A 'ApplyFunction': '⁡', # FUNCTION APPLICATION 'Aring': 'Å', # LATIN CAPITAL LETTER A WITH RING ABOVE 'Ascr': '𝒜', # MATHEMATICAL SCRIPT CAPITAL A 'Assign': '≔', # COLON EQUALS 'Atilde': 'Ã', # LATIN CAPITAL LETTER A WITH TILDE 'Auml': 'Ä', # LATIN CAPITAL LETTER A WITH DIAERESIS 'Backslash': '∖', # SET MINUS 'Barv': '⫧', # SHORT DOWN TACK WITH OVERBAR 'Barwed': '⌆', # PERSPECTIVE 'Bcy': 'Б', # CYRILLIC CAPITAL LETTER BE 'Because': '∵', # BECAUSE 'Bernoullis': 'ℬ', # SCRIPT CAPITAL B 'Beta': 'Β', # GREEK CAPITAL LETTER BETA 'Bfr': '𝔅', # MATHEMATICAL FRAKTUR CAPITAL B 'Bgr': 'Β', # GREEK CAPITAL LETTER BETA 'Bopf': '𝔹', # MATHEMATICAL DOUBLE-STRUCK CAPITAL B 'Breve': '˘', # BREVE 'Bscr': 'ℬ', # SCRIPT CAPITAL B 'Bumpeq': '≎', # GEOMETRICALLY EQUIVALENT TO 'CHcy': 'Ч', # CYRILLIC CAPITAL LETTER CHE 'COPY': '©', # COPYRIGHT SIGN 'Cacute': 'Ć', # LATIN CAPITAL LETTER C WITH ACUTE 'Cap': '⋒', # DOUBLE INTERSECTION 'CapitalDifferentialD': 'ⅅ', # DOUBLE-STRUCK ITALIC CAPITAL D 'Cayleys': 'ℭ', # BLACK-LETTER CAPITAL C 'Ccaron': 'Č', # LATIN CAPITAL LETTER C WITH CARON 'Ccedil': 'Ç', # LATIN CAPITAL LETTER C WITH CEDILLA 'Ccirc': 'Ĉ', # LATIN CAPITAL LETTER C WITH CIRCUMFLEX 'Cconint': '∰', # VOLUME INTEGRAL 'Cdot': 'Ċ', # LATIN CAPITAL LETTER C WITH DOT ABOVE 'Cedilla': '¸', # CEDILLA 'CenterDot': '·', # MIDDLE DOT 'Cfr': 'ℭ', # BLACK-LETTER CAPITAL C 'Chi': 'Χ', # GREEK CAPITAL LETTER CHI 'CircleDot': '⊙', # CIRCLED DOT OPERATOR 'CircleMinus': '⊖', # CIRCLED MINUS 'CirclePlus': '⊕', # CIRCLED PLUS 'CircleTimes': '⊗', # CIRCLED TIMES 'ClockwiseContourIntegral': '∲', # CLOCKWISE CONTOUR INTEGRAL 'CloseCurlyDoubleQuote': '”', # RIGHT DOUBLE QUOTATION MARK 'CloseCurlyQuote': '’', # RIGHT SINGLE QUOTATION MARK 'Colon': '∷', # PROPORTION 'Colone': '⩴', # DOUBLE COLON EQUAL 'Congruent': '≡', # IDENTICAL TO 'Conint': '∯', # SURFACE INTEGRAL 'ContourIntegral': '∮', # CONTOUR INTEGRAL 'Copf': 'ℂ', # DOUBLE-STRUCK CAPITAL C 'Coproduct': '∐', # N-ARY COPRODUCT 'CounterClockwiseContourIntegral': '∳', # ANTICLOCKWISE CONTOUR INTEGRAL 'Cross': '⨯', # VECTOR OR CROSS PRODUCT 'Cscr': '𝒞', # MATHEMATICAL SCRIPT CAPITAL C 'Cup': '⋓', # DOUBLE UNION 'CupCap': '≍', # EQUIVALENT TO 'DD': 'ⅅ', # DOUBLE-STRUCK ITALIC CAPITAL D 'DDotrahd': '⤑', # RIGHTWARDS ARROW WITH DOTTED STEM 'DJcy': 'Ђ', # CYRILLIC CAPITAL LETTER DJE 'DScy': 'Ѕ', # CYRILLIC CAPITAL LETTER DZE 'DZcy': 'Џ', # CYRILLIC CAPITAL LETTER DZHE 'Dagger': '‡', # DOUBLE DAGGER 'Darr': '↡', # DOWNWARDS TWO HEADED ARROW 'Dashv': '⫤', # VERTICAL BAR DOUBLE LEFT TURNSTILE 'Dcaron': 'Ď', # LATIN CAPITAL LETTER D WITH CARON 'Dcy': 'Д', # CYRILLIC CAPITAL LETTER DE 'Del': '∇', # NABLA 'Delta': 'Δ', # GREEK CAPITAL LETTER DELTA 'Dfr': '𝔇', # MATHEMATICAL FRAKTUR CAPITAL D 'Dgr': 'Δ', # GREEK CAPITAL LETTER DELTA 'DiacriticalAcute': '´', # ACUTE ACCENT 'DiacriticalDot': '˙', # DOT ABOVE 'DiacriticalDoubleAcute': '˝', # DOUBLE ACUTE ACCENT 'DiacriticalGrave': '`', # GRAVE ACCENT 'DiacriticalTilde': '˜', # SMALL TILDE 'Diamond': '⋄', # DIAMOND OPERATOR 'DifferentialD': 'ⅆ', # DOUBLE-STRUCK ITALIC SMALL D 'Dopf': '𝔻', # MATHEMATICAL DOUBLE-STRUCK CAPITAL D 'Dot': '¨', # DIAERESIS 'DotDot': '\u20DC', # COMBINING FOUR DOTS ABOVE 'DotEqual': '≐', # APPROACHES THE LIMIT 'DoubleContourIntegral': '∯', # SURFACE INTEGRAL 'DoubleDot': '¨', # DIAERESIS 'DoubleDownArrow': '⇓', # DOWNWARDS DOUBLE ARROW 'DoubleLeftArrow': '⇐', # LEFTWARDS DOUBLE ARROW 'DoubleLeftRightArrow': '⇔', # LEFT RIGHT DOUBLE ARROW 'DoubleLeftTee': '⫤', # VERTICAL BAR DOUBLE LEFT TURNSTILE 'DoubleLongLeftArrow': '⟸', # LONG LEFTWARDS DOUBLE ARROW 'DoubleLongLeftRightArrow': '⟺', # LONG LEFT RIGHT DOUBLE ARROW 'DoubleLongRightArrow': '⟹', # LONG RIGHTWARDS DOUBLE ARROW 'DoubleRightArrow': '⇒', # RIGHTWARDS DOUBLE ARROW 'DoubleRightTee': '⊨', # TRUE 'DoubleUpArrow': '⇑', # UPWARDS DOUBLE ARROW 'DoubleUpDownArrow': '⇕', # UP DOWN DOUBLE ARROW 'DoubleVerticalBar': '∥', # PARALLEL TO 'DownArrow': '↓', # DOWNWARDS ARROW 'DownArrowBar': '⤓', # DOWNWARDS ARROW TO BAR 'DownArrowUpArrow': '⇵', # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW 'DownBreve': '\u0311', # COMBINING INVERTED BREVE 'DownLeftRightVector': '⥐', # LEFT BARB DOWN RIGHT BARB DOWN HARPOON 'DownLeftTeeVector': '⥞', # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR 'DownLeftVector': '↽', # LEFTWARDS HARPOON WITH BARB DOWNWARDS 'DownLeftVectorBar': '⥖', # LEFTWARDS HARPOON WITH BARB DOWN TO BAR 'DownRightTeeVector': '⥟', # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR 'DownRightVector': '⇁', # RIGHTWARDS HARPOON WITH BARB DOWNWARDS 'DownRightVectorBar': '⥗', # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR 'DownTee': '⊤', # DOWN TACK 'DownTeeArrow': '↧', # DOWNWARDS ARROW FROM BAR 'Downarrow': '⇓', # DOWNWARDS DOUBLE ARROW 'Dscr': '𝒟', # MATHEMATICAL SCRIPT CAPITAL D 'Dstrok': 'Đ', # LATIN CAPITAL LETTER D WITH STROKE 'EEacgr': 'Ή', # GREEK CAPITAL LETTER ETA WITH TONOS 'EEgr': 'Η', # GREEK CAPITAL LETTER ETA 'ENG': 'Ŋ', # LATIN CAPITAL LETTER ENG 'ETH': 'Ð', # LATIN CAPITAL LETTER ETH 'Eacgr': 'Έ', # GREEK CAPITAL LETTER EPSILON WITH TONOS 'Eacute': 'É', # LATIN CAPITAL LETTER E WITH ACUTE 'Ecaron': 'Ě', # LATIN CAPITAL LETTER E WITH CARON 'Ecirc': 'Ê', # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 'Ecy': 'Э', # CYRILLIC CAPITAL LETTER E 'Edot': 'Ė', # LATIN CAPITAL LETTER E WITH DOT ABOVE 'Efr': '𝔈', # MATHEMATICAL FRAKTUR CAPITAL E 'Egr': 'Ε', # GREEK CAPITAL LETTER EPSILON 'Egrave': 'È', # LATIN CAPITAL LETTER E WITH GRAVE 'Element': '∈', # ELEMENT OF 'Emacr': 'Ē', # LATIN CAPITAL LETTER E WITH MACRON 'EmptySmallSquare': '◻', # WHITE MEDIUM SQUARE 'EmptyVerySmallSquare': '▫', # WHITE SMALL SQUARE 'Eogon': 'Ę', # LATIN CAPITAL LETTER E WITH OGONEK 'Eopf': '𝔼', # MATHEMATICAL DOUBLE-STRUCK CAPITAL E 'Epsilon': 'Ε', # GREEK CAPITAL LETTER EPSILON 'Equal': '⩵', # TWO CONSECUTIVE EQUALS SIGNS 'EqualTilde': '≂', # MINUS TILDE 'Equilibrium': '⇌', # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON 'Escr': 'ℰ', # SCRIPT CAPITAL E 'Esim': '⩳', # EQUALS SIGN ABOVE TILDE OPERATOR 'Eta': 'Η', # GREEK CAPITAL LETTER ETA 'Euml': 'Ë', # LATIN CAPITAL LETTER E WITH DIAERESIS 'Exists': '∃', # THERE EXISTS 'ExponentialE': 'ⅇ', # DOUBLE-STRUCK ITALIC SMALL E 'Fcy': 'Ф', # CYRILLIC CAPITAL LETTER EF 'Ffr': '𝔉', # MATHEMATICAL FRAKTUR CAPITAL F 'FilledSmallSquare': '◼', # BLACK MEDIUM SQUARE 'FilledVerySmallSquare': '▪', # BLACK SMALL SQUARE 'Fopf': '𝔽', # MATHEMATICAL DOUBLE-STRUCK CAPITAL F 'ForAll': '∀', # FOR ALL 'Fouriertrf': 'ℱ', # SCRIPT CAPITAL F 'Fscr': 'ℱ', # SCRIPT CAPITAL F 'GJcy': 'Ѓ', # CYRILLIC CAPITAL LETTER GJE 'GT': '>', # GREATER-THAN SIGN 'Gamma': 'Γ', # GREEK CAPITAL LETTER GAMMA 'Gammad': 'Ϝ', # GREEK LETTER DIGAMMA 'Gbreve': 'Ğ', # LATIN CAPITAL LETTER G WITH BREVE 'Gcedil': 'Ģ', # LATIN CAPITAL LETTER G WITH CEDILLA 'Gcirc': 'Ĝ', # LATIN CAPITAL LETTER G WITH CIRCUMFLEX 'Gcy': 'Г', # CYRILLIC CAPITAL LETTER GHE 'Gdot': 'Ġ', # LATIN CAPITAL LETTER G WITH DOT ABOVE 'Gfr': '𝔊', # MATHEMATICAL FRAKTUR CAPITAL G 'Gg': '⋙', # VERY MUCH GREATER-THAN 'Ggr': 'Γ', # GREEK CAPITAL LETTER GAMMA 'Gopf': '𝔾', # MATHEMATICAL DOUBLE-STRUCK CAPITAL G 'GreaterEqual': '≥', # GREATER-THAN OR EQUAL TO 'GreaterEqualLess': '⋛', # GREATER-THAN EQUAL TO OR LESS-THAN 'GreaterFullEqual': '≧', # GREATER-THAN OVER EQUAL TO 'GreaterGreater': '⪢', # DOUBLE NESTED GREATER-THAN 'GreaterLess': '≷', # GREATER-THAN OR LESS-THAN 'GreaterSlantEqual': '⩾', # GREATER-THAN OR SLANTED EQUAL TO 'GreaterTilde': '≳', # GREATER-THAN OR EQUIVALENT TO 'Gscr': '𝒢', # MATHEMATICAL SCRIPT CAPITAL G 'Gt': '≫', # MUCH GREATER-THAN 'HARDcy': 'Ъ', # CYRILLIC CAPITAL LETTER HARD SIGN 'Hacek': 'ˇ', # CARON 'Hat': '^', # CIRCUMFLEX ACCENT 'Hcirc': 'Ĥ', # LATIN CAPITAL LETTER H WITH CIRCUMFLEX 'Hfr': 'ℌ', # BLACK-LETTER CAPITAL H 'HilbertSpace': 'ℋ', # SCRIPT CAPITAL H 'Hopf': 'ℍ', # DOUBLE-STRUCK CAPITAL H 'HorizontalLine': '─', # BOX DRAWINGS LIGHT HORIZONTAL 'Hscr': 'ℋ', # SCRIPT CAPITAL H 'Hstrok': 'Ħ', # LATIN CAPITAL LETTER H WITH STROKE 'HumpDownHump': '≎', # GEOMETRICALLY EQUIVALENT TO 'HumpEqual': '≏', # DIFFERENCE BETWEEN 'IEcy': 'Е', # CYRILLIC CAPITAL LETTER IE 'IJlig': 'IJ', # LATIN CAPITAL LIGATURE IJ 'IOcy': 'Ё', # CYRILLIC CAPITAL LETTER IO 'Iacgr': 'Ί', # GREEK CAPITAL LETTER IOTA WITH TONOS 'Iacute': 'Í', # LATIN CAPITAL LETTER I WITH ACUTE 'Icirc': 'Î', # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 'Icy': 'И', # CYRILLIC CAPITAL LETTER I 'Idigr': 'Ϊ', # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 'Idot': 'İ', # LATIN CAPITAL LETTER I WITH DOT ABOVE 'Ifr': 'ℑ', # BLACK-LETTER CAPITAL I 'Igr': 'Ι', # GREEK CAPITAL LETTER IOTA 'Igrave': 'Ì', # LATIN CAPITAL LETTER I WITH GRAVE 'Im': 'ℑ', # BLACK-LETTER CAPITAL I 'Imacr': 'Ī', # LATIN CAPITAL LETTER I WITH MACRON 'ImaginaryI': 'ⅈ', # DOUBLE-STRUCK ITALIC SMALL I 'Implies': '⇒', # RIGHTWARDS DOUBLE ARROW 'Int': '∬', # DOUBLE INTEGRAL 'Integral': '∫', # INTEGRAL 'Intersection': '⋂', # N-ARY INTERSECTION 'InvisibleComma': '⁣', # INVISIBLE SEPARATOR 'InvisibleTimes': '⁢', # INVISIBLE TIMES 'Iogon': 'Į', # LATIN CAPITAL LETTER I WITH OGONEK 'Iopf': '𝕀', # MATHEMATICAL DOUBLE-STRUCK CAPITAL I 'Iota': 'Ι', # GREEK CAPITAL LETTER IOTA 'Iscr': 'ℐ', # SCRIPT CAPITAL I 'Itilde': 'Ĩ', # LATIN CAPITAL LETTER I WITH TILDE 'Iukcy': 'І', # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I 'Iuml': 'Ï', # LATIN CAPITAL LETTER I WITH DIAERESIS 'Jcirc': 'Ĵ', # LATIN CAPITAL LETTER J WITH CIRCUMFLEX 'Jcy': 'Й', # CYRILLIC CAPITAL LETTER SHORT I 'Jfr': '𝔍', # MATHEMATICAL FRAKTUR CAPITAL J 'Jopf': '𝕁', # MATHEMATICAL DOUBLE-STRUCK CAPITAL J 'Jscr': '𝒥', # MATHEMATICAL SCRIPT CAPITAL J 'Jsercy': 'Ј', # CYRILLIC CAPITAL LETTER JE 'Jukcy': 'Є', # CYRILLIC CAPITAL LETTER UKRAINIAN IE 'KHcy': 'Х', # CYRILLIC CAPITAL LETTER HA 'KHgr': 'Χ', # GREEK CAPITAL LETTER CHI 'KJcy': 'Ќ', # CYRILLIC CAPITAL LETTER KJE 'Kappa': 'Κ', # GREEK CAPITAL LETTER KAPPA 'Kcedil': 'Ķ', # LATIN CAPITAL LETTER K WITH CEDILLA 'Kcy': 'К', # CYRILLIC CAPITAL LETTER KA 'Kfr': '𝔎', # MATHEMATICAL FRAKTUR CAPITAL K 'Kgr': 'Κ', # GREEK CAPITAL LETTER KAPPA 'Kopf': '𝕂', # MATHEMATICAL DOUBLE-STRUCK CAPITAL K 'Kscr': '𝒦', # MATHEMATICAL SCRIPT CAPITAL K 'LJcy': 'Љ', # CYRILLIC CAPITAL LETTER LJE 'LT': '&', # LESS-THAN SIGN 'Lacute': 'Ĺ', # LATIN CAPITAL LETTER L WITH ACUTE 'Lambda': 'Λ', # GREEK CAPITAL LETTER LAMDA 'Lang': '⟪', # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET 'Laplacetrf': 'ℒ', # SCRIPT CAPITAL L 'Larr': '↞', # LEFTWARDS TWO HEADED ARROW 'Lcaron': 'Ľ', # LATIN CAPITAL LETTER L WITH CARON 'Lcedil': 'Ļ', # LATIN CAPITAL LETTER L WITH CEDILLA 'Lcy': 'Л', # CYRILLIC CAPITAL LETTER EL 'LeftAngleBracket': '⟨', # MATHEMATICAL LEFT ANGLE BRACKET 'LeftArrow': '←', # LEFTWARDS ARROW 'LeftArrowBar': '⇤', # LEFTWARDS ARROW TO BAR 'LeftArrowRightArrow': '⇆', # LEFTWARDS ARROW OVER RIGHTWARDS ARROW 'LeftCeiling': '⌈', # LEFT CEILING 'LeftDoubleBracket': '⟦', # MATHEMATICAL LEFT WHITE SQUARE BRACKET 'LeftDownTeeVector': '⥡', # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR 'LeftDownVector': '⇃', # DOWNWARDS HARPOON WITH BARB LEFTWARDS 'LeftDownVectorBar': '⥙', # DOWNWARDS HARPOON WITH BARB LEFT TO BAR 'LeftFloor': '⌊', # LEFT FLOOR 'LeftRightArrow': '↔', # LEFT RIGHT ARROW 'LeftRightVector': '⥎', # LEFT BARB UP RIGHT BARB UP HARPOON 'LeftTee': '⊣', # LEFT TACK 'LeftTeeArrow': '↤', # LEFTWARDS ARROW FROM BAR 'LeftTeeVector': '⥚', # LEFTWARDS HARPOON WITH BARB UP FROM BAR 'LeftTriangle': '⊲', # NORMAL SUBGROUP OF 'LeftTriangleBar': '⧏', # LEFT TRIANGLE BESIDE VERTICAL BAR 'LeftTriangleEqual': '⊴', # NORMAL SUBGROUP OF OR EQUAL TO 'LeftUpDownVector': '⥑', # UP BARB LEFT DOWN BARB LEFT HARPOON 'LeftUpTeeVector': '⥠', # UPWARDS HARPOON WITH BARB LEFT FROM BAR 'LeftUpVector': '↿', # UPWARDS HARPOON WITH BARB LEFTWARDS 'LeftUpVectorBar': '⥘', # UPWARDS HARPOON WITH BARB LEFT TO BAR 'LeftVector': '↼', # LEFTWARDS HARPOON WITH BARB UPWARDS 'LeftVectorBar': '⥒', # LEFTWARDS HARPOON WITH BARB UP TO BAR 'Leftarrow': '⇐', # LEFTWARDS DOUBLE ARROW 'Leftrightarrow': '⇔', # LEFT RIGHT DOUBLE ARROW 'LessEqualGreater': '⋚', # LESS-THAN EQUAL TO OR GREATER-THAN 'LessFullEqual': '≦', # LESS-THAN OVER EQUAL TO 'LessGreater': '≶', # LESS-THAN OR GREATER-THAN 'LessLess': '⪡', # DOUBLE NESTED LESS-THAN 'LessSlantEqual': '⩽', # LESS-THAN OR SLANTED EQUAL TO 'LessTilde': '≲', # LESS-THAN OR EQUIVALENT TO 'Lfr': '𝔏', # MATHEMATICAL FRAKTUR CAPITAL L 'Lgr': 'Λ', # GREEK CAPITAL LETTER LAMDA 'Ll': '⋘', # VERY MUCH LESS-THAN 'Lleftarrow': '⇚', # LEFTWARDS TRIPLE ARROW 'Lmidot': 'Ŀ', # LATIN CAPITAL LETTER L WITH MIDDLE DOT 'LongLeftArrow': '⟵', # LONG LEFTWARDS ARROW 'LongLeftRightArrow': '⟷', # LONG LEFT RIGHT ARROW 'LongRightArrow': '⟶', # LONG RIGHTWARDS ARROW 'Longleftarrow': '⟸', # LONG LEFTWARDS DOUBLE ARROW 'Longleftrightarrow': '⟺', # LONG LEFT RIGHT DOUBLE ARROW 'Longrightarrow': '⟹', # LONG RIGHTWARDS DOUBLE ARROW 'Lopf': '𝕃', # MATHEMATICAL DOUBLE-STRUCK CAPITAL L 'LowerLeftArrow': '↙', # SOUTH WEST ARROW 'LowerRightArrow': '↘', # SOUTH EAST ARROW 'Lscr': 'ℒ', # SCRIPT CAPITAL L 'Lsh': '↰', # UPWARDS ARROW WITH TIP LEFTWARDS 'Lstrok': 'Ł', # LATIN CAPITAL LETTER L WITH STROKE 'Lt': '≪', # MUCH LESS-THAN 'Map': '⤅', # RIGHTWARDS TWO-HEADED ARROW FROM BAR 'Mcy': 'М', # CYRILLIC CAPITAL LETTER EM 'MediumSpace': ' ', # MEDIUM MATHEMATICAL SPACE 'Mellintrf': 'ℳ', # SCRIPT CAPITAL M 'Mfr': '𝔐', # MATHEMATICAL FRAKTUR CAPITAL M 'Mgr': 'Μ', # GREEK CAPITAL LETTER MU 'MinusPlus': '∓', # MINUS-OR-PLUS SIGN 'Mopf': '𝕄', # MATHEMATICAL DOUBLE-STRUCK CAPITAL M 'Mscr': 'ℳ', # SCRIPT CAPITAL M 'Mu': 'Μ', # GREEK CAPITAL LETTER MU 'NJcy': 'Њ', # CYRILLIC CAPITAL LETTER NJE 'Nacute': 'Ń', # LATIN CAPITAL LETTER N WITH ACUTE 'Ncaron': 'Ň', # LATIN CAPITAL LETTER N WITH CARON 'Ncedil': 'Ņ', # LATIN CAPITAL LETTER N WITH CEDILLA 'Ncy': 'Н', # CYRILLIC CAPITAL LETTER EN 'NegativeMediumSpace': '​', # ZERO WIDTH SPACE 'NegativeThickSpace': '​', # ZERO WIDTH SPACE 'NegativeThinSpace': '​', # ZERO WIDTH SPACE 'NegativeVeryThinSpace': '​', # ZERO WIDTH SPACE 'NestedGreaterGreater': '≫', # MUCH GREATER-THAN 'NestedLessLess': '≪', # MUCH LESS-THAN 'NewLine': '\u000A', # LINE FEED (LF) 'Nfr': '𝔑', # MATHEMATICAL FRAKTUR CAPITAL N 'Ngr': 'Ν', # GREEK CAPITAL LETTER NU 'NoBreak': '⁠', # WORD JOINER 'NonBreakingSpace': ' ', # NO-BREAK SPACE 'Nopf': 'ℕ', # DOUBLE-STRUCK CAPITAL N 'Not': '⫬', # DOUBLE STROKE NOT SIGN 'NotCongruent': '≢', # NOT IDENTICAL TO 'NotCupCap': '≭', # NOT EQUIVALENT TO 'NotDoubleVerticalBar': '∦', # NOT PARALLEL TO 'NotElement': '∉', # NOT AN ELEMENT OF 'NotEqual': '≠', # NOT EQUAL TO 'NotEqualTilde': '≂̸', # MINUS TILDE with slash 'NotExists': '∄', # THERE DOES NOT EXIST 'NotGreater': '≯', # NOT GREATER-THAN 'NotGreaterEqual': '≱', # NEITHER GREATER-THAN NOR EQUAL TO 'NotGreaterFullEqual': '≧̸', # GREATER-THAN OVER EQUAL TO with slash 'NotGreaterGreater': '≫̸', # MUCH GREATER THAN with slash 'NotGreaterLess': '≹', # NEITHER GREATER-THAN NOR LESS-THAN 'NotGreaterSlantEqual': '⩾̸', # GREATER-THAN OR SLANTED EQUAL TO with slash 'NotGreaterTilde': '≵', # NEITHER GREATER-THAN NOR EQUIVALENT TO 'NotHumpDownHump': '≎̸', # GEOMETRICALLY EQUIVALENT TO with slash 'NotHumpEqual': '≏̸', # DIFFERENCE BETWEEN with slash 'NotLeftTriangle': '⋪', # NOT NORMAL SUBGROUP OF 'NotLeftTriangleBar': '⧏̸', # LEFT TRIANGLE BESIDE VERTICAL BAR with slash 'NotLeftTriangleEqual': '⋬', # NOT NORMAL SUBGROUP OF OR EQUAL TO 'NotLess': '≮', # NOT LESS-THAN 'NotLessEqual': '≰', # NEITHER LESS-THAN NOR EQUAL TO 'NotLessGreater': '≸', # NEITHER LESS-THAN NOR GREATER-THAN 'NotLessLess': '≪̸', # MUCH LESS THAN with slash 'NotLessSlantEqual': '⩽̸', # LESS-THAN OR SLANTED EQUAL TO with slash 'NotLessTilde': '≴', # NEITHER LESS-THAN NOR EQUIVALENT TO 'NotNestedGreaterGreater': '⪢̸', # DOUBLE NESTED GREATER-THAN with slash 'NotNestedLessLess': '⪡̸', # DOUBLE NESTED LESS-THAN with slash 'NotPrecedes': '⊀', # DOES NOT PRECEDE 'NotPrecedesEqual': '⪯̸', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash 'NotPrecedesSlantEqual': '⋠', # DOES NOT PRECEDE OR EQUAL 'NotReverseElement': '∌', # DOES NOT CONTAIN AS MEMBER 'NotRightTriangle': '⋫', # DOES NOT CONTAIN AS NORMAL SUBGROUP 'NotRightTriangleBar': '⧐̸', # VERTICAL BAR BESIDE RIGHT TRIANGLE with slash 'NotRightTriangleEqual': '⋭', # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL 'NotSquareSubset': '⊏̸', # SQUARE IMAGE OF with slash 'NotSquareSubsetEqual': '⋢', # NOT SQUARE IMAGE OF OR EQUAL TO 'NotSquareSuperset': '⊐̸', # SQUARE ORIGINAL OF with slash 'NotSquareSupersetEqual': '⋣', # NOT SQUARE ORIGINAL OF OR EQUAL TO 'NotSubset': '⊂⃒', # SUBSET OF with vertical line 'NotSubsetEqual': '⊈', # NEITHER A SUBSET OF NOR EQUAL TO 'NotSucceeds': '⊁', # DOES NOT SUCCEED 'NotSucceedsEqual': '⪰̸', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash 'NotSucceedsSlantEqual': '⋡', # DOES NOT SUCCEED OR EQUAL 'NotSucceedsTilde': '≿̸', # SUCCEEDS OR EQUIVALENT TO with slash 'NotSuperset': '⊃⃒', # SUPERSET OF with vertical line 'NotSupersetEqual': '⊉', # NEITHER A SUPERSET OF NOR EQUAL TO 'NotTilde': '≁', # NOT TILDE 'NotTildeEqual': '≄', # NOT ASYMPTOTICALLY EQUAL TO 'NotTildeFullEqual': '≇', # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO 'NotTildeTilde': '≉', # NOT ALMOST EQUAL TO 'NotVerticalBar': '∤', # DOES NOT DIVIDE 'Nscr': '𝒩', # MATHEMATICAL SCRIPT CAPITAL N 'Ntilde': 'Ñ', # LATIN CAPITAL LETTER N WITH TILDE 'Nu': 'Ν', # GREEK CAPITAL LETTER NU 'OElig': 'Œ', # LATIN CAPITAL LIGATURE OE 'OHacgr': 'Ώ', # GREEK CAPITAL LETTER OMEGA WITH TONOS 'OHgr': 'Ω', # GREEK CAPITAL LETTER OMEGA 'Oacgr': 'Ό', # GREEK CAPITAL LETTER OMICRON WITH TONOS 'Oacute': 'Ó', # LATIN CAPITAL LETTER O WITH ACUTE 'Ocirc': 'Ô', # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 'Ocy': 'О', # CYRILLIC CAPITAL LETTER O 'Odblac': 'Ő', # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 'Ofr': '𝔒', # MATHEMATICAL FRAKTUR CAPITAL O 'Ogr': 'Ο', # GREEK CAPITAL LETTER OMICRON 'Ograve': 'Ò', # LATIN CAPITAL LETTER O WITH GRAVE 'Omacr': 'Ō', # LATIN CAPITAL LETTER O WITH MACRON 'Omega': 'Ω', # GREEK CAPITAL LETTER OMEGA 'Omicron': 'Ο', # GREEK CAPITAL LETTER OMICRON 'Oopf': '𝕆', # MATHEMATICAL DOUBLE-STRUCK CAPITAL O 'OpenCurlyDoubleQuote': '“', # LEFT DOUBLE QUOTATION MARK 'OpenCurlyQuote': '‘', # LEFT SINGLE QUOTATION MARK 'Or': '⩔', # DOUBLE LOGICAL OR 'Oscr': '𝒪', # MATHEMATICAL SCRIPT CAPITAL O 'Oslash': 'Ø', # LATIN CAPITAL LETTER O WITH STROKE 'Otilde': 'Õ', # LATIN CAPITAL LETTER O WITH TILDE 'Otimes': '⨷', # MULTIPLICATION SIGN IN DOUBLE CIRCLE 'Ouml': 'Ö', # LATIN CAPITAL LETTER O WITH DIAERESIS 'OverBar': '‾', # OVERLINE 'OverBrace': '⏞', # TOP CURLY BRACKET 'OverBracket': '⎴', # TOP SQUARE BRACKET 'OverParenthesis': '⏜', # TOP PARENTHESIS 'PHgr': 'Φ', # GREEK CAPITAL LETTER PHI 'PSgr': 'Ψ', # GREEK CAPITAL LETTER PSI 'PartialD': '∂', # PARTIAL DIFFERENTIAL 'Pcy': 'П', # CYRILLIC CAPITAL LETTER PE 'Pfr': '𝔓', # MATHEMATICAL FRAKTUR CAPITAL P 'Pgr': 'Π', # GREEK CAPITAL LETTER PI 'Phi': 'Φ', # GREEK CAPITAL LETTER PHI 'Pi': 'Π', # GREEK CAPITAL LETTER PI 'PlusMinus': '±', # PLUS-MINUS SIGN 'Poincareplane': 'ℌ', # BLACK-LETTER CAPITAL H 'Popf': 'ℙ', # DOUBLE-STRUCK CAPITAL P 'Pr': '⪻', # DOUBLE PRECEDES 'Precedes': '≺', # PRECEDES 'PrecedesEqual': '⪯', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN 'PrecedesSlantEqual': '≼', # PRECEDES OR EQUAL TO 'PrecedesTilde': '≾', # PRECEDES OR EQUIVALENT TO 'Prime': '″', # DOUBLE PRIME 'Product': '∏', # N-ARY PRODUCT 'Proportion': '∷', # PROPORTION 'Proportional': '∝', # PROPORTIONAL TO 'Pscr': '𝒫', # MATHEMATICAL SCRIPT CAPITAL P 'Psi': 'Ψ', # GREEK CAPITAL LETTER PSI 'QUOT': '"', # QUOTATION MARK 'Qfr': '𝔔', # MATHEMATICAL FRAKTUR CAPITAL Q 'Qopf': 'ℚ', # DOUBLE-STRUCK CAPITAL Q 'Qscr': '𝒬', # MATHEMATICAL SCRIPT CAPITAL Q 'RBarr': '⤐', # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW 'REG': '®', # REGISTERED SIGN 'Racute': 'Ŕ', # LATIN CAPITAL LETTER R WITH ACUTE 'Rang': '⟫', # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET 'Rarr': '↠', # RIGHTWARDS TWO HEADED ARROW 'Rarrtl': '⤖', # RIGHTWARDS TWO-HEADED ARROW WITH TAIL 'Rcaron': 'Ř', # LATIN CAPITAL LETTER R WITH CARON 'Rcedil': 'Ŗ', # LATIN CAPITAL LETTER R WITH CEDILLA 'Rcy': 'Р', # CYRILLIC CAPITAL LETTER ER 'Re': 'ℜ', # BLACK-LETTER CAPITAL R 'ReverseElement': '∋', # CONTAINS AS MEMBER 'ReverseEquilibrium': '⇋', # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON 'ReverseUpEquilibrium': '⥯', # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT 'Rfr': 'ℜ', # BLACK-LETTER CAPITAL R 'Rgr': 'Ρ', # GREEK CAPITAL LETTER RHO 'Rho': 'Ρ', # GREEK CAPITAL LETTER RHO 'RightAngleBracket': '⟩', # MATHEMATICAL RIGHT ANGLE BRACKET 'RightArrow': '→', # RIGHTWARDS ARROW 'RightArrowBar': '⇥', # RIGHTWARDS ARROW TO BAR 'RightArrowLeftArrow': '⇄', # RIGHTWARDS ARROW OVER LEFTWARDS ARROW 'RightCeiling': '⌉', # RIGHT CEILING 'RightDoubleBracket': '⟧', # MATHEMATICAL RIGHT WHITE SQUARE BRACKET 'RightDownTeeVector': '⥝', # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR 'RightDownVector': '⇂', # DOWNWARDS HARPOON WITH BARB RIGHTWARDS 'RightDownVectorBar': '⥕', # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR 'RightFloor': '⌋', # RIGHT FLOOR 'RightTee': '⊢', # RIGHT TACK 'RightTeeArrow': '↦', # RIGHTWARDS ARROW FROM BAR 'RightTeeVector': '⥛', # RIGHTWARDS HARPOON WITH BARB UP FROM BAR 'RightTriangle': '⊳', # CONTAINS AS NORMAL SUBGROUP 'RightTriangleBar': '⧐', # VERTICAL BAR BESIDE RIGHT TRIANGLE 'RightTriangleEqual': '⊵', # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO 'RightUpDownVector': '⥏', # UP BARB RIGHT DOWN BARB RIGHT HARPOON 'RightUpTeeVector': '⥜', # UPWARDS HARPOON WITH BARB RIGHT FROM BAR 'RightUpVector': '↾', # UPWARDS HARPOON WITH BARB RIGHTWARDS 'RightUpVectorBar': '⥔', # UPWARDS HARPOON WITH BARB RIGHT TO BAR 'RightVector': '⇀', # RIGHTWARDS HARPOON WITH BARB UPWARDS 'RightVectorBar': '⥓', # RIGHTWARDS HARPOON WITH BARB UP TO BAR 'Rightarrow': '⇒', # RIGHTWARDS DOUBLE ARROW 'Ropf': 'ℝ', # DOUBLE-STRUCK CAPITAL R 'RoundImplies': '⥰', # RIGHT DOUBLE ARROW WITH ROUNDED HEAD 'Rrightarrow': '⇛', # RIGHTWARDS TRIPLE ARROW 'Rscr': 'ℛ', # SCRIPT CAPITAL R 'Rsh': '↱', # UPWARDS ARROW WITH TIP RIGHTWARDS 'RuleDelayed': '⧴', # RULE-DELAYED 'SHCHcy': 'Щ', # CYRILLIC CAPITAL LETTER SHCHA 'SHcy': 'Ш', # CYRILLIC CAPITAL LETTER SHA 'SOFTcy': 'Ь', # CYRILLIC CAPITAL LETTER SOFT SIGN 'Sacute': 'Ś', # LATIN CAPITAL LETTER S WITH ACUTE 'Sc': '⪼', # DOUBLE SUCCEEDS 'Scaron': 'Š', # LATIN CAPITAL LETTER S WITH CARON 'Scedil': 'Ş', # LATIN CAPITAL LETTER S WITH CEDILLA 'Scirc': 'Ŝ', # LATIN CAPITAL LETTER S WITH CIRCUMFLEX 'Scy': 'С', # CYRILLIC CAPITAL LETTER ES 'Sfr': '𝔖', # MATHEMATICAL FRAKTUR CAPITAL S 'Sgr': 'Σ', # GREEK CAPITAL LETTER SIGMA 'ShortDownArrow': '↓', # DOWNWARDS ARROW 'ShortLeftArrow': '←', # LEFTWARDS ARROW 'ShortRightArrow': '→', # RIGHTWARDS ARROW 'ShortUpArrow': '↑', # UPWARDS ARROW 'Sigma': 'Σ', # GREEK CAPITAL LETTER SIGMA 'SmallCircle': '∘', # RING OPERATOR 'Sopf': '𝕊', # MATHEMATICAL DOUBLE-STRUCK CAPITAL S 'Sqrt': '√', # SQUARE ROOT 'Square': '□', # WHITE SQUARE 'SquareIntersection': '⊓', # SQUARE CAP 'SquareSubset': '⊏', # SQUARE IMAGE OF 'SquareSubsetEqual': '⊑', # SQUARE IMAGE OF OR EQUAL TO 'SquareSuperset': '⊐', # SQUARE ORIGINAL OF 'SquareSupersetEqual': '⊒', # SQUARE ORIGINAL OF OR EQUAL TO 'SquareUnion': '⊔', # SQUARE CUP 'Sscr': '𝒮', # MATHEMATICAL SCRIPT CAPITAL S 'Star': '⋆', # STAR OPERATOR 'Sub': '⋐', # DOUBLE SUBSET 'Subset': '⋐', # DOUBLE SUBSET 'SubsetEqual': '⊆', # SUBSET OF OR EQUAL TO 'Succeeds': '≻', # SUCCEEDS 'SucceedsEqual': '⪰', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 'SucceedsSlantEqual': '≽', # SUCCEEDS OR EQUAL TO 'SucceedsTilde': '≿', # SUCCEEDS OR EQUIVALENT TO 'SuchThat': '∋', # CONTAINS AS MEMBER 'Sum': '∑', # N-ARY SUMMATION 'Sup': '⋑', # DOUBLE SUPERSET 'Superset': '⊃', # SUPERSET OF 'SupersetEqual': '⊇', # SUPERSET OF OR EQUAL TO 'Supset': '⋑', # DOUBLE SUPERSET 'THORN': 'Þ', # LATIN CAPITAL LETTER THORN 'THgr': 'Θ', # GREEK CAPITAL LETTER THETA 'TRADE': '™', # TRADE MARK SIGN 'TSHcy': 'Ћ', # CYRILLIC CAPITAL LETTER TSHE 'TScy': 'Ц', # CYRILLIC CAPITAL LETTER TSE 'Tab': ' ', # CHARACTER TABULATION 'Tau': 'Τ', # GREEK CAPITAL LETTER TAU 'Tcaron': 'Ť', # LATIN CAPITAL LETTER T WITH CARON 'Tcedil': 'Ţ', # LATIN CAPITAL LETTER T WITH CEDILLA 'Tcy': 'Т', # CYRILLIC CAPITAL LETTER TE 'Tfr': '𝔗', # MATHEMATICAL FRAKTUR CAPITAL T 'Tgr': 'Τ', # GREEK CAPITAL LETTER TAU 'Therefore': '∴', # THEREFORE 'Theta': 'Θ', # GREEK CAPITAL LETTER THETA 'ThickSpace': '  ', # space of width 5/18 em 'ThinSpace': ' ', # THIN SPACE 'Tilde': '∼', # TILDE OPERATOR 'TildeEqual': '≃', # ASYMPTOTICALLY EQUAL TO 'TildeFullEqual': '≅', # APPROXIMATELY EQUAL TO 'TildeTilde': '≈', # ALMOST EQUAL TO 'Topf': '𝕋', # MATHEMATICAL DOUBLE-STRUCK CAPITAL T 'TripleDot': '\u20DB', # COMBINING THREE DOTS ABOVE 'Tscr': '𝒯', # MATHEMATICAL SCRIPT CAPITAL T 'Tstrok': 'Ŧ', # LATIN CAPITAL LETTER T WITH STROKE 'Uacgr': 'Ύ', # GREEK CAPITAL LETTER UPSILON WITH TONOS 'Uacute': 'Ú', # LATIN CAPITAL LETTER U WITH ACUTE 'Uarr': '↟', # UPWARDS TWO HEADED ARROW 'Uarrocir': '⥉', # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE 'Ubrcy': 'Ў', # CYRILLIC CAPITAL LETTER SHORT U 'Ubreve': 'Ŭ', # LATIN CAPITAL LETTER U WITH BREVE 'Ucirc': 'Û', # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 'Ucy': 'У', # CYRILLIC CAPITAL LETTER U 'Udblac': 'Ű', # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 'Udigr': 'Ϋ', # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 'Ufr': '𝔘', # MATHEMATICAL FRAKTUR CAPITAL U 'Ugr': 'Υ', # GREEK CAPITAL LETTER UPSILON 'Ugrave': 'Ù', # LATIN CAPITAL LETTER U WITH GRAVE 'Umacr': 'Ū', # LATIN CAPITAL LETTER U WITH MACRON 'UnderBar': '_', # LOW LINE 'UnderBrace': '⏟', # BOTTOM CURLY BRACKET 'UnderBracket': '⎵', # BOTTOM SQUARE BRACKET 'UnderParenthesis': '⏝', # BOTTOM PARENTHESIS 'Union': '⋃', # N-ARY UNION 'UnionPlus': '⊎', # MULTISET UNION 'Uogon': 'Ų', # LATIN CAPITAL LETTER U WITH OGONEK 'Uopf': '𝕌', # MATHEMATICAL DOUBLE-STRUCK CAPITAL U 'UpArrow': '↑', # UPWARDS ARROW 'UpArrowBar': '⤒', # UPWARDS ARROW TO BAR 'UpArrowDownArrow': '⇅', # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW 'UpDownArrow': '↕', # UP DOWN ARROW 'UpEquilibrium': '⥮', # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT 'UpTee': '⊥', # UP TACK 'UpTeeArrow': '↥', # UPWARDS ARROW FROM BAR 'Uparrow': '⇑', # UPWARDS DOUBLE ARROW 'Updownarrow': '⇕', # UP DOWN DOUBLE ARROW 'UpperLeftArrow': '↖', # NORTH WEST ARROW 'UpperRightArrow': '↗', # NORTH EAST ARROW 'Upsi': 'ϒ', # GREEK UPSILON WITH HOOK SYMBOL 'Upsilon': 'Υ', # GREEK CAPITAL LETTER UPSILON 'Uring': 'Ů', # LATIN CAPITAL LETTER U WITH RING ABOVE 'Uscr': '𝒰', # MATHEMATICAL SCRIPT CAPITAL U 'Utilde': 'Ũ', # LATIN CAPITAL LETTER U WITH TILDE 'Uuml': 'Ü', # LATIN CAPITAL LETTER U WITH DIAERESIS 'VDash': '⊫', # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE 'Vbar': '⫫', # DOUBLE UP TACK 'Vcy': 'В', # CYRILLIC CAPITAL LETTER VE 'Vdash': '⊩', # FORCES 'Vdashl': '⫦', # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL 'Vee': '⋁', # N-ARY LOGICAL OR 'Verbar': '‖', # DOUBLE VERTICAL LINE 'Vert': '‖', # DOUBLE VERTICAL LINE 'VerticalBar': '∣', # DIVIDES 'VerticalLine': '|', # VERTICAL LINE 'VerticalSeparator': '❘', # LIGHT VERTICAL BAR 'VerticalTilde': '≀', # WREATH PRODUCT 'VeryThinSpace': ' ', # HAIR SPACE 'Vfr': '𝔙', # MATHEMATICAL FRAKTUR CAPITAL V 'Vopf': '𝕍', # MATHEMATICAL DOUBLE-STRUCK CAPITAL V 'Vscr': '𝒱', # MATHEMATICAL SCRIPT CAPITAL V 'Vvdash': '⊪', # TRIPLE VERTICAL BAR RIGHT TURNSTILE 'Wcirc': 'Ŵ', # LATIN CAPITAL LETTER W WITH CIRCUMFLEX 'Wedge': '⋀', # N-ARY LOGICAL AND 'Wfr': '𝔚', # MATHEMATICAL FRAKTUR CAPITAL W 'Wopf': '𝕎', # MATHEMATICAL DOUBLE-STRUCK CAPITAL W 'Wscr': '𝒲', # MATHEMATICAL SCRIPT CAPITAL W 'Xfr': '𝔛', # MATHEMATICAL FRAKTUR CAPITAL X 'Xgr': 'Ξ', # GREEK CAPITAL LETTER XI 'Xi': 'Ξ', # GREEK CAPITAL LETTER XI 'Xopf': '𝕏', # MATHEMATICAL DOUBLE-STRUCK CAPITAL X 'Xscr': '𝒳', # MATHEMATICAL SCRIPT CAPITAL X 'YAcy': 'Я', # CYRILLIC CAPITAL LETTER YA 'YIcy': 'Ї', # CYRILLIC CAPITAL LETTER YI 'YUcy': 'Ю', # CYRILLIC CAPITAL LETTER YU 'Yacute': 'Ý', # LATIN CAPITAL LETTER Y WITH ACUTE 'Ycirc': 'Ŷ', # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX 'Ycy': 'Ы', # CYRILLIC CAPITAL LETTER YERU 'Yfr': '𝔜', # MATHEMATICAL FRAKTUR CAPITAL Y 'Yopf': '𝕐', # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y 'Yscr': '𝒴', # MATHEMATICAL SCRIPT CAPITAL Y 'Yuml': 'Ÿ', # LATIN CAPITAL LETTER Y WITH DIAERESIS 'ZHcy': 'Ж', # CYRILLIC CAPITAL LETTER ZHE 'Zacute': 'Ź', # LATIN CAPITAL LETTER Z WITH ACUTE 'Zcaron': 'Ž', # LATIN CAPITAL LETTER Z WITH CARON 'Zcy': 'З', # CYRILLIC CAPITAL LETTER ZE 'Zdot': 'Ż', # LATIN CAPITAL LETTER Z WITH DOT ABOVE 'ZeroWidthSpace': '​', # ZERO WIDTH SPACE 'Zeta': 'Ζ', # GREEK CAPITAL LETTER ZETA 'Zfr': 'ℨ', # BLACK-LETTER CAPITAL Z 'Zgr': 'Ζ', # GREEK CAPITAL LETTER ZETA 'Zopf': 'ℤ', # DOUBLE-STRUCK CAPITAL Z 'Zscr': '𝒵', # MATHEMATICAL SCRIPT CAPITAL Z 'aacgr': 'ά', # GREEK SMALL LETTER ALPHA WITH TONOS 'aacute': 'á', # LATIN SMALL LETTER A WITH ACUTE 'abreve': 'ă', # LATIN SMALL LETTER A WITH BREVE 'ac': '∾', # INVERTED LAZY S 'acE': '∾̳', # INVERTED LAZY S with double underline 'acd': '∿', # SINE WAVE 'acirc': 'â', # LATIN SMALL LETTER A WITH CIRCUMFLEX 'acute': '´', # ACUTE ACCENT 'acy': 'а', # CYRILLIC SMALL LETTER A 'aelig': 'æ', # LATIN SMALL LETTER AE 'af': '⁡', # FUNCTION APPLICATION 'afr': '𝔞', # MATHEMATICAL FRAKTUR SMALL A 'agr': 'α', # GREEK SMALL LETTER ALPHA 'agrave': 'à', # LATIN SMALL LETTER A WITH GRAVE 'alefsym': 'ℵ', # ALEF SYMBOL 'aleph': 'ℵ', # ALEF SYMBOL 'alpha': 'α', # GREEK SMALL LETTER ALPHA 'amacr': 'ā', # LATIN SMALL LETTER A WITH MACRON 'amalg': '⨿', # AMALGAMATION OR COPRODUCT 'amp': '&', # AMPERSAND 'and': '∧', # LOGICAL AND 'andand': '⩕', # TWO INTERSECTING LOGICAL AND 'andd': '⩜', # LOGICAL AND WITH HORIZONTAL DASH 'andslope': '⩘', # SLOPING LARGE AND 'andv': '⩚', # LOGICAL AND WITH MIDDLE STEM 'ang': '∠', # ANGLE 'ange': '⦤', # ANGLE WITH UNDERBAR 'angle': '∠', # ANGLE 'angmsd': '∡', # MEASURED ANGLE 'angmsdaa': '⦨', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT 'angmsdab': '⦩', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT 'angmsdac': '⦪', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT 'angmsdad': '⦫', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT 'angmsdae': '⦬', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP 'angmsdaf': '⦭', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP 'angmsdag': '⦮', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN 'angmsdah': '⦯', # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN 'angrt': '∟', # RIGHT ANGLE 'angrtvb': '⊾', # RIGHT ANGLE WITH ARC 'angrtvbd': '⦝', # MEASURED RIGHT ANGLE WITH DOT 'angsph': '∢', # SPHERICAL ANGLE 'angst': 'Å', # LATIN CAPITAL LETTER A WITH RING ABOVE 'angzarr': '⍼', # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW 'aogon': 'ą', # LATIN SMALL LETTER A WITH OGONEK 'aopf': '𝕒', # MATHEMATICAL DOUBLE-STRUCK SMALL A 'ap': '≈', # ALMOST EQUAL TO 'apE': '⩰', # APPROXIMATELY EQUAL OR EQUAL TO 'apacir': '⩯', # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT 'ape': '≊', # ALMOST EQUAL OR EQUAL TO 'apid': '≋', # TRIPLE TILDE 'apos': "'", # APOSTROPHE 'approx': '≈', # ALMOST EQUAL TO 'approxeq': '≊', # ALMOST EQUAL OR EQUAL TO 'aring': 'å', # LATIN SMALL LETTER A WITH RING ABOVE 'ascr': '𝒶', # MATHEMATICAL SCRIPT SMALL A 'ast': '*', # ASTERISK 'asymp': '≈', # ALMOST EQUAL TO 'asympeq': '≍', # EQUIVALENT TO 'atilde': 'ã', # LATIN SMALL LETTER A WITH TILDE 'auml': 'ä', # LATIN SMALL LETTER A WITH DIAERESIS 'awconint': '∳', # ANTICLOCKWISE CONTOUR INTEGRAL 'awint': '⨑', # ANTICLOCKWISE INTEGRATION 'b.Delta': '𝚫', # MATHEMATICAL BOLD CAPITAL DELTA 'b.Gamma': '𝚪', # MATHEMATICAL BOLD CAPITAL GAMMA 'b.Gammad': '𝟊', # MATHEMATICAL BOLD CAPITAL DIGAMMA 'b.Lambda': '𝚲', # MATHEMATICAL BOLD CAPITAL LAMDA 'b.Omega': '𝛀', # MATHEMATICAL BOLD CAPITAL OMEGA 'b.Phi': '𝚽', # MATHEMATICAL BOLD CAPITAL PHI 'b.Pi': '𝚷', # MATHEMATICAL BOLD CAPITAL PI 'b.Psi': '𝚿', # MATHEMATICAL BOLD CAPITAL PSI 'b.Sigma': '𝚺', # MATHEMATICAL BOLD CAPITAL SIGMA 'b.Theta': '𝚯', # MATHEMATICAL BOLD CAPITAL THETA 'b.Upsi': '𝚼', # MATHEMATICAL BOLD CAPITAL UPSILON 'b.Xi': '𝚵', # MATHEMATICAL BOLD CAPITAL XI 'b.alpha': '𝛂', # MATHEMATICAL BOLD SMALL ALPHA 'b.beta': '𝛃', # MATHEMATICAL BOLD SMALL BETA 'b.chi': '𝛘', # MATHEMATICAL BOLD SMALL CHI 'b.delta': '𝛅', # MATHEMATICAL BOLD SMALL DELTA 'b.epsi': '𝛆', # MATHEMATICAL BOLD SMALL EPSILON 'b.epsiv': '𝛜', # MATHEMATICAL BOLD EPSILON SYMBOL 'b.eta': '𝛈', # MATHEMATICAL BOLD SMALL ETA 'b.gamma': '𝛄', # MATHEMATICAL BOLD SMALL GAMMA 'b.gammad': '𝟋', # MATHEMATICAL BOLD SMALL DIGAMMA 'b.iota': '𝛊', # MATHEMATICAL BOLD SMALL IOTA 'b.kappa': '𝛋', # MATHEMATICAL BOLD SMALL KAPPA 'b.kappav': '𝛞', # MATHEMATICAL BOLD KAPPA SYMBOL 'b.lambda': '𝛌', # MATHEMATICAL BOLD SMALL LAMDA 'b.mu': '𝛍', # MATHEMATICAL BOLD SMALL MU 'b.nu': '𝛎', # MATHEMATICAL BOLD SMALL NU 'b.omega': '𝛚', # MATHEMATICAL BOLD SMALL OMEGA 'b.phi': '𝛗', # MATHEMATICAL BOLD SMALL PHI 'b.phiv': '𝛟', # MATHEMATICAL BOLD PHI SYMBOL 'b.pi': '𝛑', # MATHEMATICAL BOLD SMALL PI 'b.piv': '𝛡', # MATHEMATICAL BOLD PI SYMBOL 'b.psi': '𝛙', # MATHEMATICAL BOLD SMALL PSI 'b.rho': '𝛒', # MATHEMATICAL BOLD SMALL RHO 'b.rhov': '𝛠', # MATHEMATICAL BOLD RHO SYMBOL 'b.sigma': '𝛔', # MATHEMATICAL BOLD SMALL SIGMA 'b.sigmav': '𝛓', # MATHEMATICAL BOLD SMALL FINAL SIGMA 'b.tau': '𝛕', # MATHEMATICAL BOLD SMALL TAU 'b.thetas': '𝛉', # MATHEMATICAL BOLD SMALL THETA 'b.thetav': '𝛝', # MATHEMATICAL BOLD THETA SYMBOL 'b.upsi': '𝛖', # MATHEMATICAL BOLD SMALL UPSILON 'b.xi': '𝛏', # MATHEMATICAL BOLD SMALL XI 'b.zeta': '𝛇', # MATHEMATICAL BOLD SMALL ZETA 'bNot': '⫭', # REVERSED DOUBLE STROKE NOT SIGN 'backcong': '≌', # ALL EQUAL TO 'backepsilon': '϶', # GREEK REVERSED LUNATE EPSILON SYMBOL 'backprime': '‵', # REVERSED PRIME 'backsim': '∽', # REVERSED TILDE 'backsimeq': '⋍', # REVERSED TILDE EQUALS 'barvee': '⊽', # NOR 'barwed': '⌅', # PROJECTIVE 'barwedge': '⌅', # PROJECTIVE 'bbrk': '⎵', # BOTTOM SQUARE BRACKET 'bbrktbrk': '⎶', # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET 'bcong': '≌', # ALL EQUAL TO 'bcy': 'б', # CYRILLIC SMALL LETTER BE 'bdquo': '„', # DOUBLE LOW-9 QUOTATION MARK 'becaus': '∵', # BECAUSE 'because': '∵', # BECAUSE 'bemptyv': '⦰', # REVERSED EMPTY SET 'bepsi': '϶', # GREEK REVERSED LUNATE EPSILON SYMBOL 'bernou': 'ℬ', # SCRIPT CAPITAL B 'beta': 'β', # GREEK SMALL LETTER BETA 'beth': 'ℶ', # BET SYMBOL 'between': '≬', # BETWEEN 'bfr': '𝔟', # MATHEMATICAL FRAKTUR SMALL B 'bgr': 'β', # GREEK SMALL LETTER BETA 'bigcap': '⋂', # N-ARY INTERSECTION 'bigcirc': '◯', # LARGE CIRCLE 'bigcup': '⋃', # N-ARY UNION 'bigodot': '⨀', # N-ARY CIRCLED DOT OPERATOR 'bigoplus': '⨁', # N-ARY CIRCLED PLUS OPERATOR 'bigotimes': '⨂', # N-ARY CIRCLED TIMES OPERATOR 'bigsqcup': '⨆', # N-ARY SQUARE UNION OPERATOR 'bigstar': '★', # BLACK STAR 'bigtriangledown': '▽', # WHITE DOWN-POINTING TRIANGLE 'bigtriangleup': '△', # WHITE UP-POINTING TRIANGLE 'biguplus': '⨄', # N-ARY UNION OPERATOR WITH PLUS 'bigvee': '⋁', # N-ARY LOGICAL OR 'bigwedge': '⋀', # N-ARY LOGICAL AND 'bkarow': '⤍', # RIGHTWARDS DOUBLE DASH ARROW 'blacklozenge': '⧫', # BLACK LOZENGE 'blacksquare': '▪', # BLACK SMALL SQUARE 'blacktriangle': '▴', # BLACK UP-POINTING SMALL TRIANGLE 'blacktriangledown': '▾', # BLACK DOWN-POINTING SMALL TRIANGLE 'blacktriangleleft': '◂', # BLACK LEFT-POINTING SMALL TRIANGLE 'blacktriangleright': '▸', # BLACK RIGHT-POINTING SMALL TRIANGLE 'blank': '␣', # OPEN BOX 'blk12': '▒', # MEDIUM SHADE 'blk14': '░', # LIGHT SHADE 'blk34': '▓', # DARK SHADE 'block': '█', # FULL BLOCK 'bne': '=⃥', # EQUALS SIGN with reverse slash 'bnequiv': '≡⃥', # IDENTICAL TO with reverse slash 'bnot': '⌐', # REVERSED NOT SIGN 'bopf': '𝕓', # MATHEMATICAL DOUBLE-STRUCK SMALL B 'bot': '⊥', # UP TACK 'bottom': '⊥', # UP TACK 'bowtie': '⋈', # BOWTIE 'boxDL': '╗', # BOX DRAWINGS DOUBLE DOWN AND LEFT 'boxDR': '╔', # BOX DRAWINGS DOUBLE DOWN AND RIGHT 'boxDl': '╖', # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE 'boxDr': '╓', # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE 'boxH': '═', # BOX DRAWINGS DOUBLE HORIZONTAL 'boxHD': '╦', # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL 'boxHU': '╩', # BOX DRAWINGS DOUBLE UP AND HORIZONTAL 'boxHd': '╤', # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE 'boxHu': '╧', # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE 'boxUL': '╝', # BOX DRAWINGS DOUBLE UP AND LEFT 'boxUR': '╚', # BOX DRAWINGS DOUBLE UP AND RIGHT 'boxUl': '╜', # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE 'boxUr': '╙', # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE 'boxV': '║', # BOX DRAWINGS DOUBLE VERTICAL 'boxVH': '╬', # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL 'boxVL': '╣', # BOX DRAWINGS DOUBLE VERTICAL AND LEFT 'boxVR': '╠', # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT 'boxVh': '╫', # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE 'boxVl': '╢', # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE 'boxVr': '╟', # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE 'boxbox': '⧉', # TWO JOINED SQUARES 'boxdL': '╕', # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE 'boxdR': '╒', # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE 'boxdl': '┐', # BOX DRAWINGS LIGHT DOWN AND LEFT 'boxdr': '┌', # BOX DRAWINGS LIGHT DOWN AND RIGHT 'boxh': '─', # BOX DRAWINGS LIGHT HORIZONTAL 'boxhD': '╥', # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE 'boxhU': '╨', # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE 'boxhd': '┬', # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL 'boxhu': '┴', # BOX DRAWINGS LIGHT UP AND HORIZONTAL 'boxminus': '⊟', # SQUARED MINUS 'boxplus': '⊞', # SQUARED PLUS 'boxtimes': '⊠', # SQUARED TIMES 'boxuL': '╛', # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE 'boxuR': '╘', # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE 'boxul': '┘', # BOX DRAWINGS LIGHT UP AND LEFT 'boxur': '└', # BOX DRAWINGS LIGHT UP AND RIGHT 'boxv': '│', # BOX DRAWINGS LIGHT VERTICAL 'boxvH': '╪', # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE 'boxvL': '╡', # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE 'boxvR': '╞', # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE 'boxvh': '┼', # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL 'boxvl': '┤', # BOX DRAWINGS LIGHT VERTICAL AND LEFT 'boxvr': '├', # BOX DRAWINGS LIGHT VERTICAL AND RIGHT 'bprime': '‵', # REVERSED PRIME 'breve': '˘', # BREVE 'brvbar': '¦', # BROKEN BAR 'bscr': '𝒷', # MATHEMATICAL SCRIPT SMALL B 'bsemi': '⁏', # REVERSED SEMICOLON 'bsim': '∽', # REVERSED TILDE 'bsime': '⋍', # REVERSED TILDE EQUALS 'bsol': '\\', # REVERSE SOLIDUS 'bsolb': '⧅', # SQUARED FALLING DIAGONAL SLASH 'bsolhsub': '⟈', # REVERSE SOLIDUS PRECEDING SUBSET 'bull': '•', # BULLET 'bullet': '•', # BULLET 'bump': '≎', # GEOMETRICALLY EQUIVALENT TO 'bumpE': '⪮', # EQUALS SIGN WITH BUMPY ABOVE 'bumpe': '≏', # DIFFERENCE BETWEEN 'bumpeq': '≏', # DIFFERENCE BETWEEN 'cacute': 'ć', # LATIN SMALL LETTER C WITH ACUTE 'cap': '∩', # INTERSECTION 'capand': '⩄', # INTERSECTION WITH LOGICAL AND 'capbrcup': '⩉', # INTERSECTION ABOVE BAR ABOVE UNION 'capcap': '⩋', # INTERSECTION BESIDE AND JOINED WITH INTERSECTION 'capcup': '⩇', # INTERSECTION ABOVE UNION 'capdot': '⩀', # INTERSECTION WITH DOT 'caps': '∩︀', # INTERSECTION with serifs 'caret': '⁁', # CARET INSERTION POINT 'caron': 'ˇ', # CARON 'ccaps': '⩍', # CLOSED INTERSECTION WITH SERIFS 'ccaron': 'č', # LATIN SMALL LETTER C WITH CARON 'ccedil': 'ç', # LATIN SMALL LETTER C WITH CEDILLA 'ccirc': 'ĉ', # LATIN SMALL LETTER C WITH CIRCUMFLEX 'ccups': '⩌', # CLOSED UNION WITH SERIFS 'ccupssm': '⩐', # CLOSED UNION WITH SERIFS AND SMASH PRODUCT 'cdot': 'ċ', # LATIN SMALL LETTER C WITH DOT ABOVE 'cedil': '¸', # CEDILLA 'cemptyv': '⦲', # EMPTY SET WITH SMALL CIRCLE ABOVE 'cent': '¢', # CENT SIGN 'centerdot': '·', # MIDDLE DOT 'cfr': '𝔠', # MATHEMATICAL FRAKTUR SMALL C 'chcy': 'ч', # CYRILLIC SMALL LETTER CHE 'check': '✓', # CHECK MARK 'checkmark': '✓', # CHECK MARK 'chi': 'χ', # GREEK SMALL LETTER CHI 'cir': '○', # WHITE CIRCLE 'cirE': '⧃', # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT 'circ': 'ˆ', # MODIFIER LETTER CIRCUMFLEX ACCENT 'circeq': '≗', # RING EQUAL TO 'circlearrowleft': '↺', # ANTICLOCKWISE OPEN CIRCLE ARROW 'circlearrowright': '↻', # CLOCKWISE OPEN CIRCLE ARROW 'circledR': '®', # REGISTERED SIGN 'circledS': 'Ⓢ', # CIRCLED LATIN CAPITAL LETTER S 'circledast': '⊛', # CIRCLED ASTERISK OPERATOR 'circledcirc': '⊚', # CIRCLED RING OPERATOR 'circleddash': '⊝', # CIRCLED DASH 'cire': '≗', # RING EQUAL TO 'cirfnint': '⨐', # CIRCULATION FUNCTION 'cirmid': '⫯', # VERTICAL LINE WITH CIRCLE ABOVE 'cirscir': '⧂', # CIRCLE WITH SMALL CIRCLE TO THE RIGHT 'clubs': '♣', # BLACK CLUB SUIT 'clubsuit': '♣', # BLACK CLUB SUIT 'colon': ':', # COLON 'colone': '≔', # COLON EQUALS 'coloneq': '≔', # COLON EQUALS 'comma': ',', # COMMA 'commat': '@', # COMMERCIAL AT 'comp': '∁', # COMPLEMENT 'compfn': '∘', # RING OPERATOR 'complement': '∁', # COMPLEMENT 'complexes': 'ℂ', # DOUBLE-STRUCK CAPITAL C 'cong': '≅', # APPROXIMATELY EQUAL TO 'congdot': '⩭', # CONGRUENT WITH DOT ABOVE 'conint': '∮', # CONTOUR INTEGRAL 'copf': '𝕔', # MATHEMATICAL DOUBLE-STRUCK SMALL C 'coprod': '∐', # N-ARY COPRODUCT 'copy': '©', # COPYRIGHT SIGN 'copysr': '℗', # SOUND RECORDING COPYRIGHT 'crarr': '↵', # DOWNWARDS ARROW WITH CORNER LEFTWARDS 'cross': '✗', # BALLOT X 'cscr': '𝒸', # MATHEMATICAL SCRIPT SMALL C 'csub': '⫏', # CLOSED SUBSET 'csube': '⫑', # CLOSED SUBSET OR EQUAL TO 'csup': '⫐', # CLOSED SUPERSET 'csupe': '⫒', # CLOSED SUPERSET OR EQUAL TO 'ctdot': '⋯', # MIDLINE HORIZONTAL ELLIPSIS 'cudarrl': '⤸', # RIGHT-SIDE ARC CLOCKWISE ARROW 'cudarrr': '⤵', # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS 'cuepr': '⋞', # EQUAL TO OR PRECEDES 'cuesc': '⋟', # EQUAL TO OR SUCCEEDS 'cularr': '↶', # ANTICLOCKWISE TOP SEMICIRCLE ARROW 'cularrp': '⤽', # TOP ARC ANTICLOCKWISE ARROW WITH PLUS 'cup': '∪', # UNION 'cupbrcap': '⩈', # UNION ABOVE BAR ABOVE INTERSECTION 'cupcap': '⩆', # UNION ABOVE INTERSECTION 'cupcup': '⩊', # UNION BESIDE AND JOINED WITH UNION 'cupdot': '⊍', # MULTISET MULTIPLICATION 'cupor': '⩅', # UNION WITH LOGICAL OR 'cups': '∪︀', # UNION with serifs 'curarr': '↷', # CLOCKWISE TOP SEMICIRCLE ARROW 'curarrm': '⤼', # TOP ARC CLOCKWISE ARROW WITH MINUS 'curlyeqprec': '⋞', # EQUAL TO OR PRECEDES 'curlyeqsucc': '⋟', # EQUAL TO OR SUCCEEDS 'curlyvee': '⋎', # CURLY LOGICAL OR 'curlywedge': '⋏', # CURLY LOGICAL AND 'curren': '¤', # CURRENCY SIGN 'curvearrowleft': '↶', # ANTICLOCKWISE TOP SEMICIRCLE ARROW 'curvearrowright': '↷', # CLOCKWISE TOP SEMICIRCLE ARROW 'cuvee': '⋎', # CURLY LOGICAL OR 'cuwed': '⋏', # CURLY LOGICAL AND 'cwconint': '∲', # CLOCKWISE CONTOUR INTEGRAL 'cwint': '∱', # CLOCKWISE INTEGRAL 'cylcty': '⌭', # CYLINDRICITY 'dArr': '⇓', # DOWNWARDS DOUBLE ARROW 'dHar': '⥥', # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT 'dagger': '†', # DAGGER 'daleth': 'ℸ', # DALET SYMBOL 'darr': '↓', # DOWNWARDS ARROW 'dash': '‐', # HYPHEN 'dashv': '⊣', # LEFT TACK 'dbkarow': '⤏', # RIGHTWARDS TRIPLE DASH ARROW 'dblac': '˝', # DOUBLE ACUTE ACCENT 'dcaron': 'ď', # LATIN SMALL LETTER D WITH CARON 'dcy': 'д', # CYRILLIC SMALL LETTER DE 'dd': 'ⅆ', # DOUBLE-STRUCK ITALIC SMALL D 'ddagger': '‡', # DOUBLE DAGGER 'ddarr': '⇊', # DOWNWARDS PAIRED ARROWS 'ddotseq': '⩷', # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW 'deg': '°', # DEGREE SIGN 'delta': 'δ', # GREEK SMALL LETTER DELTA 'demptyv': '⦱', # EMPTY SET WITH OVERBAR 'dfisht': '⥿', # DOWN FISH TAIL 'dfr': '𝔡', # MATHEMATICAL FRAKTUR SMALL D 'dgr': 'δ', # GREEK SMALL LETTER DELTA 'dharl': '⇃', # DOWNWARDS HARPOON WITH BARB LEFTWARDS 'dharr': '⇂', # DOWNWARDS HARPOON WITH BARB RIGHTWARDS 'diam': '⋄', # DIAMOND OPERATOR 'diamond': '⋄', # DIAMOND OPERATOR 'diamondsuit': '♦', # BLACK DIAMOND SUIT 'diams': '♦', # BLACK DIAMOND SUIT 'die': '¨', # DIAERESIS 'digamma': 'ϝ', # GREEK SMALL LETTER DIGAMMA 'disin': '⋲', # ELEMENT OF WITH LONG HORIZONTAL STROKE 'div': '÷', # DIVISION SIGN 'divide': '÷', # DIVISION SIGN 'divideontimes': '⋇', # DIVISION TIMES 'divonx': '⋇', # DIVISION TIMES 'djcy': 'ђ', # CYRILLIC SMALL LETTER DJE 'dlcorn': '⌞', # BOTTOM LEFT CORNER 'dlcrop': '⌍', # BOTTOM LEFT CROP 'dollar': '$', # DOLLAR SIGN 'dopf': '𝕕', # MATHEMATICAL DOUBLE-STRUCK SMALL D 'dot': '˙', # DOT ABOVE 'doteq': '≐', # APPROACHES THE LIMIT 'doteqdot': '≑', # GEOMETRICALLY EQUAL TO 'dotminus': '∸', # DOT MINUS 'dotplus': '∔', # DOT PLUS 'dotsquare': '⊡', # SQUARED DOT OPERATOR 'doublebarwedge': '⌆', # PERSPECTIVE 'downarrow': '↓', # DOWNWARDS ARROW 'downdownarrows': '⇊', # DOWNWARDS PAIRED ARROWS 'downharpoonleft': '⇃', # DOWNWARDS HARPOON WITH BARB LEFTWARDS 'downharpoonright': '⇂', # DOWNWARDS HARPOON WITH BARB RIGHTWARDS 'drbkarow': '⤐', # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW 'drcorn': '⌟', # BOTTOM RIGHT CORNER 'drcrop': '⌌', # BOTTOM RIGHT CROP 'dscr': '𝒹', # MATHEMATICAL SCRIPT SMALL D 'dscy': 'ѕ', # CYRILLIC SMALL LETTER DZE 'dsol': '⧶', # SOLIDUS WITH OVERBAR 'dstrok': 'đ', # LATIN SMALL LETTER D WITH STROKE 'dtdot': '⋱', # DOWN RIGHT DIAGONAL ELLIPSIS 'dtri': '▿', # WHITE DOWN-POINTING SMALL TRIANGLE 'dtrif': '▾', # BLACK DOWN-POINTING SMALL TRIANGLE 'duarr': '⇵', # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW 'duhar': '⥯', # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT 'dwangle': '⦦', # OBLIQUE ANGLE OPENING UP 'dzcy': 'џ', # CYRILLIC SMALL LETTER DZHE 'dzigrarr': '⟿', # LONG RIGHTWARDS SQUIGGLE ARROW 'eDDot': '⩷', # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW 'eDot': '≑', # GEOMETRICALLY EQUAL TO 'eacgr': 'έ', # GREEK SMALL LETTER EPSILON WITH TONOS 'eacute': 'é', # LATIN SMALL LETTER E WITH ACUTE 'easter': '⩮', # EQUALS WITH ASTERISK 'ecaron': 'ě', # LATIN SMALL LETTER E WITH CARON 'ecir': '≖', # RING IN EQUAL TO 'ecirc': 'ê', # LATIN SMALL LETTER E WITH CIRCUMFLEX 'ecolon': '≕', # EQUALS COLON 'ecy': 'э', # CYRILLIC SMALL LETTER E 'edot': 'ė', # LATIN SMALL LETTER E WITH DOT ABOVE 'ee': 'ⅇ', # DOUBLE-STRUCK ITALIC SMALL E 'eeacgr': 'ή', # GREEK SMALL LETTER ETA WITH TONOS 'eegr': 'η', # GREEK SMALL LETTER ETA 'efDot': '≒', # APPROXIMATELY EQUAL TO OR THE IMAGE OF 'efr': '𝔢', # MATHEMATICAL FRAKTUR SMALL E 'eg': '⪚', # DOUBLE-LINE EQUAL TO OR GREATER-THAN 'egr': 'ε', # GREEK SMALL LETTER EPSILON 'egrave': 'è', # LATIN SMALL LETTER E WITH GRAVE 'egs': '⪖', # SLANTED EQUAL TO OR GREATER-THAN 'egsdot': '⪘', # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE 'el': '⪙', # DOUBLE-LINE EQUAL TO OR LESS-THAN 'elinters': '⏧', # ELECTRICAL INTERSECTION 'ell': 'ℓ', # SCRIPT SMALL L 'els': '⪕', # SLANTED EQUAL TO OR LESS-THAN 'elsdot': '⪗', # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE 'emacr': 'ē', # LATIN SMALL LETTER E WITH MACRON 'empty': '∅', # EMPTY SET 'emptyset': '∅', # EMPTY SET 'emptyv': '∅', # EMPTY SET 'emsp': ' ', # EM SPACE 'emsp13': ' ', # THREE-PER-EM SPACE 'emsp14': ' ', # FOUR-PER-EM SPACE 'eng': 'ŋ', # LATIN SMALL LETTER ENG 'ensp': ' ', # EN SPACE 'eogon': 'ę', # LATIN SMALL LETTER E WITH OGONEK 'eopf': '𝕖', # MATHEMATICAL DOUBLE-STRUCK SMALL E 'epar': '⋕', # EQUAL AND PARALLEL TO 'eparsl': '⧣', # EQUALS SIGN AND SLANTED PARALLEL 'eplus': '⩱', # EQUALS SIGN ABOVE PLUS SIGN 'epsi': 'ε', # GREEK SMALL LETTER EPSILON 'epsilon': 'ε', # GREEK SMALL LETTER EPSILON 'epsiv': 'ϵ', # GREEK LUNATE EPSILON SYMBOL 'eqcirc': '≖', # RING IN EQUAL TO 'eqcolon': '≕', # EQUALS COLON 'eqsim': '≂', # MINUS TILDE 'eqslantgtr': '⪖', # SLANTED EQUAL TO OR GREATER-THAN 'eqslantless': '⪕', # SLANTED EQUAL TO OR LESS-THAN 'equals': '=', # EQUALS SIGN 'equest': '≟', # QUESTIONED EQUAL TO 'equiv': '≡', # IDENTICAL TO 'equivDD': '⩸', # EQUIVALENT WITH FOUR DOTS ABOVE 'eqvparsl': '⧥', # IDENTICAL TO AND SLANTED PARALLEL 'erDot': '≓', # IMAGE OF OR APPROXIMATELY EQUAL TO 'erarr': '⥱', # EQUALS SIGN ABOVE RIGHTWARDS ARROW 'escr': 'ℯ', # SCRIPT SMALL E 'esdot': '≐', # APPROACHES THE LIMIT 'esim': '≂', # MINUS TILDE 'eta': 'η', # GREEK SMALL LETTER ETA 'eth': 'ð', # LATIN SMALL LETTER ETH 'euml': 'ë', # LATIN SMALL LETTER E WITH DIAERESIS 'euro': '€', # EURO SIGN 'excl': '!', # EXCLAMATION MARK 'exist': '∃', # THERE EXISTS 'expectation': 'ℰ', # SCRIPT CAPITAL E 'exponentiale': 'ⅇ', # DOUBLE-STRUCK ITALIC SMALL E 'fallingdotseq': '≒', # APPROXIMATELY EQUAL TO OR THE IMAGE OF 'fcy': 'ф', # CYRILLIC SMALL LETTER EF 'female': '♀', # FEMALE SIGN 'ffilig': 'ffi', # LATIN SMALL LIGATURE FFI 'fflig': 'ff', # LATIN SMALL LIGATURE FF 'ffllig': 'ffl', # LATIN SMALL LIGATURE FFL 'ffr': '𝔣', # MATHEMATICAL FRAKTUR SMALL F 'filig': 'fi', # LATIN SMALL LIGATURE FI 'fjlig': 'fj', # fj ligature 'flat': '♭', # MUSIC FLAT SIGN 'fllig': 'fl', # LATIN SMALL LIGATURE FL 'fltns': '▱', # WHITE PARALLELOGRAM 'fnof': 'ƒ', # LATIN SMALL LETTER F WITH HOOK 'fopf': '𝕗', # MATHEMATICAL DOUBLE-STRUCK SMALL F 'forall': '∀', # FOR ALL 'fork': '⋔', # PITCHFORK 'forkv': '⫙', # ELEMENT OF OPENING DOWNWARDS 'fpartint': '⨍', # FINITE PART INTEGRAL 'frac12': '½', # VULGAR FRACTION ONE HALF 'frac13': '⅓', # VULGAR FRACTION ONE THIRD 'frac14': '¼', # VULGAR FRACTION ONE QUARTER 'frac15': '⅕', # VULGAR FRACTION ONE FIFTH 'frac16': '⅙', # VULGAR FRACTION ONE SIXTH 'frac18': '⅛', # VULGAR FRACTION ONE EIGHTH 'frac23': '⅔', # VULGAR FRACTION TWO THIRDS 'frac25': '⅖', # VULGAR FRACTION TWO FIFTHS 'frac34': '¾', # VULGAR FRACTION THREE QUARTERS 'frac35': '⅗', # VULGAR FRACTION THREE FIFTHS 'frac38': '⅜', # VULGAR FRACTION THREE EIGHTHS 'frac45': '⅘', # VULGAR FRACTION FOUR FIFTHS 'frac56': '⅚', # VULGAR FRACTION FIVE SIXTHS 'frac58': '⅝', # VULGAR FRACTION FIVE EIGHTHS 'frac78': '⅞', # VULGAR FRACTION SEVEN EIGHTHS 'frasl': '⁄', # FRACTION SLASH 'frown': '⌢', # FROWN 'fscr': '𝒻', # MATHEMATICAL SCRIPT SMALL F 'gE': '≧', # GREATER-THAN OVER EQUAL TO 'gEl': '⪌', # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN 'gacute': 'ǵ', # LATIN SMALL LETTER G WITH ACUTE 'gamma': 'γ', # GREEK SMALL LETTER GAMMA 'gammad': 'ϝ', # GREEK SMALL LETTER DIGAMMA 'gap': '⪆', # GREATER-THAN OR APPROXIMATE 'gbreve': 'ğ', # LATIN SMALL LETTER G WITH BREVE 'gcirc': 'ĝ', # LATIN SMALL LETTER G WITH CIRCUMFLEX 'gcy': 'г', # CYRILLIC SMALL LETTER GHE 'gdot': 'ġ', # LATIN SMALL LETTER G WITH DOT ABOVE 'ge': '≥', # GREATER-THAN OR EQUAL TO 'gel': '⋛', # GREATER-THAN EQUAL TO OR LESS-THAN 'geq': '≥', # GREATER-THAN OR EQUAL TO 'geqq': '≧', # GREATER-THAN OVER EQUAL TO 'geqslant': '⩾', # GREATER-THAN OR SLANTED EQUAL TO 'ges': '⩾', # GREATER-THAN OR SLANTED EQUAL TO 'gescc': '⪩', # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL 'gesdot': '⪀', # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE 'gesdoto': '⪂', # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE 'gesdotol': '⪄', # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT 'gesl': '⋛︀', # GREATER-THAN slanted EQUAL TO OR LESS-THAN 'gesles': '⪔', # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL 'gfr': '𝔤', # MATHEMATICAL FRAKTUR SMALL G 'gg': '≫', # MUCH GREATER-THAN 'ggg': '⋙', # VERY MUCH GREATER-THAN 'ggr': 'γ', # GREEK SMALL LETTER GAMMA 'gimel': 'ℷ', # GIMEL SYMBOL 'gjcy': 'ѓ', # CYRILLIC SMALL LETTER GJE 'gl': '≷', # GREATER-THAN OR LESS-THAN 'glE': '⪒', # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL 'gla': '⪥', # GREATER-THAN BESIDE LESS-THAN 'glj': '⪤', # GREATER-THAN OVERLAPPING LESS-THAN 'gnE': '≩', # GREATER-THAN BUT NOT EQUAL TO 'gnap': '⪊', # GREATER-THAN AND NOT APPROXIMATE 'gnapprox': '⪊', # GREATER-THAN AND NOT APPROXIMATE 'gne': '⪈', # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO 'gneq': '⪈', # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO 'gneqq': '≩', # GREATER-THAN BUT NOT EQUAL TO 'gnsim': '⋧', # GREATER-THAN BUT NOT EQUIVALENT TO 'gopf': '𝕘', # MATHEMATICAL DOUBLE-STRUCK SMALL G 'grave': '`', # GRAVE ACCENT 'gscr': 'ℊ', # SCRIPT SMALL G 'gsim': '≳', # GREATER-THAN OR EQUIVALENT TO 'gsime': '⪎', # GREATER-THAN ABOVE SIMILAR OR EQUAL 'gsiml': '⪐', # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN 'gt': '>', # GREATER-THAN SIGN 'gtcc': '⪧', # GREATER-THAN CLOSED BY CURVE 'gtcir': '⩺', # GREATER-THAN WITH CIRCLE INSIDE 'gtdot': '⋗', # GREATER-THAN WITH DOT 'gtlPar': '⦕', # DOUBLE LEFT ARC GREATER-THAN BRACKET 'gtquest': '⩼', # GREATER-THAN WITH QUESTION MARK ABOVE 'gtrapprox': '⪆', # GREATER-THAN OR APPROXIMATE 'gtrarr': '⥸', # GREATER-THAN ABOVE RIGHTWARDS ARROW 'gtrdot': '⋗', # GREATER-THAN WITH DOT 'gtreqless': '⋛', # GREATER-THAN EQUAL TO OR LESS-THAN 'gtreqqless': '⪌', # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN 'gtrless': '≷', # GREATER-THAN OR LESS-THAN 'gtrsim': '≳', # GREATER-THAN OR EQUIVALENT TO 'gvertneqq': '≩︀', # GREATER-THAN BUT NOT EQUAL TO - with vertical stroke 'gvnE': '≩︀', # GREATER-THAN BUT NOT EQUAL TO - with vertical stroke 'hArr': '⇔', # LEFT RIGHT DOUBLE ARROW 'hairsp': ' ', # HAIR SPACE 'half': '½', # VULGAR FRACTION ONE HALF 'hamilt': 'ℋ', # SCRIPT CAPITAL H 'hardcy': 'ъ', # CYRILLIC SMALL LETTER HARD SIGN 'harr': '↔', # LEFT RIGHT ARROW 'harrcir': '⥈', # LEFT RIGHT ARROW THROUGH SMALL CIRCLE 'harrw': '↭', # LEFT RIGHT WAVE ARROW 'hbar': 'ℏ', # PLANCK CONSTANT OVER TWO PI 'hcirc': 'ĥ', # LATIN SMALL LETTER H WITH CIRCUMFLEX 'hearts': '♥', # BLACK HEART SUIT 'heartsuit': '♥', # BLACK HEART SUIT 'hellip': '…', # HORIZONTAL ELLIPSIS 'hercon': '⊹', # HERMITIAN CONJUGATE MATRIX 'hfr': '𝔥', # MATHEMATICAL FRAKTUR SMALL H 'hksearow': '⤥', # SOUTH EAST ARROW WITH HOOK 'hkswarow': '⤦', # SOUTH WEST ARROW WITH HOOK 'hoarr': '⇿', # LEFT RIGHT OPEN-HEADED ARROW 'homtht': '∻', # HOMOTHETIC 'hookleftarrow': '↩', # LEFTWARDS ARROW WITH HOOK 'hookrightarrow': '↪', # RIGHTWARDS ARROW WITH HOOK 'hopf': '𝕙', # MATHEMATICAL DOUBLE-STRUCK SMALL H 'horbar': '―', # HORIZONTAL BAR 'hscr': '𝒽', # MATHEMATICAL SCRIPT SMALL H 'hslash': 'ℏ', # PLANCK CONSTANT OVER TWO PI 'hstrok': 'ħ', # LATIN SMALL LETTER H WITH STROKE 'hybull': '⁃', # HYPHEN BULLET 'hyphen': '‐', # HYPHEN 'iacgr': 'ί', # GREEK SMALL LETTER IOTA WITH TONOS 'iacute': 'í', # LATIN SMALL LETTER I WITH ACUTE 'ic': '⁣', # INVISIBLE SEPARATOR 'icirc': 'î', # LATIN SMALL LETTER I WITH CIRCUMFLEX 'icy': 'и', # CYRILLIC SMALL LETTER I 'idiagr': 'ΐ', # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 'idigr': 'ϊ', # GREEK SMALL LETTER IOTA WITH DIALYTIKA 'iecy': 'е', # CYRILLIC SMALL LETTER IE 'iexcl': '¡', # INVERTED EXCLAMATION MARK 'iff': '⇔', # LEFT RIGHT DOUBLE ARROW 'ifr': '𝔦', # MATHEMATICAL FRAKTUR SMALL I 'igr': 'ι', # GREEK SMALL LETTER IOTA 'igrave': 'ì', # LATIN SMALL LETTER I WITH GRAVE 'ii': 'ⅈ', # DOUBLE-STRUCK ITALIC SMALL I 'iiiint': '⨌', # QUADRUPLE INTEGRAL OPERATOR 'iiint': '∭', # TRIPLE INTEGRAL 'iinfin': '⧜', # INCOMPLETE INFINITY 'iiota': '℩', # TURNED GREEK SMALL LETTER IOTA 'ijlig': 'ij', # LATIN SMALL LIGATURE IJ 'imacr': 'ī', # LATIN SMALL LETTER I WITH MACRON 'image': 'ℑ', # BLACK-LETTER CAPITAL I 'imagline': 'ℐ', # SCRIPT CAPITAL I 'imagpart': 'ℑ', # BLACK-LETTER CAPITAL I 'imath': 'ı', # LATIN SMALL LETTER DOTLESS I 'imof': '⊷', # IMAGE OF 'imped': 'Ƶ', # LATIN CAPITAL LETTER Z WITH STROKE 'in': '∈', # ELEMENT OF 'incare': '℅', # CARE OF 'infin': '∞', # INFINITY 'infintie': '⧝', # TIE OVER INFINITY 'inodot': 'ı', # LATIN SMALL LETTER DOTLESS I 'int': '∫', # INTEGRAL 'intcal': '⊺', # INTERCALATE 'integers': 'ℤ', # DOUBLE-STRUCK CAPITAL Z 'intercal': '⊺', # INTERCALATE 'intlarhk': '⨗', # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK 'intprod': '⨼', # INTERIOR PRODUCT 'iocy': 'ё', # CYRILLIC SMALL LETTER IO 'iogon': 'į', # LATIN SMALL LETTER I WITH OGONEK 'iopf': '𝕚', # MATHEMATICAL DOUBLE-STRUCK SMALL I 'iota': 'ι', # GREEK SMALL LETTER IOTA 'iprod': '⨼', # INTERIOR PRODUCT 'iquest': '¿', # INVERTED QUESTION MARK 'iscr': '𝒾', # MATHEMATICAL SCRIPT SMALL I 'isin': '∈', # ELEMENT OF 'isinE': '⋹', # ELEMENT OF WITH TWO HORIZONTAL STROKES 'isindot': '⋵', # ELEMENT OF WITH DOT ABOVE 'isins': '⋴', # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 'isinsv': '⋳', # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 'isinv': '∈', # ELEMENT OF 'it': '⁢', # INVISIBLE TIMES 'itilde': 'ĩ', # LATIN SMALL LETTER I WITH TILDE 'iukcy': 'і', # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 'iuml': 'ï', # LATIN SMALL LETTER I WITH DIAERESIS 'jcirc': 'ĵ', # LATIN SMALL LETTER J WITH CIRCUMFLEX 'jcy': 'й', # CYRILLIC SMALL LETTER SHORT I 'jfr': '𝔧', # MATHEMATICAL FRAKTUR SMALL J 'jmath': 'ȷ', # LATIN SMALL LETTER DOTLESS J 'jopf': '𝕛', # MATHEMATICAL DOUBLE-STRUCK SMALL J 'jscr': '𝒿', # MATHEMATICAL SCRIPT SMALL J 'jsercy': 'ј', # CYRILLIC SMALL LETTER JE 'jukcy': 'є', # CYRILLIC SMALL LETTER UKRAINIAN IE 'kappa': 'κ', # GREEK SMALL LETTER KAPPA 'kappav': 'ϰ', # GREEK KAPPA SYMBOL 'kcedil': 'ķ', # LATIN SMALL LETTER K WITH CEDILLA 'kcy': 'к', # CYRILLIC SMALL LETTER KA 'kfr': '𝔨', # MATHEMATICAL FRAKTUR SMALL K 'kgr': 'κ', # GREEK SMALL LETTER KAPPA 'kgreen': 'ĸ', # LATIN SMALL LETTER KRA 'khcy': 'х', # CYRILLIC SMALL LETTER HA 'khgr': 'χ', # GREEK SMALL LETTER CHI 'kjcy': 'ќ', # CYRILLIC SMALL LETTER KJE 'kopf': '𝕜', # MATHEMATICAL DOUBLE-STRUCK SMALL K 'kscr': '𝓀', # MATHEMATICAL SCRIPT SMALL K 'lAarr': '⇚', # LEFTWARDS TRIPLE ARROW 'lArr': '⇐', # LEFTWARDS DOUBLE ARROW 'lAtail': '⤛', # LEFTWARDS DOUBLE ARROW-TAIL 'lBarr': '⤎', # LEFTWARDS TRIPLE DASH ARROW 'lE': '≦', # LESS-THAN OVER EQUAL TO 'lEg': '⪋', # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN 'lHar': '⥢', # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN 'lacute': 'ĺ', # LATIN SMALL LETTER L WITH ACUTE 'laemptyv': '⦴', # EMPTY SET WITH LEFT ARROW ABOVE 'lagran': 'ℒ', # SCRIPT CAPITAL L 'lambda': 'λ', # GREEK SMALL LETTER LAMDA 'lang': '⟨', # MATHEMATICAL LEFT ANGLE BRACKET 'langd': '⦑', # LEFT ANGLE BRACKET WITH DOT 'langle': '⟨', # MATHEMATICAL LEFT ANGLE BRACKET 'lap': '⪅', # LESS-THAN OR APPROXIMATE 'laquo': '«', # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 'larr': '←', # LEFTWARDS ARROW 'larrb': '⇤', # LEFTWARDS ARROW TO BAR 'larrbfs': '⤟', # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND 'larrfs': '⤝', # LEFTWARDS ARROW TO BLACK DIAMOND 'larrhk': '↩', # LEFTWARDS ARROW WITH HOOK 'larrlp': '↫', # LEFTWARDS ARROW WITH LOOP 'larrpl': '⤹', # LEFT-SIDE ARC ANTICLOCKWISE ARROW 'larrsim': '⥳', # LEFTWARDS ARROW ABOVE TILDE OPERATOR 'larrtl': '↢', # LEFTWARDS ARROW WITH TAIL 'lat': '⪫', # LARGER THAN 'latail': '⤙', # LEFTWARDS ARROW-TAIL 'late': '⪭', # LARGER THAN OR EQUAL TO 'lates': '⪭︀', # LARGER THAN OR slanted EQUAL 'lbarr': '⤌', # LEFTWARDS DOUBLE DASH ARROW 'lbbrk': '❲', # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT 'lbrace': '{', # LEFT CURLY BRACKET 'lbrack': '[', # LEFT SQUARE BRACKET 'lbrke': '⦋', # LEFT SQUARE BRACKET WITH UNDERBAR 'lbrksld': '⦏', # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 'lbrkslu': '⦍', # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER 'lcaron': 'ľ', # LATIN SMALL LETTER L WITH CARON 'lcedil': 'ļ', # LATIN SMALL LETTER L WITH CEDILLA 'lceil': '⌈', # LEFT CEILING 'lcub': '{', # LEFT CURLY BRACKET 'lcy': 'л', # CYRILLIC SMALL LETTER EL 'ldca': '⤶', # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS 'ldquo': '“', # LEFT DOUBLE QUOTATION MARK 'ldquor': '„', # DOUBLE LOW-9 QUOTATION MARK 'ldrdhar': '⥧', # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN 'ldrushar': '⥋', # LEFT BARB DOWN RIGHT BARB UP HARPOON 'ldsh': '↲', # DOWNWARDS ARROW WITH TIP LEFTWARDS 'le': '≤', # LESS-THAN OR EQUAL TO 'leftarrow': '←', # LEFTWARDS ARROW 'leftarrowtail': '↢', # LEFTWARDS ARROW WITH TAIL 'leftharpoondown': '↽', # LEFTWARDS HARPOON WITH BARB DOWNWARDS 'leftharpoonup': '↼', # LEFTWARDS HARPOON WITH BARB UPWARDS 'leftleftarrows': '⇇', # LEFTWARDS PAIRED ARROWS 'leftrightarrow': '↔', # LEFT RIGHT ARROW 'leftrightarrows': '⇆', # LEFTWARDS ARROW OVER RIGHTWARDS ARROW 'leftrightharpoons': '⇋', # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON 'leftrightsquigarrow': '↭', # LEFT RIGHT WAVE ARROW 'leftthreetimes': '⋋', # LEFT SEMIDIRECT PRODUCT 'leg': '⋚', # LESS-THAN EQUAL TO OR GREATER-THAN 'leq': '≤', # LESS-THAN OR EQUAL TO 'leqq': '≦', # LESS-THAN OVER EQUAL TO 'leqslant': '⩽', # LESS-THAN OR SLANTED EQUAL TO 'les': '⩽', # LESS-THAN OR SLANTED EQUAL TO 'lescc': '⪨', # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL 'lesdot': '⩿', # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE 'lesdoto': '⪁', # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE 'lesdotor': '⪃', # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT 'lesg': '⋚︀', # LESS-THAN slanted EQUAL TO OR GREATER-THAN 'lesges': '⪓', # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL 'lessapprox': '⪅', # LESS-THAN OR APPROXIMATE 'lessdot': '⋖', # LESS-THAN WITH DOT 'lesseqgtr': '⋚', # LESS-THAN EQUAL TO OR GREATER-THAN 'lesseqqgtr': '⪋', # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN 'lessgtr': '≶', # LESS-THAN OR GREATER-THAN 'lesssim': '≲', # LESS-THAN OR EQUIVALENT TO 'lfisht': '⥼', # LEFT FISH TAIL 'lfloor': '⌊', # LEFT FLOOR 'lfr': '𝔩', # MATHEMATICAL FRAKTUR SMALL L 'lg': '≶', # LESS-THAN OR GREATER-THAN 'lgE': '⪑', # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL 'lgr': 'λ', # GREEK SMALL LETTER LAMDA 'lhard': '↽', # LEFTWARDS HARPOON WITH BARB DOWNWARDS 'lharu': '↼', # LEFTWARDS HARPOON WITH BARB UPWARDS 'lharul': '⥪', # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH 'lhblk': '▄', # LOWER HALF BLOCK 'ljcy': 'љ', # CYRILLIC SMALL LETTER LJE 'll': '≪', # MUCH LESS-THAN 'llarr': '⇇', # LEFTWARDS PAIRED ARROWS 'llcorner': '⌞', # BOTTOM LEFT CORNER 'llhard': '⥫', # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH 'lltri': '◺', # LOWER LEFT TRIANGLE 'lmidot': 'ŀ', # LATIN SMALL LETTER L WITH MIDDLE DOT 'lmoust': '⎰', # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION 'lmoustache': '⎰', # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION 'lnE': '≨', # LESS-THAN BUT NOT EQUAL TO 'lnap': '⪉', # LESS-THAN AND NOT APPROXIMATE 'lnapprox': '⪉', # LESS-THAN AND NOT APPROXIMATE 'lne': '⪇', # LESS-THAN AND SINGLE-LINE NOT EQUAL TO 'lneq': '⪇', # LESS-THAN AND SINGLE-LINE NOT EQUAL TO 'lneqq': '≨', # LESS-THAN BUT NOT EQUAL TO 'lnsim': '⋦', # LESS-THAN BUT NOT EQUIVALENT TO 'loang': '⟬', # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET 'loarr': '⇽', # LEFTWARDS OPEN-HEADED ARROW 'lobrk': '⟦', # MATHEMATICAL LEFT WHITE SQUARE BRACKET 'longleftarrow': '⟵', # LONG LEFTWARDS ARROW 'longleftrightarrow': '⟷', # LONG LEFT RIGHT ARROW 'longmapsto': '⟼', # LONG RIGHTWARDS ARROW FROM BAR 'longrightarrow': '⟶', # LONG RIGHTWARDS ARROW 'looparrowleft': '↫', # LEFTWARDS ARROW WITH LOOP 'looparrowright': '↬', # RIGHTWARDS ARROW WITH LOOP 'lopar': '⦅', # LEFT WHITE PARENTHESIS 'lopf': '𝕝', # MATHEMATICAL DOUBLE-STRUCK SMALL L 'loplus': '⨭', # PLUS SIGN IN LEFT HALF CIRCLE 'lotimes': '⨴', # MULTIPLICATION SIGN IN LEFT HALF CIRCLE 'lowast': '∗', # ASTERISK OPERATOR 'lowbar': '_', # LOW LINE 'loz': '◊', # LOZENGE 'lozenge': '◊', # LOZENGE 'lozf': '⧫', # BLACK LOZENGE 'lpar': '(', # LEFT PARENTHESIS 'lparlt': '⦓', # LEFT ARC LESS-THAN BRACKET 'lrarr': '⇆', # LEFTWARDS ARROW OVER RIGHTWARDS ARROW 'lrcorner': '⌟', # BOTTOM RIGHT CORNER 'lrhar': '⇋', # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON 'lrhard': '⥭', # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH 'lrm': '‎', # LEFT-TO-RIGHT MARK 'lrtri': '⊿', # RIGHT TRIANGLE 'lsaquo': '‹', # SINGLE LEFT-POINTING ANGLE QUOTATION MARK 'lscr': '𝓁', # MATHEMATICAL SCRIPT SMALL L 'lsh': '↰', # UPWARDS ARROW WITH TIP LEFTWARDS 'lsim': '≲', # LESS-THAN OR EQUIVALENT TO 'lsime': '⪍', # LESS-THAN ABOVE SIMILAR OR EQUAL 'lsimg': '⪏', # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN 'lsqb': '[', # LEFT SQUARE BRACKET 'lsquo': '‘', # LEFT SINGLE QUOTATION MARK 'lsquor': '‚', # SINGLE LOW-9 QUOTATION MARK 'lstrok': 'ł', # LATIN SMALL LETTER L WITH STROKE 'lt': '<', # LESS-THAN SIGN 'ltcc': '⪦', # LESS-THAN CLOSED BY CURVE 'ltcir': '⩹', # LESS-THAN WITH CIRCLE INSIDE 'ltdot': '⋖', # LESS-THAN WITH DOT 'lthree': '⋋', # LEFT SEMIDIRECT PRODUCT 'ltimes': '⋉', # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT 'ltlarr': '⥶', # LESS-THAN ABOVE LEFTWARDS ARROW 'ltquest': '⩻', # LESS-THAN WITH QUESTION MARK ABOVE 'ltrPar': '⦖', # DOUBLE RIGHT ARC LESS-THAN BRACKET 'ltri': '◃', # WHITE LEFT-POINTING SMALL TRIANGLE 'ltrie': '⊴', # NORMAL SUBGROUP OF OR EQUAL TO 'ltrif': '◂', # BLACK LEFT-POINTING SMALL TRIANGLE 'lurdshar': '⥊', # LEFT BARB UP RIGHT BARB DOWN HARPOON 'luruhar': '⥦', # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP 'lvertneqq': '≨︀', # LESS-THAN BUT NOT EQUAL TO - with vertical stroke 'lvnE': '≨︀', # LESS-THAN BUT NOT EQUAL TO - with vertical stroke 'mDDot': '∺', # GEOMETRIC PROPORTION 'macr': '¯', # MACRON 'male': '♂', # MALE SIGN 'malt': '✠', # MALTESE CROSS 'maltese': '✠', # MALTESE CROSS 'map': '↦', # RIGHTWARDS ARROW FROM BAR 'mapsto': '↦', # RIGHTWARDS ARROW FROM BAR 'mapstodown': '↧', # DOWNWARDS ARROW FROM BAR 'mapstoleft': '↤', # LEFTWARDS ARROW FROM BAR 'mapstoup': '↥', # UPWARDS ARROW FROM BAR 'marker': '▮', # BLACK VERTICAL RECTANGLE 'mcomma': '⨩', # MINUS SIGN WITH COMMA ABOVE 'mcy': 'м', # CYRILLIC SMALL LETTER EM 'mdash': '—', # EM DASH 'measuredangle': '∡', # MEASURED ANGLE 'mfr': '𝔪', # MATHEMATICAL FRAKTUR SMALL M 'mgr': 'μ', # GREEK SMALL LETTER MU 'mho': '℧', # INVERTED OHM SIGN 'micro': 'µ', # MICRO SIGN 'mid': '∣', # DIVIDES 'midast': '*', # ASTERISK 'midcir': '⫰', # VERTICAL LINE WITH CIRCLE BELOW 'middot': '·', # MIDDLE DOT 'minus': '−', # MINUS SIGN 'minusb': '⊟', # SQUARED MINUS 'minusd': '∸', # DOT MINUS 'minusdu': '⨪', # MINUS SIGN WITH DOT BELOW 'mlcp': '⫛', # TRANSVERSAL INTERSECTION 'mldr': '…', # HORIZONTAL ELLIPSIS 'mnplus': '∓', # MINUS-OR-PLUS SIGN 'models': '⊧', # MODELS 'mopf': '𝕞', # MATHEMATICAL DOUBLE-STRUCK SMALL M 'mp': '∓', # MINUS-OR-PLUS SIGN 'mscr': '𝓂', # MATHEMATICAL SCRIPT SMALL M 'mstpos': '∾', # INVERTED LAZY S 'mu': 'μ', # GREEK SMALL LETTER MU 'multimap': '⊸', # MULTIMAP 'mumap': '⊸', # MULTIMAP 'nGg': '⋙̸', # VERY MUCH GREATER-THAN with slash 'nGt': '≫⃒', # MUCH GREATER THAN with vertical line 'nGtv': '≫̸', # MUCH GREATER THAN with slash 'nLeftarrow': '⇍', # LEFTWARDS DOUBLE ARROW WITH STROKE 'nLeftrightarrow': '⇎', # LEFT RIGHT DOUBLE ARROW WITH STROKE 'nLl': '⋘̸', # VERY MUCH LESS-THAN with slash 'nLt': '≪⃒', # MUCH LESS THAN with vertical line 'nLtv': '≪̸', # MUCH LESS THAN with slash 'nRightarrow': '⇏', # RIGHTWARDS DOUBLE ARROW WITH STROKE 'nVDash': '⊯', # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE 'nVdash': '⊮', # DOES NOT FORCE 'nabla': '∇', # NABLA 'nacute': 'ń', # LATIN SMALL LETTER N WITH ACUTE 'nang': '∠⃒', # ANGLE with vertical line 'nap': '≉', # NOT ALMOST EQUAL TO 'napE': '⩰̸', # APPROXIMATELY EQUAL OR EQUAL TO with slash 'napid': '≋̸', # TRIPLE TILDE with slash 'napos': 'ʼn', # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE 'napprox': '≉', # NOT ALMOST EQUAL TO 'natur': '♮', # MUSIC NATURAL SIGN 'natural': '♮', # MUSIC NATURAL SIGN 'naturals': 'ℕ', # DOUBLE-STRUCK CAPITAL N 'nbsp': ' ', # NO-BREAK SPACE 'nbump': '≎̸', # GEOMETRICALLY EQUIVALENT TO with slash 'nbumpe': '≏̸', # DIFFERENCE BETWEEN with slash 'ncap': '⩃', # INTERSECTION WITH OVERBAR 'ncaron': 'ň', # LATIN SMALL LETTER N WITH CARON 'ncedil': 'ņ', # LATIN SMALL LETTER N WITH CEDILLA 'ncong': '≇', # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO 'ncongdot': '⩭̸', # CONGRUENT WITH DOT ABOVE with slash 'ncup': '⩂', # UNION WITH OVERBAR 'ncy': 'н', # CYRILLIC SMALL LETTER EN 'ndash': '–', # EN DASH 'ne': '≠', # NOT EQUAL TO 'neArr': '⇗', # NORTH EAST DOUBLE ARROW 'nearhk': '⤤', # NORTH EAST ARROW WITH HOOK 'nearr': '↗', # NORTH EAST ARROW 'nearrow': '↗', # NORTH EAST ARROW 'nedot': '≐̸', # APPROACHES THE LIMIT with slash 'nequiv': '≢', # NOT IDENTICAL TO 'nesear': '⤨', # NORTH EAST ARROW AND SOUTH EAST ARROW 'nesim': '≂̸', # MINUS TILDE with slash 'nexist': '∄', # THERE DOES NOT EXIST 'nexists': '∄', # THERE DOES NOT EXIST 'nfr': '𝔫', # MATHEMATICAL FRAKTUR SMALL N 'ngE': '≧̸', # GREATER-THAN OVER EQUAL TO with slash 'nge': '≱', # NEITHER GREATER-THAN NOR EQUAL TO 'ngeq': '≱', # NEITHER GREATER-THAN NOR EQUAL TO 'ngeqq': '≧̸', # GREATER-THAN OVER EQUAL TO with slash 'ngeqslant': '⩾̸', # GREATER-THAN OR SLANTED EQUAL TO with slash 'nges': '⩾̸', # GREATER-THAN OR SLANTED EQUAL TO with slash 'ngr': 'ν', # GREEK SMALL LETTER NU 'ngsim': '≵', # NEITHER GREATER-THAN NOR EQUIVALENT TO 'ngt': '≯', # NOT GREATER-THAN 'ngtr': '≯', # NOT GREATER-THAN 'nhArr': '⇎', # LEFT RIGHT DOUBLE ARROW WITH STROKE 'nharr': '↮', # LEFT RIGHT ARROW WITH STROKE 'nhpar': '⫲', # PARALLEL WITH HORIZONTAL STROKE 'ni': '∋', # CONTAINS AS MEMBER 'nis': '⋼', # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 'nisd': '⋺', # CONTAINS WITH LONG HORIZONTAL STROKE 'niv': '∋', # CONTAINS AS MEMBER 'njcy': 'њ', # CYRILLIC SMALL LETTER NJE 'nlArr': '⇍', # LEFTWARDS DOUBLE ARROW WITH STROKE 'nlE': '≦̸', # LESS-THAN OVER EQUAL TO with slash 'nlarr': '↚', # LEFTWARDS ARROW WITH STROKE 'nldr': '‥', # TWO DOT LEADER 'nle': '≰', # NEITHER LESS-THAN NOR EQUAL TO 'nleftarrow': '↚', # LEFTWARDS ARROW WITH STROKE 'nleftrightarrow': '↮', # LEFT RIGHT ARROW WITH STROKE 'nleq': '≰', # NEITHER LESS-THAN NOR EQUAL TO 'nleqq': '≦̸', # LESS-THAN OVER EQUAL TO with slash 'nleqslant': '⩽̸', # LESS-THAN OR SLANTED EQUAL TO with slash 'nles': '⩽̸', # LESS-THAN OR SLANTED EQUAL TO with slash 'nless': '≮', # NOT LESS-THAN 'nlsim': '≴', # NEITHER LESS-THAN NOR EQUIVALENT TO 'nlt': '≮', # NOT LESS-THAN 'nltri': '⋪', # NOT NORMAL SUBGROUP OF 'nltrie': '⋬', # NOT NORMAL SUBGROUP OF OR EQUAL TO 'nmid': '∤', # DOES NOT DIVIDE 'nopf': '𝕟', # MATHEMATICAL DOUBLE-STRUCK SMALL N 'not': '¬', # NOT SIGN 'notin': '∉', # NOT AN ELEMENT OF 'notinE': '⋹̸', # ELEMENT OF WITH TWO HORIZONTAL STROKES with slash 'notindot': '⋵̸', # ELEMENT OF WITH DOT ABOVE with slash 'notinva': '∉', # NOT AN ELEMENT OF 'notinvb': '⋷', # SMALL ELEMENT OF WITH OVERBAR 'notinvc': '⋶', # ELEMENT OF WITH OVERBAR 'notni': '∌', # DOES NOT CONTAIN AS MEMBER 'notniva': '∌', # DOES NOT CONTAIN AS MEMBER 'notnivb': '⋾', # SMALL CONTAINS WITH OVERBAR 'notnivc': '⋽', # CONTAINS WITH OVERBAR 'npar': '∦', # NOT PARALLEL TO 'nparallel': '∦', # NOT PARALLEL TO 'nparsl': '⫽⃥', # DOUBLE SOLIDUS OPERATOR with reverse slash 'npart': '∂̸', # PARTIAL DIFFERENTIAL with slash 'npolint': '⨔', # LINE INTEGRATION NOT INCLUDING THE POLE 'npr': '⊀', # DOES NOT PRECEDE 'nprcue': '⋠', # DOES NOT PRECEDE OR EQUAL 'npre': '⪯̸', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash 'nprec': '⊀', # DOES NOT PRECEDE 'npreceq': '⪯̸', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash 'nrArr': '⇏', # RIGHTWARDS DOUBLE ARROW WITH STROKE 'nrarr': '↛', # RIGHTWARDS ARROW WITH STROKE 'nrarrc': '⤳̸', # WAVE ARROW POINTING DIRECTLY RIGHT with slash 'nrarrw': '↝̸', # RIGHTWARDS WAVE ARROW with slash 'nrightarrow': '↛', # RIGHTWARDS ARROW WITH STROKE 'nrtri': '⋫', # DOES NOT CONTAIN AS NORMAL SUBGROUP 'nrtrie': '⋭', # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL 'nsc': '⊁', # DOES NOT SUCCEED 'nsccue': '⋡', # DOES NOT SUCCEED OR EQUAL 'nsce': '⪰̸', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash 'nscr': '𝓃', # MATHEMATICAL SCRIPT SMALL N 'nshortmid': '∤', # DOES NOT DIVIDE 'nshortparallel': '∦', # NOT PARALLEL TO 'nsim': '≁', # NOT TILDE 'nsime': '≄', # NOT ASYMPTOTICALLY EQUAL TO 'nsimeq': '≄', # NOT ASYMPTOTICALLY EQUAL TO 'nsmid': '∤', # DOES NOT DIVIDE 'nspar': '∦', # NOT PARALLEL TO 'nsqsube': '⋢', # NOT SQUARE IMAGE OF OR EQUAL TO 'nsqsupe': '⋣', # NOT SQUARE ORIGINAL OF OR EQUAL TO 'nsub': '⊄', # NOT A SUBSET OF 'nsubE': '⫅̸', # SUBSET OF ABOVE EQUALS SIGN with slash 'nsube': '⊈', # NEITHER A SUBSET OF NOR EQUAL TO 'nsubset': '⊂⃒', # SUBSET OF with vertical line 'nsubseteq': '⊈', # NEITHER A SUBSET OF NOR EQUAL TO 'nsubseteqq': '⫅̸', # SUBSET OF ABOVE EQUALS SIGN with slash 'nsucc': '⊁', # DOES NOT SUCCEED 'nsucceq': '⪰̸', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash 'nsup': '⊅', # NOT A SUPERSET OF 'nsupE': '⫆̸', # SUPERSET OF ABOVE EQUALS SIGN with slash 'nsupe': '⊉', # NEITHER A SUPERSET OF NOR EQUAL TO 'nsupset': '⊃⃒', # SUPERSET OF with vertical line 'nsupseteq': '⊉', # NEITHER A SUPERSET OF NOR EQUAL TO 'nsupseteqq': '⫆̸', # SUPERSET OF ABOVE EQUALS SIGN with slash 'ntgl': '≹', # NEITHER GREATER-THAN NOR LESS-THAN 'ntilde': 'ñ', # LATIN SMALL LETTER N WITH TILDE 'ntlg': '≸', # NEITHER LESS-THAN NOR GREATER-THAN 'ntriangleleft': '⋪', # NOT NORMAL SUBGROUP OF 'ntrianglelefteq': '⋬', # NOT NORMAL SUBGROUP OF OR EQUAL TO 'ntriangleright': '⋫', # DOES NOT CONTAIN AS NORMAL SUBGROUP 'ntrianglerighteq': '⋭', # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL 'nu': 'ν', # GREEK SMALL LETTER NU 'num': '#', # NUMBER SIGN 'numero': '№', # NUMERO SIGN 'numsp': ' ', # FIGURE SPACE 'nvDash': '⊭', # NOT TRUE 'nvHarr': '⤄', # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE 'nvap': '≍⃒', # EQUIVALENT TO with vertical line 'nvdash': '⊬', # DOES NOT PROVE 'nvge': '≥⃒', # GREATER-THAN OR EQUAL TO with vertical line 'nvgt': '>⃒', # GREATER-THAN SIGN with vertical line 'nvinfin': '⧞', # INFINITY NEGATED WITH VERTICAL BAR 'nvlArr': '⤂', # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE 'nvle': '≤⃒', # LESS-THAN OR EQUAL TO with vertical line 'nvlt': '<⃒', # LESS-THAN SIGN with vertical line 'nvltrie': '⊴⃒', # NORMAL SUBGROUP OF OR EQUAL TO with vertical line 'nvrArr': '⤃', # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE 'nvrtrie': '⊵⃒', # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line 'nvsim': '∼⃒', # TILDE OPERATOR with vertical line 'nwArr': '⇖', # NORTH WEST DOUBLE ARROW 'nwarhk': '⤣', # NORTH WEST ARROW WITH HOOK 'nwarr': '↖', # NORTH WEST ARROW 'nwarrow': '↖', # NORTH WEST ARROW 'nwnear': '⤧', # NORTH WEST ARROW AND NORTH EAST ARROW 'oS': 'Ⓢ', # CIRCLED LATIN CAPITAL LETTER S 'oacgr': 'ό', # GREEK SMALL LETTER OMICRON WITH TONOS 'oacute': 'ó', # LATIN SMALL LETTER O WITH ACUTE 'oast': '⊛', # CIRCLED ASTERISK OPERATOR 'ocir': '⊚', # CIRCLED RING OPERATOR 'ocirc': 'ô', # LATIN SMALL LETTER O WITH CIRCUMFLEX 'ocy': 'о', # CYRILLIC SMALL LETTER O 'odash': '⊝', # CIRCLED DASH 'odblac': 'ő', # LATIN SMALL LETTER O WITH DOUBLE ACUTE 'odiv': '⨸', # CIRCLED DIVISION SIGN 'odot': '⊙', # CIRCLED DOT OPERATOR 'odsold': '⦼', # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN 'oelig': 'œ', # LATIN SMALL LIGATURE OE 'ofcir': '⦿', # CIRCLED BULLET 'ofr': '𝔬', # MATHEMATICAL FRAKTUR SMALL O 'ogon': '˛', # OGONEK 'ogr': 'ο', # GREEK SMALL LETTER OMICRON 'ograve': 'ò', # LATIN SMALL LETTER O WITH GRAVE 'ogt': '⧁', # CIRCLED GREATER-THAN 'ohacgr': 'ώ', # GREEK SMALL LETTER OMEGA WITH TONOS 'ohbar': '⦵', # CIRCLE WITH HORIZONTAL BAR 'ohgr': 'ω', # GREEK SMALL LETTER OMEGA 'ohm': 'Ω', # GREEK CAPITAL LETTER OMEGA 'oint': '∮', # CONTOUR INTEGRAL 'olarr': '↺', # ANTICLOCKWISE OPEN CIRCLE ARROW 'olcir': '⦾', # CIRCLED WHITE BULLET 'olcross': '⦻', # CIRCLE WITH SUPERIMPOSED X 'oline': '‾', # OVERLINE 'olt': '⧀', # CIRCLED LESS-THAN 'omacr': 'ō', # LATIN SMALL LETTER O WITH MACRON 'omega': 'ω', # GREEK SMALL LETTER OMEGA 'omicron': 'ο', # GREEK SMALL LETTER OMICRON 'omid': '⦶', # CIRCLED VERTICAL BAR 'ominus': '⊖', # CIRCLED MINUS 'oopf': '𝕠', # MATHEMATICAL DOUBLE-STRUCK SMALL O 'opar': '⦷', # CIRCLED PARALLEL 'operp': '⦹', # CIRCLED PERPENDICULAR 'oplus': '⊕', # CIRCLED PLUS 'or': '∨', # LOGICAL OR 'orarr': '↻', # CLOCKWISE OPEN CIRCLE ARROW 'ord': '⩝', # LOGICAL OR WITH HORIZONTAL DASH 'order': 'ℴ', # SCRIPT SMALL O 'orderof': 'ℴ', # SCRIPT SMALL O 'ordf': 'ª', # FEMININE ORDINAL INDICATOR 'ordm': 'º', # MASCULINE ORDINAL INDICATOR 'origof': '⊶', # ORIGINAL OF 'oror': '⩖', # TWO INTERSECTING LOGICAL OR 'orslope': '⩗', # SLOPING LARGE OR 'orv': '⩛', # LOGICAL OR WITH MIDDLE STEM 'oscr': 'ℴ', # SCRIPT SMALL O 'oslash': 'ø', # LATIN SMALL LETTER O WITH STROKE 'osol': '⊘', # CIRCLED DIVISION SLASH 'otilde': 'õ', # LATIN SMALL LETTER O WITH TILDE 'otimes': '⊗', # CIRCLED TIMES 'otimesas': '⨶', # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT 'ouml': 'ö', # LATIN SMALL LETTER O WITH DIAERESIS 'ovbar': '⌽', # APL FUNCTIONAL SYMBOL CIRCLE STILE 'par': '∥', # PARALLEL TO 'para': '¶', # PILCROW SIGN 'parallel': '∥', # PARALLEL TO 'parsim': '⫳', # PARALLEL WITH TILDE OPERATOR 'parsl': '⫽', # DOUBLE SOLIDUS OPERATOR 'part': '∂', # PARTIAL DIFFERENTIAL 'pcy': 'п', # CYRILLIC SMALL LETTER PE 'percnt': '%', # PERCENT SIGN 'period': '.', # FULL STOP 'permil': '‰', # PER MILLE SIGN 'perp': '⊥', # UP TACK 'pertenk': '‱', # PER TEN THOUSAND SIGN 'pfr': '𝔭', # MATHEMATICAL FRAKTUR SMALL P 'pgr': 'π', # GREEK SMALL LETTER PI 'phgr': 'φ', # GREEK SMALL LETTER PHI 'phi': 'φ', # GREEK SMALL LETTER PHI 'phiv': 'ϕ', # GREEK PHI SYMBOL 'phmmat': 'ℳ', # SCRIPT CAPITAL M 'phone': '☎', # BLACK TELEPHONE 'pi': 'π', # GREEK SMALL LETTER PI 'pitchfork': '⋔', # PITCHFORK 'piv': 'ϖ', # GREEK PI SYMBOL 'planck': 'ℏ', # PLANCK CONSTANT OVER TWO PI 'planckh': 'ℎ', # PLANCK CONSTANT 'plankv': 'ℏ', # PLANCK CONSTANT OVER TWO PI 'plus': '+', # PLUS SIGN 'plusacir': '⨣', # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE 'plusb': '⊞', # SQUARED PLUS 'pluscir': '⨢', # PLUS SIGN WITH SMALL CIRCLE ABOVE 'plusdo': '∔', # DOT PLUS 'plusdu': '⨥', # PLUS SIGN WITH DOT BELOW 'pluse': '⩲', # PLUS SIGN ABOVE EQUALS SIGN 'plusmn': '±', # PLUS-MINUS SIGN 'plussim': '⨦', # PLUS SIGN WITH TILDE BELOW 'plustwo': '⨧', # PLUS SIGN WITH SUBSCRIPT TWO 'pm': '±', # PLUS-MINUS SIGN 'pointint': '⨕', # INTEGRAL AROUND A POINT OPERATOR 'popf': '𝕡', # MATHEMATICAL DOUBLE-STRUCK SMALL P 'pound': '£', # POUND SIGN 'pr': '≺', # PRECEDES 'prE': '⪳', # PRECEDES ABOVE EQUALS SIGN 'prap': '⪷', # PRECEDES ABOVE ALMOST EQUAL TO 'prcue': '≼', # PRECEDES OR EQUAL TO 'pre': '⪯', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN 'prec': '≺', # PRECEDES 'precapprox': '⪷', # PRECEDES ABOVE ALMOST EQUAL TO 'preccurlyeq': '≼', # PRECEDES OR EQUAL TO 'preceq': '⪯', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN 'precnapprox': '⪹', # PRECEDES ABOVE NOT ALMOST EQUAL TO 'precneqq': '⪵', # PRECEDES ABOVE NOT EQUAL TO 'precnsim': '⋨', # PRECEDES BUT NOT EQUIVALENT TO 'precsim': '≾', # PRECEDES OR EQUIVALENT TO 'prime': '′', # PRIME 'primes': 'ℙ', # DOUBLE-STRUCK CAPITAL P 'prnE': '⪵', # PRECEDES ABOVE NOT EQUAL TO 'prnap': '⪹', # PRECEDES ABOVE NOT ALMOST EQUAL TO 'prnsim': '⋨', # PRECEDES BUT NOT EQUIVALENT TO 'prod': '∏', # N-ARY PRODUCT 'profalar': '⌮', # ALL AROUND-PROFILE 'profline': '⌒', # ARC 'profsurf': '⌓', # SEGMENT 'prop': '∝', # PROPORTIONAL TO 'propto': '∝', # PROPORTIONAL TO 'prsim': '≾', # PRECEDES OR EQUIVALENT TO 'prurel': '⊰', # PRECEDES UNDER RELATION 'pscr': '𝓅', # MATHEMATICAL SCRIPT SMALL P 'psgr': 'ψ', # GREEK SMALL LETTER PSI 'psi': 'ψ', # GREEK SMALL LETTER PSI 'puncsp': ' ', # PUNCTUATION SPACE 'qfr': '𝔮', # MATHEMATICAL FRAKTUR SMALL Q 'qint': '⨌', # QUADRUPLE INTEGRAL OPERATOR 'qopf': '𝕢', # MATHEMATICAL DOUBLE-STRUCK SMALL Q 'qprime': '⁗', # QUADRUPLE PRIME 'qscr': '𝓆', # MATHEMATICAL SCRIPT SMALL Q 'quaternions': 'ℍ', # DOUBLE-STRUCK CAPITAL H 'quatint': '⨖', # QUATERNION INTEGRAL OPERATOR 'quest': '?', # QUESTION MARK 'questeq': '≟', # QUESTIONED EQUAL TO 'quot': '"', # QUOTATION MARK 'rAarr': '⇛', # RIGHTWARDS TRIPLE ARROW 'rArr': '⇒', # RIGHTWARDS DOUBLE ARROW 'rAtail': '⤜', # RIGHTWARDS DOUBLE ARROW-TAIL 'rBarr': '⤏', # RIGHTWARDS TRIPLE DASH ARROW 'rHar': '⥤', # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN 'race': '∽̱', # REVERSED TILDE with underline 'racute': 'ŕ', # LATIN SMALL LETTER R WITH ACUTE 'radic': '√', # SQUARE ROOT 'raemptyv': '⦳', # EMPTY SET WITH RIGHT ARROW ABOVE 'rang': '⟩', # MATHEMATICAL RIGHT ANGLE BRACKET 'rangd': '⦒', # RIGHT ANGLE BRACKET WITH DOT 'range': '⦥', # REVERSED ANGLE WITH UNDERBAR 'rangle': '⟩', # MATHEMATICAL RIGHT ANGLE BRACKET 'raquo': '»', # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 'rarr': '→', # RIGHTWARDS ARROW 'rarrap': '⥵', # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO 'rarrb': '⇥', # RIGHTWARDS ARROW TO BAR 'rarrbfs': '⤠', # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND 'rarrc': '⤳', # WAVE ARROW POINTING DIRECTLY RIGHT 'rarrfs': '⤞', # RIGHTWARDS ARROW TO BLACK DIAMOND 'rarrhk': '↪', # RIGHTWARDS ARROW WITH HOOK 'rarrlp': '↬', # RIGHTWARDS ARROW WITH LOOP 'rarrpl': '⥅', # RIGHTWARDS ARROW WITH PLUS BELOW 'rarrsim': '⥴', # RIGHTWARDS ARROW ABOVE TILDE OPERATOR 'rarrtl': '↣', # RIGHTWARDS ARROW WITH TAIL 'rarrw': '↝', # RIGHTWARDS WAVE ARROW 'ratail': '⤚', # RIGHTWARDS ARROW-TAIL 'ratio': '∶', # RATIO 'rationals': 'ℚ', # DOUBLE-STRUCK CAPITAL Q 'rbarr': '⤍', # RIGHTWARDS DOUBLE DASH ARROW 'rbbrk': '❳', # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT 'rbrace': '}', # RIGHT CURLY BRACKET 'rbrack': ']', # RIGHT SQUARE BRACKET 'rbrke': '⦌', # RIGHT SQUARE BRACKET WITH UNDERBAR 'rbrksld': '⦎', # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 'rbrkslu': '⦐', # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER 'rcaron': 'ř', # LATIN SMALL LETTER R WITH CARON 'rcedil': 'ŗ', # LATIN SMALL LETTER R WITH CEDILLA 'rceil': '⌉', # RIGHT CEILING 'rcub': '}', # RIGHT CURLY BRACKET 'rcy': 'р', # CYRILLIC SMALL LETTER ER 'rdca': '⤷', # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS 'rdldhar': '⥩', # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN 'rdquo': '”', # RIGHT DOUBLE QUOTATION MARK 'rdquor': '”', # RIGHT DOUBLE QUOTATION MARK 'rdsh': '↳', # DOWNWARDS ARROW WITH TIP RIGHTWARDS 'real': 'ℜ', # BLACK-LETTER CAPITAL R 'realine': 'ℛ', # SCRIPT CAPITAL R 'realpart': 'ℜ', # BLACK-LETTER CAPITAL R 'reals': 'ℝ', # DOUBLE-STRUCK CAPITAL R 'rect': '▭', # WHITE RECTANGLE 'reg': '®', # REGISTERED SIGN 'rfisht': '⥽', # RIGHT FISH TAIL 'rfloor': '⌋', # RIGHT FLOOR 'rfr': '𝔯', # MATHEMATICAL FRAKTUR SMALL R 'rgr': 'ρ', # GREEK SMALL LETTER RHO 'rhard': '⇁', # RIGHTWARDS HARPOON WITH BARB DOWNWARDS 'rharu': '⇀', # RIGHTWARDS HARPOON WITH BARB UPWARDS 'rharul': '⥬', # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH 'rho': 'ρ', # GREEK SMALL LETTER RHO 'rhov': 'ϱ', # GREEK RHO SYMBOL 'rightarrow': '→', # RIGHTWARDS ARROW 'rightarrowtail': '↣', # RIGHTWARDS ARROW WITH TAIL 'rightharpoondown': '⇁', # RIGHTWARDS HARPOON WITH BARB DOWNWARDS 'rightharpoonup': '⇀', # RIGHTWARDS HARPOON WITH BARB UPWARDS 'rightleftarrows': '⇄', # RIGHTWARDS ARROW OVER LEFTWARDS ARROW 'rightleftharpoons': '⇌', # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON 'rightrightarrows': '⇉', # RIGHTWARDS PAIRED ARROWS 'rightsquigarrow': '↝', # RIGHTWARDS WAVE ARROW 'rightthreetimes': '⋌', # RIGHT SEMIDIRECT PRODUCT 'ring': '˚', # RING ABOVE 'risingdotseq': '≓', # IMAGE OF OR APPROXIMATELY EQUAL TO 'rlarr': '⇄', # RIGHTWARDS ARROW OVER LEFTWARDS ARROW 'rlhar': '⇌', # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON 'rlm': '‏', # RIGHT-TO-LEFT MARK 'rmoust': '⎱', # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION 'rmoustache': '⎱', # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION 'rnmid': '⫮', # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH 'roang': '⟭', # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET 'roarr': '⇾', # RIGHTWARDS OPEN-HEADED ARROW 'robrk': '⟧', # MATHEMATICAL RIGHT WHITE SQUARE BRACKET 'ropar': '⦆', # RIGHT WHITE PARENTHESIS 'ropf': '𝕣', # MATHEMATICAL DOUBLE-STRUCK SMALL R 'roplus': '⨮', # PLUS SIGN IN RIGHT HALF CIRCLE 'rotimes': '⨵', # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE 'rpar': ')', # RIGHT PARENTHESIS 'rpargt': '⦔', # RIGHT ARC GREATER-THAN BRACKET 'rppolint': '⨒', # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE 'rrarr': '⇉', # RIGHTWARDS PAIRED ARROWS 'rsaquo': '›', # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 'rscr': '𝓇', # MATHEMATICAL SCRIPT SMALL R 'rsh': '↱', # UPWARDS ARROW WITH TIP RIGHTWARDS 'rsqb': ']', # RIGHT SQUARE BRACKET 'rsquo': '’', # RIGHT SINGLE QUOTATION MARK 'rsquor': '’', # RIGHT SINGLE QUOTATION MARK 'rthree': '⋌', # RIGHT SEMIDIRECT PRODUCT 'rtimes': '⋊', # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT 'rtri': '▹', # WHITE RIGHT-POINTING SMALL TRIANGLE 'rtrie': '⊵', # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO 'rtrif': '▸', # BLACK RIGHT-POINTING SMALL TRIANGLE 'rtriltri': '⧎', # RIGHT TRIANGLE ABOVE LEFT TRIANGLE 'ruluhar': '⥨', # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP 'rx': '℞', # PRESCRIPTION TAKE 'sacute': 'ś', # LATIN SMALL LETTER S WITH ACUTE 'sbquo': '‚', # SINGLE LOW-9 QUOTATION MARK 'sc': '≻', # SUCCEEDS 'scE': '⪴', # SUCCEEDS ABOVE EQUALS SIGN 'scap': '⪸', # SUCCEEDS ABOVE ALMOST EQUAL TO 'scaron': 'š', # LATIN SMALL LETTER S WITH CARON 'sccue': '≽', # SUCCEEDS OR EQUAL TO 'sce': '⪰', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 'scedil': 'ş', # LATIN SMALL LETTER S WITH CEDILLA 'scirc': 'ŝ', # LATIN SMALL LETTER S WITH CIRCUMFLEX 'scnE': '⪶', # SUCCEEDS ABOVE NOT EQUAL TO 'scnap': '⪺', # SUCCEEDS ABOVE NOT ALMOST EQUAL TO 'scnsim': '⋩', # SUCCEEDS BUT NOT EQUIVALENT TO 'scpolint': '⨓', # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE 'scsim': '≿', # SUCCEEDS OR EQUIVALENT TO 'scy': 'с', # CYRILLIC SMALL LETTER ES 'sdot': '⋅', # DOT OPERATOR 'sdotb': '⊡', # SQUARED DOT OPERATOR 'sdote': '⩦', # EQUALS SIGN WITH DOT BELOW 'seArr': '⇘', # SOUTH EAST DOUBLE ARROW 'searhk': '⤥', # SOUTH EAST ARROW WITH HOOK 'searr': '↘', # SOUTH EAST ARROW 'searrow': '↘', # SOUTH EAST ARROW 'sect': '§', # SECTION SIGN 'semi': ';', # SEMICOLON 'seswar': '⤩', # SOUTH EAST ARROW AND SOUTH WEST ARROW 'setminus': '∖', # SET MINUS 'setmn': '∖', # SET MINUS 'sext': '✶', # SIX POINTED BLACK STAR 'sfgr': 'ς', # GREEK SMALL LETTER FINAL SIGMA 'sfr': '𝔰', # MATHEMATICAL FRAKTUR SMALL S 'sfrown': '⌢', # FROWN 'sgr': 'σ', # GREEK SMALL LETTER SIGMA 'sharp': '♯', # MUSIC SHARP SIGN 'shchcy': 'щ', # CYRILLIC SMALL LETTER SHCHA 'shcy': 'ш', # CYRILLIC SMALL LETTER SHA 'shortmid': '∣', # DIVIDES 'shortparallel': '∥', # PARALLEL TO 'shy': '­', # SOFT HYPHEN 'sigma': 'σ', # GREEK SMALL LETTER SIGMA 'sigmaf': 'ς', # GREEK SMALL LETTER FINAL SIGMA 'sigmav': 'ς', # GREEK SMALL LETTER FINAL SIGMA 'sim': '∼', # TILDE OPERATOR 'simdot': '⩪', # TILDE OPERATOR WITH DOT ABOVE 'sime': '≃', # ASYMPTOTICALLY EQUAL TO 'simeq': '≃', # ASYMPTOTICALLY EQUAL TO 'simg': '⪞', # SIMILAR OR GREATER-THAN 'simgE': '⪠', # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN 'siml': '⪝', # SIMILAR OR LESS-THAN 'simlE': '⪟', # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN 'simne': '≆', # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO 'simplus': '⨤', # PLUS SIGN WITH TILDE ABOVE 'simrarr': '⥲', # TILDE OPERATOR ABOVE RIGHTWARDS ARROW 'slarr': '←', # LEFTWARDS ARROW 'smallsetminus': '∖', # SET MINUS 'smashp': '⨳', # SMASH PRODUCT 'smeparsl': '⧤', # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE 'smid': '∣', # DIVIDES 'smile': '⌣', # SMILE 'smt': '⪪', # SMALLER THAN 'smte': '⪬', # SMALLER THAN OR EQUAL TO 'smtes': '⪬︀', # SMALLER THAN OR slanted EQUAL 'softcy': 'ь', # CYRILLIC SMALL LETTER SOFT SIGN 'sol': '/', # SOLIDUS 'solb': '⧄', # SQUARED RISING DIAGONAL SLASH 'solbar': '⌿', # APL FUNCTIONAL SYMBOL SLASH BAR 'sopf': '𝕤', # MATHEMATICAL DOUBLE-STRUCK SMALL S 'spades': '♠', # BLACK SPADE SUIT 'spadesuit': '♠', # BLACK SPADE SUIT 'spar': '∥', # PARALLEL TO 'sqcap': '⊓', # SQUARE CAP 'sqcaps': '⊓︀', # SQUARE CAP with serifs 'sqcup': '⊔', # SQUARE CUP 'sqcups': '⊔︀', # SQUARE CUP with serifs 'sqsub': '⊏', # SQUARE IMAGE OF 'sqsube': '⊑', # SQUARE IMAGE OF OR EQUAL TO 'sqsubset': '⊏', # SQUARE IMAGE OF 'sqsubseteq': '⊑', # SQUARE IMAGE OF OR EQUAL TO 'sqsup': '⊐', # SQUARE ORIGINAL OF 'sqsupe': '⊒', # SQUARE ORIGINAL OF OR EQUAL TO 'sqsupset': '⊐', # SQUARE ORIGINAL OF 'sqsupseteq': '⊒', # SQUARE ORIGINAL OF OR EQUAL TO 'squ': '□', # WHITE SQUARE 'square': '□', # WHITE SQUARE 'squarf': '▪', # BLACK SMALL SQUARE 'squf': '▪', # BLACK SMALL SQUARE 'srarr': '→', # RIGHTWARDS ARROW 'sscr': '𝓈', # MATHEMATICAL SCRIPT SMALL S 'ssetmn': '∖', # SET MINUS 'ssmile': '⌣', # SMILE 'sstarf': '⋆', # STAR OPERATOR 'star': '☆', # WHITE STAR 'starf': '★', # BLACK STAR 'straightepsilon': 'ϵ', # GREEK LUNATE EPSILON SYMBOL 'straightphi': 'ϕ', # GREEK PHI SYMBOL 'strns': '¯', # MACRON 'sub': '⊂', # SUBSET OF 'subE': '⫅', # SUBSET OF ABOVE EQUALS SIGN 'subdot': '⪽', # SUBSET WITH DOT 'sube': '⊆', # SUBSET OF OR EQUAL TO 'subedot': '⫃', # SUBSET OF OR EQUAL TO WITH DOT ABOVE 'submult': '⫁', # SUBSET WITH MULTIPLICATION SIGN BELOW 'subnE': '⫋', # SUBSET OF ABOVE NOT EQUAL TO 'subne': '⊊', # SUBSET OF WITH NOT EQUAL TO 'subplus': '⪿', # SUBSET WITH PLUS SIGN BELOW 'subrarr': '⥹', # SUBSET ABOVE RIGHTWARDS ARROW 'subset': '⊂', # SUBSET OF 'subseteq': '⊆', # SUBSET OF OR EQUAL TO 'subseteqq': '⫅', # SUBSET OF ABOVE EQUALS SIGN 'subsetneq': '⊊', # SUBSET OF WITH NOT EQUAL TO 'subsetneqq': '⫋', # SUBSET OF ABOVE NOT EQUAL TO 'subsim': '⫇', # SUBSET OF ABOVE TILDE OPERATOR 'subsub': '⫕', # SUBSET ABOVE SUBSET 'subsup': '⫓', # SUBSET ABOVE SUPERSET 'succ': '≻', # SUCCEEDS 'succapprox': '⪸', # SUCCEEDS ABOVE ALMOST EQUAL TO 'succcurlyeq': '≽', # SUCCEEDS OR EQUAL TO 'succeq': '⪰', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 'succnapprox': '⪺', # SUCCEEDS ABOVE NOT ALMOST EQUAL TO 'succneqq': '⪶', # SUCCEEDS ABOVE NOT EQUAL TO 'succnsim': '⋩', # SUCCEEDS BUT NOT EQUIVALENT TO 'succsim': '≿', # SUCCEEDS OR EQUIVALENT TO 'sum': '∑', # N-ARY SUMMATION 'sung': '♪', # EIGHTH NOTE 'sup': '⊃', # SUPERSET OF 'sup1': '¹', # SUPERSCRIPT ONE 'sup2': '²', # SUPERSCRIPT TWO 'sup3': '³', # SUPERSCRIPT THREE 'supE': '⫆', # SUPERSET OF ABOVE EQUALS SIGN 'supdot': '⪾', # SUPERSET WITH DOT 'supdsub': '⫘', # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET 'supe': '⊇', # SUPERSET OF OR EQUAL TO 'supedot': '⫄', # SUPERSET OF OR EQUAL TO WITH DOT ABOVE 'suphsol': '⟉', # SUPERSET PRECEDING SOLIDUS 'suphsub': '⫗', # SUPERSET BESIDE SUBSET 'suplarr': '⥻', # SUPERSET ABOVE LEFTWARDS ARROW 'supmult': '⫂', # SUPERSET WITH MULTIPLICATION SIGN BELOW 'supnE': '⫌', # SUPERSET OF ABOVE NOT EQUAL TO 'supne': '⊋', # SUPERSET OF WITH NOT EQUAL TO 'supplus': '⫀', # SUPERSET WITH PLUS SIGN BELOW 'supset': '⊃', # SUPERSET OF 'supseteq': '⊇', # SUPERSET OF OR EQUAL TO 'supseteqq': '⫆', # SUPERSET OF ABOVE EQUALS SIGN 'supsetneq': '⊋', # SUPERSET OF WITH NOT EQUAL TO 'supsetneqq': '⫌', # SUPERSET OF ABOVE NOT EQUAL TO 'supsim': '⫈', # SUPERSET OF ABOVE TILDE OPERATOR 'supsub': '⫔', # SUPERSET ABOVE SUBSET 'supsup': '⫖', # SUPERSET ABOVE SUPERSET 'swArr': '⇙', # SOUTH WEST DOUBLE ARROW 'swarhk': '⤦', # SOUTH WEST ARROW WITH HOOK 'swarr': '↙', # SOUTH WEST ARROW 'swarrow': '↙', # SOUTH WEST ARROW 'swnwar': '⤪', # SOUTH WEST ARROW AND NORTH WEST ARROW 'szlig': 'ß', # LATIN SMALL LETTER SHARP S 'target': '⌖', # POSITION INDICATOR 'tau': 'τ', # GREEK SMALL LETTER TAU 'tbrk': '⎴', # TOP SQUARE BRACKET 'tcaron': 'ť', # LATIN SMALL LETTER T WITH CARON 'tcedil': 'ţ', # LATIN SMALL LETTER T WITH CEDILLA 'tcy': 'т', # CYRILLIC SMALL LETTER TE 'tdot': '\u20DB', # COMBINING THREE DOTS ABOVE 'telrec': '⌕', # TELEPHONE RECORDER 'tfr': '𝔱', # MATHEMATICAL FRAKTUR SMALL T 'tgr': 'τ', # GREEK SMALL LETTER TAU 'there4': '∴', # THEREFORE 'therefore': '∴', # THEREFORE 'theta': 'θ', # GREEK SMALL LETTER THETA 'thetasym': 'ϑ', # GREEK THETA SYMBOL 'thetav': 'ϑ', # GREEK THETA SYMBOL 'thgr': 'θ', # GREEK SMALL LETTER THETA 'thickapprox': '≈', # ALMOST EQUAL TO 'thicksim': '∼', # TILDE OPERATOR 'thinsp': ' ', # THIN SPACE 'thkap': '≈', # ALMOST EQUAL TO 'thksim': '∼', # TILDE OPERATOR 'thorn': 'þ', # LATIN SMALL LETTER THORN 'tilde': '˜', # SMALL TILDE 'times': '×', # MULTIPLICATION SIGN 'timesb': '⊠', # SQUARED TIMES 'timesbar': '⨱', # MULTIPLICATION SIGN WITH UNDERBAR 'timesd': '⨰', # MULTIPLICATION SIGN WITH DOT ABOVE 'tint': '∭', # TRIPLE INTEGRAL 'toea': '⤨', # NORTH EAST ARROW AND SOUTH EAST ARROW 'top': '⊤', # DOWN TACK 'topbot': '⌶', # APL FUNCTIONAL SYMBOL I-BEAM 'topcir': '⫱', # DOWN TACK WITH CIRCLE BELOW 'topf': '𝕥', # MATHEMATICAL DOUBLE-STRUCK SMALL T 'topfork': '⫚', # PITCHFORK WITH TEE TOP 'tosa': '⤩', # SOUTH EAST ARROW AND SOUTH WEST ARROW 'tprime': '‴', # TRIPLE PRIME 'trade': '™', # TRADE MARK SIGN 'triangle': '▵', # WHITE UP-POINTING SMALL TRIANGLE 'triangledown': '▿', # WHITE DOWN-POINTING SMALL TRIANGLE 'triangleleft': '◃', # WHITE LEFT-POINTING SMALL TRIANGLE 'trianglelefteq': '⊴', # NORMAL SUBGROUP OF OR EQUAL TO 'triangleq': '≜', # DELTA EQUAL TO 'triangleright': '▹', # WHITE RIGHT-POINTING SMALL TRIANGLE 'trianglerighteq': '⊵', # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO 'tridot': '◬', # WHITE UP-POINTING TRIANGLE WITH DOT 'trie': '≜', # DELTA EQUAL TO 'triminus': '⨺', # MINUS SIGN IN TRIANGLE 'triplus': '⨹', # PLUS SIGN IN TRIANGLE 'trisb': '⧍', # TRIANGLE WITH SERIFS AT BOTTOM 'tritime': '⨻', # MULTIPLICATION SIGN IN TRIANGLE 'trpezium': '⏢', # WHITE TRAPEZIUM 'tscr': '𝓉', # MATHEMATICAL SCRIPT SMALL T 'tscy': 'ц', # CYRILLIC SMALL LETTER TSE 'tshcy': 'ћ', # CYRILLIC SMALL LETTER TSHE 'tstrok': 'ŧ', # LATIN SMALL LETTER T WITH STROKE 'twixt': '≬', # BETWEEN 'twoheadleftarrow': '↞', # LEFTWARDS TWO HEADED ARROW 'twoheadrightarrow': '↠', # RIGHTWARDS TWO HEADED ARROW 'uArr': '⇑', # UPWARDS DOUBLE ARROW 'uHar': '⥣', # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT 'uacgr': 'ύ', # GREEK SMALL LETTER UPSILON WITH TONOS 'uacute': 'ú', # LATIN SMALL LETTER U WITH ACUTE 'uarr': '↑', # UPWARDS ARROW 'ubrcy': 'ў', # CYRILLIC SMALL LETTER SHORT U 'ubreve': 'ŭ', # LATIN SMALL LETTER U WITH BREVE 'ucirc': 'û', # LATIN SMALL LETTER U WITH CIRCUMFLEX 'ucy': 'у', # CYRILLIC SMALL LETTER U 'udarr': '⇅', # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW 'udblac': 'ű', # LATIN SMALL LETTER U WITH DOUBLE ACUTE 'udhar': '⥮', # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT 'udiagr': 'ΰ', # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 'udigr': 'ϋ', # GREEK SMALL LETTER UPSILON WITH DIALYTIKA 'ufisht': '⥾', # UP FISH TAIL 'ufr': '𝔲', # MATHEMATICAL FRAKTUR SMALL U 'ugr': 'υ', # GREEK SMALL LETTER UPSILON 'ugrave': 'ù', # LATIN SMALL LETTER U WITH GRAVE 'uharl': '↿', # UPWARDS HARPOON WITH BARB LEFTWARDS 'uharr': '↾', # UPWARDS HARPOON WITH BARB RIGHTWARDS 'uhblk': '▀', # UPPER HALF BLOCK 'ulcorn': '⌜', # TOP LEFT CORNER 'ulcorner': '⌜', # TOP LEFT CORNER 'ulcrop': '⌏', # TOP LEFT CROP 'ultri': '◸', # UPPER LEFT TRIANGLE 'umacr': 'ū', # LATIN SMALL LETTER U WITH MACRON 'uml': '¨', # DIAERESIS 'uogon': 'ų', # LATIN SMALL LETTER U WITH OGONEK 'uopf': '𝕦', # MATHEMATICAL DOUBLE-STRUCK SMALL U 'uparrow': '↑', # UPWARDS ARROW 'updownarrow': '↕', # UP DOWN ARROW 'upharpoonleft': '↿', # UPWARDS HARPOON WITH BARB LEFTWARDS 'upharpoonright': '↾', # UPWARDS HARPOON WITH BARB RIGHTWARDS 'uplus': '⊎', # MULTISET UNION 'upsi': 'υ', # GREEK SMALL LETTER UPSILON 'upsih': 'ϒ', # GREEK UPSILON WITH HOOK SYMBOL 'upsilon': 'υ', # GREEK SMALL LETTER UPSILON 'upuparrows': '⇈', # UPWARDS PAIRED ARROWS 'urcorn': '⌝', # TOP RIGHT CORNER 'urcorner': '⌝', # TOP RIGHT CORNER 'urcrop': '⌎', # TOP RIGHT CROP 'uring': 'ů', # LATIN SMALL LETTER U WITH RING ABOVE 'urtri': '◹', # UPPER RIGHT TRIANGLE 'uscr': '𝓊', # MATHEMATICAL SCRIPT SMALL U 'utdot': '⋰', # UP RIGHT DIAGONAL ELLIPSIS 'utilde': 'ũ', # LATIN SMALL LETTER U WITH TILDE 'utri': '▵', # WHITE UP-POINTING SMALL TRIANGLE 'utrif': '▴', # BLACK UP-POINTING SMALL TRIANGLE 'uuarr': '⇈', # UPWARDS PAIRED ARROWS 'uuml': 'ü', # LATIN SMALL LETTER U WITH DIAERESIS 'uwangle': '⦧', # OBLIQUE ANGLE OPENING DOWN 'vArr': '⇕', # UP DOWN DOUBLE ARROW 'vBar': '⫨', # SHORT UP TACK WITH UNDERBAR 'vBarv': '⫩', # SHORT UP TACK ABOVE SHORT DOWN TACK 'vDash': '⊨', # TRUE 'vangrt': '⦜', # RIGHT ANGLE VARIANT WITH SQUARE 'varepsilon': 'ϵ', # GREEK LUNATE EPSILON SYMBOL 'varkappa': 'ϰ', # GREEK KAPPA SYMBOL 'varnothing': '∅', # EMPTY SET 'varphi': 'ϕ', # GREEK PHI SYMBOL 'varpi': 'ϖ', # GREEK PI SYMBOL 'varpropto': '∝', # PROPORTIONAL TO 'varr': '↕', # UP DOWN ARROW 'varrho': 'ϱ', # GREEK RHO SYMBOL 'varsigma': 'ς', # GREEK SMALL LETTER FINAL SIGMA 'varsubsetneq': '⊊︀', # SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members 'varsubsetneqq': '⫋︀', # SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members 'varsupsetneq': '⊋︀', # SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members 'varsupsetneqq': '⫌︀', # SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members 'vartheta': 'ϑ', # GREEK THETA SYMBOL 'vartriangleleft': '⊲', # NORMAL SUBGROUP OF 'vartriangleright': '⊳', # CONTAINS AS NORMAL SUBGROUP 'vcy': 'в', # CYRILLIC SMALL LETTER VE 'vdash': '⊢', # RIGHT TACK 'vee': '∨', # LOGICAL OR 'veebar': '⊻', # XOR 'veeeq': '≚', # EQUIANGULAR TO 'vellip': '⋮', # VERTICAL ELLIPSIS 'verbar': '|', # VERTICAL LINE 'vert': '|', # VERTICAL LINE 'vfr': '𝔳', # MATHEMATICAL FRAKTUR SMALL V 'vltri': '⊲', # NORMAL SUBGROUP OF 'vnsub': '⊂⃒', # SUBSET OF with vertical line 'vnsup': '⊃⃒', # SUPERSET OF with vertical line 'vopf': '𝕧', # MATHEMATICAL DOUBLE-STRUCK SMALL V 'vprop': '∝', # PROPORTIONAL TO 'vrtri': '⊳', # CONTAINS AS NORMAL SUBGROUP 'vscr': '𝓋', # MATHEMATICAL SCRIPT SMALL V 'vsubnE': '⫋︀', # SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members 'vsubne': '⊊︀', # SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members 'vsupnE': '⫌︀', # SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members 'vsupne': '⊋︀', # SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members 'vzigzag': '⦚', # VERTICAL ZIGZAG LINE 'wcirc': 'ŵ', # LATIN SMALL LETTER W WITH CIRCUMFLEX 'wedbar': '⩟', # LOGICAL AND WITH UNDERBAR 'wedge': '∧', # LOGICAL AND 'wedgeq': '≙', # ESTIMATES 'weierp': '℘', # SCRIPT CAPITAL P 'wfr': '𝔴', # MATHEMATICAL FRAKTUR SMALL W 'wopf': '𝕨', # MATHEMATICAL DOUBLE-STRUCK SMALL W 'wp': '℘', # SCRIPT CAPITAL P 'wr': '≀', # WREATH PRODUCT 'wreath': '≀', # WREATH PRODUCT 'wscr': '𝓌', # MATHEMATICAL SCRIPT SMALL W 'xcap': '⋂', # N-ARY INTERSECTION 'xcirc': '◯', # LARGE CIRCLE 'xcup': '⋃', # N-ARY UNION 'xdtri': '▽', # WHITE DOWN-POINTING TRIANGLE 'xfr': '𝔵', # MATHEMATICAL FRAKTUR SMALL X 'xgr': 'ξ', # GREEK SMALL LETTER XI 'xhArr': '⟺', # LONG LEFT RIGHT DOUBLE ARROW 'xharr': '⟷', # LONG LEFT RIGHT ARROW 'xi': 'ξ', # GREEK SMALL LETTER XI 'xlArr': '⟸', # LONG LEFTWARDS DOUBLE ARROW 'xlarr': '⟵', # LONG LEFTWARDS ARROW 'xmap': '⟼', # LONG RIGHTWARDS ARROW FROM BAR 'xnis': '⋻', # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 'xodot': '⨀', # N-ARY CIRCLED DOT OPERATOR 'xopf': '𝕩', # MATHEMATICAL DOUBLE-STRUCK SMALL X 'xoplus': '⨁', # N-ARY CIRCLED PLUS OPERATOR 'xotime': '⨂', # N-ARY CIRCLED TIMES OPERATOR 'xrArr': '⟹', # LONG RIGHTWARDS DOUBLE ARROW 'xrarr': '⟶', # LONG RIGHTWARDS ARROW 'xscr': '𝓍', # MATHEMATICAL SCRIPT SMALL X 'xsqcup': '⨆', # N-ARY SQUARE UNION OPERATOR 'xuplus': '⨄', # N-ARY UNION OPERATOR WITH PLUS 'xutri': '△', # WHITE UP-POINTING TRIANGLE 'xvee': '⋁', # N-ARY LOGICAL OR 'xwedge': '⋀', # N-ARY LOGICAL AND 'yacute': 'ý', # LATIN SMALL LETTER Y WITH ACUTE 'yacy': 'я', # CYRILLIC SMALL LETTER YA 'ycirc': 'ŷ', # LATIN SMALL LETTER Y WITH CIRCUMFLEX 'ycy': 'ы', # CYRILLIC SMALL LETTER YERU 'yen': '¥', # YEN SIGN 'yfr': '𝔶', # MATHEMATICAL FRAKTUR SMALL Y 'yicy': 'ї', # CYRILLIC SMALL LETTER YI 'yopf': '𝕪', # MATHEMATICAL DOUBLE-STRUCK SMALL Y 'yscr': '𝓎', # MATHEMATICAL SCRIPT SMALL Y 'yucy': 'ю', # CYRILLIC SMALL LETTER YU 'yuml': 'ÿ', # LATIN SMALL LETTER Y WITH DIAERESIS 'zacute': 'ź', # LATIN SMALL LETTER Z WITH ACUTE 'zcaron': 'ž', # LATIN SMALL LETTER Z WITH CARON 'zcy': 'з', # CYRILLIC SMALL LETTER ZE 'zdot': 'ż', # LATIN SMALL LETTER Z WITH DOT ABOVE 'zeetrf': 'ℨ', # BLACK-LETTER CAPITAL Z 'zeta': 'ζ', # GREEK SMALL LETTER ZETA 'zfr': '𝔷', # MATHEMATICAL FRAKTUR SMALL Z 'zgr': 'ζ', # GREEK SMALL LETTER ZETA 'zhcy': 'ж', # CYRILLIC SMALL LETTER ZHE 'zigrarr': '⇝', # RIGHTWARDS SQUIGGLE ARROW 'zopf': '𝕫', # MATHEMATICAL DOUBLE-STRUCK SMALL Z 'zscr': '𝓏', # MATHEMATICAL SCRIPT SMALL Z 'zwj': '‍', # ZERO WIDTH JOINER 'zwnj': '‌', # ZERO WIDTH NON-JOINER } mallard-ducktype-0.4/mallard/ducktype/parser.py000066400000000000000000001613501324725273200217460ustar00rootroot00000000000000# Copyright (c) 2014-2015 Shaun McCance # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. import collections import os import sys import urllib.parse from . import entities def FIXME(msg=None): if msg is not None: print('FIXME: %s' % msg) else: print('FIXME') def _get_indent(line): for i in range(len(line)): if line[i] != ' ': return i return 0 def _escape_xml_attr(s): return s.replace('&', '&').replace('<', '<').replace('"', '"') def _escape_xml(s): return s.replace('&', '&').replace('<', '<') _escaped_chars = '$*=-@[]()"\'' class Attributes: def __init__(self): self._attrlist = [] self._attrvals = {} def add_attribute(self, key, value): if key not in self._attrlist: self._attrlist.append(key) if key == 'style': self._attrvals.setdefault(key, []) self._attrvals[key].append(value) else: self._attrvals[key] = value def __contains__(self, item): return item in self._attrlist def _write_xml(self, fd): for attr in self._attrlist: fd.write(' ' + attr + '="') if attr == 'style': fd.write(' '.join([_escape_xml_attr(s) for s in self._attrvals[attr]])) else: fd.write(_escape_xml_attr(self._attrvals[attr])) fd.write('"') class Directive: def __init__(self, name): self.name = name self.content = '' def set_content(self, content): self.content = content @staticmethod def parse_line(line, parser): i = 1 while i < len(line): if line[i].isspace(): break i += 1 if i == 1: raise SyntaxError('Directive must start with a name', parser) directive = Directive(line[1:i]) directive.set_content(line[i:].lstrip().rstrip('\n')) return directive class Node: def __init__(self, name, outer=0, inner=None, parser=None, linenum=None): self.name = name self.nsprefix = None self.nsuri = None self.localname = name self.default_namespace = None self.is_external = False if ':' in name: self.nsprefix = name[:name.index(':')] self.nsuri = parser.document.get_namespace(self.nsprefix) if self.nsuri is None and self.nsprefix != 'xml': raise SyntaxError('Unrecognized namespace prefix: ' + self.nsprefix, parser) self.localname = self.name[len(self.nsprefix)+1:] if not self.nsuri.startswith('http://projectmallard.org/'): self.is_external = True self.outer = outer if inner is None: self.inner = outer else: self.inner = inner self.info = None self.children = [] self.attributes = None self.is_division = (name in ('page', 'section')) self.is_verbatim = (name in ('screen', 'code')) self.is_list = (name in ('list', 'steps', 'terms', 'tree')) self.linenum = linenum if self.linenum is None and parser is not None: self.linenum = parser.linenum self._namespaces = collections.OrderedDict() self._definitions = {} self._parent = None self._depth = 1 self._softbreak = False # Help keep out pesky trailing newlines @property def is_leaf(self): leafs = ('p', 'screen', 'code', 'title', 'subtitle', 'desc', 'cite', 'name', 'email', 'years') if self.name in leafs: return True if self.nsprefix is not None: if self.nsuri is None: return False if self.nsuri == 'http://projectmallard.org/1.0/': return self.localname in leafs return False @property def is_tree_item(self): if self.name != 'item': return False cur = self while cur.name == 'item': cur = cur.parent if cur.name == 'tree': return True return False @property def has_tree_items(self): if self.is_tree_item: for item in self.children: if isinstance(item, Node) and item.name == 'item': return True return False @property def is_external_leaf(self): if not self.is_external: return False if len(self.children) == 0: return False if isinstance(self.children[0], str) or isinstance(self.children[0], Inline): return True return False @property def is_empty(self): return len(self.children) == 0 and self.info is None @property def available(self): if len(self.children) == 0: return True elif len(self.children) == 1: return self.children[0].name == 'title' # FIXME: desc, cite, subtitle? else: return False @property def depth(self): return self._depth @property def parent(self): return self._parent @parent.setter def parent(self, node): self._parent = node self._depth = node._depth + 1 def add_child(self, child): if isinstance(child, str): self.add_text(child) return if self._softbreak: if len(self.children) > 0: self.children[-1] += '\n' self._softbreak = False self.children.append(child) child.parent = self def add_text(self, text): # We don't add newlines when we see them. Instead, we record that # we saw one with _softbreak and output the newline if we add # something afterwards. This prevents pesky trailing newlines on # text in block elements. But we only do newline mangling at the # block parse phase, so don't bother if self is an Inline. if self._softbreak: if len(self.children) > 0: self.children[-1] += '\n' self._softbreak = False if not isinstance(self, Inline) and text.endswith('\n'): text = text[:-1] self._softbreak = True if len(self.children) > 0 and isinstance(self.children[-1], str): self.children[-1] += text else: self.children.append(text) def add_namespace(self, prefix, uri): self._namespaces[prefix] =uri def get_namespace(self, prefix): uri = self._namespaces.get(prefix) if uri is not None: return uri if self._parent is not None: return self._parent.get_namespace(prefix) return None def add_definition(self, name, value): self._definitions[name] = value def write_xml(self, outfile=None): close = False if outfile is None: fd = sys.stdout elif isinstance(outfile, str): close = True fd = open(outfile, 'w', encoding='utf-8') else: fd = outfile self._write_xml(fd) if close: fd.close() def _write_xml(self, fd, *, depth=0, verbatim=False): verbatim = verbatim or self.is_verbatim if not isinstance(self, Inline): fd.write(' ' * depth) fd.write('<' + self.name) if self.default_namespace is not None: fd.write(' xmlns="' + self.default_namespace + '"') for prefix in self._namespaces: fd.write(' xmlns:' + prefix + '="' + self._namespaces[prefix] + '"') if self.attributes is not None: self.attributes._write_xml(fd) if self.is_empty: if isinstance(self, Inline): fd.write('/>') else: fd.write('/>\n') elif (self.info is not None or isinstance(self.children[0], Block) or isinstance(self.children[0], Info) ): fd.write('>\n') else: fd.write('>') if self.info is not None: self.info._write_xml(fd, depth=depth+1) for i in range(len(self.children)): child = self.children[i] if isinstance(child, Inline): child._write_xml(fd, depth=depth, verbatim=verbatim) elif isinstance(child, Fence): child._write_xml(fd, depth=depth, verbatim=verbatim) if i + 1 < len(self.children): fd.write('\n') elif isinstance(child, Node): child._write_xml(fd, depth=depth+1, verbatim=verbatim) else: if i > 0 and isinstance(self.children[i-1], Fence) and not verbatim: fd.write(' ' * depth) if '\n' in child: nl = child.find('\n') while nl >= 0: if nl + 1 == len(child) and i + 1 == len(self.children): fd.write(_escape_xml(child[:nl])) elif verbatim or (nl + 1 < len(child) and child[nl + 1] == '\n'): fd.write(_escape_xml(child[:nl]) + '\n') elif self.is_tree_item: fd.write(_escape_xml(child[:nl]) + '\n') if nl + 1 < len(child): fd.write(' ' * (depth + 1)) else: fd.write(_escape_xml(child[:nl]) + '\n' + (' ' * depth)) child = child[nl + 1:] nl = child.find('\n') if child != '': fd.write(_escape_xml(child)) else: fd.write(_escape_xml(child)) if not self.is_empty: if isinstance(self, Inline): fd.write('') elif self.is_leaf or self.is_external_leaf: fd.write('\n') elif self.is_tree_item: if self.has_tree_items: fd.write((' ' * depth) + '\n') else: fd.write('\n') else: fd.write((' ' * depth) + '\n') class Document(Node): def __init__(self, parser=None): Node.__init__(self, '_', parser=parser) self.is_division = True self.default_element = None self.default_namespace = 'http://projectmallard.org/1.0/' def _write_xml(self, fd, *args, depth=0, verbatim=False): if self.default_element is not None: fd.write('\n') self.name = self.default_element Node._write_xml(self, fd) else: if len(self.children) == 1: fd.write('\n') for child in self.children: if child.default_namespace is None: child.default_namespace = self.default_namespace for ns in self._namespaces: child.add_namespace(ns, self._namespaces[ns]) child._write_xml(fd) class Block(Node): pass class Info(Node): pass class Inline(Node): pass class Fence(Node): def add_line(self, line): self.add_text(line) return indent = _get_indent(line) if len(self.children) == 0: self.inner = indent self.children.append('') self.children[0] += line[min(indent, self.inner):] if not line.endswith('\n'): self.children[0] += '\n' def _write_xml(self, fd, *, depth=0, verbatim=False): lines = self.children[0].split('\n') firstindent = _get_indent(lines[0]) for i in range(len(lines)): line = lines[i] indent = _get_indent(line) if i != 0: fd.write('\n') fd.write(_escape_xml(line[min(indent, firstindent):])) class SyntaxError(Exception): def __init__(self, message, parser): self.message = message self.parser = parser self.filename = parser.filename if parser else None self.linenum = parser.linenum if parser else None self.fullmessage = '' if self.filename is not None: self.fullmessage += os.path.basename(self.filename) if self.linenum is not None: self.fullmessage += ':' + str(self.linenum) self.fullmessage += ': ' self.fullmessage += self.message class InlineParser: def __init__(self, parent, linenum=1): # Dummy node just to hold children while we parse self.current = Inline('_', linenum=linenum) self.document = parent.document self.filename = parent.filename self.linenum = linenum self._parent = parent def lookup_entity(self, entity): return self._parent.lookup_entity(entity) def parse_text(self, text): self._parse_text(text) while self.current.parent is not None: self.current = self.current.parent return self.current.children def _parse_text(self, text): start = cur = 0 parens = [] while cur < len(text): if self.current.parent is not None and text[cur] == ')': if len(parens) > 0 and parens[-1] > 0: parens[-1] -= 1 cur += 1 else: self.current.add_text(text[start:cur]) self.current = self.current.parent parens.pop() cur += 1 start = cur elif self.current.parent is not None and text[cur] == '(': parens[-1] += 1 cur += 1 elif cur == len(text) - 1: cur += 1 self.current.add_text(text[start:cur]) elif text[cur] == '$' and text[cur + 1] in _escaped_chars: self.current.add_text(text[start:cur]) self.current.add_text(text[cur + 1]) cur += 2 start = cur elif text[cur] == '$' and _isnmtoken(text[cur + 1]): end = cur + 1 while end < len(text): if not _isnmtoken(text[end]): break end += 1 if end == len(text): self.current.add_text(text[start:end]) cur = end elif text[end] == ';': self.current.add_text(text[start:cur]) entname = text[cur + 1:end] entval = self._parent.lookup_entity(entname) if entval is not None: parser = InlineParser(self, linenum=self.current.linenum) for child in parser.parse_text(entval): if isinstance(child, str): self.current.add_text(child) else: self.current.add_child(child) else: raise SyntaxError('Unrecognized entity: ' + entname, self) start = cur = end + 1 elif text[end] == '[': self.current.add_text(text[start:cur]) node = Inline(text[cur + 1:end], parser=self) self.current.add_child(node) attrparser = AttributeParser(self) attrparser.parse_line(text[end + 1:]) if not attrparser.finished: # We know we have all the text there could be, # so this an unclosed attribute list. Do we make # that an error, auto-close, or decide this was # never really markup after all? FIXME('unclosed attribute list') node.attributes = attrparser.attributes self.linenum = attrparser.linenum start = cur = len(text) - len(attrparser.remainder) if cur < len(text) and text[cur] == '(': self.current = node parens.append(0) start = cur = cur + 1 elif text[end] == '(': self.current.add_text(text[start:cur]) node = Inline(text[cur + 1:end], parser=self) self.current.add_child(node) self.current = node parens.append(0) start = cur = end + 1 else: cur = end else: if text[cur] == '\n': self.linenum += 1 cur += 1 class AttributeParser: def __init__(self, parent): self.remainder = None self.attributes = Attributes() self.finished = False self.filename = parent.filename self.linenum = parent.linenum self._quote = None self._value = '' self._attrname = None self._parent = parent def lookup_entity(self, entity): return self._parent.lookup_entity(entity) def parse_value(self, text): retval = '' start = cur = 0 while cur < len(text): if text[cur] == '$': if cur == len(text) - 1: cur += 1 retval += text[start:cur] start = cur elif text[cur] == '$' and text[cur + 1] in _escaped_chars: retval += text[start:cur] retval += text[cur + 1] cur += 2 start = cur elif text[cur] == '$' and _isnmtoken(text[cur + 1]): end = cur + 1 while end < len(text): if not _isnmtoken(text[end]): break end += 1 if end == len(text): retval += text[start:end] start = cur = end elif text[end] == ';': retval += text[start:cur] start = cur entname = text[cur + 1:end] entval = self.lookup_entity(entname) if entval is not None: parser = AttributeParser(self) retval += parser.parse_value(entval) else: raise SyntaxError('Unrecognized entity: ' + entname, self) start = cur = end + 1 else: cur = end else: cur += 1 else: if text[cur] == '\n': self.linenum += 1 cur += 1 if cur != start: retval += text[start:cur] return retval def parse_line(self, line): i = 0 while i < len(line) and not self.finished: if self._quote is not None: j = i while j < len(line): if line[j] == '$': # Will be parsed later. Just skip the escaped quote # char so it doesn't close the attribute value. if j + 1 < len(line) and line[j] in _escaped_chars: j += 2 else: j += 1 elif line[j] == self._quote: self._value += line[i:j] self._value = self.parse_value(self._value) self.attributes.add_attribute(self._attrname, self._value) self._value = '' self._quote = None i = j break else: j += 1 if self._quote is not None: self._value += line[i:j] i = j + 1 elif line[i].isspace(): if line[i] == '\n': self.linenum += 1 i += 1 elif line[i] == ']': self.finished = True self.remainder = line[i + 1:] elif line[i] in ('.', '#', '>'): j = i + 1 while j < len(line): if line[j].isspace() or line[j] == ']': break j += 1 word = self.parse_value(line[i + 1:j]) if line[i] == '>': if line[i + 1] == '>': self.attributes.add_attribute('href', word[1:]) else: self.attributes.add_attribute('xref', word) elif line[i] == '.': self.attributes.add_attribute('style', word) else: self.attributes.add_attribute('id', word) i = j else: j = i while j < len(line) and _isnmtoken(line[j]): j += 1 word = line[i:j] if line[j] == '=' and word != '': if line[j + 1] in ('"', "'"): self._quote = line[j + 1] self._value = '' i = j + 2 self._attrname = word else: k = j + 1 while k < len(line): if line[k].isspace() or line[k] == ']': break k += 1 value = self.parse_value(line[j + 1:k]) self.attributes.add_attribute(word, value) i = k elif line[j].isspace() or line[j] == ']': value = self.parse_value(line[i:j]) self.attributes.add_attribute('type', value) i = j else: raise SyntaxError('Invalid character ' + line[j] + ' in attribute list', self) class DirectiveIncludeParser: def __init__(self, parent): self.parent = parent self._start = True self._comment = False def parse_file(self, filename): self.filename = filename self.absfilename = os.path.join(os.path.dirname(self.parent.absfilename), filename) if isinstance(self.parent, DuckParser): self._parentfiles = [self.parent.absfilename, self.absfilename] else: self._parentfiles = self.parent._parentfiles + [self.absfilename] self.linenum = 0 try: fd = open(self.absfilename, encoding='utf-8') except: raise SyntaxError('Missing included file ' + filename, self.parent) for line in fd: self.parse_line(line) fd.close() def parse_line(self, line): self.linenum += 1 if self._comment: if line.strip() == '--]': self._comment = False return indent = _get_indent(line) iline = line[indent:] if iline.startswith('[-]'): return elif iline.startswith('[--'): self._comment = True return if line.strip() == '': return if not(line.startswith('@')): raise SyntaxError('Directive includes can only include directives', self) self._parse_line(line) def take_directive(self, directive): if directive.name.startswith('ducktype/'): if not self._start: raise SyntaxError('Ducktype declaration must be first', self) if directive.name != 'ducktype/1.0': raise SyntaxError( 'Unsupported ducktype version: ' + directive.name , self) for value in directive.content.split(): raise SyntaxError( 'Unsupported ducktype extension: ' + value, self) elif directive.name == 'define': try: self.parent.take_directive(directive) except SyntaxError as e: raise SyntaxError(e.message, self) elif directive.name == 'encoding': FIXME('encoding') elif directive.name == 'include': if ' ' in directive.content: raise SyntaxError('Multiple values in include. URL encode file name?', self) relfile = urllib.parse.unquote(directive.content) absfile = os.path.join(os.path.dirname(self.absfilename), relfile) if absfile in self._parentfiles: raise SyntaxError('Recursive include detected: ' + directive.content, self) incparser = DirectiveIncludeParser(self) incparser.parse_file(relfile) elif directive.name == 'namespace': try: self.parent.take_directive(directive) except SyntaxError as e: raise SyntaxError(e.message, self) else: raise SyntaxError('Unrecognized directive: ' + directive.name, self) self._start = False def _parse_line(self, line): directive = Directive.parse_line(line, self) self.take_directive(directive) class DuckParser: STATE_START = 1 STATE_TOP = 2 STATE_HEADER = 3 STATE_HEADER_POST = 4 STATE_SUBHEADER = 5 STATE_SUBHEADER_POST = 6 STATE_HEADER_ATTR = 7 STATE_HEADER_ATTR_POST = 8 STATE_HEADER_INFO = 9 STATE_BLOCK = 10 STATE_BLOCK_ATTR = 11 STATE_BLOCK_READY = 12 STATE_BLOCK_INFO = 13 INFO_STATE_NONE = 101 INFO_STATE_INFO = 102 INFO_STATE_READY = 103 INFO_STATE_BLOCK = 104 INFO_STATE_ATTR = 105 def __init__(self): self.state = DuckParser.STATE_START self.info_state = DuckParser.INFO_STATE_NONE self.linenum = 0 self.document = Document(parser=self) self.current = self.document self.curinfo = None self._value = '' self._attrparser = None self._defaultid = None self._comment = False self._fenced = False def lookup_entity(self, entity): cur = self.current while cur is not None: if entity in cur._definitions: return cur._definitions[entity] cur = cur.parent if entity in entities.entities: return entities.entities[entity] else: # Try to treat it as a hex numeric reference hexnum = 0 for c in entity: if c in '0123456789': hexnum = hexnum * 16 + (ord(c) - 48) elif c in 'abcdef': hexnum = hexnum * 16 + (ord(c) - 87) elif c in 'ABCDEF': hexnum = hexnum * 16 + (ord(c) - 55) else: hexnum = None break if hexnum is not None: return chr(hexnum) return None def parse_file(self, filename): self.filename = filename self.absfilename = os.path.abspath(filename) self._defaultid = os.path.basename(filename) if self._defaultid.endswith('.duck'): self._defaultid = self._defaultid[:-5] fd = open(filename, encoding='utf-8') for line in fd: self.parse_line(line) fd.close() def parse_line(self, line): self.linenum += 1 self._parse_line(line) def parse_inline(self, node=None): if node is None: node = self.document oldchildren = node.children node.children = [] if node.info is not None: self.parse_inline(node.info) for child in oldchildren: if isinstance(child, str): parser = InlineParser(self, linenum=node.linenum) for c in parser.parse_text(child): node.add_child(c) elif isinstance(child, Fence): node.add_child(child) else: self.parse_inline(child) node.add_child(child) def take_directive(self, directive): if directive.name.startswith('ducktype/'): if self.state != DuckParser.STATE_START: raise SyntaxError('Ducktype declaration must be first', self) if directive.name != 'ducktype/1.0': raise SyntaxError( 'Unsupported ducktype version: ' + directive.name , self) for value in directive.content.split(): raise SyntaxError( 'Unsupported ducktype extension: ' + value, self) elif directive.name == 'define': values = directive.content.split(maxsplit=1) if len(values) != 2: raise SyntaxError( 'Entity definition takes exactly two values', self) self.current.add_definition(*values) elif directive.name == 'encoding': FIXME('encoding') elif directive.name == 'include': if ' ' in directive.content: raise SyntaxError('Multiple values in include. URL encode file name?', self) relfile = urllib.parse.unquote(directive.content) incparser = DirectiveIncludeParser(self) incparser.parse_file(relfile) elif directive.name == 'namespace': values = directive.content.split(maxsplit=1) if len(values) != 2: raise SyntaxError( 'Namespace declaration takes exactly two values', self) if values[0] == 'xml': if values[1] != 'http://www.w3.org/XML/1998/namespace': raise SyntaxError('Wrong value of xml namespace prefix', self) self.current.add_namespace(*values) else: raise SyntaxError('Unrecognized directive: ' + directive.name, self) def finish(self): if (self.state in (DuckParser.STATE_HEADER_ATTR, DuckParser.STATE_BLOCK_ATTR) or self.info_state == DuckParser.INFO_STATE_ATTR): raise SyntaxError('Unterminated block declaration', self) self._push_value() if self._defaultid is not None: if self.document.attributes is None: self.document.attributes = Attributes() if 'id' not in self.document.attributes: self.document.attributes.add_attribute('id', self._defaultid) self.parse_inline() def _parse_line(self, line): if self._comment: if line.strip() == '--]': self._comment = False return if self._fenced: if line.strip() == ']]]': self._fenced = False self.current = self.current.parent else: self.current.add_line(line) return indent = _get_indent(line) iline = line[indent:] if iline.startswith('[-]'): return elif iline.startswith('[--'): self._comment = True return elif self.info_state == DuckParser.INFO_STATE_INFO: self._parse_line_info(line) elif self.info_state == DuckParser.INFO_STATE_READY: self._parse_line_info(line) elif self.info_state == DuckParser.INFO_STATE_BLOCK: self._parse_line_info(line) elif self.info_state == DuckParser.INFO_STATE_ATTR: self._parse_line_info_attr(line) elif self.state == DuckParser.STATE_START: self._parse_line_top(line) elif self.state == DuckParser.STATE_TOP: self._parse_line_top(line) elif self.state == DuckParser.STATE_HEADER: self._parse_line_header(line) elif self.state == DuckParser.STATE_HEADER_POST: self._parse_line_header_post(line) elif self.state == DuckParser.STATE_SUBHEADER: self._parse_line_subheader(line) elif self.state == DuckParser.STATE_SUBHEADER_POST: self._parse_line_subheader_post(line) elif self.state == DuckParser.STATE_HEADER_ATTR: self._parse_line_header_attr(line) elif self.state == DuckParser.STATE_HEADER_ATTR_POST: self._parse_line_header_attr_post(line) elif self.state == DuckParser.STATE_HEADER_INFO: self._parse_line_header_info(line) elif self.state == DuckParser.STATE_BLOCK: self._parse_line_block(line) elif self.state == DuckParser.STATE_BLOCK_ATTR: self._parse_line_block_attr(line) elif self.state == DuckParser.STATE_BLOCK_READY: self._parse_line_block_ready(line) else: FIXME('unknown state') def _parse_line_top(self, line): if line.strip() == '': self.state = DuckParser.STATE_TOP elif line.startswith('@'): self._parse_line_directive(line) elif line.startswith('= '): self.document.default_element = 'page' self._value = line[2:] node = Block('title', 0, 2, parser=self) self.current.add_child(node) self.current = node self.state = DuckParser.STATE_HEADER elif line.strip().startswith('[') or line.startswith('=='): self.state = DuckParser.STATE_BLOCK self._parse_line(line) else: raise SyntaxError('Missing page header', self) def _parse_line_directive(self, line): directive = Directive.parse_line(line, self) self.take_directive(directive) if self.state == DuckParser.STATE_START: self.state == DuckParser.STATE_TOP def _parse_line_header(self, line): indent = _get_indent(line) iline = line[indent:] if iline.startswith('@'): self._push_value() self.current = self.current.parent self.state = DuckParser.STATE_BLOCK self.info_state = DuckParser.INFO_STATE_INFO self._parse_line(line) elif indent > 0 and iline.startswith('['): self._parse_line_header_attr_start(line) elif indent >= self.current.inner: self._value += line[self.current.inner:] else: self._push_value() self.current = self.current.parent self.state = DuckParser.STATE_HEADER_POST self._parse_line(line) def _parse_line_header_post(self, line): if line.startswith(('-' * self.current.depth) + ' '): self._value = line[self.current.depth + 1:] node = Block('subtitle', 0, self.current.depth + 1, parser=self) self.current.add_child(node) self.current = node self.state = DuckParser.STATE_SUBHEADER elif line.lstrip().startswith('@'): self.state = DuckParser.STATE_BLOCK self.info_state = DuckParser.INFO_STATE_INFO self._parse_line(line) elif line.strip() == '': self.state = DuckParser.STATE_HEADER_INFO else: self.state = DuckParser.STATE_BLOCK self._parse_line(line) def _parse_line_subheader(self, line): indent = _get_indent(line) iline = line[indent:] if iline.startswith('@'): self._push_value() self.current = self.current.parent self.state = DuckParser.STATE_BLOCK self.info_state = DuckParser.INFO_STATE_INFO self._parse_line(line) elif indent > 0 and iline.startswith('['): self._parse_line_header_attr_start(line) elif indent >= self.current.inner: self._value += line[self.current.inner:] else: self._push_value() self.current = self.current.parent self.state = DuckParser.STATE_SUBHEADER_POST self._parse_line(line) def _parse_line_subheader_post(self, line): if line.lstrip().startswith('@'): self.state = DuckParser.STATE_BLOCK self.info_state = DuckParser.INFO_STATE_INFO self._parse_line(line) elif line.strip() == '': self.state = DuckParser.STATE_HEADER_INFO else: self.state = DuckParser.STATE_BLOCK self._parse_line(line) def _parse_line_header_attr_start(self, line): indent = _get_indent(line) if indent > 0 and line[indent:].startswith('['): self._push_value() self.current = self.current.parent self._attrparser = AttributeParser(self) self._attrparser.parse_line(line[indent + 1:]) if self._attrparser.finished: self.current.attributes = self._attrparser.attributes self.state = DuckParser.STATE_HEADER_ATTR_POST self._attrparser = None else: self.state = DuckParser.STATE_HEADER_ATTR else: self._push_value() self.current = self.current.parent self.state = DuckParser.STATE_HEADER_ATTR_POST self._parse_line(line) def _parse_line_header_attr(self, line): self._attrparser.parse_line(line) if self._attrparser.finished: self.current.attributes = self._attrparser.attributes self.state = DuckParser.STATE_HEADER_ATTR_POST self._attrparser = None def _parse_line_header_attr_post(self, line): if line.lstrip().startswith('@'): self.state = DuckParser.STATE_BLOCK self.info_state = DuckParser.INFO_STATE_INFO self._parse_line(line) else: self.state = DuckParser.STATE_BLOCK self._parse_line(line) def _parse_line_header_info(self, line): if line.lstrip().startswith('@'): self.state = DuckParser.STATE_BLOCK self.info_state = DuckParser.INFO_STATE_INFO self._parse_line(line) elif line.strip() == '': self.state = DuckParser.STATE_HEADER_INFO else: self.state = DuckParser.STATE_BLOCK self._parse_line(line) def _parse_line_info(self, line): if line.strip() == '': # If the info elements weren't indented past the indent # level of the parent and the parent is a block, blank # line terminates info, because it must terminate the # block according to block processing rules. if (self.current.outer == self.current.inner and not self.current.is_division): self._push_value() self.info_state = DuckParser.INFO_STATE_NONE self._parse_line(line) return # If we're inside a leaf element like a paragraph, break # out of that. Unless it's an indented verbatim element, # in which case the newline is just part of the content. if self.curinfo.is_leaf: if (self.curinfo.is_verbatim and self.curinfo.inner > self.curinfo.outer): self._value += '\n' else: self._push_value() self.curinfo = self.curinfo.parent self.info_state = DuckParser.INFO_STATE_INFO return indent = _get_indent(line) if self.current.info is None: self.current.info = Block('info', indent, indent, parser=self) self.current.info.parent = self.current self.curinfo = self.current.info if indent < self.current.info.outer: self._push_value() self.info_state = DuckParser.INFO_STATE_NONE self._parse_line(line) return iline = line[indent:] if iline.startswith('@'): self._parse_line_info_info(iline, indent) else: # Block content at the same (or less) indent level as the # info elements doesn't belong to info. It starts the body. if indent <= self.current.info.outer: self._push_value() self.info_state = DuckParser.INFO_STATE_NONE self._parse_line(line) return self._parse_line_info_block(iline, indent) def _parse_line_info_info(self, iline, indent): # Unlike block elements, info elements are never children of # preceding info elements at the same indent level. Unravel # as long as the current info's outer indent is the same. if indent <= self.curinfo.outer: self._push_value() while indent <= self.curinfo.outer: if self.curinfo == self.current.info: break self.curinfo = self.curinfo.parent # First line after an @info declaration? Set inner indent. if self.info_state == DuckParser.INFO_STATE_READY: self.curinfo.inner = indent self.info_state = DuckParser.INFO_STATE_INFO for j in range(1, len(iline)): if not _isnmtoken(iline[j]): break name = iline[1:j] node = Info(name, indent, parser=self) self.curinfo.add_child(node) self.curinfo = node if iline[j] == '[': self.info_state = DuckParser.INFO_STATE_ATTR self._attrparser = AttributeParser(self) self._parse_line_info_attr(iline[j + 1:]) else: self._value = iline[j:].lstrip() if self._value == '': self.info_state = DuckParser.INFO_STATE_READY def _parse_line_info_block(self, iline, indent): # If we're already inside a leaf element, we only break out # if the indent is less than the inner indent. For example: # @p # Inside of p if self.curinfo.is_leaf or self.curinfo.is_external: if indent < self.curinfo.inner: self._push_value() self.curinfo = self.curinfo.parent # If we're not in a leaf, we need to create an implicit # info paragraph, but only after breatking out to the # level of the outer indent. For example: # @foo # Not inside of foo, and in implicit p else: if indent <= self.curinfo.outer: self._push_value() while indent <= self.curinfo.outer: if self.curinfo == self.current.info: break self.curinfo = self.curinfo.parent node = Info('p', indent, parser=self) self.curinfo.add_child(node) self.curinfo = node # First line after an @info declaration? Set inner indent. if self.info_state == DuckParser.INFO_STATE_READY: self.curinfo.inner = indent self.info_state = DuckParser.INFO_STATE_BLOCK self.info_state = DuckParser.INFO_STATE_BLOCK self._value += iline def _parse_line_info_attr(self, line): self._attrparser.parse_line(line) if self._attrparser.finished: self.curinfo.attributes = self._attrparser.attributes self._value = self._attrparser.remainder.lstrip() self._attrparser = None if self._value == '': self.info_state = DuckParser.INFO_STATE_READY else: self.info_state = DuckParser.INFO_STATE_INFO def _parse_line_block(self, line): # Blank lines close off elements that have inline content (leaf) # unless they're verbatim elements that have an inner indent. Only # decreasing indent can break free of those. They also break out of # unindented block container elements, except for a set of special # elements that take lists of things instead of general blocks. if line.strip() == '': if self.current.is_leaf: if (self.current.is_verbatim and self.current.inner > self.current.outer): self._value += '\n' else: self._push_value() self.current = self.current.parent while self.current.inner == self.current.outer: if self.current.is_division: break if self.current.name in ('list', 'steps', 'terms', 'tree'): break if self.current.name in ('table', 'thead', 'tfoot', 'tbody', 'tr'): break if self.current.is_leaf: self._push_value() self.current = self.current.parent return sectd = 0 if line.startswith('=='): i = 0 while i < len(line) and line[i] == '=': i += 1 if i < len(line) and line[i] == ' ': sectd = i if sectd > 0: self._push_value() while not self.current.is_division: self.current = self.current.parent while self.current.depth >= sectd: self.current = self.current.parent if sectd != self.current.depth + 1: raise SyntaxError('Incorrect section depth', self) section = Block('section', parser=self) self.current.add_child(section) title = Block('title', 0, sectd + 1, parser=self) section.add_child(title) self.current = title self._value = line[sectd + 1:] self.state = DuckParser.STATE_HEADER return # If the indent is less than what we can append to the current # node, unravel until we're at the same indent level. Note that # this still might not be the right level. We may or may not be # able to add children to a block at the same indent, but we'll # handle that later, because it depends on stuff. indent = _get_indent(line) if indent < self.current.inner: self._push_value() while (not self.current.is_division) and self.current.inner > indent: self.current = self.current.parent if self.current.is_verbatim: iline = line[self.current.inner:] else: iline = line[indent:] if iline.startswith('[[['): self._push_value() node = Fence('_', indent, parser=self) if not (self.current.is_leaf or self.current.is_external or (self.current.is_tree_item and not self.current.has_tree_items)): if self.current.is_tree_item: while self.current.name in ('tree', 'item'): self.current = self.current.parent while (not self.current.is_division and ( not self.current.available and self.current.outer == indent)): self.current = self.current.parent pnode = Block('p', indent, parser=self) self.current.add_child(pnode) pnode.add_child(node) else: self.current.add_child(node) sline = iline.strip()[3:] if sline.endswith(']]]'): node.add_line(sline[:-3] + '\n') else: if sline.strip() != '': node.add_line(sline + '\n') self.current = node self._fenced = True elif iline.startswith('['): # Start a block with a standard block declaration. self._push_value() while (not self.current.is_division and ( self.current.is_leaf or self.current.outer > indent)): self.current = self.current.parent for j in range(1, len(iline)): if not _isnmtoken(iline[j]): break name = iline[1:j] # Now we unravel a bit more. We do not want current to be # at the same indent level, unless one of a number of special # case conditions is met. if self.current.is_tree_item: while self.current.name in ('tree', 'item'): self.current = self.current.parent while (not self.current.is_division and ( not self.current.available and self.current.outer == indent)): if name == 'item' and self.current.is_list: break if name in ('td', 'th') and self.current.name == 'tr': break if (name == 'tr' and self.current.name in ('table', 'thead', 'tfoot', 'tbody')): break if (name in ('thead', 'tfoot', 'tbody') and self.current.name == 'table'): break self.current = self.current.parent node = Block(name, indent, parser=self) self.current.add_child(node) self.current = node if iline[j] == ']': self.state = DuckParser.STATE_BLOCK_READY else: self._attrparser = AttributeParser(self) self._attrparser.parse_line(iline[j:]) if self._attrparser.finished: self.current.attributes = self._attrparser.attributes self.state = DuckParser.STATE_BLOCK_READY self._attrparser = None else: self.state = DuckParser.STATE_BLOCK_ATTR elif iline.startswith('. '): self._parse_line_block_title(iline, indent) elif iline.startswith('- '): self._parse_line_block_item_title(iline, indent) elif iline.startswith('* '): self._parse_line_block_item_content(iline, indent) elif not (self.current.is_leaf or self.current.is_external or (self.current.is_tree_item and not self.current.has_tree_items)): if self.current.is_tree_item: while self.current.name in ('tree', 'item'): self.current = self.current.parent while (not self.current.is_division and ( not self.current.available and self.current.outer == indent)): self.current = self.current.parent node = Block('p', indent, parser=self) self.current.add_child(node) self.current = node self._value += iline else: self._value += iline def _parse_line_block_title(self, iline, indent): self._push_value() while ((not self.current.is_division) and (self.current.is_leaf or self.current.outer > indent)): self.current = self.current.parent title = Block('title', indent, indent + 2, parser=self) self.current.add_child(title) self.current = title self._parse_line((' ' * self.current.inner) + iline[2:]) def _parse_line_block_item_title(self, iline, indent): self._push_value() while ((not self.current.is_division) and (self.current.is_leaf or self.current.outer > indent)): self.current = self.current.parent if self.current.name == 'tr': node = Block('th', indent, indent + 2, parser=self) self.current.add_child(node) self.current = node self._parse_line((' ' * node.inner) + iline[2:]) return if self.current.name != 'terms': node = Block('terms', indent, parser=self) self.current.add_child(node) self.current = node # By now we've unwound to the terms element. If the preceding # block was a title, then the last item will have only title # elements, and we just keep appending there. if (not self.current.is_empty and isinstance(self.current.children[-1], Block) and self.current.children[-1].name == 'item'): item = self.current.children[-1] if (not item.is_empty and isinstance(self.current.children[-1], Block) and item.children[-1].name == 'title'): self.current = item if self.current.name != 'item': item = Block('item', indent, indent + 2, parser=self) self.current.add_child(item) self.current = item title = Block('title', indent, indent + 2, parser=self) self.current.add_child(title) self.current = title self._parse_line((' ' * self.current.inner) + iline[2:]) def _parse_line_block_item_content(self, iline, indent): self._push_value() while ((not self.current.is_division) and (self.current.is_leaf or self.current.outer > indent)): if self.current.is_tree_item: break self.current = self.current.parent if self.current.name == 'tr': node = Block('td', indent, indent + 2, parser=self) self.current.add_child(node) self.current = node self._parse_line((' ' * node.inner) + iline[2:]) elif self.current.name == 'terms': # All the logic above will have unraveled us from the item # created by the title, so we have to step back into it. if self.current.is_empty or self.current.children[-1].name != 'item': raise SyntaxError('Missing item title in terms', self) self.current = self.current.children[-1] self._parse_line((' ' * self.current.inner) + iline[2:]) elif self.current.name == 'tree' or self.current.is_tree_item: item = Block('item', indent, indent + 2, parser=self) self.current.add_child(item) self.current = item self._parse_line((' ' * item.inner) + iline[2:]) elif self.current.name in ('list', 'steps'): item = Block('item', indent, indent + 2, parser=self) self.current.add_child(item) self.current = item self._parse_line((' ' * item.inner) + iline[2:]) else: node = Block('list', indent, parser=self) self.current.add_child(node) item = Block('item', indent, indent + 2, parser=self) node.add_child(item) self.current = item self._parse_line((' ' * item.inner) + iline[2:]) def _parse_line_block_attr(self, line): self._attrparser.parse_line(line) if self._attrparser.finished: self.current.attributes = self._attrparser.attributes self.state = DuckParser.STATE_BLOCK_READY self._attrparser = None def _parse_line_block_ready(self, line): indent = _get_indent(line) if indent < self.current.outer: while ((not self.current.is_division) and (self.current.outer > indent)): self.current = self.current.parent else: if line.lstrip().startswith('@'): self.info_state = DuckParser.INFO_STATE_INFO self.current.inner = _get_indent(line) self.state = DuckParser.STATE_BLOCK self._parse_line(line) def _push_value(self): if self._value != '': if self.info_state != DuckParser.INFO_STATE_NONE: self.curinfo.add_text(self._value) else: self.current.add_text(self._value) self._value = '' def _isnmtoken(c): i = ord(c) return (('A' <= c <= 'Z') or ('a' <= c <= 'z') or ('0' <= c <= '9') or (c == ':' or c == '_' or c == '-' or c == '.' or i == 0xB7) or (0xC0 <= i <= 0xD6) or (0xD8 <= i <= 0xF6) or (0xF8 <= i <= 0x2FF) or (0x370 <= i <= 0x37D) or (0x37F <= i <= 0x1FFF) or (0x200C <= i <= 0x200D) or (0x2070 <= i <= 0x218F) or (0x2C00 <= i <= 0x2FEF) or (0x3001 <= i <= 0xD7FF) or (0xF900 <= i <= 0xFDCF) or (0xFDF0 <= i <= 0xFFFD) or (0x10000 <= i <= 0xEFFFF) or (0x0300 <= i <= 0x036F) or (0x203F <= i <= 0x2040)) mallard-ducktype-0.4/setup.py000066400000000000000000000016721324725273200163460ustar00rootroot00000000000000from setuptools import setup setup( name='mallard-ducktype', version='0.4', description='Parse Ducktype files and convert them to Mallard.', packages=['mallard', 'mallard.ducktype'], scripts=['bin/ducktype'], author='Shaun McCance', author_email='shaunm@gnome.org', license='MIT', classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Console', 'Intended Audience :: Customer Service', 'Intended Audience :: Developers', 'Intended Audience :: Other Audience', 'Intended Audience :: System Administrators', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3 :: Only', 'Topic :: Documentation', 'Topic :: Software Development :: Documentation', 'Topic :: Text Processing :: Markup', 'Topic :: Text Processing :: Markup :: XML', 'License :: OSI Approved :: MIT License', ], ) mallard-ducktype-0.4/tests/000077500000000000000000000000001324725273200157705ustar00rootroot00000000000000mallard-ducktype-0.4/tests/attr01.duck000066400000000000000000000001071324725273200177510ustar00rootroot00000000000000= Attribute Test [type="topic" style="hint1 hint2"] This is a test. mallard-ducktype-0.4/tests/attr01.page000066400000000000000000000003011324725273200177330ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr02.duck000066400000000000000000000000641324725273200177540ustar00rootroot00000000000000= Attribute Test [.hint1 .hint2] This is a test. mallard-ducktype-0.4/tests/attr02.page000066400000000000000000000002641324725273200177440ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr03.duck000066400000000000000000000001011324725273200177450ustar00rootroot00000000000000= Attribute Test [type="topic" style="hint1"] This is a test. mallard-ducktype-0.4/tests/attr03.page000066400000000000000000000002731324725273200177450ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr04.duck000066400000000000000000000001171324725273200177550ustar00rootroot00000000000000= Attribute Test [type="topic" #page1 style="hint1" .hint2] This is a test. mallard-ducktype-0.4/tests/attr04.page000066400000000000000000000003001324725273200177350ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr05.duck000066400000000000000000000001071324725273200177550ustar00rootroot00000000000000= Attribute Test [type=topic style=hint1 id=attr05] This is a test. mallard-ducktype-0.4/tests/attr05.page000066400000000000000000000002731324725273200177470ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr06.duck000066400000000000000000000000701324725273200177550ustar00rootroot00000000000000= Attribute Test [topic style=hint1] This is a test. mallard-ducktype-0.4/tests/attr06.page000066400000000000000000000002731324725273200177500ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr07.duck000066400000000000000000000000701324725273200177560ustar00rootroot00000000000000= Attribute Test [style=hint1 topic] This is a test. mallard-ducktype-0.4/tests/attr07.page000066400000000000000000000002731324725273200177510ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/attr08.duck000066400000000000000000000001001324725273200177510ustar00rootroot00000000000000= Attribute Test [style="hint1 hint2" topic] This is a test. mallard-ducktype-0.4/tests/attr08.page000066400000000000000000000003011324725273200177420ustar00rootroot00000000000000 Attribute Test

This is a test.

mallard-ducktype-0.4/tests/block01.duck000066400000000000000000000000621324725273200200710ustar00rootroot00000000000000= Block Test [note] This paragraph is in a note. mallard-ducktype-0.4/tests/block01.page000066400000000000000000000002741324725273200200640ustar00rootroot00000000000000 Block Test

This paragraph is in a note.

mallard-ducktype-0.4/tests/block02.duck000066400000000000000000000001401324725273200200670ustar00rootroot00000000000000= Block Test [note] [note] [note] This paragraph is in a note in a note in a note. mallard-ducktype-0.4/tests/block02.page000066400000000000000000000003721324725273200200640ustar00rootroot00000000000000 Block Test

This paragraph is in a note in a note in a note.

mallard-ducktype-0.4/tests/block03.duck000066400000000000000000000002421324725273200200730ustar00rootroot00000000000000= Block Test [note] [note] This paragraph is in a note in a note. This is still paragraph 1. This is still in the top note. This is still pargraph 2. mallard-ducktype-0.4/tests/block03.page000066400000000000000000000004741324725273200200700ustar00rootroot00000000000000 Block Test

This paragraph is in a note in a note. This is still paragraph 1.

This is still in the top note. This is still pargraph 2.

mallard-ducktype-0.4/tests/block04.duck000066400000000000000000000001731324725273200200770ustar00rootroot00000000000000= Block Test [note] [note] This paragraph is in a note in a note. This is a new paragraph in a note in a note. mallard-ducktype-0.4/tests/block04.page000066400000000000000000000004211324725273200200610ustar00rootroot00000000000000 Block Test

This paragraph is in a note in a note.

This is a new paragraph in a note in a note.

mallard-ducktype-0.4/tests/block05.duck000066400000000000000000000001611324725273200200750ustar00rootroot00000000000000= Block Test [note] This paragraph is in a note. There is a double line break above and below this line. mallard-ducktype-0.4/tests/block05.page000066400000000000000000000003751324725273200200720ustar00rootroot00000000000000 Block Test

This paragraph is in a note.

There is a double line break above and below this line.

mallard-ducktype-0.4/tests/block06.duck000066400000000000000000000001401324725273200200730ustar00rootroot00000000000000= Block Test [note] [note] This paragraph is in two notes. This paragraph breaks out of both. mallard-ducktype-0.4/tests/block06.page000066400000000000000000000003761324725273200200740ustar00rootroot00000000000000 Block Test

This paragraph is in two notes.

This paragraph breaks out of both.

mallard-ducktype-0.4/tests/block07.duck000066400000000000000000000001521324725273200200770ustar00rootroot00000000000000= Block Test [note] This is a paragraph in a note. [note] This is a paragraph in a note in a note. mallard-ducktype-0.4/tests/block07.page000066400000000000000000000004041324725273200200650ustar00rootroot00000000000000 Block Test

This is a paragraph in a note.

This is a paragraph in a note in a note.

mallard-ducktype-0.4/tests/block08.duck000066400000000000000000000002021324725273200200740ustar00rootroot00000000000000= Block Test [figure] [title] This is a figure title. [desc] This is a figure desc. This is a paragraph in a figure. mallard-ducktype-0.4/tests/block08.page000066400000000000000000000004231324725273200200670ustar00rootroot00000000000000 Block Test
This is a figure title. This is a figure desc.

This is a paragraph in a figure.

mallard-ducktype-0.4/tests/block09.duck000066400000000000000000000002231324725273200201000ustar00rootroot00000000000000= Block Test [figure] [title] This is a figure title. [desc] This is a figure desc. [note] This is a paragraph in a note in a figure. mallard-ducktype-0.4/tests/block09.page000066400000000000000000000004611324725273200200720ustar00rootroot00000000000000 Block Test
This is a figure title. This is a figure desc.

This is a paragraph in a note in a figure.

mallard-ducktype-0.4/tests/block10.duck000066400000000000000000000002011324725273200200640ustar00rootroot00000000000000= Block Test [figure] [title] This is a figure title. [desc] This is a figure desc. This is a paragraph in a figure. mallard-ducktype-0.4/tests/block10.page000066400000000000000000000004231324725273200200600ustar00rootroot00000000000000 Block Test
This is a figure title. This is a figure desc.

This is a paragraph in a figure.

mallard-ducktype-0.4/tests/block11.duck000066400000000000000000000000601324725273200200700ustar00rootroot00000000000000= Block Test [note style="tip"] This is a note mallard-ducktype-0.4/tests/block11.page000066400000000000000000000002721324725273200200630ustar00rootroot00000000000000 Block Test

This is a note

mallard-ducktype-0.4/tests/block12.duck000066400000000000000000000000521324725273200200720ustar00rootroot00000000000000= Block Test [note .tip ] This is a note mallard-ducktype-0.4/tests/block12.page000066400000000000000000000002721324725273200200640ustar00rootroot00000000000000 Block Test

This is a note

mallard-ducktype-0.4/tests/block13.duck000066400000000000000000000001151324725273200200730ustar00rootroot00000000000000= Block Test [note] [note] This is a note in a note. [note] This is a note. mallard-ducktype-0.4/tests/block13.page000066400000000000000000000003671324725273200200720ustar00rootroot00000000000000 Block Test

This is a note in a note.

This is a note.

mallard-ducktype-0.4/tests/block14.duck000066400000000000000000000001051324725273200200730ustar00rootroot00000000000000= Block Test [note] [p] This is in a note. This is not in a note. mallard-ducktype-0.4/tests/block14.page000066400000000000000000000003211324725273200200610ustar00rootroot00000000000000 Block Test

This is in a note.

This is not in a note.

mallard-ducktype-0.4/tests/block15.duck000066400000000000000000000000621324725273200200760ustar00rootroot00000000000000= Block Test [note] . Note Title This is a note. mallard-ducktype-0.4/tests/block15.page000066400000000000000000000003131324725273200200630ustar00rootroot00000000000000 Block Test Note Title

This is a note.

mallard-ducktype-0.4/tests/block16.duck000066400000000000000000000001361324725273200201010ustar00rootroot00000000000000= Block Test [note] . Note Title This is a note. [note] . Note Title This is a note. mallard-ducktype-0.4/tests/block16.page000066400000000000000000000004231324725273200200660ustar00rootroot00000000000000 Block Test Note Title

This is a note.

Note Title

This is a note.

mallard-ducktype-0.4/tests/block17.duck000066400000000000000000000001201324725273200200730ustar00rootroot00000000000000= Block Test [note] [media src="foo.png"] This paragraph is out of the note. mallard-ducktype-0.4/tests/block17.page000066400000000000000000000003321324725273200200660ustar00rootroot00000000000000 Block Test

This paragraph is out of the note.

mallard-ducktype-0.4/tests/block18.duck000066400000000000000000000001211324725273200200750ustar00rootroot00000000000000= Block Test [media src="foo.png"] This paragraph is not in the media element. mallard-ducktype-0.4/tests/block18.page000066400000000000000000000003211324725273200200650ustar00rootroot00000000000000 Block Test

This paragraph is not in the media element.

mallard-ducktype-0.4/tests/block19.duck000066400000000000000000000001241324725273200201010ustar00rootroot00000000000000= Block Test [links section] [links topic groups="#first"] . First [links topic] mallard-ducktype-0.4/tests/block19.page000066400000000000000000000003741324725273200200760ustar00rootroot00000000000000 Block Test First mallard-ducktype-0.4/tests/block20.duck000066400000000000000000000004011324725273200200670ustar00rootroot00000000000000@namespace tt http://www.w3.org/ns/ttml = Block Test This tests leaf nodes in other namespaces. [media video src=video.mp4] [tt:tt] [tt:body] [tt:div begin="1s" end="3s"] [tt:p] This should not have a Mallard p element added. mallard-ducktype-0.4/tests/block20.page000066400000000000000000000006561324725273200200710ustar00rootroot00000000000000 Block Test

This tests leaf nodes in other namespaces.

This should not have a Mallard p element added.
mallard-ducktype-0.4/tests/block21.duck000066400000000000000000000002621324725273200200750ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ = Block Test This tests leaf nodes in other namespaces. [if:if test=target:html] This should have a Mallard p element added. mallard-ducktype-0.4/tests/block21.page000066400000000000000000000005001324725273200200560ustar00rootroot00000000000000 Block Test

This tests leaf nodes in other namespaces.

This should have a Mallard p element added.

mallard-ducktype-0.4/tests/block22.duck000066400000000000000000000002411324725273200200730ustar00rootroot00000000000000@namespace mal http://projectmallard.org/1.0/ = Block Test This tests leaf nodes in other namespaces. [mal:div] This should have a Mallard p element added. mallard-ducktype-0.4/tests/block22.page000066400000000000000000000004571324725273200200720ustar00rootroot00000000000000 Block Test

This tests leaf nodes in other namespaces.

This should have a Mallard p element added.

mallard-ducktype-0.4/tests/block23.duck000066400000000000000000000002501324725273200200740ustar00rootroot00000000000000@namespace mal http://projectmallard.org/1.0/ = Block Test This tests leaf nodes in other namespaces. [mal:screen] This should not have a Mallard p element added. mallard-ducktype-0.4/tests/block23.page000066400000000000000000000004551324725273200200710ustar00rootroot00000000000000 Block Test

This tests leaf nodes in other namespaces.

This should not have a Mallard p element added.
mallard-ducktype-0.4/tests/block24.duck000066400000000000000000000003041324725273200200750ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ = Block Test This tests leaf nodes in other namespaces. [if:choose] [if:when test=target:html] This should have a Mallard p element added. mallard-ducktype-0.4/tests/block24.page000066400000000000000000000005421324725273200200670ustar00rootroot00000000000000 Block Test

This tests leaf nodes in other namespaces.

This should have a Mallard p element added.

mallard-ducktype-0.4/tests/comment01.duck000066400000000000000000000001461324725273200204440ustar00rootroot00000000000000= Comment Test This is a paragraph. [-- This is commented out. --] This is still the first paragraph. mallard-ducktype-0.4/tests/comment01.page000066400000000000000000000003121324725273200204250ustar00rootroot00000000000000 Comment Test

This is a paragraph. This is still the first paragraph.

mallard-ducktype-0.4/tests/comment02.duck000066400000000000000000000001761324725273200204500ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-- This is commented out. --] This is still the first paragraph in the note. mallard-ducktype-0.4/tests/comment02.page000066400000000000000000000003511324725273200204310ustar00rootroot00000000000000 Comment Test

This is in the note. This is still the first paragraph in the note.

mallard-ducktype-0.4/tests/comment03.duck000066400000000000000000000002101324725273200204360ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-- This is commented out. --] This is still the first paragraph in the note. mallard-ducktype-0.4/tests/comment03.page000066400000000000000000000003511324725273200204320ustar00rootroot00000000000000 Comment Test

This is in the note. This is still the first paragraph in the note.

mallard-ducktype-0.4/tests/comment04.duck000066400000000000000000000001731324725273200204470ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-- This is commented out. --] This is a new paragraph in the note. mallard-ducktype-0.4/tests/comment04.page000066400000000000000000000003461324725273200204370ustar00rootroot00000000000000 Comment Test

This is in the note.

This is a new paragraph in the note.

mallard-ducktype-0.4/tests/comment05.duck000066400000000000000000000002631324725273200204500ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-] This is commented out. This is a new paragraph in the note. [-] This is commented out. This is still in that paragraph. mallard-ducktype-0.4/tests/comment05.page000066400000000000000000000004111324725273200204310ustar00rootroot00000000000000 Comment Test

This is in the note.

This is a new paragraph in the note. This is still in that paragraph.

mallard-ducktype-0.4/tests/comment06.duck000066400000000000000000000001671324725273200204540ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-- This is commented out. --] This is a new paragraph in the note. mallard-ducktype-0.4/tests/comment06.page000066400000000000000000000003461324725273200204410ustar00rootroot00000000000000 Comment Test

This is in the note.

This is a new paragraph in the note.

mallard-ducktype-0.4/tests/comment07.duck000066400000000000000000000002541324725273200204520ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-- This is commented out. This is still commented out. --] This did not end the comment. This is still commented out. mallard-ducktype-0.4/tests/comment07.page000066400000000000000000000002701324725273200204360ustar00rootroot00000000000000 Comment Test

This is in the note.

mallard-ducktype-0.4/tests/comment08.duck000066400000000000000000000003251324725273200204520ustar00rootroot00000000000000= Comment Test [note] This is in the note. [-- This is commented out. [-] This doesn't affect the block comment. [-] This doesn't affect the block comment. --] This is a new paragraph in the note. mallard-ducktype-0.4/tests/comment08.page000066400000000000000000000003461324725273200204430ustar00rootroot00000000000000 Comment Test

This is in the note.

This is a new paragraph in the note.

mallard-ducktype-0.4/tests/comment09.duck000066400000000000000000000002221324725273200204470ustar00rootroot00000000000000@ducktype/1.0 [-] A comment @namespace if http://projectmallard.org/if/1.0/ = Comment Test [if:if test=target:html] This is a test of comments. mallard-ducktype-0.4/tests/comment09.page000066400000000000000000000004011324725273200204340ustar00rootroot00000000000000 Comment Test

This is a test of comments.

mallard-ducktype-0.4/tests/comment10.duck000066400000000000000000000002261324725273200204430ustar00rootroot00000000000000@ducktype/1.0 [-- A comment --] @namespace if http://projectmallard.org/if/1.0/ = Comment Test [if:if test=target:html] This is a test of comments. mallard-ducktype-0.4/tests/comment10.page000066400000000000000000000004011324725273200204240ustar00rootroot00000000000000 Comment Test

This is a test of comments.

mallard-ducktype-0.4/tests/comment11-1.txt000066400000000000000000000001021324725273200204640ustar00rootroot00000000000000[-- A comment --] @namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/comment11.duck000066400000000000000000000001551324725273200204450ustar00rootroot00000000000000@ducktype/1.0 @include comment11-1.txt = Comment Test [if:if test=target:html] This is a test of comments. mallard-ducktype-0.4/tests/comment11.page000066400000000000000000000004011324725273200204250ustar00rootroot00000000000000 Comment Test

This is a test of comments.

mallard-ducktype-0.4/tests/comment12-1.txt000066400000000000000000000000761324725273200204770ustar00rootroot00000000000000[-] A comment @namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/comment12.duck000066400000000000000000000001551324725273200204460ustar00rootroot00000000000000@ducktype/1.0 @include comment12-1.txt = Comment Test [if:if test=target:html] This is a test of comments. mallard-ducktype-0.4/tests/comment12.page000066400000000000000000000004011324725273200204260ustar00rootroot00000000000000 Comment Test

This is a test of comments.

mallard-ducktype-0.4/tests/definition01.duck000066400000000000000000000001151324725273200211260ustar00rootroot00000000000000@ducktype/1.0 @define foo bar = Definition Test This should be bar: $foo;. mallard-ducktype-0.4/tests/definition01.page000066400000000000000000000002601324725273200211150ustar00rootroot00000000000000 Definition Test

This should be bar: bar.

mallard-ducktype-0.4/tests/definition02.duck000066400000000000000000000001711324725273200211310ustar00rootroot00000000000000@ducktype/1.0 @define foo1 bar$000a; @define foo2 baz$000a; = Definition Test This should be bar\nbaz\n: $foo1;$foo2;. mallard-ducktype-0.4/tests/definition02.page000066400000000000000000000002761324725273200211250ustar00rootroot00000000000000 Definition Test

This should be bar\nbaz\n: bar baz .

mallard-ducktype-0.4/tests/definition03.duck000066400000000000000000000002001324725273200211230ustar00rootroot00000000000000@ducktype/1.0 @define foo1 bar$000a; @define foo2 baz$000a; = Definition Test [code] This should be bar\nbaz\n: $foo1;$foo2;. mallard-ducktype-0.4/tests/definition03.page000066400000000000000000000003021324725273200211140ustar00rootroot00000000000000 Definition Test This should be bar\nbaz\n: bar baz . mallard-ducktype-0.4/tests/definition04.duck000066400000000000000000000001671324725273200211400ustar00rootroot00000000000000@ducktype/1.0 @define hello hello $world; @define world world = Definition Test This should be hello world: $hello;. mallard-ducktype-0.4/tests/definition04.page000066400000000000000000000003001324725273200211130ustar00rootroot00000000000000 Definition Test

This should be hello world: hello world.

mallard-ducktype-0.4/tests/definition05.duck000066400000000000000000000001611324725273200211330ustar00rootroot00000000000000@ducktype/1.0 @define hello hello @define hi $hello; world = Definition Test This should be hello world: $hi;. mallard-ducktype-0.4/tests/definition05.page000066400000000000000000000003001324725273200211140ustar00rootroot00000000000000 Definition Test

This should be hello world: hello world.

mallard-ducktype-0.4/tests/definition06.duck000066400000000000000000000004101324725273200211310ustar00rootroot00000000000000@ducktype/1.0 @define foo bar = Definition Test The style attribute should be $em[style="$foo;"](bar). The style attribute should be $em[style='$foo;'](bar). The style attribute should be $em[style=$foo;](bar). The style attribute should be $em[.$foo;](bar). mallard-ducktype-0.4/tests/definition06.page000066400000000000000000000006171324725273200211300ustar00rootroot00000000000000 Definition Test

The style attribute should be bar.

The style attribute should be bar.

The style attribute should be bar.

The style attribute should be bar.

mallard-ducktype-0.4/tests/definition07.duck000066400000000000000000000004671324725273200211460ustar00rootroot00000000000000@ducktype/1.0 @define foo $fe; $fi; @define fe fo @define fi fum = Definition Test The style attribute should be $em[style="$foo;"](fo fum). The style attribute should be $em[style='$foo;'](fo fum). The style attribute should be $em[style=$foo;](fo fum). The style attribute should be $em[.$foo;](fo fum). mallard-ducktype-0.4/tests/definition07.page000066400000000000000000000006471324725273200211340ustar00rootroot00000000000000 Definition Test

The style attribute should be fo fum.

The style attribute should be fo fum.

The style attribute should be fo fum.

The style attribute should be fo fum.

mallard-ducktype-0.4/tests/definition08.duck000066400000000000000000000004431324725273200211410ustar00rootroot00000000000000@ducktype/1.0 @define fi $fo; @define fe $fi; @define fo fum = Definition Test The style attribute should be $em[style="$fe;"](fum). The style attribute should be $em[style='$fe;'](fum). The style attribute should be $em[style=$fe;](fum). The style attribute should be $em[.$fe;](fum). mallard-ducktype-0.4/tests/definition08.page000066400000000000000000000006171324725273200211320ustar00rootroot00000000000000 Definition Test

The style attribute should be fum.

The style attribute should be fum.

The style attribute should be fum.

The style attribute should be fum.

mallard-ducktype-0.4/tests/definition09.duck000066400000000000000000000001721324725273200211410ustar00rootroot00000000000000@ducktype/1.0 @define mallard http://projectmallard.org/ = Definition Test Read more about $link[>>$mallard;](Mallard). mallard-ducktype-0.4/tests/definition09.page000066400000000000000000000003371324725273200211320ustar00rootroot00000000000000 Definition Test

Read more about Mallard.

mallard-ducktype-0.4/tests/definition10.duck000066400000000000000000000001141324725273200211250ustar00rootroot00000000000000@ducktype/1.0 @define b strong = Definition Test This is $em[.$b;](bold). mallard-ducktype-0.4/tests/definition10.page000066400000000000000000000002751324725273200211230ustar00rootroot00000000000000 Definition Test

This is bold.

mallard-ducktype-0.4/tests/directive01.duck000066400000000000000000000000771324725273200207630ustar00rootroot00000000000000@ducktype/1.0 = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive01.page000066400000000000000000000002631324725273200207460ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive02.duck000066400000000000000000000001571324725273200207630ustar00rootroot00000000000000@ducktype/1.0 @namespace if http://projectmallard.org/if/1.0/ = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive02.page000066400000000000000000000003401324725273200207430ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive03-1.txt000066400000000000000000000000601324725273200210040ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/directive03.duck000066400000000000000000000001631324725273200207610ustar00rootroot00000000000000@ducktype/1.0 @include directive03-1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive03.page000066400000000000000000000004071324725273200207500ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive04.duck000066400000000000000000000001251324725273200207600ustar00rootroot00000000000000@ducktype/1.0 @wrong directive name = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive04.error000066400000000000000000000000621324725273200211630ustar00rootroot00000000000000directive04.duck:2: Unrecognized directive: wrong mallard-ducktype-0.4/tests/directive05-1.txt000066400000000000000000000001061324725273200210070ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ @wrong directive name mallard-ducktype-0.4/tests/directive05.duck000066400000000000000000000001631324725273200207630ustar00rootroot00000000000000@ducktype/1.0 @include directive05-1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive05.error000066400000000000000000000000631324725273200211650ustar00rootroot00000000000000directive05-1.txt:2: Unrecognized directive: wrong mallard-ducktype-0.4/tests/directive06-1.txt000066400000000000000000000001461324725273200210140ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ @namespace e http://projectmallard.org/experimental/ mallard-ducktype-0.4/tests/directive06.duck000066400000000000000000000001721324725273200207640ustar00rootroot00000000000000@ducktype/1.0 @include directive06-1.txt = Directive Test [if:if test=target:html] This is a test of $e:hi(directives). mallard-ducktype-0.4/tests/directive06.page000066400000000000000000000005061324725273200207530ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive07-1.txt000066400000000000000000000000431324725273200210110ustar00rootroot00000000000000@define directives $em(directives) mallard-ducktype-0.4/tests/directive07.duck000066400000000000000000000001341324725273200207630ustar00rootroot00000000000000@ducktype/1.0 @include directive07-1.txt = Directive Test This is a test of $directives;. mallard-ducktype-0.4/tests/directive07.page000066400000000000000000000002741324725273200207560ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive08-1.txt000066400000000000000000000000331324725273200210110ustar00rootroot00000000000000@include directive08-2.txt mallard-ducktype-0.4/tests/directive08-2.txt000066400000000000000000000000431324725273200210130ustar00rootroot00000000000000@define directives $em(directives) mallard-ducktype-0.4/tests/directive08.duck000066400000000000000000000001341324725273200207640ustar00rootroot00000000000000@ducktype/1.0 @include directive08-1.txt = Directive Test This is a test of $directives;. mallard-ducktype-0.4/tests/directive08.page000066400000000000000000000002741324725273200207570ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive09-1.txt000066400000000000000000000000331324725273200210120ustar00rootroot00000000000000@include directive09-1.txt mallard-ducktype-0.4/tests/directive09.duck000066400000000000000000000001141324725273200207630ustar00rootroot00000000000000@include directive09-1.txt = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive09.error000066400000000000000000000001031324725273200211640ustar00rootroot00000000000000directive09-1.txt:1: Recursive include detected: directive09-1.txt mallard-ducktype-0.4/tests/directive10-1.txt000066400000000000000000000000331324725273200210020ustar00rootroot00000000000000@include directive10-2.txt mallard-ducktype-0.4/tests/directive10-2.txt000066400000000000000000000000331324725273200210030ustar00rootroot00000000000000@include directive10-1.txt mallard-ducktype-0.4/tests/directive10.duck000066400000000000000000000001141324725273200207530ustar00rootroot00000000000000@include directive10-1.txt = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive10.error000066400000000000000000000001031324725273200211540ustar00rootroot00000000000000directive10-2.txt:1: Recursive include detected: directive10-1.txt mallard-ducktype-0.4/tests/directive11-1.txt000066400000000000000000000000141324725273200210020ustar00rootroot00000000000000@define foo mallard-ducktype-0.4/tests/directive11.duck000066400000000000000000000001141324725273200207540ustar00rootroot00000000000000@include directive11-1.txt = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive11.error000066400000000000000000000001001324725273200211520ustar00rootroot00000000000000directive11-1.txt:1: Entity definition takes exactly two values mallard-ducktype-0.4/tests/directive12-1.txt000066400000000000000000000000171324725273200210060ustar00rootroot00000000000000@namespace foo mallard-ducktype-0.4/tests/directive12.duck000066400000000000000000000001141324725273200207550ustar00rootroot00000000000000@include directive12-1.txt = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive12.error000066400000000000000000000001041324725273200211570ustar00rootroot00000000000000directive12-1.txt:1: Namespace declaration takes exactly two values mallard-ducktype-0.4/tests/directive13-1.txt000066400000000000000000000001501324725273200210050ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ [wrong] Directive includes can include only directives mallard-ducktype-0.4/tests/directive13.duck000066400000000000000000000001141324725273200207560ustar00rootroot00000000000000@include directive13-1.txt = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/directive13.error000066400000000000000000000001041324725273200211600ustar00rootroot00000000000000directive13-1.txt:3: Directive includes can only include directives mallard-ducktype-0.4/tests/directive14-1.txt000066400000000000000000000000771324725273200210160ustar00rootroot00000000000000@ducktype/1.0 @namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/directive14.duck000066400000000000000000000001451324725273200207630ustar00rootroot00000000000000@include directive14-1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive14.page000066400000000000000000000004071324725273200207520ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive15-1.txt000066400000000000000000000000771324725273200210170ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ @ducktype/1.0 mallard-ducktype-0.4/tests/directive15.duck000066400000000000000000000001451324725273200207640ustar00rootroot00000000000000@include directive15-1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive15.error000066400000000000000000000000701324725273200211640ustar00rootroot00000000000000directive15-1.txt:3: Ducktype declaration must be first mallard-ducktype-0.4/tests/directive16-1.txt000066400000000000000000000000761324725273200210170ustar00rootroot00000000000000@ducktype/1.1 @namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/directive16.duck000066400000000000000000000001451324725273200207650ustar00rootroot00000000000000@include directive16-1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive16.error000066400000000000000000000001001324725273200211570ustar00rootroot00000000000000directive16-1.txt:1: Unsupported ducktype version: ducktype/1.1 mallard-ducktype-0.4/tests/directive17-1.txt000066400000000000000000000001061324725273200210120ustar00rootroot00000000000000@ducktype/1.0 foo/1.0 @namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/directive17.duck000066400000000000000000000001451324725273200207660ustar00rootroot00000000000000@include directive17-1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive17.error000066400000000000000000000000751324725273200211730ustar00rootroot00000000000000directive17-1.txt:1: Unsupported ducktype extension: foo/1.0 mallard-ducktype-0.4/tests/directive18 1.txt000066400000000000000000000000601324725273200207750ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/directive18.duck000066400000000000000000000001471324725273200207710ustar00rootroot00000000000000@include directive18%201.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive18.page000066400000000000000000000004071324725273200207560ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive19 1.txt000066400000000000000000000000351324725273200210000ustar00rootroot00000000000000@include directive19%202.txt mallard-ducktype-0.4/tests/directive19 2.txt000066400000000000000000000000601324725273200207770ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ mallard-ducktype-0.4/tests/directive19.duck000066400000000000000000000001471324725273200207720ustar00rootroot00000000000000@include directive19%201.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive19.page000066400000000000000000000004071324725273200207570ustar00rootroot00000000000000 Directive Test

This is a test of directives.

mallard-ducktype-0.4/tests/directive20.duck000066400000000000000000000001451324725273200207600ustar00rootroot00000000000000@include directive20 1.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive20.error000066400000000000000000000001061324725273200211600ustar00rootroot00000000000000directive20.duck:1: Multiple values in include. URL encode file name? mallard-ducktype-0.4/tests/directive21 1.txt000066400000000000000000000000331324725273200207670ustar00rootroot00000000000000@include directive21 2.txt mallard-ducktype-0.4/tests/directive21.duck000066400000000000000000000001471324725273200207630ustar00rootroot00000000000000@include directive21%201.txt = Directive Test [if:if test=target:html] This is a test of directives. mallard-ducktype-0.4/tests/directive21.error000066400000000000000000000001071324725273200211620ustar00rootroot00000000000000directive21 1.txt:1: Multiple values in include. URL encode file name? mallard-ducktype-0.4/tests/error01.duck000066400000000000000000000000241324725273200201260ustar00rootroot00000000000000= Error Test [code mallard-ducktype-0.4/tests/error01.error000066400000000000000000000000571324725273200203370ustar00rootroot00000000000000error01.duck:3: Unterminated block declaration mallard-ducktype-0.4/tests/error02.duck000066400000000000000000000001141324725273200201270ustar00rootroot00000000000000= Error Test [code Somebody forgot to close the $code(code) element above. mallard-ducktype-0.4/tests/error02.error000066400000000000000000000000661324725273200203400ustar00rootroot00000000000000error02.duck:4: Invalid character $ in attribute list mallard-ducktype-0.4/tests/error03.duck000066400000000000000000000001331324725273200201310ustar00rootroot00000000000000= Error Test [listing [code] Somebody forgot to close the $code(listing) element above. mallard-ducktype-0.4/tests/error03.error000066400000000000000000000000661324725273200203410ustar00rootroot00000000000000error03.duck:4: Invalid character [ in attribute list mallard-ducktype-0.4/tests/error04.duck000066400000000000000000000000351324725273200201330ustar00rootroot00000000000000= Error Test [listing =foo] mallard-ducktype-0.4/tests/error04.error000066400000000000000000000000661324725273200203420ustar00rootroot00000000000000error04.duck:3: Invalid character = in attribute list mallard-ducktype-0.4/tests/error05.duck000066400000000000000000000000651324725273200201370ustar00rootroot00000000000000= Error Test This is a test of an $unknown; entity. mallard-ducktype-0.4/tests/error05.error000066400000000000000000000000551324725273200203410ustar00rootroot00000000000000error05.duck:3: Unrecognized entity: unknown mallard-ducktype-0.4/tests/error06.duck000066400000000000000000000001361324725273200201370ustar00rootroot00000000000000= Error Test This is another test of an $unknown; entity, but not on the first or last line. mallard-ducktype-0.4/tests/error06.error000066400000000000000000000000551324725273200203420ustar00rootroot00000000000000error06.duck:4: Unrecognized entity: unknown mallard-ducktype-0.4/tests/error07.duck000066400000000000000000000002161324725273200201370ustar00rootroot00000000000000= Error Test This is another test with $em[.bold .strong style="bold and strong"](an $unknown; entity) after some line breaks in attributes. mallard-ducktype-0.4/tests/error07.error000066400000000000000000000000551324725273200203430ustar00rootroot00000000000000error07.duck:6: Unrecognized entity: unknown mallard-ducktype-0.4/tests/error08.duck000066400000000000000000000001031324725273200201330ustar00rootroot00000000000000= Error Test This is a test of an $em[style="$unknown;"](entity). mallard-ducktype-0.4/tests/error08.error000066400000000000000000000000551324725273200203440ustar00rootroot00000000000000error08.duck:3: Unrecognized entity: unknown mallard-ducktype-0.4/tests/error09.duck000066400000000000000000000001211324725273200201340ustar00rootroot00000000000000= Error Test This is a test of an $em[.bold style="strong $unknown;" ](entity). mallard-ducktype-0.4/tests/error09.error000066400000000000000000000000551324725273200203450ustar00rootroot00000000000000error09.duck:5: Unrecognized entity: unknown mallard-ducktype-0.4/tests/error10.duck000066400000000000000000000000611324725273200201270ustar00rootroot00000000000000-- Error Test This page doesn't start with a =. mallard-ducktype-0.4/tests/error10.error000066400000000000000000000000441324725273200203330ustar00rootroot00000000000000error10.duck:1: Missing page header mallard-ducktype-0.4/tests/error11.duck000066400000000000000000000000601324725273200201270ustar00rootroot00000000000000= Error Test == Section ==== This is too deep mallard-ducktype-0.4/tests/error11.error000066400000000000000000000000501324725273200203310ustar00rootroot00000000000000error11.duck:5: Incorrect section depth mallard-ducktype-0.4/tests/error12.duck000066400000000000000000000000361324725273200201330ustar00rootroot00000000000000= Error Test [terms] * Hello mallard-ducktype-0.4/tests/error12.error000066400000000000000000000000541324725273200203360ustar00rootroot00000000000000error12.duck:4: Missing item title in terms mallard-ducktype-0.4/tests/error13.duck000066400000000000000000000000641324725273200201350ustar00rootroot00000000000000@define foo bar @ducktype/1.0 = Error Test Hello mallard-ducktype-0.4/tests/error13.error000066400000000000000000000000631324725273200203370ustar00rootroot00000000000000error13.duck:3: Ducktype declaration must be first mallard-ducktype-0.4/tests/error14.duck000066400000000000000000000000441324725273200201340ustar00rootroot00000000000000 @ducktype/1.0 = Error Test Hello mallard-ducktype-0.4/tests/error14.error000066400000000000000000000000631324725273200203400ustar00rootroot00000000000000error14.duck:2: Ducktype declaration must be first mallard-ducktype-0.4/tests/error15.duck000066400000000000000000000000431324725273200201340ustar00rootroot00000000000000@ducktype/4.0 = Error Test Hello mallard-ducktype-0.4/tests/error15.error000066400000000000000000000000731324725273200203420ustar00rootroot00000000000000error15.duck:1: Unsupported ducktype version: ducktype/4.0 mallard-ducktype-0.4/tests/error16.duck000066400000000000000000000000641324725273200201400ustar00rootroot00000000000000@ducktype/1.0 badextension/0.1 = Error Test Hello mallard-ducktype-0.4/tests/error16.error000066400000000000000000000001011324725273200203330ustar00rootroot00000000000000error16.duck:1: Unsupported ducktype extension: badextension/0.1 mallard-ducktype-0.4/tests/error17.duck000066400000000000000000000000661324725273200201430ustar00rootroot00000000000000@ducktype/1.0 badextension="bar" = Error Test Hello mallard-ducktype-0.4/tests/error17.error000066400000000000000000000001031324725273200203360ustar00rootroot00000000000000error17.duck:1: Unsupported ducktype extension: badextension="bar" mallard-ducktype-0.4/tests/error18.duck000066400000000000000000000000641324725273200201420ustar00rootroot00000000000000@ducktype/1.0 badextension=bar = Error Test Hello mallard-ducktype-0.4/tests/error18.error000066400000000000000000000001011324725273200203350ustar00rootroot00000000000000error18.duck:1: Unsupported ducktype extension: badextension=bar mallard-ducktype-0.4/tests/error19.duck000066400000000000000000000001231324725273200201370ustar00rootroot00000000000000@ducktype/1.0 @namespace badvalue = Directive Test This is a test of directives. mallard-ducktype-0.4/tests/error19.error000066400000000000000000000000771324725273200203520ustar00rootroot00000000000000error19.duck:2: Namespace declaration takes exactly two values mallard-ducktype-0.4/tests/fenced01.duck000066400000000000000000000001441324725273200202240ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[ This is some code. This is some more code. ]]] mallard-ducktype-0.4/tests/fenced01.page000066400000000000000000000003421324725273200202120ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is some code. This is some more code.
mallard-ducktype-0.4/tests/fenced02.duck000066400000000000000000000001531324725273200202250ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[ [note] This is some code. This is some more code. ]]] mallard-ducktype-0.4/tests/fenced02.page000066400000000000000000000003511324725273200202130ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

[note] This is some code. This is some more code.
mallard-ducktype-0.4/tests/fenced03.duck000066400000000000000000000001721324725273200202270ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[

This is some code. This is some more code.

]]] mallard-ducktype-0.4/tests/fenced03.page000066400000000000000000000004041324725273200202130ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

<note> <p>This is some code. This is some more code.</p> </note>
mallard-ducktype-0.4/tests/fenced04.duck000066400000000000000000000001531324725273200202270ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[ This is some $code(code). This is some more code. ]]] mallard-ducktype-0.4/tests/fenced04.page000066400000000000000000000003511324725273200202150ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is some $code(code). This is some more code.
mallard-ducktype-0.4/tests/fenced05.duck000066400000000000000000000001571324725273200202340ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[This is some $code(code).]]] [[[This is some more code.]]] mallard-ducktype-0.4/tests/fenced05.page000066400000000000000000000003511324725273200202160ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is some $code(code). This is some more code.
mallard-ducktype-0.4/tests/fenced06.duck000066400000000000000000000003201324725273200202250ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] 1: This is some $var(code). [[[2: This is some $code(code).]]] $em(3: This is some $var(code).) [[[4: This is some $code(code).]]] 5: This is some $var(code). mallard-ducktype-0.4/tests/fenced06.page000066400000000000000000000005351324725273200202230ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

1: This is some code. 2: This is some $code(code). 3: This is some code. 4: This is some $code(code). 5: This is some code.
mallard-ducktype-0.4/tests/fenced07.duck000066400000000000000000000002041324725273200202270ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[

This is some code. This is some more code.

]]] mallard-ducktype-0.4/tests/fenced07.page000066400000000000000000000004041324725273200202170ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

<note> <p>This is some code. This is some more code.</p> </note>
mallard-ducktype-0.4/tests/fenced08.duck000066400000000000000000000002621324725273200202340ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[ This sets the indent strip level. This should be indented by 2. This is an anomoloy, but should be at column 0. ]]] mallard-ducktype-0.4/tests/fenced08.page000066400000000000000000000004511324725273200202220ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This sets the indent strip level. This should be indented by 2. This is an anomoloy, but should be at column 0.
mallard-ducktype-0.4/tests/fenced09.duck000066400000000000000000000002611324725273200202340ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[ This sets the indent strip level. This should be indented by 2. This is an anomoloy, but should be at column 0. ]]] mallard-ducktype-0.4/tests/fenced09.page000066400000000000000000000004511324725273200202230ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This sets the indent strip level. This should be indented by 2. This is an anomoloy, but should be at column 0.
mallard-ducktype-0.4/tests/fenced10.duck000066400000000000000000000001071324725273200202230ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [[[This gets a paragraph.]]] mallard-ducktype-0.4/tests/fenced10.page000066400000000000000000000003101324725273200202050ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This gets a paragraph.

mallard-ducktype-0.4/tests/fenced11.duck000066400000000000000000000001111324725273200202170ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [[[ This gets a paragraph. ]]] mallard-ducktype-0.4/tests/fenced11.page000066400000000000000000000003101324725273200202060ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This gets a paragraph.

mallard-ducktype-0.4/tests/fenced12.duck000066400000000000000000000001661324725273200202320ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [note] This is a paragraph in a note. [[[This is the same paragraph.]]] mallard-ducktype-0.4/tests/fenced12.page000066400000000000000000000004001324725273200202070ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is a paragraph in a note. This is the same paragraph.

mallard-ducktype-0.4/tests/fenced13.duck000066400000000000000000000002321324725273200202250ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [note] This is a paragraph in a note. [[[ This is the same paragraph. So is this, but without indent. ]]] mallard-ducktype-0.4/tests/fenced13.page000066400000000000000000000004401324725273200202140ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is a paragraph in a note. This is the same paragraph. So is this, but without indent.

mallard-ducktype-0.4/tests/fenced14.duck000066400000000000000000000003151324725273200202300ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [note] This is a paragraph in a note. [[[ This is the same paragraph. ]]] This is still in that paragraph. [[[This is a new paragraph in the note.]]] mallard-ducktype-0.4/tests/fenced14.page000066400000000000000000000005211324725273200202150ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is a paragraph in a note. This is the same paragraph. This is still in that paragraph.

This is a new paragraph in the note.

mallard-ducktype-0.4/tests/fenced15.duck000066400000000000000000000001431324725273200202300ustar00rootroot00000000000000= Fenced Test This tests fenced blocks. [code] [[[ This is code. The code has a line break. ]]] mallard-ducktype-0.4/tests/fenced15.page000066400000000000000000000003411324725273200202160ustar00rootroot00000000000000 Fenced Test

This tests fenced blocks.

This is code. The code has a line break.
mallard-ducktype-0.4/tests/fragment01.duck000066400000000000000000000000271324725273200206030ustar00rootroot00000000000000[note] This is a note. mallard-ducktype-0.4/tests/fragment01.page000066400000000000000000000001651324725273200205740ustar00rootroot00000000000000

This is a note.

mallard-ducktype-0.4/tests/fragment02.duck000066400000000000000000000000641324725273200206050ustar00rootroot00000000000000[note] This is a note. [note] This is another note. mallard-ducktype-0.4/tests/fragment02.page000066400000000000000000000002421324725273200205710ustar00rootroot00000000000000

This is a note.

This is another note.

mallard-ducktype-0.4/tests/fragment03.duck000066400000000000000000000000551324725273200206060ustar00rootroot00000000000000[note] This is a note. This is a paragraph. mallard-ducktype-0.4/tests/fragment03.page000066400000000000000000000002211324725273200205670ustar00rootroot00000000000000

This is a note.

This is a paragraph.

mallard-ducktype-0.4/tests/fragment04.duck000066400000000000000000000001671324725273200206130ustar00rootroot00000000000000[list] * This is a list item. * This is a second list item. [note] This is a note. * This is a third list item. mallard-ducktype-0.4/tests/fragment04.page000066400000000000000000000004441324725273200205770ustar00rootroot00000000000000

This is a list item.

This is a second list item.

This is a note.

This is a third list item.

mallard-ducktype-0.4/tests/fragment05.duck000066400000000000000000000001741324725273200206120ustar00rootroot00000000000000[note] This is a note. [example] This is an example in a note. * This is a list item in an example in a note. mallard-ducktype-0.4/tests/fragment05.page000066400000000000000000000004231324725273200205750ustar00rootroot00000000000000

This is a note.

This is an example in a note.

This is a list item in an example in a note.

mallard-ducktype-0.4/tests/fragment06.duck000066400000000000000000000000531324725273200206070ustar00rootroot00000000000000== Section Title This only has a section. mallard-ducktype-0.4/tests/fragment06.page000066400000000000000000000002421324725273200205750ustar00rootroot00000000000000
Section Title

This only has a section.

mallard-ducktype-0.4/tests/fragment07.duck000066400000000000000000000000761324725273200206150ustar00rootroot00000000000000== Section Title === First Subsection === Second Subsection mallard-ducktype-0.4/tests/fragment07.page000066400000000000000000000003641324725273200206030ustar00rootroot00000000000000
Section Title
First Subsection
Second Subsection
mallard-ducktype-0.4/tests/fragment08.duck000066400000000000000000000001271324725273200206130ustar00rootroot00000000000000== First Section This is a paragraph. == Seconed Section This is another paragraph. mallard-ducktype-0.4/tests/fragment08.page000066400000000000000000000003661324725273200206060ustar00rootroot00000000000000
First Section

This is a paragraph.

Seconed Section

This is another paragraph.

mallard-ducktype-0.4/tests/fragment09.duck000066400000000000000000000001471324725273200206160ustar00rootroot00000000000000== First Section This is a paragraph. === Subsection == Seconed Section This is another paragraph. mallard-ducktype-0.4/tests/fragment09.page000066400000000000000000000004511324725273200206020ustar00rootroot00000000000000
First Section

This is a paragraph.

Subsection
Seconed Section

This is another paragraph.

mallard-ducktype-0.4/tests/fragment10.duck000066400000000000000000000001421324725273200206010ustar00rootroot00000000000000@namespace if http://projectmallard.org/1.0/ [if:if test="target:html"] This is a conditional. mallard-ducktype-0.4/tests/fragment10.page000066400000000000000000000002731324725273200205740ustar00rootroot00000000000000

This is a conditional.

mallard-ducktype-0.4/tests/fragment11.duck000066400000000000000000000001051324725273200206010ustar00rootroot00000000000000 [note] This note is indented. [note] This note is not indented. mallard-ducktype-0.4/tests/fragment11.page000066400000000000000000000002561324725273200205760ustar00rootroot00000000000000

This note is indented.

This note is not indented.

mallard-ducktype-0.4/tests/fragment12.duck000066400000000000000000000002201324725273200206000ustar00rootroot00000000000000@namespace if http://projectmallard.org/1.0/ [if:if test="target:html"] This conditional is indented. [note] This note is not indented. mallard-ducktype-0.4/tests/fragment12.page000066400000000000000000000004361324725273200205770ustar00rootroot00000000000000

This conditional is indented.

This note is not indented.

mallard-ducktype-0.4/tests/fragment13.duck000066400000000000000000000000311324725273200206010ustar00rootroot00000000000000=== Subsection == Error mallard-ducktype-0.4/tests/fragment13.error000066400000000000000000000000531324725273200210100ustar00rootroot00000000000000fragment13.duck:1: Incorrect section depth mallard-ducktype-0.4/tests/info01.duck000066400000000000000000000001151324725273200177310ustar00rootroot00000000000000= Info Test @desc Test of info elements. This is a page with info elements. mallard-ducktype-0.4/tests/info01.page000066400000000000000000000003451324725273200177240ustar00rootroot00000000000000 Test of info elements. Info Test

This is a page with info elements.

mallard-ducktype-0.4/tests/info02.duck000066400000000000000000000001351324725273200177340ustar00rootroot00000000000000= Info Test - Info Subtitle @desc Test of info elements. This is a page with info elements. mallard-ducktype-0.4/tests/info02.page000066400000000000000000000004111324725273200177170ustar00rootroot00000000000000 Test of info elements. Info Test Info Subtitle

This is a page with info elements.

mallard-ducktype-0.4/tests/info03.duck000066400000000000000000000001501324725273200177320ustar00rootroot00000000000000= Info Test - Info Subtitle [.style] @desc Test of info elements. This is a page with info elements. mallard-ducktype-0.4/tests/info03.page000066400000000000000000000004271324725273200177270ustar00rootroot00000000000000 Test of info elements. Info Test Info Subtitle

This is a page with info elements.

mallard-ducktype-0.4/tests/info04.duck000066400000000000000000000001171324725273200177360ustar00rootroot00000000000000= Info Test @desc Test of info elements. This is a page with info elements. mallard-ducktype-0.4/tests/info04.page000066400000000000000000000003451324725273200177270ustar00rootroot00000000000000 Test of info elements. Info Test

This is a page with info elements.

mallard-ducktype-0.4/tests/info05.duck000066400000000000000000000001121324725273200177320ustar00rootroot00000000000000= Info Test @title[sort] A Sort Title This is a page with info elements. mallard-ducktype-0.4/tests/info05.page000066400000000000000000000003511324725273200177250ustar00rootroot00000000000000 A Sort Title Info Test

This is a page with info elements.

mallard-ducktype-0.4/tests/info06.duck000066400000000000000000000001441324725273200177400ustar00rootroot00000000000000= Info Test @title[sort] A Sort Title @title[text] A Text Title This is a page with info elements. mallard-ducktype-0.4/tests/info06.page000066400000000000000000000004231324725273200177260ustar00rootroot00000000000000 A Sort Title A Text Title Info Test

This is a page with info elements.

mallard-ducktype-0.4/tests/info07.duck000066400000000000000000000001501324725273200177360ustar00rootroot00000000000000= Info Test @title[sort] A Sort Title @title[text] A Text Title This is a page with info elements. mallard-ducktype-0.4/tests/info07.page000066400000000000000000000004251324725273200177310ustar00rootroot00000000000000 A Sort Title A Text Title Info Test

This is a page with info elements.

mallard-ducktype-0.4/tests/info08.duck000066400000000000000000000001371324725273200177440ustar00rootroot00000000000000= Info Test @title[link role=topic] A Topic Link Title This is a page with info elements. mallard-ducktype-0.4/tests/info08.page000066400000000000000000000003741324725273200177350ustar00rootroot00000000000000 A Topic Link Title Info Test

This is a page with info elements.

mallard-ducktype-0.4/tests/info09.duck000066400000000000000000000001121324725273200177360ustar00rootroot00000000000000= Info Test @license This is the license. This is still the license. mallard-ducktype-0.4/tests/info09.page000066400000000000000000000003611324725273200177320ustar00rootroot00000000000000

This is the license.

This is still the license.

Info Test
mallard-ducktype-0.4/tests/info10.duck000066400000000000000000000001541324725273200177340ustar00rootroot00000000000000= Info Test @license This is the license. This is still the license. This is not the license. mallard-ducktype-0.4/tests/info10.page000066400000000000000000000004221324725273200177200ustar00rootroot00000000000000

This is the license.

This is still the license.

Info Test

This is not the license.

mallard-ducktype-0.4/tests/info11.duck000066400000000000000000000004221324725273200177330ustar00rootroot00000000000000= Info Test @license This is the license. @screen This is verbatim text in a license. This is a new paragraph in a license. @code This is verbatim text in a license. This is still verbatim text in a license. This is not the license. mallard-ducktype-0.4/tests/info11.page000066400000000000000000000006641324725273200177310ustar00rootroot00000000000000

This is the license.

This is verbatim text in a license.

This is a new paragraph in a license.

This is verbatim text in a license. This is still verbatim text in a license.
Info Test

This is not the license.

mallard-ducktype-0.4/tests/info12.duck000066400000000000000000000002001324725273200177260ustar00rootroot00000000000000= Info Test @credit @name Shaun McCance @email shaunm@gnome.org @desc A page description This paragraph is not in the info. mallard-ducktype-0.4/tests/info12.page000066400000000000000000000004711324725273200177260ustar00rootroot00000000000000 Shaun McCance shaunm@gnome.org A page description Info Test

This paragraph is not in the info.

mallard-ducktype-0.4/tests/info13.duck000066400000000000000000000001361324725273200177370ustar00rootroot00000000000000= Info Test @desc A page description @Not part of the info, even if it does start with an @ mallard-ducktype-0.4/tests/info13.page000066400000000000000000000003651324725273200177310ustar00rootroot00000000000000 A page description Info Test

@Not part of the info, even if it does start with an @

mallard-ducktype-0.4/tests/info14.duck000066400000000000000000000002201324725273200177320ustar00rootroot00000000000000= Info Test @license This is the license. @media[src=foo.png] This is a new paragraph in a license. This is not the license. mallard-ducktype-0.4/tests/info14.page000066400000000000000000000004671324725273200177350ustar00rootroot00000000000000

This is the license.

This is a new paragraph in a license.

Info Test

This is not the license.

mallard-ducktype-0.4/tests/info15.duck000066400000000000000000000002521324725273200177400ustar00rootroot00000000000000= Info Test @license This is the license. @media[src=foo.svg] @media[src=foo.png] This is a new paragraph in a license. This is not the license. mallard-ducktype-0.4/tests/info15.page000066400000000000000000000005351324725273200177320ustar00rootroot00000000000000

This is the license.

This is a new paragraph in a license.

Info Test

This is not the license.

mallard-ducktype-0.4/tests/info16.duck000066400000000000000000000002501324725273200177370ustar00rootroot00000000000000= Info Test @license This is the license. @media[src=foo.svg] @media[src=foo.png] This is a new paragraph in a license. This is not the license. mallard-ducktype-0.4/tests/info16.page000066400000000000000000000005351324725273200177330ustar00rootroot00000000000000

This is the license.

This is a new paragraph in a license.

Info Test

This is not the license.

mallard-ducktype-0.4/tests/info17.duck000066400000000000000000000000761324725273200177460ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. mallard-ducktype-0.4/tests/info17.page000066400000000000000000000003561324725273200177350ustar00rootroot00000000000000 Info Test

This is the figure lincense.

mallard-ducktype-0.4/tests/info18.duck000066400000000000000000000001321324725273200177400ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. This is not in the figure. mallard-ducktype-0.4/tests/info18.page000066400000000000000000000004211324725273200177270ustar00rootroot00000000000000 Info Test

This is the figure lincense.

This is not in the figure.

mallard-ducktype-0.4/tests/info19.duck000066400000000000000000000001341324725273200177430ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. This is not in the figure. mallard-ducktype-0.4/tests/info19.page000066400000000000000000000004211324725273200177300ustar00rootroot00000000000000 Info Test

This is the figure lincense.

This is not in the figure.

mallard-ducktype-0.4/tests/info20.duck000066400000000000000000000002051324725273200177320ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. This is still in the figure license. This is in the figure. mallard-ducktype-0.4/tests/info20.page000066400000000000000000000004761324725273200177320ustar00rootroot00000000000000 Info Test

This is the figure lincense.

This is still in the figure license.

This is in the figure.

mallard-ducktype-0.4/tests/info21.duck000066400000000000000000000002071324725273200177350ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. This is still in the figure license. This is not in the figure. mallard-ducktype-0.4/tests/info21.page000066400000000000000000000005011324725273200177200ustar00rootroot00000000000000 Info Test

This is the figure lincense.

This is still in the figure license.

This is not in the figure.

mallard-ducktype-0.4/tests/info22.duck000066400000000000000000000002371324725273200177410ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. @screen This is a screen in a figure license. This is no longer in the screen. mallard-ducktype-0.4/tests/info22.page000066400000000000000000000005251324725273200177270ustar00rootroot00000000000000 Info Test

This is the figure lincense.

This is a screen in a figure license.

This is no longer in the screen.

mallard-ducktype-0.4/tests/info23.duck000066400000000000000000000002371324725273200177420ustar00rootroot00000000000000= Info Test [figure] @license This is the figure lincense. @screen This is a screen in a figure license. This is still in the screen. mallard-ducktype-0.4/tests/info23.page000066400000000000000000000005071324725273200177300ustar00rootroot00000000000000 Info Test

This is the figure lincense.

This is a screen in a figure license. This is still in the screen.
mallard-ducktype-0.4/tests/info24.duck000066400000000000000000000003201324725273200177340ustar00rootroot00000000000000= Info Test @license This is the license. This is the same license paragraph. @media[src=foo.png] @media[src=foo.png] This is a new paragraph in a license. This is not the license. mallard-ducktype-0.4/tests/info24.page000066400000000000000000000005701324725273200177310ustar00rootroot00000000000000

This is the license. This is the same license paragraph.

This is a new paragraph in a license.

Info Test

This is not the license.

mallard-ducktype-0.4/tests/info25.duck000066400000000000000000000003261324725273200177430ustar00rootroot00000000000000@namespace tt http://www.w3.org/ns/ttml = Info Test @tt:tt @tt:body @tt:div[begin="1s" end="3s"] @tt:p This should not have a Mallard p element added. This tests leaf nodes in other namespaces. mallard-ducktype-0.4/tests/info25.page000066400000000000000000000006151324725273200177320ustar00rootroot00000000000000 This should not have a Mallard p element added. Info Test

This tests leaf nodes in other namespaces.

mallard-ducktype-0.4/tests/info26.duck000066400000000000000000000002611324725273200177420ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ = Info Test @if:if[test=target:html] This should have a Mallard p element added. This tests leaf nodes in other namespaces. mallard-ducktype-0.4/tests/info26.page000066400000000000000000000005221324725273200177300ustar00rootroot00000000000000

This should have a Mallard p element added.

Info Test

This tests leaf nodes in other namespaces.

mallard-ducktype-0.4/tests/info27.duck000066400000000000000000000002371324725273200177460ustar00rootroot00000000000000@namespace mal http://projectmallard.org/1.0/ = Info Test @mal:div This should have a Mallard p element added. This tests leaf nodes in other namespaces. mallard-ducktype-0.4/tests/info27.page000066400000000000000000000005011324725273200177260ustar00rootroot00000000000000

This should have a Mallard p element added.

Info Test

This tests leaf nodes in other namespaces.

mallard-ducktype-0.4/tests/info28.duck000066400000000000000000000002451324725273200177460ustar00rootroot00000000000000@namespace mal http://projectmallard.org/1.0/ = Info Test @mal:screen This should not have a Mallard p element added. This tests leaf nodes in other namespaces. mallard-ducktype-0.4/tests/info28.page000066400000000000000000000004751324725273200177410ustar00rootroot00000000000000 This should not have a Mallard p element added. Info Test

This tests leaf nodes in other namespaces.

mallard-ducktype-0.4/tests/info29.duck000066400000000000000000000003011324725273200177400ustar00rootroot00000000000000@namespace if http://projectmallard.org/if/1.0/ = Info Test @if:choose @if:when[test=target:html] This should have a Mallard p element added. This tests leaf nodes in other namespaces. mallard-ducktype-0.4/tests/info29.page000066400000000000000000000005661324725273200177430ustar00rootroot00000000000000

This should have a Mallard p element added.

Info Test

This tests leaf nodes in other namespaces.

mallard-ducktype-0.4/tests/info30.duck000066400000000000000000000001131324725273200177310ustar00rootroot00000000000000= Info Test @license This is the license with a $link[>index](link). mallard-ducktype-0.4/tests/info30.page000066400000000000000000000003621324725273200177250ustar00rootroot00000000000000

This is the license with a link.

Info Test
mallard-ducktype-0.4/tests/info31.duck000066400000000000000000000000761324725273200177420ustar00rootroot00000000000000= Info Test @credit @name Shaun McCance @years 2017 mallard-ducktype-0.4/tests/info31.page000066400000000000000000000003401324725273200177220ustar00rootroot00000000000000 Shaun McCance 2017 Info Test mallard-ducktype-0.4/tests/info32.duck000066400000000000000000000001341324725273200177360ustar00rootroot00000000000000= Info Test @desc Test of info elements. Info elements can have a blank line before them. mallard-ducktype-0.4/tests/info32.page000066400000000000000000000003631324725273200177300ustar00rootroot00000000000000 Test of info elements. Info Test

Info elements can have a blank line before them.

mallard-ducktype-0.4/tests/info33.duck000066400000000000000000000001041324725273200177340ustar00rootroot00000000000000= Info Test $@This is a way to escape elements that look like info mallard-ducktype-0.4/tests/info33.page000066400000000000000000000003011324725273200177210ustar00rootroot00000000000000 Info Test

@This is a way to escape elements that look like info

mallard-ducktype-0.4/tests/info34.duck000066400000000000000000000001131324725273200177350ustar00rootroot00000000000000= Info Test [[[ @This is a way to escape elements that look like info ]]] mallard-ducktype-0.4/tests/info34.page000066400000000000000000000003011324725273200177220ustar00rootroot00000000000000 Info Test

@This is a way to escape elements that look like info

mallard-ducktype-0.4/tests/info35.duck000066400000000000000000000001471324725273200177450ustar00rootroot00000000000000= Info Test - Subtitle @desc Test of info elements. Info elements can have a blank line before them. mallard-ducktype-0.4/tests/info35.page000066400000000000000000000004221324725273200177270ustar00rootroot00000000000000 Test of info elements. Info Test Subtitle

Info elements can have a blank line before them.

mallard-ducktype-0.4/tests/inline01.duck000066400000000000000000000000701324725273200202540ustar00rootroot00000000000000= Inline Test This paragraph has $em(emphasized) text. mallard-ducktype-0.4/tests/inline01.page000066400000000000000000000002741324725273200202500ustar00rootroot00000000000000 Inline Test

This paragraph has emphasized text.

mallard-ducktype-0.4/tests/inline02.duck000066400000000000000000000000561324725273200202610ustar00rootroot00000000000000= Inline Test This is $not actually $markup. mallard-ducktype-0.4/tests/inline02.page000066400000000000000000000002561324725273200202510ustar00rootroot00000000000000 Inline Test

This is $not actually $markup.

mallard-ducktype-0.4/tests/inline03.duck000066400000000000000000000000541324725273200202600ustar00rootroot00000000000000= Inline Test This element is empty: $em() mallard-ducktype-0.4/tests/inline03.page000066400000000000000000000002601324725273200202450ustar00rootroot00000000000000 Inline Test

This element is empty:

mallard-ducktype-0.4/tests/inline04.duck000066400000000000000000000000611324725273200202570ustar00rootroot00000000000000= Inline Test This element is $em[.bold](bold). mallard-ducktype-0.4/tests/inline04.page000066400000000000000000000002731324725273200202520ustar00rootroot00000000000000 Inline Test

This element is bold.

mallard-ducktype-0.4/tests/inline05.duck000066400000000000000000000001031324725273200202550ustar00rootroot00000000000000= Inline Test Here is a $link[xref=another_page] without content. mallard-ducktype-0.4/tests/inline05.page000066400000000000000000000003061324725273200202500ustar00rootroot00000000000000 Inline Test

Here is a without content.

mallard-ducktype-0.4/tests/inline06.duck000066400000000000000000000000741324725273200202650ustar00rootroot00000000000000= Inline Test We can $em(nest $gui(inline $key(content))). mallard-ducktype-0.4/tests/inline06.page000066400000000000000000000003121324725273200202460ustar00rootroot00000000000000 Inline Test

We can nest inline content.

mallard-ducktype-0.4/tests/inline07.duck000066400000000000000000000000741324725273200202660ustar00rootroot00000000000000= Inline Test We can $em(nest $gui($key(inline) content)). mallard-ducktype-0.4/tests/inline07.page000066400000000000000000000003121324725273200202470ustar00rootroot00000000000000 Inline Test

We can nest inline content.

mallard-ducktype-0.4/tests/inline08.duck000066400000000000000000000001421324725273200202630ustar00rootroot00000000000000= Inline Test This element is empty: $em[] This element is empty: $em[] and has stuff after it. mallard-ducktype-0.4/tests/inline08.page000066400000000000000000000003511324725273200202530ustar00rootroot00000000000000 Inline Test

This element is empty:

This element is empty: and has stuff after it.

mallard-ducktype-0.4/tests/inline09.duck000066400000000000000000000001531324725273200202660ustar00rootroot00000000000000= Inline Test This page has an entity reference $eacute; And another one $eacute; with content after it. mallard-ducktype-0.4/tests/inline09.page000066400000000000000000000003461324725273200202600ustar00rootroot00000000000000 Inline Test

This page has an entity reference é

And another one é with content after it.

mallard-ducktype-0.4/tests/inline10.duck000066400000000000000000000000711324725273200202550ustar00rootroot00000000000000= Inline Test This page has a combining entity o$tdot;. mallard-ducktype-0.4/tests/inline10.page000066400000000000000000000002661324725273200202510ustar00rootroot00000000000000 Inline Test

This page has a combining entity o⃛.

mallard-ducktype-0.4/tests/inline11.duck000066400000000000000000000001451324725273200202600ustar00rootroot00000000000000= Inline Test This page has numeric entity refs: $e9;. These look numeric, but aren't: $ac; $acE;. mallard-ducktype-0.4/tests/inline11.page000066400000000000000000000003511324725273200202450ustar00rootroot00000000000000 Inline Test

This page has numeric entity refs: é.

These look numeric, but aren't: ∾ ∾̳.

mallard-ducktype-0.4/tests/inline12.duck000066400000000000000000000001251324725273200202570ustar00rootroot00000000000000= Inline Test This is a link: $link[>index]. This is a $link[>index](with content). mallard-ducktype-0.4/tests/inline12.page000066400000000000000000000003501324725273200202450ustar00rootroot00000000000000 Inline Test

This is a link: . This is a with content.

mallard-ducktype-0.4/tests/inline13.duck000066400000000000000000000002041324725273200202560ustar00rootroot00000000000000= Inline Test This is a link: $link[>>http://projectmallard.org/]. This is a link: $link[>>http://projectmallard.org/ ](Mallard). mallard-ducktype-0.4/tests/inline13.page000066400000000000000000000004321324725273200202470ustar00rootroot00000000000000 Inline Test

This is a link: .

This is a link: Mallard.

mallard-ducktype-0.4/tests/inline14.duck000066400000000000000000000003761324725273200202710ustar00rootroot00000000000000= Inline Test This is a test of escaping in attribute values. $em[style="$quot;quoted style$quot;"](quoted style). $em[style='$apos;quoted style$apos;'](quoted style). $link[>$dollar;sigils](dollar). $link[>>http://$dollar;sigils.example.com/](dollar). mallard-ducktype-0.4/tests/inline14.page000066400000000000000000000006051324725273200202520ustar00rootroot00000000000000 Inline Test

This is a test of escaping in attribute values. quoted style. quoted style. dollar. dollar.

mallard-ducktype-0.4/tests/inline15.duck000066400000000000000000000001561324725273200202660ustar00rootroot00000000000000= Inline Test Let's escape $em[style="$"mystyle$""](stuff) and then not escape $em[style="$$"](other stuff). mallard-ducktype-0.4/tests/inline15.page000066400000000000000000000003741324725273200202560ustar00rootroot00000000000000 Inline Test

Let's escape stuff and then not escape other stuff.

mallard-ducktype-0.4/tests/inline16.duck000066400000000000000000000001761324725273200202710ustar00rootroot00000000000000= Inline Test Testing nested parenthesis with $gui(File(s)) (and $gui(File)). This is ($em(more $em((complicated) stuff)).) mallard-ducktype-0.4/tests/inline16.page000066400000000000000000000004271324725273200202560ustar00rootroot00000000000000 Inline Test

Testing nested parenthesis with File(s) (and File).

This is (more (complicated) stuff.)

mallard-ducktype-0.4/tests/inline17.duck000066400000000000000000000000721324725273200202650ustar00rootroot00000000000000= Inline Test This $em(has $em(some$) escapes)$( in it.) mallard-ducktype-0.4/tests/inline17.page000066400000000000000000000003001324725273200202450ustar00rootroot00000000000000 Inline Test

This has some) escapes( in it.

mallard-ducktype-0.4/tests/list01.duck000066400000000000000000000000511324725273200177500ustar00rootroot00000000000000= List Test * List item 1 * List item 2 mallard-ducktype-0.4/tests/list01.page000066400000000000000000000003461324725273200177450ustar00rootroot00000000000000 List Test

List item 1

List item 2

mallard-ducktype-0.4/tests/list02.duck000066400000000000000000000001501324725273200177510ustar00rootroot00000000000000= List Test * List item 1 Continuing list item 1 * List item 2 Another paragraph in a list item 2 mallard-ducktype-0.4/tests/list02.page000066400000000000000000000004551324725273200177470ustar00rootroot00000000000000 List Test

List item 1 Continuing list item 1

List item 2

Another paragraph in a list item 2

mallard-ducktype-0.4/tests/list03.duck000066400000000000000000000001701324725273200177540ustar00rootroot00000000000000= List Test [list numbered] * List item 1 Continuing list item 1 * List item 2 Another paragraph in a list item 2 mallard-ducktype-0.4/tests/list03.page000066400000000000000000000004751324725273200177520ustar00rootroot00000000000000 List Test

List item 1 Continuing list item 1

List item 2

Another paragraph in a list item 2

mallard-ducktype-0.4/tests/list04.duck000066400000000000000000000001231324725273200177530ustar00rootroot00000000000000= List Test [list] [item] First Item [item] Second Item [list] [item] Second List mallard-ducktype-0.4/tests/list04.page000066400000000000000000000004371324725273200177510ustar00rootroot00000000000000 List Test

First Item

Second Item

Second List

mallard-ducktype-0.4/tests/list05.duck000066400000000000000000000002141324725273200177550ustar00rootroot00000000000000= List Test * List item 1 Continuing list item 1 * List item 2 * List item 3 still in the same list [list] * List item 1 in a new list mallard-ducktype-0.4/tests/list05.page000066400000000000000000000006101324725273200177430ustar00rootroot00000000000000 List Test

List item 1 Continuing list item 1

List item 2

List item 3 still in the same list

List item 1 in a new list

mallard-ducktype-0.4/tests/list06.duck000066400000000000000000000002741324725273200177640ustar00rootroot00000000000000= List Test [steps] * List item 1 * Sublist item 1 Continuing item 1 * Sublist item 2 * List item 2 [steps] * Substep 2.1 * Substep 2.2 [note] A note in substep 2.2 mallard-ducktype-0.4/tests/list06.page000066400000000000000000000010511324725273200177440ustar00rootroot00000000000000 List Test

List item 1

Sublist item 1 Continuing item 1

Sublist item 2

List item 2

Substep 2.1

Substep 2.2

A note in substep 2.2

mallard-ducktype-0.4/tests/list07.duck000066400000000000000000000002761324725273200177670ustar00rootroot00000000000000= List Test [terms] [item] [title] Term 1 Definition 1 [item] [title] Term 2 [p] Definition 2 [item] [title] Term 3 Not in the terms list because the newline breaks free of the item. mallard-ducktype-0.4/tests/list07.page000066400000000000000000000006231324725273200177510ustar00rootroot00000000000000 List Test Term 1

Definition 1

Term 2

Definition 2

Term 3

Not in the terms list because the newline breaks free of the item.

mallard-ducktype-0.4/tests/list08.duck000066400000000000000000000001371324725273200177640ustar00rootroot00000000000000= List Test [terms] - Term 1 * Definition 1 - Term 2 * Definition 2 - Term 3 * Definition 3 mallard-ducktype-0.4/tests/list08.page000066400000000000000000000005371324725273200177560ustar00rootroot00000000000000 List Test Term 1

Definition 1

Term 2

Definition 2

Term 3

Definition 3

mallard-ducktype-0.4/tests/list09.duck000066400000000000000000000003131324725273200177610ustar00rootroot00000000000000= List Test [terms] - Item 1 Term 1 - Item 1 Term 2 * Definition 1 - Item 2 Term 1 - Item 2 Term 2 * Definition 2 Cointinuing definition 2 New paragraph in definition 2 Out of the terms list mallard-ducktype-0.4/tests/list09.page000066400000000000000000000007171324725273200177570ustar00rootroot00000000000000 List Test Item 1 Term 1 Item 1 Term 2

Definition 1

Item 2 Term 1 Item 2 Term 2

Definition 2 Cointinuing definition 2

New paragraph in definition 2

Out of the terms list

mallard-ducktype-0.4/tests/list10.duck000066400000000000000000000001221324725273200177470ustar00rootroot00000000000000= List Test [terms] . Terms Title - Item 1 Term 1 - Item 1 Term 2 * Definition 1 mallard-ducktype-0.4/tests/list10.page000066400000000000000000000004351324725273200177440ustar00rootroot00000000000000 List Test Terms Title Item 1 Term 1 Item 1 Term 2

Definition 1

mallard-ducktype-0.4/tests/list11.duck000066400000000000000000000002041324725273200177510ustar00rootroot00000000000000= List Test [tree] * List item 1 * Sublist item 1 Continuing item 1 * Sublist item 2 * Subsublist item 1 * List item 2 mallard-ducktype-0.4/tests/list11.page000066400000000000000000000005101324725273200177370ustar00rootroot00000000000000 List Test List item 1 Sublist item 1 Continuing item 1 Sublist item 2 Subsublist item 1 List item 2 mallard-ducktype-0.4/tests/list12.duck000066400000000000000000000002241324725273200177540ustar00rootroot00000000000000= List Test [tree] * List item 1 * Sublist item 1 [[[ Continuing item 1 ]]] * Sublist item 2 * Subsublist item 1 * List item 2 mallard-ducktype-0.4/tests/list12.page000066400000000000000000000005041324725273200177430ustar00rootroot00000000000000 List Test List item 1 Sublist item 1 Continuing item 1 Sublist item 2 Subsublist item 1 List item 2 mallard-ducktype-0.4/tests/list13.duck000066400000000000000000000002341324725273200177560ustar00rootroot00000000000000= List Test [tree] * List item 1 * List item 2 * Sublist item 1 * Sublist item 2 * Subsublist item 1 * Subsublist item 2 * List item 3 mallard-ducktype-0.4/tests/list13.page000066400000000000000000000005601324725273200177460ustar00rootroot00000000000000 List Test List item 1 List item 2 Sublist item 1 Sublist item 2 Subsublist item 1 Subsublist item 2 List item 3 mallard-ducktype-0.4/tests/list14.duck000066400000000000000000000001741324725273200177620ustar00rootroot00000000000000= List Test [tree] * List item 1 * List item 2 * Sublist item 1 This must break out of the tree * Sublist item 2 mallard-ducktype-0.4/tests/list14.page000066400000000000000000000005211324725273200177440ustar00rootroot00000000000000 List Test List item 1 List item 2 Sublist item 1

This must break out of the tree

Sublist item 2

mallard-ducktype-0.4/tests/list15.duck000066400000000000000000000002101324725273200177520ustar00rootroot00000000000000= List Test [tree] * List item 1 * List item 2 * Sublist item 1 [[[ This must break out of the tree ]]] * Sublist item 2 mallard-ducktype-0.4/tests/list15.page000066400000000000000000000005211324725273200177450ustar00rootroot00000000000000 List Test List item 1 List item 2 Sublist item 1

This must break out of the tree

Sublist item 2

mallard-ducktype-0.4/tests/list16.duck000066400000000000000000000002051324725273200177570ustar00rootroot00000000000000= List Test [tree] * List item 1 * List item 2 * Sublist item 1 [note] This must break out of the tree * Sublist item 2 mallard-ducktype-0.4/tests/list16.page000066400000000000000000000005431324725273200177520ustar00rootroot00000000000000 List Test List item 1 List item 2 Sublist item 1

This must break out of the tree

Sublist item 2

mallard-ducktype-0.4/tests/namespace01.duck000066400000000000000000000001571324725273200207400ustar00rootroot00000000000000@ducktype/1.0 @namespace if http://projectmallard.org/if/1.0/ = Namespace Test This is a test of namespaces. mallard-ducktype-0.4/tests/namespace01.page000066400000000000000000000003401324725273200207200ustar00rootroot00000000000000 Namespace Test

This is a test of namespaces.

mallard-ducktype-0.4/tests/namespace02.duck000066400000000000000000000003031324725273200207320ustar00rootroot00000000000000@ducktype/1.0 @namespace if http://projectmallard.org/if/1.0/ = Namespace Test [if:if test=target:mobile] This is a test of namespaces. [p if:test=target:mobile] This is a test of namespaces. mallard-ducktype-0.4/tests/namespace02.page000066400000000000000000000005071324725273200207260ustar00rootroot00000000000000 Namespace Test

This is a test of namespaces.

This is a test of namespaces.

mallard-ducktype-0.4/tests/namespace03.duck000066400000000000000000000003631324725273200207410ustar00rootroot00000000000000@ducktype/1.0 @namespace if http://projectmallard.org/if/1.0/ @namespace if http://projectmallard.org/if/2.0/ = Namespace Test [if:if test=target:mobile] This is a test of namespaces. [p if:test=target:mobile] This is a test of namespaces. mallard-ducktype-0.4/tests/namespace03.page000066400000000000000000000005071324725273200207270ustar00rootroot00000000000000 Namespace Test

This is a test of namespaces.

This is a test of namespaces.

mallard-ducktype-0.4/tests/namespace04.duck000066400000000000000000000001201324725273200207310ustar00rootroot00000000000000@ducktype/1.0 = Namespace Test This is a test of undefined $e:hi(namespaces). mallard-ducktype-0.4/tests/namespace04.error000066400000000000000000000000651324725273200211440ustar00rootroot00000000000000namespace04.duck:5: Unrecognized namespace prefix: e mallard-ducktype-0.4/tests/namespace05.duck000066400000000000000000000001221324725273200207340ustar00rootroot00000000000000@ducktype/1.0 = Namespace Test [e:nope] This is a test of undefined namespaces. mallard-ducktype-0.4/tests/namespace05.error000066400000000000000000000000651324725273200211450ustar00rootroot00000000000000namespace05.duck:5: Unrecognized namespace prefix: e mallard-ducktype-0.4/tests/namespace06.duck000066400000000000000000000001431324725273200207400ustar00rootroot00000000000000@ducktype/1.0 = Namespace Test @e:nope Fail on this line This is a test of undefined namespaces. mallard-ducktype-0.4/tests/namespace06.error000066400000000000000000000000651324725273200211460ustar00rootroot00000000000000namespace06.duck:4: Unrecognized namespace prefix: e mallard-ducktype-0.4/tests/namespace07.duck000066400000000000000000000001551324725273200207440ustar00rootroot00000000000000@ducktype/1.0 @define undefined undefined $e:hi(namespace) = Namespace Test This is a test of $undefined;. mallard-ducktype-0.4/tests/namespace07.error000066400000000000000000000000651324725273200211470ustar00rootroot00000000000000namespace07.duck:6: Unrecognized namespace prefix: e mallard-ducktype-0.4/tests/namespace08.duck000066400000000000000000000002151324725273200207420ustar00rootroot00000000000000@ducktype/1.0 @namespace xml http://www.w3.org/XML/1998/namespace = Namespace Test [code xml:space=preserve] This is a test of namespaces. mallard-ducktype-0.4/tests/namespace08.page000066400000000000000000000003771324725273200207410ustar00rootroot00000000000000 Namespace Test This is a test of namespaces. mallard-ducktype-0.4/tests/namespace09.duck000066400000000000000000000001311324725273200207400ustar00rootroot00000000000000@ducktype/1.0 = Namespace Test [code xml:space=preserve] This is a test of namespaces. mallard-ducktype-0.4/tests/namespace09.page000066400000000000000000000003161324725273200207330ustar00rootroot00000000000000 Namespace Test This is a test of namespaces. mallard-ducktype-0.4/tests/namespace10.duck000066400000000000000000000002221324725273200207310ustar00rootroot00000000000000@ducktype/1.0 @namespace xml http://www.w3.org/XML/1998/wrongnamespace = Namespace Test [code xml:space=preserve] This is a test of namespaces. mallard-ducktype-0.4/tests/namespace10.error000066400000000000000000000000701324725273200211350ustar00rootroot00000000000000namespace10.duck:2: Wrong value of xml namespace prefix mallard-ducktype-0.4/tests/page01.duck000066400000000000000000000001011324725273200177050ustar00rootroot00000000000000= Page Title This is a simple page. This is another paragraph. mallard-ducktype-0.4/tests/page01.page000066400000000000000000000003061324725273200177020ustar00rootroot00000000000000 Page Title

This is a simple page.

This is another paragraph.

mallard-ducktype-0.4/tests/page02.duck000066400000000000000000000000451324725273200177150ustar00rootroot00000000000000= Page Title This is a paragraph. mallard-ducktype-0.4/tests/page02.page000066400000000000000000000002421324725273200177020ustar00rootroot00000000000000 Page Title

This is a paragraph.

mallard-ducktype-0.4/tests/page03.duck000066400000000000000000000000601324725273200177130ustar00rootroot00000000000000= Page Title - Subtitle This is a paragraph. mallard-ducktype-0.4/tests/page03.page000066400000000000000000000003011324725273200176770ustar00rootroot00000000000000 Page Title Subtitle

This is a paragraph.

mallard-ducktype-0.4/tests/page04.duck000066400000000000000000000000671324725273200177230ustar00rootroot00000000000000= Page Title - Page Subtitle This is a paragraph. mallard-ducktype-0.4/tests/page04.page000066400000000000000000000003071324725273200177060ustar00rootroot00000000000000 Page Title Page Subtitle

This is a paragraph.

mallard-ducktype-0.4/tests/page05.duck000066400000000000000000000001201324725273200177120ustar00rootroot00000000000000= Page Title - Page Subtitle [#pageid .pagestyle] This is a paragraph. mallard-ducktype-0.4/tests/page05.page000066400000000000000000000003311324725273200177040ustar00rootroot00000000000000 Page Title Page Subtitle

This is a paragraph.

mallard-ducktype-0.4/tests/runtest.py000077500000000000000000000005751324725273200200600ustar00rootroot00000000000000#!/usr/bin/env python3 import os import sys sys.path.insert(0, (os.path.dirname(os.path.abspath(os.path.dirname(sys.argv[0]))))) import mallard.ducktype try: parser = mallard.ducktype.DuckParser() parser.parse_file(sys.argv[1]) parser.finish() except mallard.ducktype.SyntaxError as e: print(e.fullmessage) sys.exit(1) parser.document.write_xml(sys.stdout) mallard-ducktype-0.4/tests/runtests000077500000000000000000000005511324725273200176060ustar00rootroot00000000000000#!/bin/sh for duck in *.duck; do page=$(echo $duck | sed -e 's/\.duck$/.page/') error=$(echo $duck | sed -e 's/\.duck$/.error/') if [ -f "$page" ]; then python3 runtest.py $duck | cmp - $page || echo $duck elif [ -f "$error" ]; then python3 runtest.py $duck | cmp - $error || echo $duck else echo $duck; fi done mallard-ducktype-0.4/tests/section01.duck000066400000000000000000000000731324725273200204450ustar00rootroot00000000000000= Section Test == This is a section This is a paragraph. mallard-ducktype-0.4/tests/section01.page000066400000000000000000000003411324725273200204310ustar00rootroot00000000000000 Section Test
This is a section

This is a paragraph.

mallard-ducktype-0.4/tests/section02.duck000066400000000000000000000001541324725273200204460ustar00rootroot00000000000000= Section Test == This is a section with a long title == This is another section This is a paragraph. mallard-ducktype-0.4/tests/section02.page000066400000000000000000000004651324725273200204410ustar00rootroot00000000000000 Section Test
This is a section with a long title
This is another section

This is a paragraph.

mallard-ducktype-0.4/tests/section03.duck000066400000000000000000000005151324725273200204500ustar00rootroot00000000000000= Section Test This is a paragraph. == First section This paragraph is in the first section === First subsection ==== First subsubsection === Second subsection This paragraph is in subsection 2. ==== Secont subsubsection This paragraph is in subsubsection 2. == Breaking out to a top-level section. And a final paragraph. mallard-ducktype-0.4/tests/section03.page000066400000000000000000000013251324725273200204360ustar00rootroot00000000000000 Section Test

This is a paragraph.

First section

This paragraph is in the first section

First subsection
First subsubsection
Second subsection

This paragraph is in subsection 2.

Secont subsubsection

This paragraph is in subsubsection 2.

Breaking out to a top-level section.

And a final paragraph.

mallard-ducktype-0.4/tests/section04.duck000066400000000000000000000003021324725273200204430ustar00rootroot00000000000000= Section Test == Section One [#sect1 .sect1style] === Section One Point One [ #sect1-1 style="sect1style" ] == Section Two [ id="sect2"] This is in section two. mallard-ducktype-0.4/tests/section04.page000066400000000000000000000006341324725273200204410ustar00rootroot00000000000000 Section Test
Section One
Section One Point One
Section Two

This is in section two.

mallard-ducktype-0.4/tests/section05.duck000066400000000000000000000003001324725273200204420ustar00rootroot00000000000000= Section Test == Section One -- Section One Subtitle === Section One Point One --- Section 1.1 Subtitle == Section Two -- Subtitle Two [ id="sect2"] This is in section two. mallard-ducktype-0.4/tests/section05.page000066400000000000000000000007411324725273200204410ustar00rootroot00000000000000 Section Test
Section One Section One Subtitle
Section One Point One Section 1.1 Subtitle
Section Two Subtitle Two

This is in section two.

mallard-ducktype-0.4/tests/section06.duck000066400000000000000000000001161324725273200204500ustar00rootroot00000000000000= Section Test == Section One [code] Some code == Section Two Some text mallard-ducktype-0.4/tests/section06.page000066400000000000000000000004351324725273200204420ustar00rootroot00000000000000 Section Test
Section One Some code
Section Two

Some text

mallard-ducktype-0.4/tests/section07.duck000066400000000000000000000004151324725273200204530ustar00rootroot00000000000000= Section Test == Section One -- Section One Subtitle [#sect1] [screen] This is section one. == Section Two -- Section Two Subtitle [#sect2] This is section two. == Section Three [#sect3] This is section three. == Section Four Four is a paragraph. mallard-ducktype-0.4/tests/section07.page000066400000000000000000000011501324725273200204360ustar00rootroot00000000000000 Section Test
Section One Section One Subtitle This is section one.
Section Two Section Two Subtitle

This is section two.

Section Three

This is section three.

Section

Four

Four is a paragraph.

mallard-ducktype-0.4/tests/table01.duck000066400000000000000000000001561324725273200200720ustar00rootroot00000000000000= Table Test [table] [tr] [th] Northwest [th] Northeast [tr] [td] Southwest [td] Southeast Out of the table mallard-ducktype-0.4/tests/table01.page000066400000000000000000000005471324725273200200640ustar00rootroot00000000000000 Table Test

Northwest

Northeast

Southwest

Southeast

Out of the table

mallard-ducktype-0.4/tests/table02.duck000066400000000000000000000003231324725273200200670ustar00rootroot00000000000000= Table Test [table] [thead] [tr] [td] One [td] Two [tr] [td] Three [td] Four [tbody] [tr] [td] One [td] Two [tr] [td] Three [td] Four [tfoot] [tr] [td] One [td] Two [tr] [td] Three [td] Four Out of the table mallard-ducktype-0.4/tests/table02.page000066400000000000000000000014031324725273200200550ustar00rootroot00000000000000 Table Test

One

Two

Three

Four

One

Two

Three

Four

One

Two

Three

Four

Out of the table

mallard-ducktype-0.4/tests/table03.duck000066400000000000000000000003231324725273200200700ustar00rootroot00000000000000= Table Test [table] [tbody] [tr] [td] One [td] Two [tr] [td] Three [td] Four [tbody] [tr] [td] One [td] Two [tr] [td] Three [td] Four [tbody] [tr] [td] One [td] Two [tr] [td] Three [td] Four Out of the table mallard-ducktype-0.4/tests/table03.page000066400000000000000000000014031324725273200200560ustar00rootroot00000000000000 Table Test

One

Two

Three

Four

One

Two

Three

Four

One

Two

Three

Four

Out of the table

mallard-ducktype-0.4/tests/table04.duck000066400000000000000000000001421324725273200200700ustar00rootroot00000000000000= Table Test [table] [tr] - Northwest - Northeast [tr] * Southwest * Southeast Out of the table mallard-ducktype-0.4/tests/table04.page000066400000000000000000000005471324725273200200670ustar00rootroot00000000000000 Table Test

Northwest

Northeast

Southwest

Southeast

Out of the table

mallard-ducktype-0.4/tests/table05.duck000066400000000000000000000001611324725273200200720ustar00rootroot00000000000000= Table Test [table] [tr] - North west - North east [tr] * South west * South east Out of the table mallard-ducktype-0.4/tests/table05.page000066400000000000000000000006111324725273200200600ustar00rootroot00000000000000 Table Test

North west

North

east

South

west

South east

Out of the table

mallard-ducktype-0.4/tests/verbatim01.duck000066400000000000000000000001601324725273200206070ustar00rootroot00000000000000= Verbatim Test [screen] This is in a verbatim environment This is still in it. This is in its own paragraph. mallard-ducktype-0.4/tests/verbatim01.page000066400000000000000000000003721324725273200206020ustar00rootroot00000000000000 Verbatim Test This is in a verbatim environment This is still in it.

This is in its own paragraph.

mallard-ducktype-0.4/tests/verbatim02.duck000066400000000000000000000002331324725273200206110ustar00rootroot00000000000000= Verbatim Test [screen] This is in a verbatim environment This is still in it. This is also still in the verbatim. This is in its own paragraph. mallard-ducktype-0.4/tests/verbatim02.page000066400000000000000000000004371324725273200206050ustar00rootroot00000000000000 Verbatim Test This is in a verbatim environment This is still in it. This is also still in the verbatim.

This is in its own paragraph.

mallard-ducktype-0.4/tests/verbatim03.duck000066400000000000000000000003471324725273200206200ustar00rootroot00000000000000= Verbatim Test [note] [code] This is in code in a note. So is this. This is in a new paragraph in the note. [screen] This is in a screen in a note. This is still in that screen. This breaks out of the note. mallard-ducktype-0.4/tests/verbatim03.page000066400000000000000000000005711324725273200206050ustar00rootroot00000000000000 Verbatim Test This is in code in a note. So is this.

This is in a new paragraph in the note.

This is in a screen in a note. This is still in that screen.

This breaks out of the note.

mallard-ducktype-0.4/tests/verbatim04.duck000066400000000000000000000005101324725273200206110ustar00rootroot00000000000000= Verbatim Test [note] [code] This is in code in a note. So is this, and it's indented. This is still in the code at the original indent. This is indented after a line break. This is indented even further. This is no longer indented. This is no longer in the code, but still in the note. mallard-ducktype-0.4/tests/verbatim04.page000066400000000000000000000007011324725273200206010ustar00rootroot00000000000000 Verbatim Test This is in code in a note. So is this, and it's indented. This is still in the code at the original indent. This is indented after a line break. This is indented even further. This is no longer indented.

This is no longer in the code, but still in the note.