diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index 4e90396..82b378a 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml
@@ -59,3 +59,23 @@ - name: Run VM tests run: dart test --platform vm if: always() && steps.install.outcome == 'success' + + coverage: + needs: test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d + with: + sdk: dev + - name: Install dependencies + run: dart pub get + - name: Install coverage + run: dart pub global activate coverage + - name: Collect and report coverage + run: dart pub global run coverage:test_with_coverage + - name: Upload coverage + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + path-to-lcov: coverage/lcov.info
diff --git a/CHANGELOG.md b/CHANGELOG.md index edd336b..58e4ab0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md
@@ -1,8 +1,15 @@ +## 7.0.0-dev + +* **Breaking change**: `close()` of `DelimiterSyntax` and `LinkSyntax` + returns multiple nodes instead of single one. + ## 6.0.2-dev * Fix a crash in checkbox lists when mixing checkbox items with non-checkbox items. * Add a new syntax `BlockHtmlSyntax` to parse HTML blocks. +* Add a new syntax `DecodeHtmlSyntax` to decode HTML entity and numeric + character references. * Deprecate `BlockTagBlockHtmlSyntax`, `LongBlockHtmlSyntax` and `OtherTagBlockHtmlSyntax`. These syntaxes will be removed from the next major version.
diff --git a/README.md b/README.md index cf6a000..a952014 100644 --- a/README.md +++ b/README.md
@@ -1,5 +1,7 @@ [![Build Status](https://github.com/dart-lang/markdown/workflows/Dart%20CI/badge.svg)](https://github.com/dart-lang/markdown/actions?query=workflow%3A"Dart+CI"+branch%3Amaster) [![Pub](https://img.shields.io/pub/v/markdown.svg)](https://pub.dev/packages/markdown) +[![package publisher](https://img.shields.io/pub/publisher/markdown.svg)](https://pub.dev/packages/markdown/publisher) +[![Coverage Status](https://coveralls.io/repos/github/dart-lang/markdown/badge.svg?branch=master)](https://coveralls.io/github/dart-lang/markdown?branch=master) A portable Markdown library written in Dart. It can parse Markdown into HTML on both the client and server.
diff --git a/analysis_options.yaml b/analysis_options.yaml index 4190e9a..ac272aa 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml
@@ -1,4 +1,6 @@ +# https://dart.dev/guides/language/analysis-options include: package:lints/recommended.yaml + analyzer: language: strict-inference: true @@ -17,15 +19,37 @@ rules: # https://github.com/dart-lang/linter/issues/574 #- comment_references + - always_declare_return_types + - avoid_catching_errors + - avoid_dynamic_calls + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_unused_constructor_parameters + - avoid_void_async + - cancel_subscriptions - directives_ordering + - literal_only_boolean_expressions + - missing_whitespace_between_adjacent_strings + - no_adjacent_strings_in_list + - omit_local_variable_types - only_throw_errors - package_api_docs + - prefer_asserts_in_initializer_lists + - prefer_const_constructors - prefer_const_declarations - prefer_final_locals + - prefer_relative_imports - prefer_single_quotes + - sort_pub_dependencies - test_types_in_equals - throw_in_finally + - type_annotate_public_apis + - unawaited_futures + - unnecessary_await_in_return + - unnecessary_lambdas + - unnecessary_parenthesis - unnecessary_raw_strings - use_if_null_to_convert_nulls_to_bools - use_raw_strings + - use_string_buffers - use_super_parameters
diff --git a/benchmark/benchmark.dart b/benchmark/benchmark.dart index 4c4d61f..63a8d1f 100644 --- a/benchmark/benchmark.dart +++ b/benchmark/benchmark.dart
@@ -38,7 +38,8 @@ // the VM doesn't optimize "dead" code away. if (result != expected) { print('Incorrect output:\n$result'); - exit(1); + exitCode = 1; + return; } // Don't print the first run. It's always terrible since the VM hasn't
diff --git a/lib/src/assets/html_entities.dart b/lib/src/assets/html_entities.dart new file mode 100644 index 0000000..2599762 --- /dev/null +++ b/lib/src/assets/html_entities.dart
@@ -0,0 +1,2133 @@ +// Generated file. do not edit. +// +// Source: tool/entities.json +// Script: tool/update_entities.dart +// ignore_for_file: prefer_single_quotes + +const htmlEntitiesMap = { + "Æ": "Æ", + "&": "&", + "Á": "Á", + "Ă": "Ă", + "Â": "Â", + "А": "А", + "𝔄": "𝔄", + "À": "À", + "Α": "Α", + "Ā": "Ā", + "⩓": "⩓", + "Ą": "Ą", + "𝔸": "𝔸", + "⁡": "", + "Å": "Å", + "𝒜": "𝒜", + "≔": "≔", + "Ã": "Ã", + "Ä": "Ä", + "∖": "∖", + "⫧": "⫧", + "⌆": "⌆", + "Б": "Б", + "∵": "∵", + "ℬ": "ℬ", + "Β": "Β", + "𝔅": "𝔅", + "𝔹": "𝔹", + "˘": "˘", + "ℬ": "ℬ", + "≎": "≎", + "Ч": "Ч", + "©": "©", + "Ć": "Ć", + "⋒": "⋒", + "ⅅ": "ⅅ", + "ℭ": "ℭ", + "Č": "Č", + "Ç": "Ç", + "Ĉ": "Ĉ", + "∰": "∰", + "Ċ": "Ċ", + "¸": "¸", + "·": "·", + "ℭ": "ℭ", + "Χ": "Χ", + "⊙": "⊙", + "⊖": "⊖", + "⊕": "⊕", + "⊗": "⊗", + "∲": "∲", + "”": "”", + "’": "’", + "∷": "∷", + "⩴": "⩴", + "≡": "≡", + "∯": "∯", + "∮": "∮", + "ℂ": "ℂ", + "∐": "∐", + "∳": "∳", + "⨯": "⨯", + "𝒞": "𝒞", + "⋓": "⋓", + "≍": "≍", + "ⅅ": "ⅅ", + "⤑": "⤑", + "Ђ": "Ђ", + "Ѕ": "Ѕ", + "Џ": "Џ", + "‡": "‡", + "↡": "↡", + "⫤": "⫤", + "Ď": "Ď", + "Д": "Д", + "∇": "∇", + "Δ": "Δ", + "𝔇": "𝔇", + "´": "´", + "˙": "˙", + "˝": "˝", + "`": "`", + "˜": "˜", + "⋄": "⋄", + "ⅆ": "ⅆ", + "𝔻": "𝔻", + "¨": "¨", + "⃜": "⃜", + "≐": "≐", + "∯": "∯", + "¨": "¨", + "⇓": "⇓", + "⇐": "⇐", + "⇔": "⇔", + "⫤": "⫤", + "⟸": "⟸", + "⟺": "⟺", + "⟹": "⟹", + "⇒": "⇒", + "⊨": "⊨", + "⇑": "⇑", + "⇕": "⇕", + "∥": "∥", + "↓": "↓", + "⤓": "⤓", + "⇵": "⇵", + "̑": "̑", + "⥐": "⥐", + "⥞": "⥞", + "↽": "↽", + "⥖": "⥖", + "⥟": "⥟", + "⇁": "⇁", + "⥗": "⥗", + "⊤": "⊤", + "↧": "↧", + "⇓": "⇓", + "𝒟": "𝒟", + "Đ": "Đ", + "Ŋ": "Ŋ", + "Ð": "Ð", + "É": "É", + "Ě": "Ě", + "Ê": "Ê", + "Э": "Э", + "Ė": "Ė", + "𝔈": "𝔈", + "È": "È", + "∈": "∈", + "Ē": "Ē", + "◻": "◻", + "▫": "▫", + "Ę": "Ę", + "𝔼": "𝔼", + "Ε": "Ε", + "⩵": "⩵", + "≂": "≂", + "⇌": "⇌", + "ℰ": "ℰ", + "⩳": "⩳", + "Η": "Η", + "Ë": "Ë", + "∃": "∃", + "ⅇ": "ⅇ", + "Ф": "Ф", + "𝔉": "𝔉", + "◼": "◼", + "▪": "▪", + "𝔽": "𝔽", + "∀": "∀", + "ℱ": "ℱ", + "ℱ": "ℱ", + "Ѓ": "Ѓ", + ">": ">", + "Γ": "Γ", + "Ϝ": "Ϝ", + "Ğ": "Ğ", + "Ģ": "Ģ", + "Ĝ": "Ĝ", + "Г": "Г", + "Ġ": "Ġ", + "𝔊": "𝔊", + "⋙": "⋙", + "𝔾": "𝔾", + "≥": "≥", + "⋛": "⋛", + "≧": "≧", + "⪢": "⪢", + "≷": "≷", + "⩾": "⩾", + "≳": "≳", + "𝒢": "𝒢", + "≫": "≫", + "Ъ": "Ъ", + "ˇ": "ˇ", + "^": "^", + "Ĥ": "Ĥ", + "ℌ": "ℌ", + "ℋ": "ℋ", + "ℍ": "ℍ", + "─": "─", + "ℋ": "ℋ", + "Ħ": "Ħ", + "≎": "≎", + "≏": "≏", + "Е": "Е", + "IJ": "IJ", + "Ё": "Ё", + "Í": "Í", + "Î": "Î", + "И": "И", + "İ": "İ", + "ℑ": "ℑ", + "Ì": "Ì", + "ℑ": "ℑ", + "Ī": "Ī", + "ⅈ": "ⅈ", + "⇒": "⇒", + "∬": "∬", + "∫": "∫", + "⋂": "⋂", + "⁣": "", + "⁢": "", + "Į": "Į", + "𝕀": "𝕀", + "Ι": "Ι", + "ℐ": "ℐ", + "Ĩ": "Ĩ", + "І": "І", + "Ï": "Ï", + "Ĵ": "Ĵ", + "Й": "Й", + "𝔍": "𝔍", + "𝕁": "𝕁", + "𝒥": "𝒥", + "Ј": "Ј", + "Є": "Є", + "Х": "Х", + "Ќ": "Ќ", + "Κ": "Κ", + "Ķ": "Ķ", + "К": "К", + "𝔎": "𝔎", + "𝕂": "𝕂", + "𝒦": "𝒦", + "Љ": "Љ", + "<": "<", + "Ĺ": "Ĺ", + "Λ": "Λ", + "⟪": "⟪", + "ℒ": "ℒ", + "↞": "↞", + "Ľ": "Ľ", + "Ļ": "Ļ", + "Л": "Л", + "⟨": "⟨", + "←": "←", + "⇤": "⇤", + "⇆": "⇆", + "⌈": "⌈", + "⟦": "⟦", + "⥡": "⥡", + "⇃": "⇃", + "⥙": "⥙", + "⌊": "⌊", + "↔": "↔", + "⥎": "⥎", + "⊣": "⊣", + "↤": "↤", + "⥚": "⥚", + "⊲": "⊲", + "⧏": "⧏", + "⊴": "⊴", + "⥑": "⥑", + "⥠": "⥠", + "↿": "↿", + "⥘": "⥘", + "↼": "↼", + "⥒": "⥒", + "⇐": "⇐", + "⇔": "⇔", + "⋚": "⋚", + "≦": "≦", + "≶": "≶", + "⪡": "⪡", + "⩽": "⩽", + "≲": "≲", + "𝔏": "𝔏", + "⋘": "⋘", + "⇚": "⇚", + "Ŀ": "Ŀ", + "⟵": "⟵", + "⟷": "⟷", + "⟶": "⟶", + "⟸": "⟸", + "⟺": "⟺", + "⟹": "⟹", + "𝕃": "𝕃", + "↙": "↙", + "↘": "↘", + "ℒ": "ℒ", + "↰": "↰", + "Ł": "Ł", + "≪": "≪", + "⤅": "⤅", + "М": "М", + " ": " ", + "ℳ": "ℳ", + "𝔐": "𝔐", + "∓": "∓", + "𝕄": "𝕄", + "ℳ": "ℳ", + "Μ": "Μ", + "Њ": "Њ", + "Ń": "Ń", + "Ň": "Ň", + "Ņ": "Ņ", + "Н": "Н", + "​": "", + "​": "", + "​": "", + "​": "", + "≫": "≫", + "≪": "≪", + "
": "\n", + "𝔑": "𝔑", + "⁠": "", + " ": " ", + "ℕ": "ℕ", + "⫬": "⫬", + "≢": "≢", + "≭": "≭", + "∦": "∦", + "∉": "∉", + "≠": "≠", + "≂̸": "≂̸", + "∄": "∄", + "≯": "≯", + "≱": "≱", + "≧̸": "≧̸", + "≫̸": "≫̸", + "≹": "≹", + "⩾̸": "⩾̸", + "≵": "≵", + "≎̸": "≎̸", + "≏̸": "≏̸", + "⋪": "⋪", + "⧏̸": "⧏̸", + "⋬": "⋬", + "≮": "≮", + "≰": "≰", + "≸": "≸", + "≪̸": "≪̸", + "⩽̸": "⩽̸", + "≴": "≴", + "⪢̸": "⪢̸", + "⪡̸": "⪡̸", + "⊀": "⊀", + "⪯̸": "⪯̸", + "⋠": "⋠", + "∌": "∌", + "⋫": "⋫", + "⧐̸": "⧐̸", + "⋭": "⋭", + "⊏̸": "⊏̸", + "⋢": "⋢", + "⊐̸": "⊐̸", + "⋣": "⋣", + "⊂⃒": "⊂⃒", + "⊈": "⊈", + "⊁": "⊁", + "⪰̸": "⪰̸", + "⋡": "⋡", + "≿̸": "≿̸", + "⊃⃒": "⊃⃒", + "⊉": "⊉", + "≁": "≁", + "≄": "≄", + "≇": "≇", + "≉": "≉", + "∤": "∤", + "𝒩": "𝒩", + "Ñ": "Ñ", + "Ν": "Ν", + "Œ": "Œ", + "Ó": "Ó", + "Ô": "Ô", + "О": "О", + "Ő": "Ő", + "𝔒": "𝔒", + "Ò": "Ò", + "Ō": "Ō", + "Ω": "Ω", + "Ο": "Ο", + "𝕆": "𝕆", + "“": "“", + "‘": "‘", + "⩔": "⩔", + "𝒪": "𝒪", + "Ø": "Ø", + "Õ": "Õ", + "⨷": "⨷", + "Ö": "Ö", + "‾": "‾", + "⏞": "⏞", + "⎴": "⎴", + "⏜": "⏜", + "∂": "∂", + "П": "П", + "𝔓": "𝔓", + "Φ": "Φ", + "Π": "Π", + "±": "±", + "ℌ": "ℌ", + "ℙ": "ℙ", + "⪻": "⪻", + "≺": "≺", + "⪯": "⪯", + "≼": "≼", + "≾": "≾", + "″": "″", + "∏": "∏", + "∷": "∷", + "∝": "∝", + "𝒫": "𝒫", + "Ψ": "Ψ", + """: "\"", + "𝔔": "𝔔", + "ℚ": "ℚ", + "𝒬": "𝒬", + "⤐": "⤐", + "®": "®", + "Ŕ": "Ŕ", + "⟫": "⟫", + "↠": "↠", + "⤖": "⤖", + "Ř": "Ř", + "Ŗ": "Ŗ", + "Р": "Р", + "ℜ": "ℜ", + "∋": "∋", + "⇋": "⇋", + "⥯": "⥯", + "ℜ": "ℜ", + "Ρ": "Ρ", + "⟩": "⟩", + "→": "→", + "⇥": "⇥", + "⇄": "⇄", + "⌉": "⌉", + "⟧": "⟧", + "⥝": "⥝", + "⇂": "⇂", + "⥕": "⥕", + "⌋": "⌋", + "⊢": "⊢", + "↦": "↦", + "⥛": "⥛", + "⊳": "⊳", + "⧐": "⧐", + "⊵": "⊵", + "⥏": "⥏", + "⥜": "⥜", + "↾": "↾", + "⥔": "⥔", + "⇀": "⇀", + "⥓": "⥓", + "⇒": "⇒", + "ℝ": "ℝ", + "⥰": "⥰", + "⇛": "⇛", + "ℛ": "ℛ", + "↱": "↱", + "⧴": "⧴", + "Щ": "Щ", + "Ш": "Ш", + "Ь": "Ь", + "Ś": "Ś", + "⪼": "⪼", + "Š": "Š", + "Ş": "Ş", + "Ŝ": "Ŝ", + "С": "С", + "𝔖": "𝔖", + "↓": "↓", + "←": "←", + "→": "→", + "↑": "↑", + "Σ": "Σ", + "∘": "∘", + "𝕊": "𝕊", + "√": "√", + "□": "□", + "⊓": "⊓", + "⊏": "⊏", + "⊑": "⊑", + "⊐": "⊐", + "⊒": "⊒", + "⊔": "⊔", + "𝒮": "𝒮", + "⋆": "⋆", + "⋐": "⋐", + "⋐": "⋐", + "⊆": "⊆", + "≻": "≻", + "⪰": "⪰", + "≽": "≽", + "≿": "≿", + "∋": "∋", + "∑": "∑", + "⋑": "⋑", + "⊃": "⊃", + "⊇": "⊇", + "⋑": "⋑", + "Þ": "Þ", + "™": "™", + "Ћ": "Ћ", + "Ц": "Ц", + "	": "\t", + "Τ": "Τ", + "Ť": "Ť", + "Ţ": "Ţ", + "Т": "Т", + "𝔗": "𝔗", + "∴": "∴", + "Θ": "Θ", + "  ": " ", + " ": " ", + "∼": "∼", + "≃": "≃", + "≅": "≅", + "≈": "≈", + "𝕋": "𝕋", + "⃛": "⃛", + "𝒯": "𝒯", + "Ŧ": "Ŧ", + "Ú": "Ú", + "↟": "↟", + "⥉": "⥉", + "Ў": "Ў", + "Ŭ": "Ŭ", + "Û": "Û", + "У": "У", + "Ű": "Ű", + "𝔘": "𝔘", + "Ù": "Ù", + "Ū": "Ū", + "_": "_", + "⏟": "⏟", + "⎵": "⎵", + "⏝": "⏝", + "⋃": "⋃", + "⊎": "⊎", + "Ų": "Ų", + "𝕌": "𝕌", + "↑": "↑", + "⤒": "⤒", + "⇅": "⇅", + "↕": "↕", + "⥮": "⥮", + "⊥": "⊥", + "↥": "↥", + "⇑": "⇑", + "⇕": "⇕", + "↖": "↖", + "↗": "↗", + "ϒ": "ϒ", + "Υ": "Υ", + "Ů": "Ů", + "𝒰": "𝒰", + "Ũ": "Ũ", + "Ü": "Ü", + "⊫": "⊫", + "⫫": "⫫", + "В": "В", + "⊩": "⊩", + "⫦": "⫦", + "⋁": "⋁", + "‖": "‖", + "‖": "‖", + "∣": "∣", + "|": "|", + "❘": "❘", + "≀": "≀", + " ": " ", + "𝔙": "𝔙", + "𝕍": "𝕍", + "𝒱": "𝒱", + "⊪": "⊪", + "Ŵ": "Ŵ", + "⋀": "⋀", + "𝔚": "𝔚", + "𝕎": "𝕎", + "𝒲": "𝒲", + "𝔛": "𝔛", + "Ξ": "Ξ", + "𝕏": "𝕏", + "𝒳": "𝒳", + "Я": "Я", + "Ї": "Ї", + "Ю": "Ю", + "Ý": "Ý", + "Ŷ": "Ŷ", + "Ы": "Ы", + "𝔜": "𝔜", + "𝕐": "𝕐", + "𝒴": "𝒴", + "Ÿ": "Ÿ", + "Ж": "Ж", + "Ź": "Ź", + "Ž": "Ž", + "З": "З", + "Ż": "Ż", + "​": "", + "Ζ": "Ζ", + "ℨ": "ℨ", + "ℤ": "ℤ", + "𝒵": "𝒵", + "á": "á", + "ă": "ă", + "∾": "∾", + "∾̳": "∾̳", + "∿": "∿", + "â": "â", + "´": "´", + "а": "а", + "æ": "æ", + "⁡": "", + "𝔞": "𝔞", + "à": "à", + "ℵ": "ℵ", + "ℵ": "ℵ", + "α": "α", + "ā": "ā", + "⨿": "⨿", + "&": "&", + "∧": "∧", + "⩕": "⩕", + "⩜": "⩜", + "⩘": "⩘", + "⩚": "⩚", + "∠": "∠", + "⦤": "⦤", + "∠": "∠", + "∡": "∡", + "⦨": "⦨", + "⦩": "⦩", + "⦪": "⦪", + "⦫": "⦫", + "⦬": "⦬", + "⦭": "⦭", + "⦮": "⦮", + "⦯": "⦯", + "∟": "∟", + "⊾": "⊾", + "⦝": "⦝", + "∢": "∢", + "Å": "Å", + "⍼": "⍼", + "ą": "ą", + "𝕒": "𝕒", + "≈": "≈", + "⩰": "⩰", + "⩯": "⩯", + "≊": "≊", + "≋": "≋", + "'": "'", + "≈": "≈", + "≊": "≊", + "å": "å", + "𝒶": "𝒶", + "*": "*", + "≈": "≈", + "≍": "≍", + "ã": "ã", + "ä": "ä", + "∳": "∳", + "⨑": "⨑", + "⫭": "⫭", + "≌": "≌", + "϶": "϶", + "‵": "‵", + "∽": "∽", + "⋍": "⋍", + "⊽": "⊽", + "⌅": "⌅", + "⌅": "⌅", + "⎵": "⎵", + "⎶": "⎶", + "≌": "≌", + "б": "б", + "„": "„", + "∵": "∵", + "∵": "∵", + "⦰": "⦰", + "϶": "϶", + "ℬ": "ℬ", + "β": "β", + "ℶ": "ℶ", + "≬": "≬", + "𝔟": "𝔟", + "⋂": "⋂", + "◯": "◯", + "⋃": "⋃", + "⨀": "⨀", + "⨁": "⨁", + "⨂": "⨂", + "⨆": "⨆", + "★": "★", + "▽": "▽", + "△": "△", + "⨄": "⨄", + "⋁": "⋁", + "⋀": "⋀", + "⤍": "⤍", + "⧫": "⧫", + "▪": "▪", + "▴": "▴", + "▾": "▾", + "◂": "◂", + "▸": "▸", + "␣": "␣", + "▒": "▒", + "░": "░", + "▓": "▓", + "█": "█", + "=⃥": "=⃥", + "≡⃥": "≡⃥", + "⌐": "⌐", + "𝕓": "𝕓", + "⊥": "⊥", + "⊥": "⊥", + "⋈": "⋈", + "╗": "╗", + "╔": "╔", + "╖": "╖", + "╓": "╓", + "═": "═", + "╦": "╦", + "╩": "╩", + "╤": "╤", + "╧": "╧", + "╝": "╝", + "╚": "╚", + "╜": "╜", + "╙": "╙", + "║": "║", + "╬": "╬", + "╣": "╣", + "╠": "╠", + "╫": "╫", + "╢": "╢", + "╟": "╟", + "⧉": "⧉", + "╕": "╕", + "╒": "╒", + "┐": "┐", + "┌": "┌", + "─": "─", + "╥": "╥", + "╨": "╨", + "┬": "┬", + "┴": "┴", + "⊟": "⊟", + "⊞": "⊞", + "⊠": "⊠", + "╛": "╛", + "╘": "╘", + "┘": "┘", + "└": "└", + "│": "│", + "╪": "╪", + "╡": "╡", + "╞": "╞", + "┼": "┼", + "┤": "┤", + "├": "├", + "‵": "‵", + "˘": "˘", + "¦": "¦", + "𝒷": "𝒷", + "⁏": "⁏", + "∽": "∽", + "⋍": "⋍", + "\": r"\", + "⧅": "⧅", + "⟈": "⟈", + "•": "•", + "•": "•", + "≎": "≎", + "⪮": "⪮", + "≏": "≏", + "≏": "≏", + "ć": "ć", + "∩": "∩", + "⩄": "⩄", + "⩉": "⩉", + "⩋": "⩋", + "⩇": "⩇", + "⩀": "⩀", + "∩︀": "∩︀", + "⁁": "⁁", + "ˇ": "ˇ", + "⩍": "⩍", + "č": "č", + "ç": "ç", + "ĉ": "ĉ", + "⩌": "⩌", + "⩐": "⩐", + "ċ": "ċ", + "¸": "¸", + "⦲": "⦲", + "¢": "¢", + "·": "·", + "𝔠": "𝔠", + "ч": "ч", + "✓": "✓", + "✓": "✓", + "χ": "χ", + "○": "○", + "⧃": "⧃", + "ˆ": "ˆ", + "≗": "≗", + "↺": "↺", + "↻": "↻", + "®": "®", + "Ⓢ": "Ⓢ", + "⊛": "⊛", + "⊚": "⊚", + "⊝": "⊝", + "≗": "≗", + "⨐": "⨐", + "⫯": "⫯", + "⧂": "⧂", + "♣": "♣", + "♣": "♣", + ":": ":", + "≔": "≔", + "≔": "≔", + ",": ",", + "@": "@", + "∁": "∁", + "∘": "∘", + "∁": "∁", + "ℂ": "ℂ", + "≅": "≅", + "⩭": "⩭", + "∮": "∮", + "𝕔": "𝕔", + "∐": "∐", + "©": "©", + "℗": "℗", + "↵": "↵", + "✗": "✗", + "𝒸": "𝒸", + "⫏": "⫏", + "⫑": "⫑", + "⫐": "⫐", + "⫒": "⫒", + "⋯": "⋯", + "⤸": "⤸", + "⤵": "⤵", + "⋞": "⋞", + "⋟": "⋟", + "↶": "↶", + "⤽": "⤽", + "∪": "∪", + "⩈": "⩈", + "⩆": "⩆", + "⩊": "⩊", + "⊍": "⊍", + "⩅": "⩅", + "∪︀": "∪︀", + "↷": "↷", + "⤼": "⤼", + "⋞": "⋞", + "⋟": "⋟", + "⋎": "⋎", + "⋏": "⋏", + "¤": "¤", + "↶": "↶", + "↷": "↷", + "⋎": "⋎", + "⋏": "⋏", + "∲": "∲", + "∱": "∱", + "⌭": "⌭", + "⇓": "⇓", + "⥥": "⥥", + "†": "†", + "ℸ": "ℸ", + "↓": "↓", + "‐": "‐", + "⊣": "⊣", + "⤏": "⤏", + "˝": "˝", + "ď": "ď", + "д": "д", + "ⅆ": "ⅆ", + "‡": "‡", + "⇊": "⇊", + "⩷": "⩷", + "°": "°", + "δ": "δ", + "⦱": "⦱", + "⥿": "⥿", + "𝔡": "𝔡", + "⇃": "⇃", + "⇂": "⇂", + "⋄": "⋄", + "⋄": "⋄", + "♦": "♦", + "♦": "♦", + "¨": "¨", + "ϝ": "ϝ", + "⋲": "⋲", + "÷": "÷", + "÷": "÷", + "⋇": "⋇", + "⋇": "⋇", + "ђ": "ђ", + "⌞": "⌞", + "⌍": "⌍", + "$": r"$", + "𝕕": "𝕕", + "˙": "˙", + "≐": "≐", + "≑": "≑", + "∸": "∸", + "∔": "∔", + "⊡": "⊡", + "⌆": "⌆", + "↓": "↓", + "⇊": "⇊", + "⇃": "⇃", + "⇂": "⇂", + "⤐": "⤐", + "⌟": "⌟", + "⌌": "⌌", + "𝒹": "𝒹", + "ѕ": "ѕ", + "⧶": "⧶", + "đ": "đ", + "⋱": "⋱", + "▿": "▿", + "▾": "▾", + "⇵": "⇵", + "⥯": "⥯", + "⦦": "⦦", + "џ": "џ", + "⟿": "⟿", + "⩷": "⩷", + "≑": "≑", + "é": "é", + "⩮": "⩮", + "ě": "ě", + "≖": "≖", + "ê": "ê", + "≕": "≕", + "э": "э", + "ė": "ė", + "ⅇ": "ⅇ", + "≒": "≒", + "𝔢": "𝔢", + "⪚": "⪚", + "è": "è", + "⪖": "⪖", + "⪘": "⪘", + "⪙": "⪙", + "⏧": "⏧", + "ℓ": "ℓ", + "⪕": "⪕", + "⪗": "⪗", + "ē": "ē", + "∅": "∅", + "∅": "∅", + "∅": "∅", + " ": " ", + " ": " ", + " ": " ", + "ŋ": "ŋ", + " ": " ", + "ę": "ę", + "𝕖": "𝕖", + "⋕": "⋕", + "⧣": "⧣", + "⩱": "⩱", + "ε": "ε", + "ε": "ε", + "ϵ": "ϵ", + "≖": "≖", + "≕": "≕", + "≂": "≂", + "⪖": "⪖", + "⪕": "⪕", + "=": "=", + "≟": "≟", + "≡": "≡", + "⩸": "⩸", + "⧥": "⧥", + "≓": "≓", + "⥱": "⥱", + "ℯ": "ℯ", + "≐": "≐", + "≂": "≂", + "η": "η", + "ð": "ð", + "ë": "ë", + "€": "€", + "!": "!", + "∃": "∃", + "ℰ": "ℰ", + "ⅇ": "ⅇ", + "≒": "≒", + "ф": "ф", + "♀": "♀", + "ffi": "ffi", + "ff": "ff", + "ffl": "ffl", + "𝔣": "𝔣", + "fi": "fi", + "fj": "fj", + "♭": "♭", + "fl": "fl", + "▱": "▱", + "ƒ": "ƒ", + "𝕗": "𝕗", + "∀": "∀", + "⋔": "⋔", + "⫙": "⫙", + "⨍": "⨍", + "½": "½", + "⅓": "⅓", + "¼": "¼", + "⅕": "⅕", + "⅙": "⅙", + "⅛": "⅛", + "⅔": "⅔", + "⅖": "⅖", + "¾": "¾", + "⅗": "⅗", + "⅜": "⅜", + "⅘": "⅘", + "⅚": "⅚", + "⅝": "⅝", + "⅞": "⅞", + "⁄": "⁄", + "⌢": "⌢", + "𝒻": "𝒻", + "≧": "≧", + "⪌": "⪌", + "ǵ": "ǵ", + "γ": "γ", + "ϝ": "ϝ", + "⪆": "⪆", + "ğ": "ğ", + "ĝ": "ĝ", + "г": "г", + "ġ": "ġ", + "≥": "≥", + "⋛": "⋛", + "≥": "≥", + "≧": "≧", + "⩾": "⩾", + "⩾": "⩾", + "⪩": "⪩", + "⪀": "⪀", + "⪂": "⪂", + "⪄": "⪄", + "⋛︀": "⋛︀", + "⪔": "⪔", + "𝔤": "𝔤", + "≫": "≫", + "⋙": "⋙", + "ℷ": "ℷ", + "ѓ": "ѓ", + "≷": "≷", + "⪒": "⪒", + "⪥": "⪥", + "⪤": "⪤", + "≩": "≩", + "⪊": "⪊", + "⪊": "⪊", + "⪈": "⪈", + "⪈": "⪈", + "≩": "≩", + "⋧": "⋧", + "𝕘": "𝕘", + "`": "`", + "ℊ": "ℊ", + "≳": "≳", + "⪎": "⪎", + "⪐": "⪐", + ">": ">", + "⪧": "⪧", + "⩺": "⩺", + "⋗": "⋗", + "⦕": "⦕", + "⩼": "⩼", + "⪆": "⪆", + "⥸": "⥸", + "⋗": "⋗", + "⋛": "⋛", + "⪌": "⪌", + "≷": "≷", + "≳": "≳", + "≩︀": "≩︀", + "≩︀": "≩︀", + "⇔": "⇔", + " ": " ", + "½": "½", + "ℋ": "ℋ", + "ъ": "ъ", + "↔": "↔", + "⥈": "⥈", + "↭": "↭", + "ℏ": "ℏ", + "ĥ": "ĥ", + "♥": "♥", + "♥": "♥", + "…": "…", + "⊹": "⊹", + "𝔥": "𝔥", + "⤥": "⤥", + "⤦": "⤦", + "⇿": "⇿", + "∻": "∻", + "↩": "↩", + "↪": "↪", + "𝕙": "𝕙", + "―": "―", + "𝒽": "𝒽", + "ℏ": "ℏ", + "ħ": "ħ", + "⁃": "⁃", + "‐": "‐", + "í": "í", + "⁣": "", + "î": "î", + "и": "и", + "е": "е", + "¡": "¡", + "⇔": "⇔", + "𝔦": "𝔦", + "ì": "ì", + "ⅈ": "ⅈ", + "⨌": "⨌", + "∭": "∭", + "⧜": "⧜", + "℩": "℩", + "ij": "ij", + "ī": "ī", + "ℑ": "ℑ", + "ℐ": "ℐ", + "ℑ": "ℑ", + "ı": "ı", + "⊷": "⊷", + "Ƶ": "Ƶ", + "∈": "∈", + "℅": "℅", + "∞": "∞", + "⧝": "⧝", + "ı": "ı", + "∫": "∫", + "⊺": "⊺", + "ℤ": "ℤ", + "⊺": "⊺", + "⨗": "⨗", + "⨼": "⨼", + "ё": "ё", + "į": "į", + "𝕚": "𝕚", + "ι": "ι", + "⨼": "⨼", + "¿": "¿", + "𝒾": "𝒾", + "∈": "∈", + "⋹": "⋹", + "⋵": "⋵", + "⋴": "⋴", + "⋳": "⋳", + "∈": "∈", + "⁢": "", + "ĩ": "ĩ", + "і": "і", + "ï": "ï", + "ĵ": "ĵ", + "й": "й", + "𝔧": "𝔧", + "ȷ": "ȷ", + "𝕛": "𝕛", + "𝒿": "𝒿", + "ј": "ј", + "є": "є", + "κ": "κ", + "ϰ": "ϰ", + "ķ": "ķ", + "к": "к", + "𝔨": "𝔨", + "ĸ": "ĸ", + "х": "х", + "ќ": "ќ", + "𝕜": "𝕜", + "𝓀": "𝓀", + "⇚": "⇚", + "⇐": "⇐", + "⤛": "⤛", + "⤎": "⤎", + "≦": "≦", + "⪋": "⪋", + "⥢": "⥢", + "ĺ": "ĺ", + "⦴": "⦴", + "ℒ": "ℒ", + "λ": "λ", + "⟨": "⟨", + "⦑": "⦑", + "⟨": "⟨", + "⪅": "⪅", + "«": "«", + "←": "←", + "⇤": "⇤", + "⤟": "⤟", + "⤝": "⤝", + "↩": "↩", + "↫": "↫", + "⤹": "⤹", + "⥳": "⥳", + "↢": "↢", + "⪫": "⪫", + "⤙": "⤙", + "⪭": "⪭", + "⪭︀": "⪭︀", + "⤌": "⤌", + "❲": "❲", + "{": "{", + "[": "[", + "⦋": "⦋", + "⦏": "⦏", + "⦍": "⦍", + "ľ": "ľ", + "ļ": "ļ", + "⌈": "⌈", + "{": "{", + "л": "л", + "⤶": "⤶", + "“": "“", + "„": "„", + "⥧": "⥧", + "⥋": "⥋", + "↲": "↲", + "≤": "≤", + "←": "←", + "↢": "↢", + "↽": "↽", + "↼": "↼", + "⇇": "⇇", + "↔": "↔", + "⇆": "⇆", + "⇋": "⇋", + "↭": "↭", + "⋋": "⋋", + "⋚": "⋚", + "≤": "≤", + "≦": "≦", + "⩽": "⩽", + "⩽": "⩽", + "⪨": "⪨", + "⩿": "⩿", + "⪁": "⪁", + "⪃": "⪃", + "⋚︀": "⋚︀", + "⪓": "⪓", + "⪅": "⪅", + "⋖": "⋖", + "⋚": "⋚", + "⪋": "⪋", + "≶": "≶", + "≲": "≲", + "⥼": "⥼", + "⌊": "⌊", + "𝔩": "𝔩", + "≶": "≶", + "⪑": "⪑", + "↽": "↽", + "↼": "↼", + "⥪": "⥪", + "▄": "▄", + "љ": "љ", + "≪": "≪", + "⇇": "⇇", + "⌞": "⌞", + "⥫": "⥫", + "◺": "◺", + "ŀ": "ŀ", + "⎰": "⎰", + "⎰": "⎰", + "≨": "≨", + "⪉": "⪉", + "⪉": "⪉", + "⪇": "⪇", + "⪇": "⪇", + "≨": "≨", + "⋦": "⋦", + "⟬": "⟬", + "⇽": "⇽", + "⟦": "⟦", + "⟵": "⟵", + "⟷": "⟷", + "⟼": "⟼", + "⟶": "⟶", + "↫": "↫", + "↬": "↬", + "⦅": "⦅", + "𝕝": "𝕝", + "⨭": "⨭", + "⨴": "⨴", + "∗": "∗", + "_": "_", + "◊": "◊", + "◊": "◊", + "⧫": "⧫", + "(": "(", + "⦓": "⦓", + "⇆": "⇆", + "⌟": "⌟", + "⇋": "⇋", + "⥭": "⥭", + "‎": "", + "⊿": "⊿", + "‹": "‹", + "𝓁": "𝓁", + "↰": "↰", + "≲": "≲", + "⪍": "⪍", + "⪏": "⪏", + "[": "[", + "‘": "‘", + "‚": "‚", + "ł": "ł", + "<": "<", + "⪦": "⪦", + "⩹": "⩹", + "⋖": "⋖", + "⋋": "⋋", + "⋉": "⋉", + "⥶": "⥶", + "⩻": "⩻", + "⦖": "⦖", + "◃": "◃", + "⊴": "⊴", + "◂": "◂", + "⥊": "⥊", + "⥦": "⥦", + "≨︀": "≨︀", + "≨︀": "≨︀", + "∺": "∺", + "¯": "¯", + "♂": "♂", + "✠": "✠", + "✠": "✠", + "↦": "↦", + "↦": "↦", + "↧": "↧", + "↤": "↤", + "↥": "↥", + "▮": "▮", + "⨩": "⨩", + "м": "м", + "—": "—", + "∡": "∡", + "𝔪": "𝔪", + "℧": "℧", + "µ": "µ", + "∣": "∣", + "*": "*", + "⫰": "⫰", + "·": "·", + "−": "−", + "⊟": "⊟", + "∸": "∸", + "⨪": "⨪", + "⫛": "⫛", + "…": "…", + "∓": "∓", + "⊧": "⊧", + "𝕞": "𝕞", + "∓": "∓", + "𝓂": "𝓂", + "∾": "∾", + "μ": "μ", + "⊸": "⊸", + "⊸": "⊸", + "⋙̸": "⋙̸", + "≫⃒": "≫⃒", + "≫̸": "≫̸", + "⇍": "⇍", + "⇎": "⇎", + "⋘̸": "⋘̸", + "≪⃒": "≪⃒", + "≪̸": "≪̸", + "⇏": "⇏", + "⊯": "⊯", + "⊮": "⊮", + "∇": "∇", + "ń": "ń", + "∠⃒": "∠⃒", + "≉": "≉", + "⩰̸": "⩰̸", + "≋̸": "≋̸", + "ʼn": "ʼn", + "≉": "≉", + "♮": "♮", + "♮": "♮", + "ℕ": "ℕ", + " ": " ", + "≎̸": "≎̸", + "≏̸": "≏̸", + "⩃": "⩃", + "ň": "ň", + "ņ": "ņ", + "≇": "≇", + "⩭̸": "⩭̸", + "⩂": "⩂", + "н": "н", + "–": "–", + "≠": "≠", + "⇗": "⇗", + "⤤": "⤤", + "↗": "↗", + "↗": "↗", + "≐̸": "≐̸", + "≢": "≢", + "⤨": "⤨", + "≂̸": "≂̸", + "∄": "∄", + "∄": "∄", + "𝔫": "𝔫", + "≧̸": "≧̸", + "≱": "≱", + "≱": "≱", + "≧̸": "≧̸", + "⩾̸": "⩾̸", + "⩾̸": "⩾̸", + "≵": "≵", + "≯": "≯", + "≯": "≯", + "⇎": "⇎", + "↮": "↮", + "⫲": "⫲", + "∋": "∋", + "⋼": "⋼", + "⋺": "⋺", + "∋": "∋", + "њ": "њ", + "⇍": "⇍", + "≦̸": "≦̸", + "↚": "↚", + "‥": "‥", + "≰": "≰", + "↚": "↚", + "↮": "↮", + "≰": "≰", + "≦̸": "≦̸", + "⩽̸": "⩽̸", + "⩽̸": "⩽̸", + "≮": "≮", + "≴": "≴", + "≮": "≮", + "⋪": "⋪", + "⋬": "⋬", + "∤": "∤", + "𝕟": "𝕟", + "¬": "¬", + "∉": "∉", + "⋹̸": "⋹̸", + "⋵̸": "⋵̸", + "∉": "∉", + "⋷": "⋷", + "⋶": "⋶", + "∌": "∌", + "∌": "∌", + "⋾": "⋾", + "⋽": "⋽", + "∦": "∦", + "∦": "∦", + "⫽⃥": "⫽⃥", + "∂̸": "∂̸", + "⨔": "⨔", + "⊀": "⊀", + "⋠": "⋠", + "⪯̸": "⪯̸", + "⊀": "⊀", + "⪯̸": "⪯̸", + "⇏": "⇏", + "↛": "↛", + "⤳̸": "⤳̸", + "↝̸": "↝̸", + "↛": "↛", + "⋫": "⋫", + "⋭": "⋭", + "⊁": "⊁", + "⋡": "⋡", + "⪰̸": "⪰̸", + "𝓃": "𝓃", + "∤": "∤", + "∦": "∦", + "≁": "≁", + "≄": "≄", + "≄": "≄", + "∤": "∤", + "∦": "∦", + "⋢": "⋢", + "⋣": "⋣", + "⊄": "⊄", + "⫅̸": "⫅̸", + "⊈": "⊈", + "⊂⃒": "⊂⃒", + "⊈": "⊈", + "⫅̸": "⫅̸", + "⊁": "⊁", + "⪰̸": "⪰̸", + "⊅": "⊅", + "⫆̸": "⫆̸", + "⊉": "⊉", + "⊃⃒": "⊃⃒", + "⊉": "⊉", + "⫆̸": "⫆̸", + "≹": "≹", + "ñ": "ñ", + "≸": "≸", + "⋪": "⋪", + "⋬": "⋬", + "⋫": "⋫", + "⋭": "⋭", + "ν": "ν", + "#": "#", + "№": "№", + " ": " ", + "⊭": "⊭", + "⤄": "⤄", + "≍⃒": "≍⃒", + "⊬": "⊬", + "≥⃒": "≥⃒", + ">⃒": ">⃒", + "⧞": "⧞", + "⤂": "⤂", + "≤⃒": "≤⃒", + "<⃒": "<⃒", + "⊴⃒": "⊴⃒", + "⤃": "⤃", + "⊵⃒": "⊵⃒", + "∼⃒": "∼⃒", + "⇖": "⇖", + "⤣": "⤣", + "↖": "↖", + "↖": "↖", + "⤧": "⤧", + "Ⓢ": "Ⓢ", + "ó": "ó", + "⊛": "⊛", + "⊚": "⊚", + "ô": "ô", + "о": "о", + "⊝": "⊝", + "ő": "ő", + "⨸": "⨸", + "⊙": "⊙", + "⦼": "⦼", + "œ": "œ", + "⦿": "⦿", + "𝔬": "𝔬", + "˛": "˛", + "ò": "ò", + "⧁": "⧁", + "⦵": "⦵", + "Ω": "Ω", + "∮": "∮", + "↺": "↺", + "⦾": "⦾", + "⦻": "⦻", + "‾": "‾", + "⧀": "⧀", + "ō": "ō", + "ω": "ω", + "ο": "ο", + "⦶": "⦶", + "⊖": "⊖", + "𝕠": "𝕠", + "⦷": "⦷", + "⦹": "⦹", + "⊕": "⊕", + "∨": "∨", + "↻": "↻", + "⩝": "⩝", + "ℴ": "ℴ", + "ℴ": "ℴ", + "ª": "ª", + "º": "º", + "⊶": "⊶", + "⩖": "⩖", + "⩗": "⩗", + "⩛": "⩛", + "ℴ": "ℴ", + "ø": "ø", + "⊘": "⊘", + "õ": "õ", + "⊗": "⊗", + "⨶": "⨶", + "ö": "ö", + "⌽": "⌽", + "∥": "∥", + "¶": "¶", + "∥": "∥", + "⫳": "⫳", + "⫽": "⫽", + "∂": "∂", + "п": "п", + "%": "%", + ".": ".", + "‰": "‰", + "⊥": "⊥", + "‱": "‱", + "𝔭": "𝔭", + "φ": "φ", + "ϕ": "ϕ", + "ℳ": "ℳ", + "☎": "☎", + "π": "π", + "⋔": "⋔", + "ϖ": "ϖ", + "ℏ": "ℏ", + "ℎ": "ℎ", + "ℏ": "ℏ", + "+": "+", + "⨣": "⨣", + "⊞": "⊞", + "⨢": "⨢", + "∔": "∔", + "⨥": "⨥", + "⩲": "⩲", + "±": "±", + "⨦": "⨦", + "⨧": "⨧", + "±": "±", + "⨕": "⨕", + "𝕡": "𝕡", + "£": "£", + "≺": "≺", + "⪳": "⪳", + "⪷": "⪷", + "≼": "≼", + "⪯": "⪯", + "≺": "≺", + "⪷": "⪷", + "≼": "≼", + "⪯": "⪯", + "⪹": "⪹", + "⪵": "⪵", + "⋨": "⋨", + "≾": "≾", + "′": "′", + "ℙ": "ℙ", + "⪵": "⪵", + "⪹": "⪹", + "⋨": "⋨", + "∏": "∏", + "⌮": "⌮", + "⌒": "⌒", + "⌓": "⌓", + "∝": "∝", + "∝": "∝", + "≾": "≾", + "⊰": "⊰", + "𝓅": "𝓅", + "ψ": "ψ", + " ": " ", + "𝔮": "𝔮", + "⨌": "⨌", + "𝕢": "𝕢", + "⁗": "⁗", + "𝓆": "𝓆", + "ℍ": "ℍ", + "⨖": "⨖", + "?": "?", + "≟": "≟", + """: "\"", + "⇛": "⇛", + "⇒": "⇒", + "⤜": "⤜", + "⤏": "⤏", + "⥤": "⥤", + "∽̱": "∽̱", + "ŕ": "ŕ", + "√": "√", + "⦳": "⦳", + "⟩": "⟩", + "⦒": "⦒", + "⦥": "⦥", + "⟩": "⟩", + "»": "»", + "→": "→", + "⥵": "⥵", + "⇥": "⇥", + "⤠": "⤠", + "⤳": "⤳", + "⤞": "⤞", + "↪": "↪", + "↬": "↬", + "⥅": "⥅", + "⥴": "⥴", + "↣": "↣", + "↝": "↝", + "⤚": "⤚", + "∶": "∶", + "ℚ": "ℚ", + "⤍": "⤍", + "❳": "❳", + "}": "}", + "]": "]", + "⦌": "⦌", + "⦎": "⦎", + "⦐": "⦐", + "ř": "ř", + "ŗ": "ŗ", + "⌉": "⌉", + "}": "}", + "р": "р", + "⤷": "⤷", + "⥩": "⥩", + "”": "”", + "”": "”", + "↳": "↳", + "ℜ": "ℜ", + "ℛ": "ℛ", + "ℜ": "ℜ", + "ℝ": "ℝ", + "▭": "▭", + "®": "®", + "⥽": "⥽", + "⌋": "⌋", + "𝔯": "𝔯", + "⇁": "⇁", + "⇀": "⇀", + "⥬": "⥬", + "ρ": "ρ", + "ϱ": "ϱ", + "→": "→", + "↣": "↣", + "⇁": "⇁", + "⇀": "⇀", + "⇄": "⇄", + "⇌": "⇌", + "⇉": "⇉", + "↝": "↝", + "⋌": "⋌", + "˚": "˚", + "≓": "≓", + "⇄": "⇄", + "⇌": "⇌", + "‏": "", + "⎱": "⎱", + "⎱": "⎱", + "⫮": "⫮", + "⟭": "⟭", + "⇾": "⇾", + "⟧": "⟧", + "⦆": "⦆", + "𝕣": "𝕣", + "⨮": "⨮", + "⨵": "⨵", + ")": ")", + "⦔": "⦔", + "⨒": "⨒", + "⇉": "⇉", + "›": "›", + "𝓇": "𝓇", + "↱": "↱", + "]": "]", + "’": "’", + "’": "’", + "⋌": "⋌", + "⋊": "⋊", + "▹": "▹", + "⊵": "⊵", + "▸": "▸", + "⧎": "⧎", + "⥨": "⥨", + "℞": "℞", + "ś": "ś", + "‚": "‚", + "≻": "≻", + "⪴": "⪴", + "⪸": "⪸", + "š": "š", + "≽": "≽", + "⪰": "⪰", + "ş": "ş", + "ŝ": "ŝ", + "⪶": "⪶", + "⪺": "⪺", + "⋩": "⋩", + "⨓": "⨓", + "≿": "≿", + "с": "с", + "⋅": "⋅", + "⊡": "⊡", + "⩦": "⩦", + "⇘": "⇘", + "⤥": "⤥", + "↘": "↘", + "↘": "↘", + "§": "§", + ";": ";", + "⤩": "⤩", + "∖": "∖", + "∖": "∖", + "✶": "✶", + "𝔰": "𝔰", + "⌢": "⌢", + "♯": "♯", + "щ": "щ", + "ш": "ш", + "∣": "∣", + "∥": "∥", + "­": "", + "σ": "σ", + "ς": "ς", + "ς": "ς", + "∼": "∼", + "⩪": "⩪", + "≃": "≃", + "≃": "≃", + "⪞": "⪞", + "⪠": "⪠", + "⪝": "⪝", + "⪟": "⪟", + "≆": "≆", + "⨤": "⨤", + "⥲": "⥲", + "←": "←", + "∖": "∖", + "⨳": "⨳", + "⧤": "⧤", + "∣": "∣", + "⌣": "⌣", + "⪪": "⪪", + "⪬": "⪬", + "⪬︀": "⪬︀", + "ь": "ь", + "/": "/", + "⧄": "⧄", + "⌿": "⌿", + "𝕤": "𝕤", + "♠": "♠", + "♠": "♠", + "∥": "∥", + "⊓": "⊓", + "⊓︀": "⊓︀", + "⊔": "⊔", + "⊔︀": "⊔︀", + "⊏": "⊏", + "⊑": "⊑", + "⊏": "⊏", + "⊑": "⊑", + "⊐": "⊐", + "⊒": "⊒", + "⊐": "⊐", + "⊒": "⊒", + "□": "□", + "□": "□", + "▪": "▪", + "▪": "▪", + "→": "→", + "𝓈": "𝓈", + "∖": "∖", + "⌣": "⌣", + "⋆": "⋆", + "☆": "☆", + "★": "★", + "ϵ": "ϵ", + "ϕ": "ϕ", + "¯": "¯", + "⊂": "⊂", + "⫅": "⫅", + "⪽": "⪽", + "⊆": "⊆", + "⫃": "⫃", + "⫁": "⫁", + "⫋": "⫋", + "⊊": "⊊", + "⪿": "⪿", + "⥹": "⥹", + "⊂": "⊂", + "⊆": "⊆", + "⫅": "⫅", + "⊊": "⊊", + "⫋": "⫋", + "⫇": "⫇", + "⫕": "⫕", + "⫓": "⫓", + "≻": "≻", + "⪸": "⪸", + "≽": "≽", + "⪰": "⪰", + "⪺": "⪺", + "⪶": "⪶", + "⋩": "⋩", + "≿": "≿", + "∑": "∑", + "♪": "♪", + "¹": "¹", + "²": "²", + "³": "³", + "⊃": "⊃", + "⫆": "⫆", + "⪾": "⪾", + "⫘": "⫘", + "⊇": "⊇", + "⫄": "⫄", + "⟉": "⟉", + "⫗": "⫗", + "⥻": "⥻", + "⫂": "⫂", + "⫌": "⫌", + "⊋": "⊋", + "⫀": "⫀", + "⊃": "⊃", + "⊇": "⊇", + "⫆": "⫆", + "⊋": "⊋", + "⫌": "⫌", + "⫈": "⫈", + "⫔": "⫔", + "⫖": "⫖", + "⇙": "⇙", + "⤦": "⤦", + "↙": "↙", + "↙": "↙", + "⤪": "⤪", + "ß": "ß", + "⌖": "⌖", + "τ": "τ", + "⎴": "⎴", + "ť": "ť", + "ţ": "ţ", + "т": "т", + "⃛": "⃛", + "⌕": "⌕", + "𝔱": "𝔱", + "∴": "∴", + "∴": "∴", + "θ": "θ", + "ϑ": "ϑ", + "ϑ": "ϑ", + "≈": "≈", + "∼": "∼", + " ": " ", + "≈": "≈", + "∼": "∼", + "þ": "þ", + "˜": "˜", + "×": "×", + "⊠": "⊠", + "⨱": "⨱", + "⨰": "⨰", + "∭": "∭", + "⤨": "⤨", + "⊤": "⊤", + "⌶": "⌶", + "⫱": "⫱", + "𝕥": "𝕥", + "⫚": "⫚", + "⤩": "⤩", + "‴": "‴", + "™": "™", + "▵": "▵", + "▿": "▿", + "◃": "◃", + "⊴": "⊴", + "≜": "≜", + "▹": "▹", + "⊵": "⊵", + "◬": "◬", + "≜": "≜", + "⨺": "⨺", + "⨹": "⨹", + "⧍": "⧍", + "⨻": "⨻", + "⏢": "⏢", + "𝓉": "𝓉", + "ц": "ц", + "ћ": "ћ", + "ŧ": "ŧ", + "≬": "≬", + "↞": "↞", + "↠": "↠", + "⇑": "⇑", + "⥣": "⥣", + "ú": "ú", + "↑": "↑", + "ў": "ў", + "ŭ": "ŭ", + "û": "û", + "у": "у", + "⇅": "⇅", + "ű": "ű", + "⥮": "⥮", + "⥾": "⥾", + "𝔲": "𝔲", + "ù": "ù", + "↿": "↿", + "↾": "↾", + "▀": "▀", + "⌜": "⌜", + "⌜": "⌜", + "⌏": "⌏", + "◸": "◸", + "ū": "ū", + "¨": "¨", + "ų": "ų", + "𝕦": "𝕦", + "↑": "↑", + "↕": "↕", + "↿": "↿", + "↾": "↾", + "⊎": "⊎", + "υ": "υ", + "ϒ": "ϒ", + "υ": "υ", + "⇈": "⇈", + "⌝": "⌝", + "⌝": "⌝", + "⌎": "⌎", + "ů": "ů", + "◹": "◹", + "𝓊": "𝓊", + "⋰": "⋰", + "ũ": "ũ", + "▵": "▵", + "▴": "▴", + "⇈": "⇈", + "ü": "ü", + "⦧": "⦧", + "⇕": "⇕", + "⫨": "⫨", + "⫩": "⫩", + "⊨": "⊨", + "⦜": "⦜", + "ϵ": "ϵ", + "ϰ": "ϰ", + "∅": "∅", + "ϕ": "ϕ", + "ϖ": "ϖ", + "∝": "∝", + "↕": "↕", + "ϱ": "ϱ", + "ς": "ς", + "⊊︀": "⊊︀", + "⫋︀": "⫋︀", + "⊋︀": "⊋︀", + "⫌︀": "⫌︀", + "ϑ": "ϑ", + "⊲": "⊲", + "⊳": "⊳", + "в": "в", + "⊢": "⊢", + "∨": "∨", + "⊻": "⊻", + "≚": "≚", + "⋮": "⋮", + "|": "|", + "|": "|", + "𝔳": "𝔳", + "⊲": "⊲", + "⊂⃒": "⊂⃒", + "⊃⃒": "⊃⃒", + "𝕧": "𝕧", + "∝": "∝", + "⊳": "⊳", + "𝓋": "𝓋", + "⫋︀": "⫋︀", + "⊊︀": "⊊︀", + "⫌︀": "⫌︀", + "⊋︀": "⊋︀", + "⦚": "⦚", + "ŵ": "ŵ", + "⩟": "⩟", + "∧": "∧", + "≙": "≙", + "℘": "℘", + "𝔴": "𝔴", + "𝕨": "𝕨", + "℘": "℘", + "≀": "≀", + "≀": "≀", + "𝓌": "𝓌", + "⋂": "⋂", + "◯": "◯", + "⋃": "⋃", + "▽": "▽", + "𝔵": "𝔵", + "⟺": "⟺", + "⟷": "⟷", + "ξ": "ξ", + "⟸": "⟸", + "⟵": "⟵", + "⟼": "⟼", + "⋻": "⋻", + "⨀": "⨀", + "𝕩": "𝕩", + "⨁": "⨁", + "⨂": "⨂", + "⟹": "⟹", + "⟶": "⟶", + "𝓍": "𝓍", + "⨆": "⨆", + "⨄": "⨄", + "△": "△", + "⋁": "⋁", + "⋀": "⋀", + "ý": "ý", + "я": "я", + "ŷ": "ŷ", + "ы": "ы", + "¥": "¥", + "𝔶": "𝔶", + "ї": "ї", + "𝕪": "𝕪", + "𝓎": "𝓎", + "ю": "ю", + "ÿ": "ÿ", + "ź": "ź", + "ž": "ž", + "з": "з", + "ż": "ż", + "ℨ": "ℨ", + "ζ": "ζ", + "𝔷": "𝔷", + "ж": "ж", + "⇝": "⇝", + "𝕫": "𝕫", + "𝓏": "𝓏", + "‍": "", + "‌": "" +};
diff --git a/lib/src/ast.dart b/lib/src/ast.dart index c9fd8e7..3fb2561 100644 --- a/lib/src/ast.dart +++ b/lib/src/ast.dart
@@ -58,7 +58,7 @@ final children = this.children; return children == null ? '' - : children.map((child) => child.textContent).join(''); + : children.map((child) => child.textContent).join(); } }
diff --git a/lib/src/block_parser.dart b/lib/src/block_parser.dart index beaa46a..9289ae1 100644 --- a/lib/src/block_parser.dart +++ b/lib/src/block_parser.dart
@@ -91,6 +91,10 @@ _pos++; } + void retreat() { + _pos--; + } + bool get isDone => _pos >= lines.length; /// Gets whether or not the current line matches the given pattern. @@ -107,11 +111,28 @@ List<Node> parseLines() { final blocks = <Node>[]; + + // If the `_pos` does not change before and after `parse()`, never try to + // parse the line at `_pos` with the same syntax again. + // For example the `TableSyntax` might not advance the `_pos` in `parse` + // method, beause of the header row does not match the delimiter row in the + // number of cells, which makes a table like structure not be recognized. + BlockSyntax? neverMatch; + while (!isDone) { for (final syntax in blockSyntaxes) { + if (neverMatch == syntax) { + continue; + } + if (syntax.canParse(this)) { + final positionBefore = _pos; final block = syntax.parse(this); - if (block != null) blocks.add(block); + if (block != null) { + blocks.add(block); + } + neverMatch = _pos != positionBefore ? null : syntax; + break; } }
diff --git a/lib/src/block_syntaxes/blockquote_syntax.dart b/lib/src/block_syntaxes/blockquote_syntax.dart index 7d16e55..00b7560 100644 --- a/lib/src/block_syntaxes/blockquote_syntax.dart +++ b/lib/src/block_syntaxes/blockquote_syntax.dart
@@ -21,7 +21,7 @@ // Grab all of the lines that form the blockquote, stripping off the ">". final childLines = <String>[]; - bool encounteredCodeBlock = false; + var encounteredCodeBlock = false; while (!parser.isDone) { final match = pattern.firstMatch(parser.current); if (match != null) {
diff --git a/lib/src/block_syntaxes/fenced_code_block_syntax.dart b/lib/src/block_syntaxes/fenced_code_block_syntax.dart index a64e031..0b55f4a 100644 --- a/lib/src/block_syntaxes/fenced_code_block_syntax.dart +++ b/lib/src/block_syntaxes/fenced_code_block_syntax.dart
@@ -28,8 +28,8 @@ // // > If the info string comes after a backtick fence, it may not contain // > any backtick characters. - return (codeFence.codeUnitAt(0) != $backquote || - !infoString!.codeUnits.contains($backquote)); + return codeFence.codeUnitAt(0) != $backquote || + !infoString!.codeUnits.contains($backquote); } @override @@ -81,6 +81,7 @@ if (firstSpace >= 0) { infoString = infoString.substring(0, firstSpace); } + infoString = decodeHtmlCharacters(infoString); if (parser.document.encodeHtml) { infoString = escapeHtmlAttribute(infoString); }
diff --git a/lib/src/block_syntaxes/list_syntax.dart b/lib/src/block_syntaxes/list_syntax.dart index 4b7619f..7b6d0b1 100644 --- a/lib/src/block_syntaxes/list_syntax.dart +++ b/lib/src/block_syntaxes/list_syntax.dart
@@ -83,13 +83,13 @@ final pattern = RegExp(r'^ {0,3}\[([ xX])\][ \t]'); if (taskListParserEnabled && pattern.hasMatch(text)) { - return text.replaceFirstMapped(pattern, ((match) { + return text.replaceFirstMapped(pattern, (match) { taskListItemState = match[1] == ' ' ? TaskListItemState.unchecked : TaskListItemState.checked; return ''; - })); + }); } else { taskListItemState = null; return text;
diff --git a/lib/src/block_syntaxes/table_syntax.dart b/lib/src/block_syntaxes/table_syntax.dart index a63540f..fbd63c9 100644 --- a/lib/src/block_syntaxes/table_syntax.dart +++ b/lib/src/block_syntaxes/table_syntax.dart
@@ -36,6 +36,7 @@ final columnCount = alignments.length; final headRow = _parseRow(parser, alignments, 'th'); if (headRow.children!.length != columnCount) { + parser.retreat(); return null; } final head = Element('thead', [headRow]); @@ -50,7 +51,7 @@ if (children != null) { while (children.length < columnCount) { // Insert synthetic empty cells. - children.add(Element.empty('td')); + children.add(Element('td', const [])); } while (children.length > columnCount) { children.removeLast(); @@ -71,29 +72,42 @@ } List<String?> _parseAlignments(String line) { - final startIndex = _walkPastOpeningPipe(line); + final columns = <String?>[]; + // Set the value to `true` when hitting a non whitespace character other + // than the first pipe character. + var started = false; + var hitDash = false; + String? alignment; - var endIndex = line.length - 1; - while (endIndex > 0) { - final ch = line.codeUnitAt(endIndex); - if (ch == $pipe) { - endIndex--; - break; + for (var i = 0; i < line.length; i++) { + final char = line.codeUnitAt(i); + if (char == $space || char == $tab || (!started && char == $pipe)) { + continue; } - if (ch != $space && ch != $tab) { - break; + started = true; + + if (char == $colon) { + if (hitDash) { + alignment = alignment == 'left' ? 'center' : 'right'; + } else { + alignment = 'left'; + } } - endIndex--; + + if (char == $pipe) { + columns.add(alignment); + hitDash = false; + alignment = null; + } else { + hitDash = true; + } } - // Optimization: We walk [line] too many times. One lap should do it. - return line.substring(startIndex, endIndex + 1).split('|').map((column) { - column = column.trim(); - if (column.startsWith(':') && column.endsWith(':')) return 'center'; - if (column.startsWith(':')) return 'left'; - if (column.endsWith(':')) return 'right'; - return null; - }).toList(growable: false); + if (hitDash) { + columns.add(alignment); + } + + return columns; } /// Parses a table row at the current line into a table row element, with @@ -166,7 +180,7 @@ for (var i = 0; i < row.length && i < alignments.length; i++) { if (alignments[i] == null) continue; - row[i].attributes['style'] = 'text-align: ${alignments[i]};'; + row[i].attributes['align'] = '${alignments[i]}'; } return Element('tr', row);
diff --git a/lib/src/extension_set.dart b/lib/src/extension_set.dart index d9d2e38..a7bf1ee 100644 --- a/lib/src/extension_set.dart +++ b/lib/src/extension_set.dart
@@ -1,11 +1,10 @@ -import 'package:markdown/src/block_syntaxes/ordered_list_with_checkbox_syntax.dart'; -import 'package:markdown/src/block_syntaxes/unordered_list_with_checkbox_syntax.dart'; - import 'block_syntaxes/block_syntax.dart'; import 'block_syntaxes/fenced_code_block_syntax.dart'; import 'block_syntaxes/header_with_id_syntax.dart'; +import 'block_syntaxes/ordered_list_with_checkbox_syntax.dart'; import 'block_syntaxes/setext_header_with_id_syntax.dart'; import 'block_syntaxes/table_syntax.dart'; +import 'block_syntaxes/unordered_list_with_checkbox_syntax.dart'; import 'inline_syntaxes/autolink_extension_syntax.dart'; import 'inline_syntaxes/color_swatch_syntax.dart'; import 'inline_syntaxes/emoji_syntax.dart';
diff --git a/lib/src/html_renderer.dart b/lib/src/html_renderer.dart index a6abfcd..8b7dedc 100644 --- a/lib/src/html_renderer.dart +++ b/lib/src/html_renderer.dart
@@ -77,7 +77,12 @@ 'main', 'nav', 'section', - 'table' + 'table', + 'thead', + 'tbody', + 'th', + 'tr', + 'td', ]; /// Translates a parsed AST to HTML.
diff --git a/lib/src/inline_parser.dart b/lib/src/inline_parser.dart index 603d3da..e0f08c6 100644 --- a/lib/src/inline_parser.dart +++ b/lib/src/inline_parser.dart
@@ -7,6 +7,7 @@ import 'document.dart'; import 'inline_syntaxes/autolink_syntax.dart'; import 'inline_syntaxes/code_syntax.dart'; +import 'inline_syntaxes/decode_html_syntax.dart'; import 'inline_syntaxes/delimiter_syntax.dart'; import 'inline_syntaxes/email_autolink_syntax.dart'; import 'inline_syntaxes/emphasis_syntax.dart'; @@ -92,6 +93,7 @@ if (document.withDefaultInlineSyntaxes) { // Custom link resolvers go after the generic text syntax. syntaxes.addAll([ + DecodeHtmlSyntax(), LinkSyntax(linkResolver: document.linkResolver), ImageSyntax(linkResolver: document.imageLinkResolver) ]); @@ -153,9 +155,9 @@ return; } final syntax = delimiter.syntax; - if (syntax is LinkSyntax && syntaxes.any(((e) => e is LinkSyntax))) { + if (syntax is LinkSyntax && syntaxes.any((e) => e is LinkSyntax)) { final nodeIndex = _tree.lastIndexWhere((n) => n == delimiter.node); - final linkNode = syntax.close(this, delimiter, null, getChildren: () { + final linkNodes = syntax.close(this, delimiter, null, getChildren: () { _processDelimiterRun(index); // All of the nodes which lie past [index] are children of this // link/image. @@ -163,14 +165,14 @@ _tree.removeRange(nodeIndex + 1, _tree.length); return children; }); - if (linkNode != null) { + if (linkNodes != null) { _delimiterStack.removeAt(index); if (delimiter.char == $lbracket) { for (final d in _delimiterStack.sublist(0, index)) { if (d.char == $lbracket) d.isActive = false; } } - _tree[nodeIndex] = linkNode; + _tree.replaceRange(nodeIndex, _tree.length, linkNodes); advanceBy(1); start = pos; } else { @@ -240,7 +242,7 @@ final openerTextNodeIndex = _tree.indexOf(openerTextNode); final closerTextNode = closer.node; var closerTextNodeIndex = _tree.indexOf(closerTextNode); - final node = opener.syntax.close( + final nodes = opener.syntax.close( this, opener, closer, @@ -255,7 +257,7 @@ _tree.replaceRange( openerTextNodeIndex + 1, closerTextNodeIndex, - [node!], + nodes!, ); // Slide [closerTextNodeIndex] back accordingly. closerTextNodeIndex = openerTextNodeIndex + 2;
diff --git a/lib/src/inline_syntaxes/autolink_extension_syntax.dart b/lib/src/inline_syntaxes/autolink_extension_syntax.dart index ff2bc59..152b9a4 100644 --- a/lib/src/inline_syntaxes/autolink_extension_syntax.dart +++ b/lib/src/inline_syntaxes/autolink_extension_syntax.dart
@@ -3,134 +3,128 @@ // BSD-style license that can be found in the LICENSE file. import '../ast.dart'; +import '../charcode.dart'; import '../inline_parser.dart'; import '../util.dart'; import 'inline_syntax.dart'; -/// Matches autolinks like `http://foo.com`. +/// Matches autolinks like `http://foo.com` and `foo@bar.com`. class AutolinkExtensionSyntax extends InlineSyntax { - /// Broken up parts of the autolink regex for reusability and readability + static const _linkPattern = + // Autolinks can only come at the beginning of a line, after whitespace, + // or any of the delimiting characters *, _, ~, and (. + r'(?<=^|[\s*_~(>])' - // Autolinks can only come at the beginning of a line, after whitespace, or - // any of the delimiting characters *, _, ~, and (. - static const start = r'(?:^|[\s*_~(>])'; + // An extended url autolink will be recognised when one of the schemes + // http://, or https://, followed by a valid domain. See + // https://github.github.com/gfm/#extended-url-autolink. + r'(?:(?:https?|ftp):\/\/|www\.)' - // An extended url autolink will be recognized when one of the schemes - // http://, https://, or ftp://, followed by a valid domain - static const scheme = r'(?:(?:https?|ftp):\/\/|www\.)'; + // A valid domain consists of segments of alphanumeric characters, + // underscores (_) and hyphens (-) separated by periods (.). There must + // be at least one period, and no underscores may be present in the last + // two segments of the domain. See + // https://github.github.com/gfm/#valid-domain. + r'(?:[-_a-z0-9]+\.)*(?:[-a-z0-9]+\.[-a-z0-9]+)' - // A valid domain consists of alphanumeric characters, underscores (_), - // hyphens (-) and periods (.). There must be at least one period, and no - // underscores may be present in the last two segments of the domain. - static const domainPart = r'\w\-'; - static const domain = '[$domainPart][$domainPart.]+'; + // After a valid domain, zero or more non-space non-< characters may + // follow. + r'[^\s<]*' - // A valid domain consists of alphanumeric characters, underscores (_), - // hyphens (-) and periods (.). - static const path = r'[^\s<]*'; + // Trailing punctuation (specifically, ?, !, ., ,, :, *, _, and ~) will + // not be considered part of the autolink, though they may be included in + // the interior of the link. See + // https://github.github.com/gfm/#extended-autolink-path-validation. + '(?<![?!.,:*_~])'; - // Trailing punctuation (specifically, ?, !, ., ,, :, *, _, and ~) will not - // be considered part of the autolink - static const truncatingPunctuationPositive = '[?!.,:*_~]'; + // An extended email autolink, see + // https://github.github.com/gfm/#extended-email-autolink. + static const _emailPattern = + r'[-_.+a-z0-9]+@(?:[-_a-z0-9]+\.)+[-_a-z0-9]*[a-z0-9](?![-_])'; - static final regExpTrailingPunc = RegExp('$truncatingPunctuationPositive*\$'); - static final regExpEndsWithColon = RegExp(r'\&[a-zA-Z0-9]+;$'); - static final regExpWhiteSpace = RegExp(r'\s'); - - AutolinkExtensionSyntax() : super('$start(($scheme)($domain)($path))'); + AutolinkExtensionSyntax() + : super( + '($_linkPattern)|($_emailPattern)', + caseSensitive: false, + ); @override bool tryMatch(InlineParser parser, [int? startMatchPos]) { - return super.tryMatch(parser, parser.pos > 0 ? parser.pos - 1 : 0); + startMatchPos ??= parser.pos; + final startMatch = pattern.matchAsPrefix(parser.source, startMatchPos); + if (startMatch == null) { + return false; + } + parser.writeText(); + return onMatch(parser, startMatch); } @override bool onMatch(InlineParser parser, Match match) { - var url = match[1]!; - var href = url; - var matchLength = url.length; + int consumeLength; - if (url[0] == '>' || url.startsWith(regExpWhiteSpace)) { - url = url.substring(1, url.length - 1); - href = href.substring(1, href.length - 1); - parser.pos++; - matchLength--; + final isEmailLink = match[2] != null; + if (isEmailLink) { + consumeLength = match.match.length; + } else { + consumeLength = _getConsumeLength(match.match); } - // Prevent accidental standard autolink matches - if (url.endsWith('>') && parser.source[parser.pos - 1] == '<') { - return false; + var text = match.match.substring(0, consumeLength); + text = parser.encodeHtml ? escapeHtml(text) : text; + + var destination = text; + if (isEmailLink) { + destination = 'mailto:$destination'; + } else if (destination[0] == 'w') { + // When there is no scheme specified, insert the scheme `http`. + destination = 'http://$destination'; } - // When an autolink ends in ), we scan the entire autolink for the total - // number of parentheses. If there is a greater number of closing - // parentheses than opening ones, we don’t consider the last character - // part of the autolink, in order to facilitate including an autolink - // inside a parenthesis: - // https://github.github.com/gfm/#example-600 - if (url.endsWith(')')) { - final opening = _countChars(url, '('); - final closing = _countChars(url, ')'); + final anchor = Element.text('a', text) + ..attributes['href'] = Uri.encodeFull(destination); - if (closing > opening) { - url = url.substring(0, url.length - 1); - href = href.substring(0, href.length - 1); - matchLength--; - } - } + parser + ..addNode(anchor) + ..consume(consumeLength); - // Trailing punctuation (specifically, ?, !, ., ,, :, *, _, and ~) will - // not be considered part of the autolink, though they may be included - // in the interior of the link: - // https://github.github.com/gfm/#example-599 - final trailingPunc = regExpTrailingPunc.firstMatch(url); - if (trailingPunc != null) { - final trailingLength = trailingPunc.match.length; - url = url.substring(0, url.length - trailingLength); - href = href.substring(0, href.length - trailingLength); - matchLength -= trailingLength; - } - - // If an autolink ends in a semicolon (;), we check to see if it appears - // to resemble an - // [entity reference](https://github.github.com/gfm/#entity-references); - // if the preceding text is & followed by one or more alphanumeric - // characters. If so, it is excluded from the autolink: - // https://github.github.com/gfm/#example-602 - if (url.endsWith(';')) { - final entityRef = regExpEndsWithColon.firstMatch(url); - if (entityRef != null) { - // Strip out HTML entity reference - final entityRefLength = entityRef.match.length; - url = url.substring(0, url.length - entityRefLength); - href = href.substring(0, href.length - entityRefLength); - matchLength -= entityRefLength; - } - } - - // The scheme http will be inserted automatically - if (!href.startsWith('http://') && - !href.startsWith('https://') && - !href.startsWith('ftp://')) { - href = 'http://$href'; - } - - final text = parser.encodeHtml ? escapeHtml(url) : url; - final anchor = Element.text('a', text); - anchor.attributes['href'] = Uri.encodeFull(href); - parser.addNode(anchor); - - parser.consume(matchLength); - return false; + return true; } - int _countChars(String input, String char) { - var count = 0; + int _getConsumeLength(String text) { + var excludedLength = 0; - for (var i = 0; i < input.length; i++) { - if (input[i] == char) count++; + // When an autolink ends in `)`, see + // https://github.github.com/gfm/#example-625. + if (text.endsWith(')')) { + final match = RegExp(r'(\(.*)?(\)+)$').firstMatch(text)!; + + if (match[1] == null) { + excludedLength = match[2]!.length; + } else { + var parenCount = 0; + for (var i = 0; i < text.length; i++) { + final char = text.codeUnitAt(i); + if (char == $lparen) { + parenCount++; + } else if (char == $rparen) { + parenCount--; + } + } + if (parenCount < 0) { + excludedLength = parenCount.abs(); + } + } + } + // If an autolink ends in a semicolon `;`, see + // https://github.github.com/gfm/#example-627 + else if (text.endsWith(';')) { + final match = RegExp(r'&[0-9a-z]+;$').firstMatch(text); + if (match != null) { + excludedLength = match.match.length; + } } - return count; + return text.length - excludedLength; } }
diff --git a/lib/src/inline_syntaxes/decode_html_syntax.dart b/lib/src/inline_syntaxes/decode_html_syntax.dart new file mode 100644 index 0000000..348a6b2 --- /dev/null +++ b/lib/src/inline_syntaxes/decode_html_syntax.dart
@@ -0,0 +1,48 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import '../ast.dart'; +import '../charcode.dart'; +import '../inline_parser.dart'; +import '../patterns.dart'; +import '../util.dart'; +import 'inline_syntax.dart'; + +/// Decodes numeric character references, for example decode `#` to `#`. +// https://spec.commonmark.org/0.30/#entity-and-numeric-character-references +class DecodeHtmlSyntax extends InlineSyntax { + DecodeHtmlSyntax() + : super(htmlCharactersPattern.pattern, + caseSensitive: false, startCharacter: $ampersand); + + @override + bool tryMatch(InlineParser parser, [int? startMatchPos]) { + if (parser.pos > 0 && parser.charAt(parser.pos - 1) == $backquote) { + return false; + } + + final match = pattern.matchAsPrefix(parser.source, parser.pos); + if (match == null) { + return false; + } + + // TODO(Zhiguang): Enable HTML entity decoding when working on HTML escape + // issues. + if (match[1] != null) { + return false; + } + + parser.writeText(); + if (onMatch(parser, match)) parser.consume(match.match.length); + return true; + } + + @override + bool onMatch(InlineParser parser, Match match) { + final decodedText = decodeHtmlCharacterFromMatch(match); + + parser.addNode(Text(decodedText)); + return true; + } +}
diff --git a/lib/src/inline_syntaxes/delimiter_syntax.dart b/lib/src/inline_syntaxes/delimiter_syntax.dart index a616cfb..712883f 100644 --- a/lib/src/inline_syntaxes/delimiter_syntax.dart +++ b/lib/src/inline_syntaxes/delimiter_syntax.dart
@@ -83,15 +83,15 @@ /// /// If a tag can be closed at the current position, then this method calls /// [getChildren], in which [parser] parses any nested text into child nodes. - /// The returned [Node] incorpororates these child nodes. - Node? close( + /// The returned [Iterable] includes these children nodes. + Iterable<Node>? close( InlineParser parser, Delimiter opener, Delimiter closer, { required String tag, required List<Node> Function() getChildren, }) { - return Element(tag, getChildren()); + return [Element(tag, getChildren())]; } }
diff --git a/lib/src/inline_syntaxes/link_syntax.dart b/lib/src/inline_syntaxes/link_syntax.dart index 7522036..0546b93 100644 --- a/lib/src/inline_syntaxes/link_syntax.dart +++ b/lib/src/inline_syntaxes/link_syntax.dart
@@ -9,6 +9,16 @@ import '../util.dart'; import 'delimiter_syntax.dart'; +/// A helper class holds params of link context. +/// Footnote creation needs other info in [_tryCreateReferenceLink]. +class _LinkContext { + final InlineParser parser; + final SimpleDelimiter opener; + final List<Node> Function() getChildren; + + const _LinkContext(this.parser, this.opener, this.getChildren); +} + /// Matches links like `[blah][label]` and `[blah](url)`. class LinkSyntax extends DelimiterSyntax { static final _entirelyWhitespacePattern = RegExp(r'^\s*$'); @@ -23,13 +33,14 @@ super(pattern, startCharacter: startCharacter); @override - Node? close( + Iterable<Node>? close( InlineParser parser, covariant SimpleDelimiter opener, Delimiter? closer, { String? tag, required List<Node> Function() getChildren, }) { + final context = _LinkContext(parser, opener, getChildren); final text = parser.source.substring(opener.endPos, parser.pos); // The current character is the `]` that closed the link text. Examine the // next character, to determine what type of link we might have (a '(' @@ -37,7 +48,7 @@ if (parser.pos + 1 >= parser.source.length) { // The `]` is at the end of the document, but this may still be a valid // shortcut reference link. - return _tryCreateReferenceLink(parser, text, getChildren: getChildren); + return _tryCreateReferenceLink(context, text); } // Peek at the next character; don't advance, so as to avoid later stepping @@ -50,11 +61,13 @@ final leftParenIndex = parser.pos; final inlineLink = _parseInlineLink(parser); if (inlineLink != null) { - return _tryCreateInlineLink( - parser, - inlineLink, - getChildren: getChildren, - ); + return [ + _tryCreateInlineLink( + parser, + inlineLink, + getChildren: getChildren, + ), + ]; } // At this point, we've matched `[...](`, but that `(` did not pan out to // be an inline link. We must now check if `[...]` is simply a shortcut @@ -63,7 +76,7 @@ // Reset the parser position. parser.pos = leftParenIndex; parser.advanceBy(-1); - return _tryCreateReferenceLink(parser, text, getChildren: getChildren); + return _tryCreateReferenceLink(context, text); } if (char == $lbracket) { @@ -75,18 +88,18 @@ // That opening `[` is not actually part of the link. Maybe a // *shortcut* reference link (followed by a `[`). parser.advanceBy(1); - return _tryCreateReferenceLink(parser, text, getChildren: getChildren); + return _tryCreateReferenceLink(context, text); } final label = _parseReferenceLinkLabel(parser); if (label != null) { - return _tryCreateReferenceLink(parser, label, getChildren: getChildren); + return _tryCreateReferenceLink(context, label); } return null; } // The link text (inside `[...]`) was not followed with a opening `(` nor // an opening `[`. Perhaps just a simple shortcut reference link (`[...]`). - return _tryCreateReferenceLink(parser, text, getChildren: getChildren); + return _tryCreateReferenceLink(context, text); } /// Resolve a possible reference link. @@ -148,17 +161,23 @@ /// Tries to create a reference link node. /// - /// Returns the link if it was successfully created, `null` otherwise. - Node? _tryCreateReferenceLink( - InlineParser parser, - String label, { - required List<Node> Function() getChildren, - }) { - return _resolveReferenceLink( + /// Returns the nodes if it was successfully created, `null` otherwise. + Iterable<Node>? _tryCreateReferenceLink( + _LinkContext context, + String label, + ) { + final parser = context.parser; + final getChildren = context.getChildren; + final link = _resolveReferenceLink( label, parser.document.linkReferences, getChildren: getChildren, ); + if (link != null) { + return [link]; + } + // TODO: add footnote creation here + return null; } // Tries to create an inline link node.
diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index 67b33ad..c13600d 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart
@@ -198,3 +198,10 @@ // HTML tag is legal or not. '(?<condition_7>(?:$namedTagDefinition)\\s*\$))', caseSensitive: false); + +/// A pattern to match HTML entity references and numeric character references. +// https://spec.commonmark.org/0.30/#entity-and-numeric-character-references +final htmlCharactersPattern = RegExp( + '&(?:([a-z0-9]+)|#([0-9]{1,7})|#x([a-f0-9]{1,6}));', + caseSensitive: false, +);
diff --git a/lib/src/util.dart b/lib/src/util.dart index 32462ea..05ec697 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart
@@ -5,7 +5,9 @@ import 'dart:convert'; import 'assets/case_folding.dart'; +import 'assets/html_entities.dart'; import 'charcode.dart'; +import 'patterns.dart'; String escapeHtml(String html) => const HtmlEscape(HtmlEscapeMode.element).convert(html); @@ -96,6 +98,51 @@ return text; } +/// Decodes HTML entity and numeric character references, for example decode +/// `#` to `#`. +String decodeHtmlCharacters(String input) => + input.replaceAllMapped(htmlCharactersPattern, decodeHtmlCharacterFromMatch); + +/// Decodes HTML entity and numeric character references from the given [match]. +String decodeHtmlCharacterFromMatch(Match match) { + final text = match.match; + final entity = match[1]; + final decimalNumber = match[2]; + final hexadecimalNumber = match[3]; + + // Entity references, see + // https://spec.commonmark.org/0.30/#entity-references. + if (entity != null) { + return htmlEntitiesMap[text] ?? text; + } + + // Decimal numeric character references, see + // https://spec.commonmark.org/0.30/#decimal-numeric-character-references. + else if (decimalNumber != null) { + final decimalValue = int.parse(decimalNumber); + int hexValue; + if (decimalValue < 1114112 && decimalValue > 1) { + hexValue = int.parse(decimalValue.toRadixString(16), radix: 16); + } else { + hexValue = 0xFFFd; + } + + return String.fromCharCode(hexValue); + } + + // Hexadecimal numeric character references, see + // https://spec.commonmark.org/0.30/#hexadecimal-numeric-character-references. + else if (hexadecimalNumber != null) { + var hexValue = int.parse(hexadecimalNumber, radix: 16); + if (hexValue > 0x10ffff || hexValue == 0) { + hexValue = 0xFFFd; + } + return String.fromCharCode(hexValue); + } + + return text; +} + extension MatchExtensions on Match { /// Returns the whole match String String get match => this[0]!;
diff --git a/lib/src/version.dart b/lib/src/version.dart index 1806888..0c814be 100644 --- a/lib/src/version.dart +++ b/lib/src/version.dart
@@ -1,2 +1,2 @@ // Generated code. Do not modify. -const packageVersion = '6.0.2-dev'; +const packageVersion = '7.0.0-dev';
diff --git a/pubspec.yaml b/pubspec.yaml index 470875d..b44329b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml
@@ -1,5 +1,5 @@ name: markdown -version: 6.0.2-dev +version: 7.0.0-dev description: A portable Markdown library written in Dart that can parse Markdown into HTML.
diff --git a/test/common_mark/entity_and_numeric_character_references.unit b/test/common_mark/entity_and_numeric_character_references.unit index f26a97b..da96678 100644 --- a/test/common_mark/entity_and_numeric_character_references.unit +++ b/test/common_mark/entity_and_numeric_character_references.unit
@@ -9,11 +9,11 @@ >>> Entity and numeric character references - 26 # Ӓ Ϡ � <<< -<p># Ӓ Ϡ �</p> +<p># Ӓ Ϡ �</p> >>> Entity and numeric character references - 27 " ആ ಫ <<< -<p>" ആ ಫ</p> +<p>" ആ ಫ</p> >>> Entity and numeric character references - 28   &x; &#; &#x; � @@ -51,7 +51,7 @@ foo ``` <<< -<pre><code class="language-f&ouml;&ouml;">foo +<pre><code class="language-föö">foo </code></pre> >>> Entity and numeric character references - 35 `föö` @@ -66,25 +66,27 @@ *foo* *foo* <<< -<p>*foo* +<p>*foo* <em>foo</em></p> >>> Entity and numeric character references - 38 * foo * foo <<< -<p>* foo</p> +<p>* foo</p> <ul> <li>foo</li> </ul> >>> Entity and numeric character references - 39 foo bar <<< -<p>foo bar</p> +<p>foo + +bar</p> >>> Entity and numeric character references - 40 	foo <<< -<p>	foo</p> +<p>foo</p> >>> Entity and numeric character references - 41 [a](url "tit") <<<
diff --git a/test/document_test.dart b/test/document_test.dart index 42ca40f..a9a8be7 100644 --- a/test/document_test.dart +++ b/test/document_test.dart
@@ -20,7 +20,7 @@ }); group('with encodeHtml enabled', () { - final document = Document(encodeHtml: true); + final document = Document(); test('encodes HTML in an inline code snippet', () { final result = @@ -55,7 +55,7 @@ test('encodeHtml spaces are preserved in text', () { // Example to get a <p> tag rendered before a text node. const contents = 'Sample\n\n<pre>\n A\n B\n</pre>'; - final document = Document(encodeHtml: true); + final document = Document(); final lines = LineSplitter.split(contents).toList(); final nodes = BlockParser(lines, document).parseLines(); final result = HtmlRenderer().render(nodes); @@ -65,7 +65,7 @@ test('encode double quotes, greater than, and less than when escaped', () { const contents = r'\>\"\< Hello'; - final document = Document(encodeHtml: true); + final document = Document(); final nodes = document.parseInline(contents); expect(nodes, hasLength(1)); expect(
diff --git a/test/extensions/tables.unit b/test/extensions/tables.unit index 9516fb3..2f076df 100644 --- a/test/extensions/tables.unit +++ b/test/extensions/tables.unit
@@ -4,7 +4,20 @@ body | cells <<< -<table><thead><tr><th>head</th><th>cells</th></tr></thead><tbody><tr><td>body</td><td>cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +<th>cells</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +<td>cells</td> +</tr> +</tbody> +</table> >>> multiple rows head | cells -----|------ @@ -12,40 +25,124 @@ more | cells <<< -<table><thead><tr><th>head</th><th>cells</th></tr></thead><tbody><tr><td>body</td><td>cells</td></tr><tr><td>more</td><td>cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +<th>cells</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +<td>cells</td> +</tr> +<tr> +<td>more</td> +<td>cells</td> +</tr> +</tbody> +</table> >>> rows wrapped in pipes | head | cells | |------|-------| | body | cells | <<< -<table><thead><tr><th>head</th><th>cells</th></tr></thead><tbody><tr><td>body</td><td>cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +<th>cells</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +<td>cells</td> +</tr> +</tbody> +</table> >>> rows wrapped in pipes, whitespace alignment row | head | cells | | -- | --- | | body | cells | <<< -<table><thead><tr><th>head</th><th>cells</th></tr></thead><tbody><tr><td>body</td><td>cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +<th>cells</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +<td>cells</td> +</tr> +</tbody> +</table> >>> rows wrapped in pipes, tabs in whitespace | head | cells | | -- | --- | | body | cells | <<< -<table><thead><tr><th>head</th><th>cells</th></tr></thead><tbody><tr><td>body</td><td>cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +<th>cells</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +<td>cells</td> +</tr> +</tbody> +</table> >>> cells with inline syntax head `code` | _cells_ ------------|-------- *text* | <span>text</span> <<< -<table><thead><tr><th>head <code>code</code></th><th><em>cells</em></th></tr></thead><tbody><tr><td><em>text</em></td><td><span>text</span></td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head <code>code</code></th> +<th><em>cells</em></th> +</tr> +</thead> +<tbody> +<tr> +<td><em>text</em></td> +<td><span>text</span></td> +</tr> +</tbody> +</table> >>> cells are parsed before inline syntax header | _foo | bar_ -------|------------|--- text | text <<< -<table><thead><tr><th>header</th><th>_foo</th><th>bar_</th></tr></thead><tbody><tr><td>text</td><td>text</td><td /></tr></tbody></table> +<table> +<thead> +<tr> +<th>header</th> +<th>_foo</th> +<th>bar_</th> +</tr> +</thead> +<tbody> +<tr> +<td>text</td> +<td>text</td> +<td></td> +</tr> +</tbody> +</table> >>> cells contain reference links header | header -------|-------- @@ -53,20 +150,64 @@ [here]: http://url <<< -<table><thead><tr><th>header</th><th>header</th></tr></thead><tbody><tr><td>text</td><td><a href="http://url">link</a></td></tr></tbody></table> +<table> +<thead> +<tr> +<th>header</th> +<th>header</th> +</tr> +</thead> +<tbody> +<tr> +<td>text</td> +<td><a href="http://url">link</a></td> +</tr> +</tbody> +</table> >>> one column tables head -----| body <<< -<table><thead><tr><th>head</th></tr></thead><tbody><tr><td>body</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +</tr> +</tbody> +</table> >>> varying cells per row head | foo | bar -----|-----|----- body row with | two cells <<< -<table><thead><tr><th>head</th><th>foo</th><th>bar</th></tr></thead><tbody><tr><td>body</td><td /><td /></tr><tr><td>row with</td><td>two cells</td><td /></tr></tbody></table> +<table> +<thead> +<tr> +<th>head</th> +<th>foo</th> +<th>bar</th> +</tr> +</thead> +<tbody> +<tr> +<td>body</td> +<td></td> +<td></td> +</tr> +<tr> +<td>row with</td> +<td>two cells</td> +<td></td> +</tr> +</tbody> +</table> >>> left, center, and right alignment head | cells | here :----|:-----:|----: @@ -74,7 +215,27 @@ too | many | cells | here <<< -<table><thead><tr><th style="text-align: left;">head</th><th style="text-align: center;">cells</th><th style="text-align: right;">here</th></tr></thead><tbody><tr><td style="text-align: left;">body</td><td style="text-align: center;">cells</td><td style="text-align: right;">here</td></tr><tr><td style="text-align: left;">too</td><td style="text-align: center;">many</td><td style="text-align: right;">cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th align="left">head</th> +<th align="center">cells</th> +<th align="right">here</th> +</tr> +</thead> +<tbody> +<tr> +<td align="left">body</td> +<td align="center">cells</td> +<td align="right">here</td> +</tr> +<tr> +<td align="left">too</td> +<td align="center">many</td> +<td align="right">cells</td> +</tr> +</tbody> +</table> >>> left, center, and right alignment, with whitespace head | cells | here :-- | :---: | ---: @@ -82,7 +243,27 @@ too | many | cells | here <<< -<table><thead><tr><th style="text-align: left;">head</th><th style="text-align: center;">cells</th><th style="text-align: right;">here</th></tr></thead><tbody><tr><td style="text-align: left;">body</td><td style="text-align: center;">cells</td><td style="text-align: right;">here</td></tr><tr><td style="text-align: left;">too</td><td style="text-align: center;">many</td><td style="text-align: right;">cells</td></tr></tbody></table> +<table> +<thead> +<tr> +<th align="left">head</th> +<th align="center">cells</th> +<th align="right">here</th> +</tr> +</thead> +<tbody> +<tr> +<td align="left">body</td> +<td align="center">cells</td> +<td align="right">here</td> +</tr> +<tr> +<td align="left">too</td> +<td align="center">many</td> +<td align="right">cells</td> +</tr> +</tbody> +</table> >>> escape pipe | Name | Character | | --- | --- | @@ -90,17 +271,60 @@ | Pipe | \| | <<< -<table><thead><tr><th>Name</th><th>Character</th></tr></thead><tbody><tr><td>Backtick</td><td>`</td></tr><tr><td>Pipe</td><td>|</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>Name</th> +<th>Character</th> +</tr> +</thead> +<tbody> +<tr> +<td>Backtick</td> +<td>`</td> +</tr> +<tr> +<td>Pipe</td> +<td>|</td> +</tr> +</tbody> +</table> >>> escape pipe, preserve trailing whitespace | Name | Character | | --- | --- | | Pipe | \| abcdef | <<< -<table><thead><tr><th>Name</th><th>Character</th></tr></thead><tbody><tr><td>Pipe</td><td>| abcdef</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>Name</th> +<th>Character</th> +</tr> +</thead> +<tbody> +<tr> +<td>Pipe</td> +<td>| abcdef</td> +</tr> +</tbody> +</table> >>> trailing whitespace after final pipe | Name | Character | | --- | --- | | Pipe | abcdef | <<< -<table><thead><tr><th>Name</th><th>Character</th></tr></thead><tbody><tr><td>Pipe</td><td>abcdef</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>Name</th> +<th>Character</th> +</tr> +</thead> +<tbody> +<tr> +<td>Pipe</td> +<td>abcdef</td> +</tr> +</tbody> +</table>
diff --git a/test/gfm/autolinks.unit b/test/gfm/autolinks.unit index d4c803b..4de9122 100644 --- a/test/gfm/autolinks.unit +++ b/test/gfm/autolinks.unit
@@ -57,7 +57,7 @@ >>> Autolinks - 616 < http://foo.bar > <<< -<p>< <a href="http://foo.bar">http://foo.bar</a> ></p> +<p>< http://foo.bar ></p> >>> Autolinks - 617 <m:abc> <<< @@ -69,7 +69,7 @@ >>> Autolinks - 619 http://example.com <<< -<p><a href="http://example.com">http://example.com</a></p> +<p>http://example.com</p> >>> Autolinks - 620 foo@bar.example.com <<<
diff --git a/test/gfm/autolinks_extension.unit b/test/gfm/autolinks_extension.unit index ac41184..024fde1 100644 --- a/test/gfm/autolinks_extension.unit +++ b/test/gfm/autolinks_extension.unit
@@ -23,9 +23,9 @@ (www.google.com/search?q=Markup+(business) <<< <p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p> -<p><a href="http://www.google.com/search?q=Markup+(business))">www.google.com/search?q=Markup+(business))</a>)</p> <p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p> -<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p> +<p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p> +<p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p> >>> Autolinks (extension) - 625 www.google.com/search?q=(business))+ok <<< @@ -35,7 +35,7 @@ www.google.com/search?q=commonmark&hl; <<< -<p><a href="http://www.google.com/search?q=commonmark&hl=en">www.google.com/search?q=commonmark&hl=en</a></p> +<p><a href="http://www.google.com/search?q=commonmark&hl=en">www.google.com/search?q=commonmark&hl=en</a></p> <p><a href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&hl;</p> >>> Autolinks (extension) - 627 www.commonmark.org/he<lp @@ -54,11 +54,11 @@ >>> Autolinks (extension) - 629 foo@bar.baz <<< -<p>foo@bar.baz</p> +<p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p> >>> Autolinks (extension) - 630 hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is. <<< -<p>hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.</p> +<p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p> >>> Autolinks (extension) - 631 a.b-c_d@a.b @@ -68,7 +68,7 @@ a.b-c_d@a.b_ <<< -<p>a.b-c_d@a.b</p> -<p>a.b-c_d@a.b.</p> +<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p> +<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p> <p>a.b-c_d@a.b-</p> <p>a.b-c_d@a.b_</p>
diff --git a/test/gfm/entity_and_numeric_character_references.unit b/test/gfm/entity_and_numeric_character_references.unit index 5405ac2..be80572 100644 --- a/test/gfm/entity_and_numeric_character_references.unit +++ b/test/gfm/entity_and_numeric_character_references.unit
@@ -9,11 +9,11 @@ >>> Entity and numeric character references - 322 # Ӓ Ϡ � <<< -<p># Ӓ Ϡ �</p> +<p># Ӓ Ϡ �</p> >>> Entity and numeric character references - 323 " ആ ಫ <<< -<p>" ആ ಫ</p> +<p>" ആ ಫ</p> >>> Entity and numeric character references - 324   &x; &#; &#x; � @@ -51,7 +51,7 @@ foo ``` <<< -<pre><code class="language-f&ouml;&ouml;">foo +<pre><code class="language-föö">foo </code></pre> >>> Entity and numeric character references - 331 `föö` @@ -66,25 +66,27 @@ *foo* *foo* <<< -<p>*foo* +<p>*foo* <em>foo</em></p> >>> Entity and numeric character references - 334 * foo * foo <<< -<p>* foo</p> +<p>* foo</p> <ul> <li>foo</li> </ul> >>> Entity and numeric character references - 335 foo bar <<< -<p>foo bar</p> +<p>foo + +bar</p> >>> Entity and numeric character references - 336 	foo <<< -<p>	foo</p> +<p>foo</p> >>> Entity and numeric character references - 337 [a](url "tit") <<<
diff --git a/test/gfm/tables_extension.unit b/test/gfm/tables_extension.unit index cd84708..625fca8 100644 --- a/test/gfm/tables_extension.unit +++ b/test/gfm/tables_extension.unit
@@ -3,27 +3,80 @@ | --- | --- | | baz | bim | <<< -<table><thead><tr><th>foo</th><th>bar</th></tr></thead><tbody><tr><td>baz</td><td>bim</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>foo</th> +<th>bar</th> +</tr> +</thead> +<tbody> +<tr> +<td>baz</td> +<td>bim</td> +</tr> +</tbody> +</table> >>> Tables (extension) - 199 | abc | defghi | :-: | -----------: bar | baz <<< -<table><thead><tr><th style="text-align: center;">abc</th><th style="text-align: right;">defghi</th></tr></thead><tbody><tr><td style="text-align: center;">bar</td><td style="text-align: right;">baz</td></tr></tbody></table> +<table> +<thead> +<tr> +<th align="center">abc</th> +<th align="right">defghi</th> +</tr> +</thead> +<tbody> +<tr> +<td align="center">bar</td> +<td align="right">baz</td> +</tr> +</tbody> +</table> >>> Tables (extension) - 200 | f\|oo | | ------ | | b `\|` az | | b **\|** im | <<< -<table><thead><tr><th>f|oo</th></tr></thead><tbody><tr><td>b <code>|</code> az</td></tr><tr><td>b <strong>|</strong> im</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>f|oo</th> +</tr> +</thead> +<tbody> +<tr> +<td>b <code>|</code> az</td> +</tr> +<tr> +<td>b <strong>|</strong> im</td> +</tr> +</tbody> +</table> >>> Tables (extension) - 201 | abc | def | | --- | --- | | bar | baz | > bar <<< -<table><thead><tr><th>abc</th><th>def</th></tr></thead><tbody><tr><td>bar</td><td>baz</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +<tbody> +<tr> +<td>bar</td> +<td>baz</td> +</tr> +</tbody> +</table> <blockquote> <p>bar</p> </blockquote> @@ -35,14 +88,32 @@ bar <<< -<table><thead><tr><th>abc</th><th>def</th></tr></thead><tbody><tr><td>bar</td><td>baz</td></tr><tr><td>bar</td><td /></tr></tbody></table> +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +<tbody> +<tr> +<td>bar</td> +<td>baz</td> +</tr> +<tr> +<td>bar</td> +<td></td> +</tr> +</tbody> +</table> <p>bar</p> >>> Tables (extension) - 203 | abc | def | | --- | | bar | <<< -<p>| --- | +<p>| abc | def | +| --- | | bar |</p> >>> Tables (extension) - 204 | abc | def | @@ -50,9 +121,33 @@ | bar | | bar | baz | boo | <<< -<table><thead><tr><th>abc</th><th>def</th></tr></thead><tbody><tr><td>bar</td><td /></tr><tr><td>bar</td><td>baz</td></tr></tbody></table> +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +<tbody> +<tr> +<td>bar</td> +<td></td> +</tr> +<tr> +<td>bar</td> +<td>baz</td> +</tr> +</tbody> +</table> >>> Tables (extension) - 205 | abc | def | | --- | --- | <<< -<table><thead><tr><th>abc</th><th>def</th></tr></thead></table> +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +</table>
diff --git a/test/html_renderer_test.dart b/test/html_renderer_test.dart index cc32869..77c33d3 100644 --- a/test/html_renderer_test.dart +++ b/test/html_renderer_test.dart
@@ -40,7 +40,6 @@ test('with only default block syntaxes', () { final result = markdownToHtml( text, - withDefaultBlockSyntaxes: true, withDefaultInlineSyntaxes: false, encodeHtml: false, ); @@ -55,7 +54,6 @@ final result = markdownToHtml( text, withDefaultBlockSyntaxes: false, - withDefaultInlineSyntaxes: true, encodeHtml: false, ); @@ -70,7 +68,6 @@ text, withDefaultBlockSyntaxes: false, withDefaultInlineSyntaxes: false, - encodeHtml: true, ); expect(
diff --git a/test/markdown_test.dart b/test/markdown_test.dart index 0b05c73..35fde7e 100644 --- a/test/markdown_test.dart +++ b/test/markdown_test.dart
@@ -8,7 +8,7 @@ import 'util.dart'; void main() async { - await testDirectory('original'); + testDirectory('original'); // Block syntax extensions. testFile( @@ -54,8 +54,8 @@ inlineSyntaxes: [StrikethroughSyntax()], ); - await testDirectory('common_mark'); - await testDirectory('gfm', extensionSet: ExtensionSet.gitHubFlavored); + testDirectory('common_mark'); + testDirectory('gfm'); group('Corner cases', () { validateCore('Incorrect Links', '''
diff --git a/test/util.dart b/test/util.dart index ad73c0c..fba598d 100644 --- a/test/util.dart +++ b/test/util.dart
@@ -2,41 +2,63 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'dart:isolate'; - import 'package:io/ansi.dart' as ansi; import 'package:markdown/markdown.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; + import '../tool/expected_output.dart'; /// Runs tests defined in "*.unit" files inside directory [name]. -Future<void> testDirectory(String name, {ExtensionSet? extensionSet}) async { - await for (final dataCase in dataCasesUnder(testDirectory: name)) { +void testDirectory(String name, {ExtensionSet? extensionSet}) { + for (final dataCase in dataCasesUnder(testDirectory: name)) { final description = '${dataCase.directory}/${dataCase.file}.unit ${dataCase.description}'; + + final inlineSyntaxes = <InlineSyntax>[]; + final blockSyntaxes = <BlockSyntax>[]; + + if (dataCase.file.endsWith('_extension')) { + final extension = dataCase.file.substring( + 0, + dataCase.file.lastIndexOf('_extension'), + ); + switch (extension) { + case 'autolinks': + inlineSyntaxes.add(AutolinkExtensionSyntax()); + break; + case 'strikethrough': + inlineSyntaxes.add(StrikethroughSyntax()); + break; + case 'tables': + blockSyntaxes.add(const TableSyntax()); + break; + case 'disallowed_raw_html': + // TODO(Zhiguang): https://github.com/dart-lang/markdown/pull/447 + break; + default: + throw UnimplementedError('Unimplemented extension "$extension"'); + } + } + validateCore( description, dataCase.input, dataCase.expectedOutput, extensionSet: extensionSet, + inlineSyntaxes: inlineSyntaxes, + blockSyntaxes: blockSyntaxes, ); } } -Future<String> get markdownPackageRoot async { - final packageUri = Uri.parse('package:markdown/markdown.dart'); - final isolateUri = await Isolate.resolvePackageUri(packageUri); - return p.dirname(p.dirname(isolateUri!.toFilePath())); -} - void testFile( String file, { Iterable<BlockSyntax> blockSyntaxes = const [], Iterable<InlineSyntax> inlineSyntaxes = const [], -}) async { - final directory = p.join(await markdownPackageRoot, 'test'); - for (final dataCase in dataCasesInFile(path: p.join(directory, file))) { +}) { + for (final dataCase + in dataCasesInFile(path: p.join(p.current, 'test', file))) { final description = '${dataCase.directory}/${dataCase.file}.unit ${dataCase.description}'; validateCore(
diff --git a/test/version_test.dart b/test/version_test.dart index 14763d3..4397ad1 100644 --- a/test/version_test.dart +++ b/test/version_test.dart
@@ -8,12 +8,9 @@ import 'package:test/test.dart'; import 'package:yaml/yaml.dart'; -import 'util.dart'; - void main() { test('check versions', () async { - final packageRoot = await markdownPackageRoot; - final binary = p.normalize(p.join(packageRoot, 'bin', 'markdown.dart')); + final binary = p.join(p.current, 'bin', 'markdown.dart'); final dartBin = Platform.executable; final result = Process.runSync(dartBin, [binary, '--version']); expect( @@ -26,7 +23,7 @@ final binVersion = (result.stdout as String).trim(); - final pubspecFile = p.normalize(p.join(packageRoot, 'pubspec.yaml')); + final pubspecFile = p.join(p.current, 'pubspec.yaml'); final pubspecContent = loadYaml(File(pubspecFile).readAsStringSync()) as YamlMap;
diff --git a/tool/common_mark_stats.json b/tool/common_mark_stats.json index f7dfee0..1de59bb 100644 --- a/tool/common_mark_stats.json +++ b/tool/common_mark_stats.json
@@ -244,7 +244,7 @@ }, "Entity and numeric character references": { "25": "loose", - "26": "loose", + "26": "strict", "27": "loose", "28": "loose", "29": "strict", @@ -252,12 +252,12 @@ "31": "strict", "32": "fail", "33": "fail", - "34": "fail", + "34": "strict", "35": "strict", "36": "strict", - "37": "loose", - "38": "loose", - "39": "loose", + "37": "strict", + "38": "strict", + "39": "strict", "40": "loose", "41": "strict" },
diff --git a/tool/common_mark_stats.txt b/tool/common_mark_stats.txt index 72a784c..3afa53c 100644 --- a/tool/common_mark_stats.txt +++ b/tool/common_mark_stats.txt
@@ -5,7 +5,7 @@ 23 of 25 – 92.0% Block quotes 22 of 22 – 100.0% Code spans 130 of 131 – 99.2% Emphasis and strong emphasis - 14 of 17 – 82.4% Entity and numeric character references + 15 of 17 – 88.2% Entity and numeric character references 28 of 29 – 96.6% Fenced code blocks 15 of 15 – 100.0% Hard line breaks 44 of 44 – 100.0% HTML blocks @@ -24,5 +24,5 @@ 11 of 11 – 100.0% Tabs 3 of 3 – 100.0% Textual content 19 of 19 – 100.0% Thematic breaks - 621 of 652 – 95.2% TOTAL - 554 of 621 – 89.2% TOTAL Strict + 622 of 652 – 95.4% TOTAL + 559 of 622 – 89.9% TOTAL Strict
diff --git a/tool/dartdoc_compare.dart b/tool/dartdoc_compare.dart index 7186d79..37be7fb 100644 --- a/tool/dartdoc_compare.dart +++ b/tool/dartdoc_compare.dart
@@ -27,7 +27,6 @@ ) ..addFlag( _sdk, - defaultsTo: false, negatable: false, help: 'Is the package the SDK?', ) @@ -146,12 +145,14 @@ // make modifiable copy dartdocPubspec = jsonDecode(jsonEncode(dartdocPubspec)) as Map; + final dependencies = dartdocPubspec['dependencies'] as Map; + if (markdownRef == 'local') { - dartdocPubspec['dependencies']['markdown'] = { + dependencies['markdown'] = { 'path': markdownPath, }; } else { - dartdocPubspec['dependencies']['markdown'] = { + dependencies['markdown'] = { 'git': { 'url': 'git://github.com/dart-lang/markdown.git', 'ref': markdownRef
diff --git a/tool/entities.json b/tool/entities.json new file mode 100644 index 0000000..557170b --- /dev/null +++ b/tool/entities.json
@@ -0,0 +1,2233 @@ +{ + "Æ": { "codepoints": [198], "characters": "\u00C6" }, + "Æ": { "codepoints": [198], "characters": "\u00C6" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "Á": { "codepoints": [193], "characters": "\u00C1" }, + "Á": { "codepoints": [193], "characters": "\u00C1" }, + "Ă": { "codepoints": [258], "characters": "\u0102" }, + "Â": { "codepoints": [194], "characters": "\u00C2" }, + "Â": { "codepoints": [194], "characters": "\u00C2" }, + "А": { "codepoints": [1040], "characters": "\u0410" }, + "𝔄": { "codepoints": [120068], "characters": "\uD835\uDD04" }, + "À": { "codepoints": [192], "characters": "\u00C0" }, + "À": { "codepoints": [192], "characters": "\u00C0" }, + "Α": { "codepoints": [913], "characters": "\u0391" }, + "Ā": { "codepoints": [256], "characters": "\u0100" }, + "⩓": { "codepoints": [10835], "characters": "\u2A53" }, + "Ą": { "codepoints": [260], "characters": "\u0104" }, + "𝔸": { "codepoints": [120120], "characters": "\uD835\uDD38" }, + "⁡": { "codepoints": [8289], "characters": "\u2061" }, + "Å": { "codepoints": [197], "characters": "\u00C5" }, + "Å": { "codepoints": [197], "characters": "\u00C5" }, + "𝒜": { "codepoints": [119964], "characters": "\uD835\uDC9C" }, + "≔": { "codepoints": [8788], "characters": "\u2254" }, + "Ã": { "codepoints": [195], "characters": "\u00C3" }, + "Ã": { "codepoints": [195], "characters": "\u00C3" }, + "Ä": { "codepoints": [196], "characters": "\u00C4" }, + "Ä": { "codepoints": [196], "characters": "\u00C4" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "⫧": { "codepoints": [10983], "characters": "\u2AE7" }, + "⌆": { "codepoints": [8966], "characters": "\u2306" }, + "Б": { "codepoints": [1041], "characters": "\u0411" }, + "∵": { "codepoints": [8757], "characters": "\u2235" }, + "ℬ": { "codepoints": [8492], "characters": "\u212C" }, + "Β": { "codepoints": [914], "characters": "\u0392" }, + "𝔅": { "codepoints": [120069], "characters": "\uD835\uDD05" }, + "𝔹": { "codepoints": [120121], "characters": "\uD835\uDD39" }, + "˘": { "codepoints": [728], "characters": "\u02D8" }, + "ℬ": { "codepoints": [8492], "characters": "\u212C" }, + "≎": { "codepoints": [8782], "characters": "\u224E" }, + "Ч": { "codepoints": [1063], "characters": "\u0427" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "Ć": { "codepoints": [262], "characters": "\u0106" }, + "⋒": { "codepoints": [8914], "characters": "\u22D2" }, + "ⅅ": { "codepoints": [8517], "characters": "\u2145" }, + "ℭ": { "codepoints": [8493], "characters": "\u212D" }, + "Č": { "codepoints": [268], "characters": "\u010C" }, + "Ç": { "codepoints": [199], "characters": "\u00C7" }, + "Ç": { "codepoints": [199], "characters": "\u00C7" }, + "Ĉ": { "codepoints": [264], "characters": "\u0108" }, + "∰": { "codepoints": [8752], "characters": "\u2230" }, + "Ċ": { "codepoints": [266], "characters": "\u010A" }, + "¸": { "codepoints": [184], "characters": "\u00B8" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "ℭ": { "codepoints": [8493], "characters": "\u212D" }, + "Χ": { "codepoints": [935], "characters": "\u03A7" }, + "⊙": { "codepoints": [8857], "characters": "\u2299" }, + "⊖": { "codepoints": [8854], "characters": "\u2296" }, + "⊕": { "codepoints": [8853], "characters": "\u2295" }, + "⊗": { "codepoints": [8855], "characters": "\u2297" }, + "∲": { "codepoints": [8754], "characters": "\u2232" }, + "”": { "codepoints": [8221], "characters": "\u201D" }, + "’": { "codepoints": [8217], "characters": "\u2019" }, + "∷": { "codepoints": [8759], "characters": "\u2237" }, + "⩴": { "codepoints": [10868], "characters": "\u2A74" }, + "≡": { "codepoints": [8801], "characters": "\u2261" }, + "∯": { "codepoints": [8751], "characters": "\u222F" }, + "∮": { "codepoints": [8750], "characters": "\u222E" }, + "ℂ": { "codepoints": [8450], "characters": "\u2102" }, + "∐": { "codepoints": [8720], "characters": "\u2210" }, + "∳": { "codepoints": [8755], "characters": "\u2233" }, + "⨯": { "codepoints": [10799], "characters": "\u2A2F" }, + "𝒞": { "codepoints": [119966], "characters": "\uD835\uDC9E" }, + "⋓": { "codepoints": [8915], "characters": "\u22D3" }, + "≍": { "codepoints": [8781], "characters": "\u224D" }, + "ⅅ": { "codepoints": [8517], "characters": "\u2145" }, + "⤑": { "codepoints": [10513], "characters": "\u2911" }, + "Ђ": { "codepoints": [1026], "characters": "\u0402" }, + "Ѕ": { "codepoints": [1029], "characters": "\u0405" }, + "Џ": { "codepoints": [1039], "characters": "\u040F" }, + "‡": { "codepoints": [8225], "characters": "\u2021" }, + "↡": { "codepoints": [8609], "characters": "\u21A1" }, + "⫤": { "codepoints": [10980], "characters": "\u2AE4" }, + "Ď": { "codepoints": [270], "characters": "\u010E" }, + "Д": { "codepoints": [1044], "characters": "\u0414" }, + "∇": { "codepoints": [8711], "characters": "\u2207" }, + "Δ": { "codepoints": [916], "characters": "\u0394" }, + "𝔇": { "codepoints": [120071], "characters": "\uD835\uDD07" }, + "´": { "codepoints": [180], "characters": "\u00B4" }, + "˙": { "codepoints": [729], "characters": "\u02D9" }, + "˝": { "codepoints": [733], "characters": "\u02DD" }, + "`": { "codepoints": [96], "characters": "\u0060" }, + "˜": { "codepoints": [732], "characters": "\u02DC" }, + "⋄": { "codepoints": [8900], "characters": "\u22C4" }, + "ⅆ": { "codepoints": [8518], "characters": "\u2146" }, + "𝔻": { "codepoints": [120123], "characters": "\uD835\uDD3B" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "⃜": { "codepoints": [8412], "characters": "\u20DC" }, + "≐": { "codepoints": [8784], "characters": "\u2250" }, + "∯": { "codepoints": [8751], "characters": "\u222F" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "⇓": { "codepoints": [8659], "characters": "\u21D3" }, + "⇐": { "codepoints": [8656], "characters": "\u21D0" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + "⫤": { "codepoints": [10980], "characters": "\u2AE4" }, + "⟸": { "codepoints": [10232], "characters": "\u27F8" }, + "⟺": { "codepoints": [10234], "characters": "\u27FA" }, + "⟹": { "codepoints": [10233], "characters": "\u27F9" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "⊨": { "codepoints": [8872], "characters": "\u22A8" }, + "⇑": { "codepoints": [8657], "characters": "\u21D1" }, + "⇕": { "codepoints": [8661], "characters": "\u21D5" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "⤓": { "codepoints": [10515], "characters": "\u2913" }, + "⇵": { "codepoints": [8693], "characters": "\u21F5" }, + "̑": { "codepoints": [785], "characters": "\u0311" }, + "⥐": { "codepoints": [10576], "characters": "\u2950" }, + "⥞": { "codepoints": [10590], "characters": "\u295E" }, + "↽": { "codepoints": [8637], "characters": "\u21BD" }, + "⥖": { "codepoints": [10582], "characters": "\u2956" }, + "⥟": { "codepoints": [10591], "characters": "\u295F" }, + "⇁": { "codepoints": [8641], "characters": "\u21C1" }, + "⥗": { "codepoints": [10583], "characters": "\u2957" }, + "⊤": { "codepoints": [8868], "characters": "\u22A4" }, + "↧": { "codepoints": [8615], "characters": "\u21A7" }, + "⇓": { "codepoints": [8659], "characters": "\u21D3" }, + "𝒟": { "codepoints": [119967], "characters": "\uD835\uDC9F" }, + "Đ": { "codepoints": [272], "characters": "\u0110" }, + "Ŋ": { "codepoints": [330], "characters": "\u014A" }, + "Ð": { "codepoints": [208], "characters": "\u00D0" }, + "Ð": { "codepoints": [208], "characters": "\u00D0" }, + "É": { "codepoints": [201], "characters": "\u00C9" }, + "É": { "codepoints": [201], "characters": "\u00C9" }, + "Ě": { "codepoints": [282], "characters": "\u011A" }, + "Ê": { "codepoints": [202], "characters": "\u00CA" }, + "Ê": { "codepoints": [202], "characters": "\u00CA" }, + "Э": { "codepoints": [1069], "characters": "\u042D" }, + "Ė": { "codepoints": [278], "characters": "\u0116" }, + "𝔈": { "codepoints": [120072], "characters": "\uD835\uDD08" }, + "È": { "codepoints": [200], "characters": "\u00C8" }, + "È": { "codepoints": [200], "characters": "\u00C8" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "Ē": { "codepoints": [274], "characters": "\u0112" }, + "◻": { "codepoints": [9723], "characters": "\u25FB" }, + "▫": { "codepoints": [9643], "characters": "\u25AB" }, + "Ę": { "codepoints": [280], "characters": "\u0118" }, + "𝔼": { "codepoints": [120124], "characters": "\uD835\uDD3C" }, + "Ε": { "codepoints": [917], "characters": "\u0395" }, + "⩵": { "codepoints": [10869], "characters": "\u2A75" }, + "≂": { "codepoints": [8770], "characters": "\u2242" }, + "⇌": { "codepoints": [8652], "characters": "\u21CC" }, + "ℰ": { "codepoints": [8496], "characters": "\u2130" }, + "⩳": { "codepoints": [10867], "characters": "\u2A73" }, + "Η": { "codepoints": [919], "characters": "\u0397" }, + "Ë": { "codepoints": [203], "characters": "\u00CB" }, + "Ë": { "codepoints": [203], "characters": "\u00CB" }, + "∃": { "codepoints": [8707], "characters": "\u2203" }, + "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, + "Ф": { "codepoints": [1060], "characters": "\u0424" }, + "𝔉": { "codepoints": [120073], "characters": "\uD835\uDD09" }, + "◼": { "codepoints": [9724], "characters": "\u25FC" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "𝔽": { "codepoints": [120125], "characters": "\uD835\uDD3D" }, + "∀": { "codepoints": [8704], "characters": "\u2200" }, + "ℱ": { "codepoints": [8497], "characters": "\u2131" }, + "ℱ": { "codepoints": [8497], "characters": "\u2131" }, + "Ѓ": { "codepoints": [1027], "characters": "\u0403" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + "Γ": { "codepoints": [915], "characters": "\u0393" }, + "Ϝ": { "codepoints": [988], "characters": "\u03DC" }, + "Ğ": { "codepoints": [286], "characters": "\u011E" }, + "Ģ": { "codepoints": [290], "characters": "\u0122" }, + "Ĝ": { "codepoints": [284], "characters": "\u011C" }, + "Г": { "codepoints": [1043], "characters": "\u0413" }, + "Ġ": { "codepoints": [288], "characters": "\u0120" }, + "𝔊": { "codepoints": [120074], "characters": "\uD835\uDD0A" }, + "⋙": { "codepoints": [8921], "characters": "\u22D9" }, + "𝔾": { "codepoints": [120126], "characters": "\uD835\uDD3E" }, + "≥": { "codepoints": [8805], "characters": "\u2265" }, + "⋛": { "codepoints": [8923], "characters": "\u22DB" }, + "≧": { "codepoints": [8807], "characters": "\u2267" }, + "⪢": { "codepoints": [10914], "characters": "\u2AA2" }, + "≷": { "codepoints": [8823], "characters": "\u2277" }, + "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, + "≳": { "codepoints": [8819], "characters": "\u2273" }, + "𝒢": { "codepoints": [119970], "characters": "\uD835\uDCA2" }, + "≫": { "codepoints": [8811], "characters": "\u226B" }, + "Ъ": { "codepoints": [1066], "characters": "\u042A" }, + "ˇ": { "codepoints": [711], "characters": "\u02C7" }, + "^": { "codepoints": [94], "characters": "\u005E" }, + "Ĥ": { "codepoints": [292], "characters": "\u0124" }, + "ℌ": { "codepoints": [8460], "characters": "\u210C" }, + "ℋ": { "codepoints": [8459], "characters": "\u210B" }, + "ℍ": { "codepoints": [8461], "characters": "\u210D" }, + "─": { "codepoints": [9472], "characters": "\u2500" }, + "ℋ": { "codepoints": [8459], "characters": "\u210B" }, + "Ħ": { "codepoints": [294], "characters": "\u0126" }, + "≎": { "codepoints": [8782], "characters": "\u224E" }, + "≏": { "codepoints": [8783], "characters": "\u224F" }, + "Е": { "codepoints": [1045], "characters": "\u0415" }, + "IJ": { "codepoints": [306], "characters": "\u0132" }, + "Ё": { "codepoints": [1025], "characters": "\u0401" }, + "Í": { "codepoints": [205], "characters": "\u00CD" }, + "Í": { "codepoints": [205], "characters": "\u00CD" }, + "Î": { "codepoints": [206], "characters": "\u00CE" }, + "Î": { "codepoints": [206], "characters": "\u00CE" }, + "И": { "codepoints": [1048], "characters": "\u0418" }, + "İ": { "codepoints": [304], "characters": "\u0130" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "Ì": { "codepoints": [204], "characters": "\u00CC" }, + "Ì": { "codepoints": [204], "characters": "\u00CC" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "Ī": { "codepoints": [298], "characters": "\u012A" }, + "ⅈ": { "codepoints": [8520], "characters": "\u2148" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "∬": { "codepoints": [8748], "characters": "\u222C" }, + "∫": { "codepoints": [8747], "characters": "\u222B" }, + "⋂": { "codepoints": [8898], "characters": "\u22C2" }, + "⁣": { "codepoints": [8291], "characters": "\u2063" }, + "⁢": { "codepoints": [8290], "characters": "\u2062" }, + "Į": { "codepoints": [302], "characters": "\u012E" }, + "𝕀": { "codepoints": [120128], "characters": "\uD835\uDD40" }, + "Ι": { "codepoints": [921], "characters": "\u0399" }, + "ℐ": { "codepoints": [8464], "characters": "\u2110" }, + "Ĩ": { "codepoints": [296], "characters": "\u0128" }, + "І": { "codepoints": [1030], "characters": "\u0406" }, + "Ï": { "codepoints": [207], "characters": "\u00CF" }, + "Ï": { "codepoints": [207], "characters": "\u00CF" }, + "Ĵ": { "codepoints": [308], "characters": "\u0134" }, + "Й": { "codepoints": [1049], "characters": "\u0419" }, + "𝔍": { "codepoints": [120077], "characters": "\uD835\uDD0D" }, + "𝕁": { "codepoints": [120129], "characters": "\uD835\uDD41" }, + "𝒥": { "codepoints": [119973], "characters": "\uD835\uDCA5" }, + "Ј": { "codepoints": [1032], "characters": "\u0408" }, + "Є": { "codepoints": [1028], "characters": "\u0404" }, + "Х": { "codepoints": [1061], "characters": "\u0425" }, + "Ќ": { "codepoints": [1036], "characters": "\u040C" }, + "Κ": { "codepoints": [922], "characters": "\u039A" }, + "Ķ": { "codepoints": [310], "characters": "\u0136" }, + "К": { "codepoints": [1050], "characters": "\u041A" }, + "𝔎": { "codepoints": [120078], "characters": "\uD835\uDD0E" }, + "𝕂": { "codepoints": [120130], "characters": "\uD835\uDD42" }, + "𝒦": { "codepoints": [119974], "characters": "\uD835\uDCA6" }, + "Љ": { "codepoints": [1033], "characters": "\u0409" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "Ĺ": { "codepoints": [313], "characters": "\u0139" }, + "Λ": { "codepoints": [923], "characters": "\u039B" }, + "⟪": { "codepoints": [10218], "characters": "\u27EA" }, + "ℒ": { "codepoints": [8466], "characters": "\u2112" }, + "↞": { "codepoints": [8606], "characters": "\u219E" }, + "Ľ": { "codepoints": [317], "characters": "\u013D" }, + "Ļ": { "codepoints": [315], "characters": "\u013B" }, + "Л": { "codepoints": [1051], "characters": "\u041B" }, + "⟨": { "codepoints": [10216], "characters": "\u27E8" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "⇤": { "codepoints": [8676], "characters": "\u21E4" }, + "⇆": { "codepoints": [8646], "characters": "\u21C6" }, + "⌈": { "codepoints": [8968], "characters": "\u2308" }, + "⟦": { "codepoints": [10214], "characters": "\u27E6" }, + "⥡": { "codepoints": [10593], "characters": "\u2961" }, + "⇃": { "codepoints": [8643], "characters": "\u21C3" }, + "⥙": { "codepoints": [10585], "characters": "\u2959" }, + "⌊": { "codepoints": [8970], "characters": "\u230A" }, + "↔": { "codepoints": [8596], "characters": "\u2194" }, + "⥎": { "codepoints": [10574], "characters": "\u294E" }, + "⊣": { "codepoints": [8867], "characters": "\u22A3" }, + "↤": { "codepoints": [8612], "characters": "\u21A4" }, + "⥚": { "codepoints": [10586], "characters": "\u295A" }, + "⊲": { "codepoints": [8882], "characters": "\u22B2" }, + "⧏": { "codepoints": [10703], "characters": "\u29CF" }, + "⊴": { "codepoints": [8884], "characters": "\u22B4" }, + "⥑": { "codepoints": [10577], "characters": "\u2951" }, + "⥠": { "codepoints": [10592], "characters": "\u2960" }, + "↿": { "codepoints": [8639], "characters": "\u21BF" }, + "⥘": { "codepoints": [10584], "characters": "\u2958" }, + "↼": { "codepoints": [8636], "characters": "\u21BC" }, + "⥒": { "codepoints": [10578], "characters": "\u2952" }, + "⇐": { "codepoints": [8656], "characters": "\u21D0" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + "⋚": { "codepoints": [8922], "characters": "\u22DA" }, + "≦": { "codepoints": [8806], "characters": "\u2266" }, + "≶": { "codepoints": [8822], "characters": "\u2276" }, + "⪡": { "codepoints": [10913], "characters": "\u2AA1" }, + "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, + "≲": { "codepoints": [8818], "characters": "\u2272" }, + "𝔏": { "codepoints": [120079], "characters": "\uD835\uDD0F" }, + "⋘": { "codepoints": [8920], "characters": "\u22D8" }, + "⇚": { "codepoints": [8666], "characters": "\u21DA" }, + "Ŀ": { "codepoints": [319], "characters": "\u013F" }, + "⟵": { "codepoints": [10229], "characters": "\u27F5" }, + "⟷": { "codepoints": [10231], "characters": "\u27F7" }, + "⟶": { "codepoints": [10230], "characters": "\u27F6" }, + "⟸": { "codepoints": [10232], "characters": "\u27F8" }, + "⟺": { "codepoints": [10234], "characters": "\u27FA" }, + "⟹": { "codepoints": [10233], "characters": "\u27F9" }, + "𝕃": { "codepoints": [120131], "characters": "\uD835\uDD43" }, + "↙": { "codepoints": [8601], "characters": "\u2199" }, + "↘": { "codepoints": [8600], "characters": "\u2198" }, + "ℒ": { "codepoints": [8466], "characters": "\u2112" }, + "↰": { "codepoints": [8624], "characters": "\u21B0" }, + "Ł": { "codepoints": [321], "characters": "\u0141" }, + "≪": { "codepoints": [8810], "characters": "\u226A" }, + "⤅": { "codepoints": [10501], "characters": "\u2905" }, + "М": { "codepoints": [1052], "characters": "\u041C" }, + " ": { "codepoints": [8287], "characters": "\u205F" }, + "ℳ": { "codepoints": [8499], "characters": "\u2133" }, + "𝔐": { "codepoints": [120080], "characters": "\uD835\uDD10" }, + "∓": { "codepoints": [8723], "characters": "\u2213" }, + "𝕄": { "codepoints": [120132], "characters": "\uD835\uDD44" }, + "ℳ": { "codepoints": [8499], "characters": "\u2133" }, + "Μ": { "codepoints": [924], "characters": "\u039C" }, + "Њ": { "codepoints": [1034], "characters": "\u040A" }, + "Ń": { "codepoints": [323], "characters": "\u0143" }, + "Ň": { "codepoints": [327], "characters": "\u0147" }, + "Ņ": { "codepoints": [325], "characters": "\u0145" }, + "Н": { "codepoints": [1053], "characters": "\u041D" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "≫": { "codepoints": [8811], "characters": "\u226B" }, + "≪": { "codepoints": [8810], "characters": "\u226A" }, + "
": { "codepoints": [10], "characters": "\u000A" }, + "𝔑": { "codepoints": [120081], "characters": "\uD835\uDD11" }, + "⁠": { "codepoints": [8288], "characters": "\u2060" }, + " ": { "codepoints": [160], "characters": "\u00A0" }, + "ℕ": { "codepoints": [8469], "characters": "\u2115" }, + "⫬": { "codepoints": [10988], "characters": "\u2AEC" }, + "≢": { "codepoints": [8802], "characters": "\u2262" }, + "≭": { "codepoints": [8813], "characters": "\u226D" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "∉": { "codepoints": [8713], "characters": "\u2209" }, + "≠": { "codepoints": [8800], "characters": "\u2260" }, + "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" }, + "∄": { "codepoints": [8708], "characters": "\u2204" }, + "≯": { "codepoints": [8815], "characters": "\u226F" }, + "≱": { "codepoints": [8817], "characters": "\u2271" }, + "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, + "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" }, + "≹": { "codepoints": [8825], "characters": "\u2279" }, + "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, + "≵": { "codepoints": [8821], "characters": "\u2275" }, + "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" }, + "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" }, + "⋪": { "codepoints": [8938], "characters": "\u22EA" }, + "⧏̸": { "codepoints": [10703, 824], "characters": "\u29CF\u0338" }, + "⋬": { "codepoints": [8940], "characters": "\u22EC" }, + "≮": { "codepoints": [8814], "characters": "\u226E" }, + "≰": { "codepoints": [8816], "characters": "\u2270" }, + "≸": { "codepoints": [8824], "characters": "\u2278" }, + "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" }, + "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, + "≴": { "codepoints": [8820], "characters": "\u2274" }, + "⪢̸": { "codepoints": [10914, 824], "characters": "\u2AA2\u0338" }, + "⪡̸": { "codepoints": [10913, 824], "characters": "\u2AA1\u0338" }, + "⊀": { "codepoints": [8832], "characters": "\u2280" }, + "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, + "⋠": { "codepoints": [8928], "characters": "\u22E0" }, + "∌": { "codepoints": [8716], "characters": "\u220C" }, + "⋫": { "codepoints": [8939], "characters": "\u22EB" }, + "⧐̸": { "codepoints": [10704, 824], "characters": "\u29D0\u0338" }, + "⋭": { "codepoints": [8941], "characters": "\u22ED" }, + "⊏̸": { "codepoints": [8847, 824], "characters": "\u228F\u0338" }, + "⋢": { "codepoints": [8930], "characters": "\u22E2" }, + "⊐̸": { "codepoints": [8848, 824], "characters": "\u2290\u0338" }, + "⋣": { "codepoints": [8931], "characters": "\u22E3" }, + "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, + "⊈": { "codepoints": [8840], "characters": "\u2288" }, + "⊁": { "codepoints": [8833], "characters": "\u2281" }, + "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, + "⋡": { "codepoints": [8929], "characters": "\u22E1" }, + "≿̸": { "codepoints": [8831, 824], "characters": "\u227F\u0338" }, + "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, + "⊉": { "codepoints": [8841], "characters": "\u2289" }, + "≁": { "codepoints": [8769], "characters": "\u2241" }, + "≄": { "codepoints": [8772], "characters": "\u2244" }, + "≇": { "codepoints": [8775], "characters": "\u2247" }, + "≉": { "codepoints": [8777], "characters": "\u2249" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "𝒩": { "codepoints": [119977], "characters": "\uD835\uDCA9" }, + "Ñ": { "codepoints": [209], "characters": "\u00D1" }, + "Ñ": { "codepoints": [209], "characters": "\u00D1" }, + "Ν": { "codepoints": [925], "characters": "\u039D" }, + "Œ": { "codepoints": [338], "characters": "\u0152" }, + "Ó": { "codepoints": [211], "characters": "\u00D3" }, + "Ó": { "codepoints": [211], "characters": "\u00D3" }, + "Ô": { "codepoints": [212], "characters": "\u00D4" }, + "Ô": { "codepoints": [212], "characters": "\u00D4" }, + "О": { "codepoints": [1054], "characters": "\u041E" }, + "Ő": { "codepoints": [336], "characters": "\u0150" }, + "𝔒": { "codepoints": [120082], "characters": "\uD835\uDD12" }, + "Ò": { "codepoints": [210], "characters": "\u00D2" }, + "Ò": { "codepoints": [210], "characters": "\u00D2" }, + "Ō": { "codepoints": [332], "characters": "\u014C" }, + "Ω": { "codepoints": [937], "characters": "\u03A9" }, + "Ο": { "codepoints": [927], "characters": "\u039F" }, + "𝕆": { "codepoints": [120134], "characters": "\uD835\uDD46" }, + "“": { "codepoints": [8220], "characters": "\u201C" }, + "‘": { "codepoints": [8216], "characters": "\u2018" }, + "⩔": { "codepoints": [10836], "characters": "\u2A54" }, + "𝒪": { "codepoints": [119978], "characters": "\uD835\uDCAA" }, + "Ø": { "codepoints": [216], "characters": "\u00D8" }, + "Ø": { "codepoints": [216], "characters": "\u00D8" }, + "Õ": { "codepoints": [213], "characters": "\u00D5" }, + "Õ": { "codepoints": [213], "characters": "\u00D5" }, + "⨷": { "codepoints": [10807], "characters": "\u2A37" }, + "Ö": { "codepoints": [214], "characters": "\u00D6" }, + "Ö": { "codepoints": [214], "characters": "\u00D6" }, + "‾": { "codepoints": [8254], "characters": "\u203E" }, + "⏞": { "codepoints": [9182], "characters": "\u23DE" }, + "⎴": { "codepoints": [9140], "characters": "\u23B4" }, + "⏜": { "codepoints": [9180], "characters": "\u23DC" }, + "∂": { "codepoints": [8706], "characters": "\u2202" }, + "П": { "codepoints": [1055], "characters": "\u041F" }, + "𝔓": { "codepoints": [120083], "characters": "\uD835\uDD13" }, + "Φ": { "codepoints": [934], "characters": "\u03A6" }, + "Π": { "codepoints": [928], "characters": "\u03A0" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "ℌ": { "codepoints": [8460], "characters": "\u210C" }, + "ℙ": { "codepoints": [8473], "characters": "\u2119" }, + "⪻": { "codepoints": [10939], "characters": "\u2ABB" }, + "≺": { "codepoints": [8826], "characters": "\u227A" }, + "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, + "≼": { "codepoints": [8828], "characters": "\u227C" }, + "≾": { "codepoints": [8830], "characters": "\u227E" }, + "″": { "codepoints": [8243], "characters": "\u2033" }, + "∏": { "codepoints": [8719], "characters": "\u220F" }, + "∷": { "codepoints": [8759], "characters": "\u2237" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "𝒫": { "codepoints": [119979], "characters": "\uD835\uDCAB" }, + "Ψ": { "codepoints": [936], "characters": "\u03A8" }, + """: { "codepoints": [34], "characters": "\u0022" }, + """: { "codepoints": [34], "characters": "\u0022" }, + "𝔔": { "codepoints": [120084], "characters": "\uD835\uDD14" }, + "ℚ": { "codepoints": [8474], "characters": "\u211A" }, + "𝒬": { "codepoints": [119980], "characters": "\uD835\uDCAC" }, + "⤐": { "codepoints": [10512], "characters": "\u2910" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "Ŕ": { "codepoints": [340], "characters": "\u0154" }, + "⟫": { "codepoints": [10219], "characters": "\u27EB" }, + "↠": { "codepoints": [8608], "characters": "\u21A0" }, + "⤖": { "codepoints": [10518], "characters": "\u2916" }, + "Ř": { "codepoints": [344], "characters": "\u0158" }, + "Ŗ": { "codepoints": [342], "characters": "\u0156" }, + "Р": { "codepoints": [1056], "characters": "\u0420" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "⇋": { "codepoints": [8651], "characters": "\u21CB" }, + "⥯": { "codepoints": [10607], "characters": "\u296F" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "Ρ": { "codepoints": [929], "characters": "\u03A1" }, + "⟩": { "codepoints": [10217], "characters": "\u27E9" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "⇥": { "codepoints": [8677], "characters": "\u21E5" }, + "⇄": { "codepoints": [8644], "characters": "\u21C4" }, + "⌉": { "codepoints": [8969], "characters": "\u2309" }, + "⟧": { "codepoints": [10215], "characters": "\u27E7" }, + "⥝": { "codepoints": [10589], "characters": "\u295D" }, + "⇂": { "codepoints": [8642], "characters": "\u21C2" }, + "⥕": { "codepoints": [10581], "characters": "\u2955" }, + "⌋": { "codepoints": [8971], "characters": "\u230B" }, + "⊢": { "codepoints": [8866], "characters": "\u22A2" }, + "↦": { "codepoints": [8614], "characters": "\u21A6" }, + "⥛": { "codepoints": [10587], "characters": "\u295B" }, + "⊳": { "codepoints": [8883], "characters": "\u22B3" }, + "⧐": { "codepoints": [10704], "characters": "\u29D0" }, + "⊵": { "codepoints": [8885], "characters": "\u22B5" }, + "⥏": { "codepoints": [10575], "characters": "\u294F" }, + "⥜": { "codepoints": [10588], "characters": "\u295C" }, + "↾": { "codepoints": [8638], "characters": "\u21BE" }, + "⥔": { "codepoints": [10580], "characters": "\u2954" }, + "⇀": { "codepoints": [8640], "characters": "\u21C0" }, + "⥓": { "codepoints": [10579], "characters": "\u2953" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "ℝ": { "codepoints": [8477], "characters": "\u211D" }, + "⥰": { "codepoints": [10608], "characters": "\u2970" }, + "⇛": { "codepoints": [8667], "characters": "\u21DB" }, + "ℛ": { "codepoints": [8475], "characters": "\u211B" }, + "↱": { "codepoints": [8625], "characters": "\u21B1" }, + "⧴": { "codepoints": [10740], "characters": "\u29F4" }, + "Щ": { "codepoints": [1065], "characters": "\u0429" }, + "Ш": { "codepoints": [1064], "characters": "\u0428" }, + "Ь": { "codepoints": [1068], "characters": "\u042C" }, + "Ś": { "codepoints": [346], "characters": "\u015A" }, + "⪼": { "codepoints": [10940], "characters": "\u2ABC" }, + "Š": { "codepoints": [352], "characters": "\u0160" }, + "Ş": { "codepoints": [350], "characters": "\u015E" }, + "Ŝ": { "codepoints": [348], "characters": "\u015C" }, + "С": { "codepoints": [1057], "characters": "\u0421" }, + "𝔖": { "codepoints": [120086], "characters": "\uD835\uDD16" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "Σ": { "codepoints": [931], "characters": "\u03A3" }, + "∘": { "codepoints": [8728], "characters": "\u2218" }, + "𝕊": { "codepoints": [120138], "characters": "\uD835\uDD4A" }, + "√": { "codepoints": [8730], "characters": "\u221A" }, + "□": { "codepoints": [9633], "characters": "\u25A1" }, + "⊓": { "codepoints": [8851], "characters": "\u2293" }, + "⊏": { "codepoints": [8847], "characters": "\u228F" }, + "⊑": { "codepoints": [8849], "characters": "\u2291" }, + "⊐": { "codepoints": [8848], "characters": "\u2290" }, + "⊒": { "codepoints": [8850], "characters": "\u2292" }, + "⊔": { "codepoints": [8852], "characters": "\u2294" }, + "𝒮": { "codepoints": [119982], "characters": "\uD835\uDCAE" }, + "⋆": { "codepoints": [8902], "characters": "\u22C6" }, + "⋐": { "codepoints": [8912], "characters": "\u22D0" }, + "⋐": { "codepoints": [8912], "characters": "\u22D0" }, + "⊆": { "codepoints": [8838], "characters": "\u2286" }, + "≻": { "codepoints": [8827], "characters": "\u227B" }, + "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, + "≽": { "codepoints": [8829], "characters": "\u227D" }, + "≿": { "codepoints": [8831], "characters": "\u227F" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "∑": { "codepoints": [8721], "characters": "\u2211" }, + "⋑": { "codepoints": [8913], "characters": "\u22D1" }, + "⊃": { "codepoints": [8835], "characters": "\u2283" }, + "⊇": { "codepoints": [8839], "characters": "\u2287" }, + "⋑": { "codepoints": [8913], "characters": "\u22D1" }, + "Þ": { "codepoints": [222], "characters": "\u00DE" }, + "Þ": { "codepoints": [222], "characters": "\u00DE" }, + "™": { "codepoints": [8482], "characters": "\u2122" }, + "Ћ": { "codepoints": [1035], "characters": "\u040B" }, + "Ц": { "codepoints": [1062], "characters": "\u0426" }, + "	": { "codepoints": [9], "characters": "\u0009" }, + "Τ": { "codepoints": [932], "characters": "\u03A4" }, + "Ť": { "codepoints": [356], "characters": "\u0164" }, + "Ţ": { "codepoints": [354], "characters": "\u0162" }, + "Т": { "codepoints": [1058], "characters": "\u0422" }, + "𝔗": { "codepoints": [120087], "characters": "\uD835\uDD17" }, + "∴": { "codepoints": [8756], "characters": "\u2234" }, + "Θ": { "codepoints": [920], "characters": "\u0398" }, + "  ": { "codepoints": [8287, 8202], "characters": "\u205F\u200A" }, + " ": { "codepoints": [8201], "characters": "\u2009" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + "≃": { "codepoints": [8771], "characters": "\u2243" }, + "≅": { "codepoints": [8773], "characters": "\u2245" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "𝕋": { "codepoints": [120139], "characters": "\uD835\uDD4B" }, + "⃛": { "codepoints": [8411], "characters": "\u20DB" }, + "𝒯": { "codepoints": [119983], "characters": "\uD835\uDCAF" }, + "Ŧ": { "codepoints": [358], "characters": "\u0166" }, + "Ú": { "codepoints": [218], "characters": "\u00DA" }, + "Ú": { "codepoints": [218], "characters": "\u00DA" }, + "↟": { "codepoints": [8607], "characters": "\u219F" }, + "⥉": { "codepoints": [10569], "characters": "\u2949" }, + "Ў": { "codepoints": [1038], "characters": "\u040E" }, + "Ŭ": { "codepoints": [364], "characters": "\u016C" }, + "Û": { "codepoints": [219], "characters": "\u00DB" }, + "Û": { "codepoints": [219], "characters": "\u00DB" }, + "У": { "codepoints": [1059], "characters": "\u0423" }, + "Ű": { "codepoints": [368], "characters": "\u0170" }, + "𝔘": { "codepoints": [120088], "characters": "\uD835\uDD18" }, + "Ù": { "codepoints": [217], "characters": "\u00D9" }, + "Ù": { "codepoints": [217], "characters": "\u00D9" }, + "Ū": { "codepoints": [362], "characters": "\u016A" }, + "_": { "codepoints": [95], "characters": "\u005F" }, + "⏟": { "codepoints": [9183], "characters": "\u23DF" }, + "⎵": { "codepoints": [9141], "characters": "\u23B5" }, + "⏝": { "codepoints": [9181], "characters": "\u23DD" }, + "⋃": { "codepoints": [8899], "characters": "\u22C3" }, + "⊎": { "codepoints": [8846], "characters": "\u228E" }, + "Ų": { "codepoints": [370], "characters": "\u0172" }, + "𝕌": { "codepoints": [120140], "characters": "\uD835\uDD4C" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "⤒": { "codepoints": [10514], "characters": "\u2912" }, + "⇅": { "codepoints": [8645], "characters": "\u21C5" }, + "↕": { "codepoints": [8597], "characters": "\u2195" }, + "⥮": { "codepoints": [10606], "characters": "\u296E" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "↥": { "codepoints": [8613], "characters": "\u21A5" }, + "⇑": { "codepoints": [8657], "characters": "\u21D1" }, + "⇕": { "codepoints": [8661], "characters": "\u21D5" }, + "↖": { "codepoints": [8598], "characters": "\u2196" }, + "↗": { "codepoints": [8599], "characters": "\u2197" }, + "ϒ": { "codepoints": [978], "characters": "\u03D2" }, + "Υ": { "codepoints": [933], "characters": "\u03A5" }, + "Ů": { "codepoints": [366], "characters": "\u016E" }, + "𝒰": { "codepoints": [119984], "characters": "\uD835\uDCB0" }, + "Ũ": { "codepoints": [360], "characters": "\u0168" }, + "Ü": { "codepoints": [220], "characters": "\u00DC" }, + "Ü": { "codepoints": [220], "characters": "\u00DC" }, + "⊫": { "codepoints": [8875], "characters": "\u22AB" }, + "⫫": { "codepoints": [10987], "characters": "\u2AEB" }, + "В": { "codepoints": [1042], "characters": "\u0412" }, + "⊩": { "codepoints": [8873], "characters": "\u22A9" }, + "⫦": { "codepoints": [10982], "characters": "\u2AE6" }, + "⋁": { "codepoints": [8897], "characters": "\u22C1" }, + "‖": { "codepoints": [8214], "characters": "\u2016" }, + "‖": { "codepoints": [8214], "characters": "\u2016" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "|": { "codepoints": [124], "characters": "\u007C" }, + "❘": { "codepoints": [10072], "characters": "\u2758" }, + "≀": { "codepoints": [8768], "characters": "\u2240" }, + " ": { "codepoints": [8202], "characters": "\u200A" }, + "𝔙": { "codepoints": [120089], "characters": "\uD835\uDD19" }, + "𝕍": { "codepoints": [120141], "characters": "\uD835\uDD4D" }, + "𝒱": { "codepoints": [119985], "characters": "\uD835\uDCB1" }, + "⊪": { "codepoints": [8874], "characters": "\u22AA" }, + "Ŵ": { "codepoints": [372], "characters": "\u0174" }, + "⋀": { "codepoints": [8896], "characters": "\u22C0" }, + "𝔚": { "codepoints": [120090], "characters": "\uD835\uDD1A" }, + "𝕎": { "codepoints": [120142], "characters": "\uD835\uDD4E" }, + "𝒲": { "codepoints": [119986], "characters": "\uD835\uDCB2" }, + "𝔛": { "codepoints": [120091], "characters": "\uD835\uDD1B" }, + "Ξ": { "codepoints": [926], "characters": "\u039E" }, + "𝕏": { "codepoints": [120143], "characters": "\uD835\uDD4F" }, + "𝒳": { "codepoints": [119987], "characters": "\uD835\uDCB3" }, + "Я": { "codepoints": [1071], "characters": "\u042F" }, + "Ї": { "codepoints": [1031], "characters": "\u0407" }, + "Ю": { "codepoints": [1070], "characters": "\u042E" }, + "Ý": { "codepoints": [221], "characters": "\u00DD" }, + "Ý": { "codepoints": [221], "characters": "\u00DD" }, + "Ŷ": { "codepoints": [374], "characters": "\u0176" }, + "Ы": { "codepoints": [1067], "characters": "\u042B" }, + "𝔜": { "codepoints": [120092], "characters": "\uD835\uDD1C" }, + "𝕐": { "codepoints": [120144], "characters": "\uD835\uDD50" }, + "𝒴": { "codepoints": [119988], "characters": "\uD835\uDCB4" }, + "Ÿ": { "codepoints": [376], "characters": "\u0178" }, + "Ж": { "codepoints": [1046], "characters": "\u0416" }, + "Ź": { "codepoints": [377], "characters": "\u0179" }, + "Ž": { "codepoints": [381], "characters": "\u017D" }, + "З": { "codepoints": [1047], "characters": "\u0417" }, + "Ż": { "codepoints": [379], "characters": "\u017B" }, + "​": { "codepoints": [8203], "characters": "\u200B" }, + "Ζ": { "codepoints": [918], "characters": "\u0396" }, + "ℨ": { "codepoints": [8488], "characters": "\u2128" }, + "ℤ": { "codepoints": [8484], "characters": "\u2124" }, + "𝒵": { "codepoints": [119989], "characters": "\uD835\uDCB5" }, + "á": { "codepoints": [225], "characters": "\u00E1" }, + "á": { "codepoints": [225], "characters": "\u00E1" }, + "ă": { "codepoints": [259], "characters": "\u0103" }, + "∾": { "codepoints": [8766], "characters": "\u223E" }, + "∾̳": { "codepoints": [8766, 819], "characters": "\u223E\u0333" }, + "∿": { "codepoints": [8767], "characters": "\u223F" }, + "â": { "codepoints": [226], "characters": "\u00E2" }, + "â": { "codepoints": [226], "characters": "\u00E2" }, + "´": { "codepoints": [180], "characters": "\u00B4" }, + "´": { "codepoints": [180], "characters": "\u00B4" }, + "а": { "codepoints": [1072], "characters": "\u0430" }, + "æ": { "codepoints": [230], "characters": "\u00E6" }, + "æ": { "codepoints": [230], "characters": "\u00E6" }, + "⁡": { "codepoints": [8289], "characters": "\u2061" }, + "𝔞": { "codepoints": [120094], "characters": "\uD835\uDD1E" }, + "à": { "codepoints": [224], "characters": "\u00E0" }, + "à": { "codepoints": [224], "characters": "\u00E0" }, + "ℵ": { "codepoints": [8501], "characters": "\u2135" }, + "ℵ": { "codepoints": [8501], "characters": "\u2135" }, + "α": { "codepoints": [945], "characters": "\u03B1" }, + "ā": { "codepoints": [257], "characters": "\u0101" }, + "⨿": { "codepoints": [10815], "characters": "\u2A3F" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "&": { "codepoints": [38], "characters": "\u0026" }, + "∧": { "codepoints": [8743], "characters": "\u2227" }, + "⩕": { "codepoints": [10837], "characters": "\u2A55" }, + "⩜": { "codepoints": [10844], "characters": "\u2A5C" }, + "⩘": { "codepoints": [10840], "characters": "\u2A58" }, + "⩚": { "codepoints": [10842], "characters": "\u2A5A" }, + "∠": { "codepoints": [8736], "characters": "\u2220" }, + "⦤": { "codepoints": [10660], "characters": "\u29A4" }, + "∠": { "codepoints": [8736], "characters": "\u2220" }, + "∡": { "codepoints": [8737], "characters": "\u2221" }, + "⦨": { "codepoints": [10664], "characters": "\u29A8" }, + "⦩": { "codepoints": [10665], "characters": "\u29A9" }, + "⦪": { "codepoints": [10666], "characters": "\u29AA" }, + "⦫": { "codepoints": [10667], "characters": "\u29AB" }, + "⦬": { "codepoints": [10668], "characters": "\u29AC" }, + "⦭": { "codepoints": [10669], "characters": "\u29AD" }, + "⦮": { "codepoints": [10670], "characters": "\u29AE" }, + "⦯": { "codepoints": [10671], "characters": "\u29AF" }, + "∟": { "codepoints": [8735], "characters": "\u221F" }, + "⊾": { "codepoints": [8894], "characters": "\u22BE" }, + "⦝": { "codepoints": [10653], "characters": "\u299D" }, + "∢": { "codepoints": [8738], "characters": "\u2222" }, + "Å": { "codepoints": [197], "characters": "\u00C5" }, + "⍼": { "codepoints": [9084], "characters": "\u237C" }, + "ą": { "codepoints": [261], "characters": "\u0105" }, + "𝕒": { "codepoints": [120146], "characters": "\uD835\uDD52" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "⩰": { "codepoints": [10864], "characters": "\u2A70" }, + "⩯": { "codepoints": [10863], "characters": "\u2A6F" }, + "≊": { "codepoints": [8778], "characters": "\u224A" }, + "≋": { "codepoints": [8779], "characters": "\u224B" }, + "'": { "codepoints": [39], "characters": "\u0027" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "≊": { "codepoints": [8778], "characters": "\u224A" }, + "å": { "codepoints": [229], "characters": "\u00E5" }, + "å": { "codepoints": [229], "characters": "\u00E5" }, + "𝒶": { "codepoints": [119990], "characters": "\uD835\uDCB6" }, + "*": { "codepoints": [42], "characters": "\u002A" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "≍": { "codepoints": [8781], "characters": "\u224D" }, + "ã": { "codepoints": [227], "characters": "\u00E3" }, + "ã": { "codepoints": [227], "characters": "\u00E3" }, + "ä": { "codepoints": [228], "characters": "\u00E4" }, + "ä": { "codepoints": [228], "characters": "\u00E4" }, + "∳": { "codepoints": [8755], "characters": "\u2233" }, + "⨑": { "codepoints": [10769], "characters": "\u2A11" }, + "⫭": { "codepoints": [10989], "characters": "\u2AED" }, + "≌": { "codepoints": [8780], "characters": "\u224C" }, + "϶": { "codepoints": [1014], "characters": "\u03F6" }, + "‵": { "codepoints": [8245], "characters": "\u2035" }, + "∽": { "codepoints": [8765], "characters": "\u223D" }, + "⋍": { "codepoints": [8909], "characters": "\u22CD" }, + "⊽": { "codepoints": [8893], "characters": "\u22BD" }, + "⌅": { "codepoints": [8965], "characters": "\u2305" }, + "⌅": { "codepoints": [8965], "characters": "\u2305" }, + "⎵": { "codepoints": [9141], "characters": "\u23B5" }, + "⎶": { "codepoints": [9142], "characters": "\u23B6" }, + "≌": { "codepoints": [8780], "characters": "\u224C" }, + "б": { "codepoints": [1073], "characters": "\u0431" }, + "„": { "codepoints": [8222], "characters": "\u201E" }, + "∵": { "codepoints": [8757], "characters": "\u2235" }, + "∵": { "codepoints": [8757], "characters": "\u2235" }, + "⦰": { "codepoints": [10672], "characters": "\u29B0" }, + "϶": { "codepoints": [1014], "characters": "\u03F6" }, + "ℬ": { "codepoints": [8492], "characters": "\u212C" }, + "β": { "codepoints": [946], "characters": "\u03B2" }, + "ℶ": { "codepoints": [8502], "characters": "\u2136" }, + "≬": { "codepoints": [8812], "characters": "\u226C" }, + "𝔟": { "codepoints": [120095], "characters": "\uD835\uDD1F" }, + "⋂": { "codepoints": [8898], "characters": "\u22C2" }, + "◯": { "codepoints": [9711], "characters": "\u25EF" }, + "⋃": { "codepoints": [8899], "characters": "\u22C3" }, + "⨀": { "codepoints": [10752], "characters": "\u2A00" }, + "⨁": { "codepoints": [10753], "characters": "\u2A01" }, + "⨂": { "codepoints": [10754], "characters": "\u2A02" }, + "⨆": { "codepoints": [10758], "characters": "\u2A06" }, + "★": { "codepoints": [9733], "characters": "\u2605" }, + "▽": { "codepoints": [9661], "characters": "\u25BD" }, + "△": { "codepoints": [9651], "characters": "\u25B3" }, + "⨄": { "codepoints": [10756], "characters": "\u2A04" }, + "⋁": { "codepoints": [8897], "characters": "\u22C1" }, + "⋀": { "codepoints": [8896], "characters": "\u22C0" }, + "⤍": { "codepoints": [10509], "characters": "\u290D" }, + "⧫": { "codepoints": [10731], "characters": "\u29EB" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "▴": { "codepoints": [9652], "characters": "\u25B4" }, + "▾": { "codepoints": [9662], "characters": "\u25BE" }, + "◂": { "codepoints": [9666], "characters": "\u25C2" }, + "▸": { "codepoints": [9656], "characters": "\u25B8" }, + "␣": { "codepoints": [9251], "characters": "\u2423" }, + "▒": { "codepoints": [9618], "characters": "\u2592" }, + "░": { "codepoints": [9617], "characters": "\u2591" }, + "▓": { "codepoints": [9619], "characters": "\u2593" }, + "█": { "codepoints": [9608], "characters": "\u2588" }, + "=⃥": { "codepoints": [61, 8421], "characters": "\u003D\u20E5" }, + "≡⃥": { "codepoints": [8801, 8421], "characters": "\u2261\u20E5" }, + "⌐": { "codepoints": [8976], "characters": "\u2310" }, + "𝕓": { "codepoints": [120147], "characters": "\uD835\uDD53" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "⋈": { "codepoints": [8904], "characters": "\u22C8" }, + "╗": { "codepoints": [9559], "characters": "\u2557" }, + "╔": { "codepoints": [9556], "characters": "\u2554" }, + "╖": { "codepoints": [9558], "characters": "\u2556" }, + "╓": { "codepoints": [9555], "characters": "\u2553" }, + "═": { "codepoints": [9552], "characters": "\u2550" }, + "╦": { "codepoints": [9574], "characters": "\u2566" }, + "╩": { "codepoints": [9577], "characters": "\u2569" }, + "╤": { "codepoints": [9572], "characters": "\u2564" }, + "╧": { "codepoints": [9575], "characters": "\u2567" }, + "╝": { "codepoints": [9565], "characters": "\u255D" }, + "╚": { "codepoints": [9562], "characters": "\u255A" }, + "╜": { "codepoints": [9564], "characters": "\u255C" }, + "╙": { "codepoints": [9561], "characters": "\u2559" }, + "║": { "codepoints": [9553], "characters": "\u2551" }, + "╬": { "codepoints": [9580], "characters": "\u256C" }, + "╣": { "codepoints": [9571], "characters": "\u2563" }, + "╠": { "codepoints": [9568], "characters": "\u2560" }, + "╫": { "codepoints": [9579], "characters": "\u256B" }, + "╢": { "codepoints": [9570], "characters": "\u2562" }, + "╟": { "codepoints": [9567], "characters": "\u255F" }, + "⧉": { "codepoints": [10697], "characters": "\u29C9" }, + "╕": { "codepoints": [9557], "characters": "\u2555" }, + "╒": { "codepoints": [9554], "characters": "\u2552" }, + "┐": { "codepoints": [9488], "characters": "\u2510" }, + "┌": { "codepoints": [9484], "characters": "\u250C" }, + "─": { "codepoints": [9472], "characters": "\u2500" }, + "╥": { "codepoints": [9573], "characters": "\u2565" }, + "╨": { "codepoints": [9576], "characters": "\u2568" }, + "┬": { "codepoints": [9516], "characters": "\u252C" }, + "┴": { "codepoints": [9524], "characters": "\u2534" }, + "⊟": { "codepoints": [8863], "characters": "\u229F" }, + "⊞": { "codepoints": [8862], "characters": "\u229E" }, + "⊠": { "codepoints": [8864], "characters": "\u22A0" }, + "╛": { "codepoints": [9563], "characters": "\u255B" }, + "╘": { "codepoints": [9560], "characters": "\u2558" }, + "┘": { "codepoints": [9496], "characters": "\u2518" }, + "└": { "codepoints": [9492], "characters": "\u2514" }, + "│": { "codepoints": [9474], "characters": "\u2502" }, + "╪": { "codepoints": [9578], "characters": "\u256A" }, + "╡": { "codepoints": [9569], "characters": "\u2561" }, + "╞": { "codepoints": [9566], "characters": "\u255E" }, + "┼": { "codepoints": [9532], "characters": "\u253C" }, + "┤": { "codepoints": [9508], "characters": "\u2524" }, + "├": { "codepoints": [9500], "characters": "\u251C" }, + "‵": { "codepoints": [8245], "characters": "\u2035" }, + "˘": { "codepoints": [728], "characters": "\u02D8" }, + "¦": { "codepoints": [166], "characters": "\u00A6" }, + "¦": { "codepoints": [166], "characters": "\u00A6" }, + "𝒷": { "codepoints": [119991], "characters": "\uD835\uDCB7" }, + "⁏": { "codepoints": [8271], "characters": "\u204F" }, + "∽": { "codepoints": [8765], "characters": "\u223D" }, + "⋍": { "codepoints": [8909], "characters": "\u22CD" }, + "\": { "codepoints": [92], "characters": "\u005C" }, + "⧅": { "codepoints": [10693], "characters": "\u29C5" }, + "⟈": { "codepoints": [10184], "characters": "\u27C8" }, + "•": { "codepoints": [8226], "characters": "\u2022" }, + "•": { "codepoints": [8226], "characters": "\u2022" }, + "≎": { "codepoints": [8782], "characters": "\u224E" }, + "⪮": { "codepoints": [10926], "characters": "\u2AAE" }, + "≏": { "codepoints": [8783], "characters": "\u224F" }, + "≏": { "codepoints": [8783], "characters": "\u224F" }, + "ć": { "codepoints": [263], "characters": "\u0107" }, + "∩": { "codepoints": [8745], "characters": "\u2229" }, + "⩄": { "codepoints": [10820], "characters": "\u2A44" }, + "⩉": { "codepoints": [10825], "characters": "\u2A49" }, + "⩋": { "codepoints": [10827], "characters": "\u2A4B" }, + "⩇": { "codepoints": [10823], "characters": "\u2A47" }, + "⩀": { "codepoints": [10816], "characters": "\u2A40" }, + "∩︀": { "codepoints": [8745, 65024], "characters": "\u2229\uFE00" }, + "⁁": { "codepoints": [8257], "characters": "\u2041" }, + "ˇ": { "codepoints": [711], "characters": "\u02C7" }, + "⩍": { "codepoints": [10829], "characters": "\u2A4D" }, + "č": { "codepoints": [269], "characters": "\u010D" }, + "ç": { "codepoints": [231], "characters": "\u00E7" }, + "ç": { "codepoints": [231], "characters": "\u00E7" }, + "ĉ": { "codepoints": [265], "characters": "\u0109" }, + "⩌": { "codepoints": [10828], "characters": "\u2A4C" }, + "⩐": { "codepoints": [10832], "characters": "\u2A50" }, + "ċ": { "codepoints": [267], "characters": "\u010B" }, + "¸": { "codepoints": [184], "characters": "\u00B8" }, + "¸": { "codepoints": [184], "characters": "\u00B8" }, + "⦲": { "codepoints": [10674], "characters": "\u29B2" }, + "¢": { "codepoints": [162], "characters": "\u00A2" }, + "¢": { "codepoints": [162], "characters": "\u00A2" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "𝔠": { "codepoints": [120096], "characters": "\uD835\uDD20" }, + "ч": { "codepoints": [1095], "characters": "\u0447" }, + "✓": { "codepoints": [10003], "characters": "\u2713" }, + "✓": { "codepoints": [10003], "characters": "\u2713" }, + "χ": { "codepoints": [967], "characters": "\u03C7" }, + "○": { "codepoints": [9675], "characters": "\u25CB" }, + "⧃": { "codepoints": [10691], "characters": "\u29C3" }, + "ˆ": { "codepoints": [710], "characters": "\u02C6" }, + "≗": { "codepoints": [8791], "characters": "\u2257" }, + "↺": { "codepoints": [8634], "characters": "\u21BA" }, + "↻": { "codepoints": [8635], "characters": "\u21BB" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" }, + "⊛": { "codepoints": [8859], "characters": "\u229B" }, + "⊚": { "codepoints": [8858], "characters": "\u229A" }, + "⊝": { "codepoints": [8861], "characters": "\u229D" }, + "≗": { "codepoints": [8791], "characters": "\u2257" }, + "⨐": { "codepoints": [10768], "characters": "\u2A10" }, + "⫯": { "codepoints": [10991], "characters": "\u2AEF" }, + "⧂": { "codepoints": [10690], "characters": "\u29C2" }, + "♣": { "codepoints": [9827], "characters": "\u2663" }, + "♣": { "codepoints": [9827], "characters": "\u2663" }, + ":": { "codepoints": [58], "characters": "\u003A" }, + "≔": { "codepoints": [8788], "characters": "\u2254" }, + "≔": { "codepoints": [8788], "characters": "\u2254" }, + ",": { "codepoints": [44], "characters": "\u002C" }, + "@": { "codepoints": [64], "characters": "\u0040" }, + "∁": { "codepoints": [8705], "characters": "\u2201" }, + "∘": { "codepoints": [8728], "characters": "\u2218" }, + "∁": { "codepoints": [8705], "characters": "\u2201" }, + "ℂ": { "codepoints": [8450], "characters": "\u2102" }, + "≅": { "codepoints": [8773], "characters": "\u2245" }, + "⩭": { "codepoints": [10861], "characters": "\u2A6D" }, + "∮": { "codepoints": [8750], "characters": "\u222E" }, + "𝕔": { "codepoints": [120148], "characters": "\uD835\uDD54" }, + "∐": { "codepoints": [8720], "characters": "\u2210" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "©": { "codepoints": [169], "characters": "\u00A9" }, + "℗": { "codepoints": [8471], "characters": "\u2117" }, + "↵": { "codepoints": [8629], "characters": "\u21B5" }, + "✗": { "codepoints": [10007], "characters": "\u2717" }, + "𝒸": { "codepoints": [119992], "characters": "\uD835\uDCB8" }, + "⫏": { "codepoints": [10959], "characters": "\u2ACF" }, + "⫑": { "codepoints": [10961], "characters": "\u2AD1" }, + "⫐": { "codepoints": [10960], "characters": "\u2AD0" }, + "⫒": { "codepoints": [10962], "characters": "\u2AD2" }, + "⋯": { "codepoints": [8943], "characters": "\u22EF" }, + "⤸": { "codepoints": [10552], "characters": "\u2938" }, + "⤵": { "codepoints": [10549], "characters": "\u2935" }, + "⋞": { "codepoints": [8926], "characters": "\u22DE" }, + "⋟": { "codepoints": [8927], "characters": "\u22DF" }, + "↶": { "codepoints": [8630], "characters": "\u21B6" }, + "⤽": { "codepoints": [10557], "characters": "\u293D" }, + "∪": { "codepoints": [8746], "characters": "\u222A" }, + "⩈": { "codepoints": [10824], "characters": "\u2A48" }, + "⩆": { "codepoints": [10822], "characters": "\u2A46" }, + "⩊": { "codepoints": [10826], "characters": "\u2A4A" }, + "⊍": { "codepoints": [8845], "characters": "\u228D" }, + "⩅": { "codepoints": [10821], "characters": "\u2A45" }, + "∪︀": { "codepoints": [8746, 65024], "characters": "\u222A\uFE00" }, + "↷": { "codepoints": [8631], "characters": "\u21B7" }, + "⤼": { "codepoints": [10556], "characters": "\u293C" }, + "⋞": { "codepoints": [8926], "characters": "\u22DE" }, + "⋟": { "codepoints": [8927], "characters": "\u22DF" }, + "⋎": { "codepoints": [8910], "characters": "\u22CE" }, + "⋏": { "codepoints": [8911], "characters": "\u22CF" }, + "¤": { "codepoints": [164], "characters": "\u00A4" }, + "¤": { "codepoints": [164], "characters": "\u00A4" }, + "↶": { "codepoints": [8630], "characters": "\u21B6" }, + "↷": { "codepoints": [8631], "characters": "\u21B7" }, + "⋎": { "codepoints": [8910], "characters": "\u22CE" }, + "⋏": { "codepoints": [8911], "characters": "\u22CF" }, + "∲": { "codepoints": [8754], "characters": "\u2232" }, + "∱": { "codepoints": [8753], "characters": "\u2231" }, + "⌭": { "codepoints": [9005], "characters": "\u232D" }, + "⇓": { "codepoints": [8659], "characters": "\u21D3" }, + "⥥": { "codepoints": [10597], "characters": "\u2965" }, + "†": { "codepoints": [8224], "characters": "\u2020" }, + "ℸ": { "codepoints": [8504], "characters": "\u2138" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "‐": { "codepoints": [8208], "characters": "\u2010" }, + "⊣": { "codepoints": [8867], "characters": "\u22A3" }, + "⤏": { "codepoints": [10511], "characters": "\u290F" }, + "˝": { "codepoints": [733], "characters": "\u02DD" }, + "ď": { "codepoints": [271], "characters": "\u010F" }, + "д": { "codepoints": [1076], "characters": "\u0434" }, + "ⅆ": { "codepoints": [8518], "characters": "\u2146" }, + "‡": { "codepoints": [8225], "characters": "\u2021" }, + "⇊": { "codepoints": [8650], "characters": "\u21CA" }, + "⩷": { "codepoints": [10871], "characters": "\u2A77" }, + "°": { "codepoints": [176], "characters": "\u00B0" }, + "°": { "codepoints": [176], "characters": "\u00B0" }, + "δ": { "codepoints": [948], "characters": "\u03B4" }, + "⦱": { "codepoints": [10673], "characters": "\u29B1" }, + "⥿": { "codepoints": [10623], "characters": "\u297F" }, + "𝔡": { "codepoints": [120097], "characters": "\uD835\uDD21" }, + "⇃": { "codepoints": [8643], "characters": "\u21C3" }, + "⇂": { "codepoints": [8642], "characters": "\u21C2" }, + "⋄": { "codepoints": [8900], "characters": "\u22C4" }, + "⋄": { "codepoints": [8900], "characters": "\u22C4" }, + "♦": { "codepoints": [9830], "characters": "\u2666" }, + "♦": { "codepoints": [9830], "characters": "\u2666" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "ϝ": { "codepoints": [989], "characters": "\u03DD" }, + "⋲": { "codepoints": [8946], "characters": "\u22F2" }, + "÷": { "codepoints": [247], "characters": "\u00F7" }, + "÷": { "codepoints": [247], "characters": "\u00F7" }, + "÷": { "codepoints": [247], "characters": "\u00F7" }, + "⋇": { "codepoints": [8903], "characters": "\u22C7" }, + "⋇": { "codepoints": [8903], "characters": "\u22C7" }, + "ђ": { "codepoints": [1106], "characters": "\u0452" }, + "⌞": { "codepoints": [8990], "characters": "\u231E" }, + "⌍": { "codepoints": [8973], "characters": "\u230D" }, + "$": { "codepoints": [36], "characters": "\u0024" }, + "𝕕": { "codepoints": [120149], "characters": "\uD835\uDD55" }, + "˙": { "codepoints": [729], "characters": "\u02D9" }, + "≐": { "codepoints": [8784], "characters": "\u2250" }, + "≑": { "codepoints": [8785], "characters": "\u2251" }, + "∸": { "codepoints": [8760], "characters": "\u2238" }, + "∔": { "codepoints": [8724], "characters": "\u2214" }, + "⊡": { "codepoints": [8865], "characters": "\u22A1" }, + "⌆": { "codepoints": [8966], "characters": "\u2306" }, + "↓": { "codepoints": [8595], "characters": "\u2193" }, + "⇊": { "codepoints": [8650], "characters": "\u21CA" }, + "⇃": { "codepoints": [8643], "characters": "\u21C3" }, + "⇂": { "codepoints": [8642], "characters": "\u21C2" }, + "⤐": { "codepoints": [10512], "characters": "\u2910" }, + "⌟": { "codepoints": [8991], "characters": "\u231F" }, + "⌌": { "codepoints": [8972], "characters": "\u230C" }, + "𝒹": { "codepoints": [119993], "characters": "\uD835\uDCB9" }, + "ѕ": { "codepoints": [1109], "characters": "\u0455" }, + "⧶": { "codepoints": [10742], "characters": "\u29F6" }, + "đ": { "codepoints": [273], "characters": "\u0111" }, + "⋱": { "codepoints": [8945], "characters": "\u22F1" }, + "▿": { "codepoints": [9663], "characters": "\u25BF" }, + "▾": { "codepoints": [9662], "characters": "\u25BE" }, + "⇵": { "codepoints": [8693], "characters": "\u21F5" }, + "⥯": { "codepoints": [10607], "characters": "\u296F" }, + "⦦": { "codepoints": [10662], "characters": "\u29A6" }, + "џ": { "codepoints": [1119], "characters": "\u045F" }, + "⟿": { "codepoints": [10239], "characters": "\u27FF" }, + "⩷": { "codepoints": [10871], "characters": "\u2A77" }, + "≑": { "codepoints": [8785], "characters": "\u2251" }, + "é": { "codepoints": [233], "characters": "\u00E9" }, + "é": { "codepoints": [233], "characters": "\u00E9" }, + "⩮": { "codepoints": [10862], "characters": "\u2A6E" }, + "ě": { "codepoints": [283], "characters": "\u011B" }, + "≖": { "codepoints": [8790], "characters": "\u2256" }, + "ê": { "codepoints": [234], "characters": "\u00EA" }, + "ê": { "codepoints": [234], "characters": "\u00EA" }, + "≕": { "codepoints": [8789], "characters": "\u2255" }, + "э": { "codepoints": [1101], "characters": "\u044D" }, + "ė": { "codepoints": [279], "characters": "\u0117" }, + "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, + "≒": { "codepoints": [8786], "characters": "\u2252" }, + "𝔢": { "codepoints": [120098], "characters": "\uD835\uDD22" }, + "⪚": { "codepoints": [10906], "characters": "\u2A9A" }, + "è": { "codepoints": [232], "characters": "\u00E8" }, + "è": { "codepoints": [232], "characters": "\u00E8" }, + "⪖": { "codepoints": [10902], "characters": "\u2A96" }, + "⪘": { "codepoints": [10904], "characters": "\u2A98" }, + "⪙": { "codepoints": [10905], "characters": "\u2A99" }, + "⏧": { "codepoints": [9191], "characters": "\u23E7" }, + "ℓ": { "codepoints": [8467], "characters": "\u2113" }, + "⪕": { "codepoints": [10901], "characters": "\u2A95" }, + "⪗": { "codepoints": [10903], "characters": "\u2A97" }, + "ē": { "codepoints": [275], "characters": "\u0113" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + " ": { "codepoints": [8196], "characters": "\u2004" }, + " ": { "codepoints": [8197], "characters": "\u2005" }, + " ": { "codepoints": [8195], "characters": "\u2003" }, + "ŋ": { "codepoints": [331], "characters": "\u014B" }, + " ": { "codepoints": [8194], "characters": "\u2002" }, + "ę": { "codepoints": [281], "characters": "\u0119" }, + "𝕖": { "codepoints": [120150], "characters": "\uD835\uDD56" }, + "⋕": { "codepoints": [8917], "characters": "\u22D5" }, + "⧣": { "codepoints": [10723], "characters": "\u29E3" }, + "⩱": { "codepoints": [10865], "characters": "\u2A71" }, + "ε": { "codepoints": [949], "characters": "\u03B5" }, + "ε": { "codepoints": [949], "characters": "\u03B5" }, + "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, + "≖": { "codepoints": [8790], "characters": "\u2256" }, + "≕": { "codepoints": [8789], "characters": "\u2255" }, + "≂": { "codepoints": [8770], "characters": "\u2242" }, + "⪖": { "codepoints": [10902], "characters": "\u2A96" }, + "⪕": { "codepoints": [10901], "characters": "\u2A95" }, + "=": { "codepoints": [61], "characters": "\u003D" }, + "≟": { "codepoints": [8799], "characters": "\u225F" }, + "≡": { "codepoints": [8801], "characters": "\u2261" }, + "⩸": { "codepoints": [10872], "characters": "\u2A78" }, + "⧥": { "codepoints": [10725], "characters": "\u29E5" }, + "≓": { "codepoints": [8787], "characters": "\u2253" }, + "⥱": { "codepoints": [10609], "characters": "\u2971" }, + "ℯ": { "codepoints": [8495], "characters": "\u212F" }, + "≐": { "codepoints": [8784], "characters": "\u2250" }, + "≂": { "codepoints": [8770], "characters": "\u2242" }, + "η": { "codepoints": [951], "characters": "\u03B7" }, + "ð": { "codepoints": [240], "characters": "\u00F0" }, + "ð": { "codepoints": [240], "characters": "\u00F0" }, + "ë": { "codepoints": [235], "characters": "\u00EB" }, + "ë": { "codepoints": [235], "characters": "\u00EB" }, + "€": { "codepoints": [8364], "characters": "\u20AC" }, + "!": { "codepoints": [33], "characters": "\u0021" }, + "∃": { "codepoints": [8707], "characters": "\u2203" }, + "ℰ": { "codepoints": [8496], "characters": "\u2130" }, + "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, + "≒": { "codepoints": [8786], "characters": "\u2252" }, + "ф": { "codepoints": [1092], "characters": "\u0444" }, + "♀": { "codepoints": [9792], "characters": "\u2640" }, + "ffi": { "codepoints": [64259], "characters": "\uFB03" }, + "ff": { "codepoints": [64256], "characters": "\uFB00" }, + "ffl": { "codepoints": [64260], "characters": "\uFB04" }, + "𝔣": { "codepoints": [120099], "characters": "\uD835\uDD23" }, + "fi": { "codepoints": [64257], "characters": "\uFB01" }, + "fj": { "codepoints": [102, 106], "characters": "\u0066\u006A" }, + "♭": { "codepoints": [9837], "characters": "\u266D" }, + "fl": { "codepoints": [64258], "characters": "\uFB02" }, + "▱": { "codepoints": [9649], "characters": "\u25B1" }, + "ƒ": { "codepoints": [402], "characters": "\u0192" }, + "𝕗": { "codepoints": [120151], "characters": "\uD835\uDD57" }, + "∀": { "codepoints": [8704], "characters": "\u2200" }, + "⋔": { "codepoints": [8916], "characters": "\u22D4" }, + "⫙": { "codepoints": [10969], "characters": "\u2AD9" }, + "⨍": { "codepoints": [10765], "characters": "\u2A0D" }, + "½": { "codepoints": [189], "characters": "\u00BD" }, + "½": { "codepoints": [189], "characters": "\u00BD" }, + "⅓": { "codepoints": [8531], "characters": "\u2153" }, + "¼": { "codepoints": [188], "characters": "\u00BC" }, + "¼": { "codepoints": [188], "characters": "\u00BC" }, + "⅕": { "codepoints": [8533], "characters": "\u2155" }, + "⅙": { "codepoints": [8537], "characters": "\u2159" }, + "⅛": { "codepoints": [8539], "characters": "\u215B" }, + "⅔": { "codepoints": [8532], "characters": "\u2154" }, + "⅖": { "codepoints": [8534], "characters": "\u2156" }, + "¾": { "codepoints": [190], "characters": "\u00BE" }, + "¾": { "codepoints": [190], "characters": "\u00BE" }, + "⅗": { "codepoints": [8535], "characters": "\u2157" }, + "⅜": { "codepoints": [8540], "characters": "\u215C" }, + "⅘": { "codepoints": [8536], "characters": "\u2158" }, + "⅚": { "codepoints": [8538], "characters": "\u215A" }, + "⅝": { "codepoints": [8541], "characters": "\u215D" }, + "⅞": { "codepoints": [8542], "characters": "\u215E" }, + "⁄": { "codepoints": [8260], "characters": "\u2044" }, + "⌢": { "codepoints": [8994], "characters": "\u2322" }, + "𝒻": { "codepoints": [119995], "characters": "\uD835\uDCBB" }, + "≧": { "codepoints": [8807], "characters": "\u2267" }, + "⪌": { "codepoints": [10892], "characters": "\u2A8C" }, + "ǵ": { "codepoints": [501], "characters": "\u01F5" }, + "γ": { "codepoints": [947], "characters": "\u03B3" }, + "ϝ": { "codepoints": [989], "characters": "\u03DD" }, + "⪆": { "codepoints": [10886], "characters": "\u2A86" }, + "ğ": { "codepoints": [287], "characters": "\u011F" }, + "ĝ": { "codepoints": [285], "characters": "\u011D" }, + "г": { "codepoints": [1075], "characters": "\u0433" }, + "ġ": { "codepoints": [289], "characters": "\u0121" }, + "≥": { "codepoints": [8805], "characters": "\u2265" }, + "⋛": { "codepoints": [8923], "characters": "\u22DB" }, + "≥": { "codepoints": [8805], "characters": "\u2265" }, + "≧": { "codepoints": [8807], "characters": "\u2267" }, + "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, + "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, + "⪩": { "codepoints": [10921], "characters": "\u2AA9" }, + "⪀": { "codepoints": [10880], "characters": "\u2A80" }, + "⪂": { "codepoints": [10882], "characters": "\u2A82" }, + "⪄": { "codepoints": [10884], "characters": "\u2A84" }, + "⋛︀": { "codepoints": [8923, 65024], "characters": "\u22DB\uFE00" }, + "⪔": { "codepoints": [10900], "characters": "\u2A94" }, + "𝔤": { "codepoints": [120100], "characters": "\uD835\uDD24" }, + "≫": { "codepoints": [8811], "characters": "\u226B" }, + "⋙": { "codepoints": [8921], "characters": "\u22D9" }, + "ℷ": { "codepoints": [8503], "characters": "\u2137" }, + "ѓ": { "codepoints": [1107], "characters": "\u0453" }, + "≷": { "codepoints": [8823], "characters": "\u2277" }, + "⪒": { "codepoints": [10898], "characters": "\u2A92" }, + "⪥": { "codepoints": [10917], "characters": "\u2AA5" }, + "⪤": { "codepoints": [10916], "characters": "\u2AA4" }, + "≩": { "codepoints": [8809], "characters": "\u2269" }, + "⪊": { "codepoints": [10890], "characters": "\u2A8A" }, + "⪊": { "codepoints": [10890], "characters": "\u2A8A" }, + "⪈": { "codepoints": [10888], "characters": "\u2A88" }, + "⪈": { "codepoints": [10888], "characters": "\u2A88" }, + "≩": { "codepoints": [8809], "characters": "\u2269" }, + "⋧": { "codepoints": [8935], "characters": "\u22E7" }, + "𝕘": { "codepoints": [120152], "characters": "\uD835\uDD58" }, + "`": { "codepoints": [96], "characters": "\u0060" }, + "ℊ": { "codepoints": [8458], "characters": "\u210A" }, + "≳": { "codepoints": [8819], "characters": "\u2273" }, + "⪎": { "codepoints": [10894], "characters": "\u2A8E" }, + "⪐": { "codepoints": [10896], "characters": "\u2A90" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + ">": { "codepoints": [62], "characters": "\u003E" }, + "⪧": { "codepoints": [10919], "characters": "\u2AA7" }, + "⩺": { "codepoints": [10874], "characters": "\u2A7A" }, + "⋗": { "codepoints": [8919], "characters": "\u22D7" }, + "⦕": { "codepoints": [10645], "characters": "\u2995" }, + "⩼": { "codepoints": [10876], "characters": "\u2A7C" }, + "⪆": { "codepoints": [10886], "characters": "\u2A86" }, + "⥸": { "codepoints": [10616], "characters": "\u2978" }, + "⋗": { "codepoints": [8919], "characters": "\u22D7" }, + "⋛": { "codepoints": [8923], "characters": "\u22DB" }, + "⪌": { "codepoints": [10892], "characters": "\u2A8C" }, + "≷": { "codepoints": [8823], "characters": "\u2277" }, + "≳": { "codepoints": [8819], "characters": "\u2273" }, + "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" }, + "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + " ": { "codepoints": [8202], "characters": "\u200A" }, + "½": { "codepoints": [189], "characters": "\u00BD" }, + "ℋ": { "codepoints": [8459], "characters": "\u210B" }, + "ъ": { "codepoints": [1098], "characters": "\u044A" }, + "↔": { "codepoints": [8596], "characters": "\u2194" }, + "⥈": { "codepoints": [10568], "characters": "\u2948" }, + "↭": { "codepoints": [8621], "characters": "\u21AD" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "ĥ": { "codepoints": [293], "characters": "\u0125" }, + "♥": { "codepoints": [9829], "characters": "\u2665" }, + "♥": { "codepoints": [9829], "characters": "\u2665" }, + "…": { "codepoints": [8230], "characters": "\u2026" }, + "⊹": { "codepoints": [8889], "characters": "\u22B9" }, + "𝔥": { "codepoints": [120101], "characters": "\uD835\uDD25" }, + "⤥": { "codepoints": [10533], "characters": "\u2925" }, + "⤦": { "codepoints": [10534], "characters": "\u2926" }, + "⇿": { "codepoints": [8703], "characters": "\u21FF" }, + "∻": { "codepoints": [8763], "characters": "\u223B" }, + "↩": { "codepoints": [8617], "characters": "\u21A9" }, + "↪": { "codepoints": [8618], "characters": "\u21AA" }, + "𝕙": { "codepoints": [120153], "characters": "\uD835\uDD59" }, + "―": { "codepoints": [8213], "characters": "\u2015" }, + "𝒽": { "codepoints": [119997], "characters": "\uD835\uDCBD" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "ħ": { "codepoints": [295], "characters": "\u0127" }, + "⁃": { "codepoints": [8259], "characters": "\u2043" }, + "‐": { "codepoints": [8208], "characters": "\u2010" }, + "í": { "codepoints": [237], "characters": "\u00ED" }, + "í": { "codepoints": [237], "characters": "\u00ED" }, + "⁣": { "codepoints": [8291], "characters": "\u2063" }, + "î": { "codepoints": [238], "characters": "\u00EE" }, + "î": { "codepoints": [238], "characters": "\u00EE" }, + "и": { "codepoints": [1080], "characters": "\u0438" }, + "е": { "codepoints": [1077], "characters": "\u0435" }, + "¡": { "codepoints": [161], "characters": "\u00A1" }, + "¡": { "codepoints": [161], "characters": "\u00A1" }, + "⇔": { "codepoints": [8660], "characters": "\u21D4" }, + "𝔦": { "codepoints": [120102], "characters": "\uD835\uDD26" }, + "ì": { "codepoints": [236], "characters": "\u00EC" }, + "ì": { "codepoints": [236], "characters": "\u00EC" }, + "ⅈ": { "codepoints": [8520], "characters": "\u2148" }, + "⨌": { "codepoints": [10764], "characters": "\u2A0C" }, + "∭": { "codepoints": [8749], "characters": "\u222D" }, + "⧜": { "codepoints": [10716], "characters": "\u29DC" }, + "℩": { "codepoints": [8489], "characters": "\u2129" }, + "ij": { "codepoints": [307], "characters": "\u0133" }, + "ī": { "codepoints": [299], "characters": "\u012B" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "ℐ": { "codepoints": [8464], "characters": "\u2110" }, + "ℑ": { "codepoints": [8465], "characters": "\u2111" }, + "ı": { "codepoints": [305], "characters": "\u0131" }, + "⊷": { "codepoints": [8887], "characters": "\u22B7" }, + "Ƶ": { "codepoints": [437], "characters": "\u01B5" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "℅": { "codepoints": [8453], "characters": "\u2105" }, + "∞": { "codepoints": [8734], "characters": "\u221E" }, + "⧝": { "codepoints": [10717], "characters": "\u29DD" }, + "ı": { "codepoints": [305], "characters": "\u0131" }, + "∫": { "codepoints": [8747], "characters": "\u222B" }, + "⊺": { "codepoints": [8890], "characters": "\u22BA" }, + "ℤ": { "codepoints": [8484], "characters": "\u2124" }, + "⊺": { "codepoints": [8890], "characters": "\u22BA" }, + "⨗": { "codepoints": [10775], "characters": "\u2A17" }, + "⨼": { "codepoints": [10812], "characters": "\u2A3C" }, + "ё": { "codepoints": [1105], "characters": "\u0451" }, + "į": { "codepoints": [303], "characters": "\u012F" }, + "𝕚": { "codepoints": [120154], "characters": "\uD835\uDD5A" }, + "ι": { "codepoints": [953], "characters": "\u03B9" }, + "⨼": { "codepoints": [10812], "characters": "\u2A3C" }, + "¿": { "codepoints": [191], "characters": "\u00BF" }, + "¿": { "codepoints": [191], "characters": "\u00BF" }, + "𝒾": { "codepoints": [119998], "characters": "\uD835\uDCBE" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "⋹": { "codepoints": [8953], "characters": "\u22F9" }, + "⋵": { "codepoints": [8949], "characters": "\u22F5" }, + "⋴": { "codepoints": [8948], "characters": "\u22F4" }, + "⋳": { "codepoints": [8947], "characters": "\u22F3" }, + "∈": { "codepoints": [8712], "characters": "\u2208" }, + "⁢": { "codepoints": [8290], "characters": "\u2062" }, + "ĩ": { "codepoints": [297], "characters": "\u0129" }, + "і": { "codepoints": [1110], "characters": "\u0456" }, + "ï": { "codepoints": [239], "characters": "\u00EF" }, + "ï": { "codepoints": [239], "characters": "\u00EF" }, + "ĵ": { "codepoints": [309], "characters": "\u0135" }, + "й": { "codepoints": [1081], "characters": "\u0439" }, + "𝔧": { "codepoints": [120103], "characters": "\uD835\uDD27" }, + "ȷ": { "codepoints": [567], "characters": "\u0237" }, + "𝕛": { "codepoints": [120155], "characters": "\uD835\uDD5B" }, + "𝒿": { "codepoints": [119999], "characters": "\uD835\uDCBF" }, + "ј": { "codepoints": [1112], "characters": "\u0458" }, + "є": { "codepoints": [1108], "characters": "\u0454" }, + "κ": { "codepoints": [954], "characters": "\u03BA" }, + "ϰ": { "codepoints": [1008], "characters": "\u03F0" }, + "ķ": { "codepoints": [311], "characters": "\u0137" }, + "к": { "codepoints": [1082], "characters": "\u043A" }, + "𝔨": { "codepoints": [120104], "characters": "\uD835\uDD28" }, + "ĸ": { "codepoints": [312], "characters": "\u0138" }, + "х": { "codepoints": [1093], "characters": "\u0445" }, + "ќ": { "codepoints": [1116], "characters": "\u045C" }, + "𝕜": { "codepoints": [120156], "characters": "\uD835\uDD5C" }, + "𝓀": { "codepoints": [120000], "characters": "\uD835\uDCC0" }, + "⇚": { "codepoints": [8666], "characters": "\u21DA" }, + "⇐": { "codepoints": [8656], "characters": "\u21D0" }, + "⤛": { "codepoints": [10523], "characters": "\u291B" }, + "⤎": { "codepoints": [10510], "characters": "\u290E" }, + "≦": { "codepoints": [8806], "characters": "\u2266" }, + "⪋": { "codepoints": [10891], "characters": "\u2A8B" }, + "⥢": { "codepoints": [10594], "characters": "\u2962" }, + "ĺ": { "codepoints": [314], "characters": "\u013A" }, + "⦴": { "codepoints": [10676], "characters": "\u29B4" }, + "ℒ": { "codepoints": [8466], "characters": "\u2112" }, + "λ": { "codepoints": [955], "characters": "\u03BB" }, + "⟨": { "codepoints": [10216], "characters": "\u27E8" }, + "⦑": { "codepoints": [10641], "characters": "\u2991" }, + "⟨": { "codepoints": [10216], "characters": "\u27E8" }, + "⪅": { "codepoints": [10885], "characters": "\u2A85" }, + "«": { "codepoints": [171], "characters": "\u00AB" }, + "«": { "codepoints": [171], "characters": "\u00AB" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "⇤": { "codepoints": [8676], "characters": "\u21E4" }, + "⤟": { "codepoints": [10527], "characters": "\u291F" }, + "⤝": { "codepoints": [10525], "characters": "\u291D" }, + "↩": { "codepoints": [8617], "characters": "\u21A9" }, + "↫": { "codepoints": [8619], "characters": "\u21AB" }, + "⤹": { "codepoints": [10553], "characters": "\u2939" }, + "⥳": { "codepoints": [10611], "characters": "\u2973" }, + "↢": { "codepoints": [8610], "characters": "\u21A2" }, + "⪫": { "codepoints": [10923], "characters": "\u2AAB" }, + "⤙": { "codepoints": [10521], "characters": "\u2919" }, + "⪭": { "codepoints": [10925], "characters": "\u2AAD" }, + "⪭︀": { "codepoints": [10925, 65024], "characters": "\u2AAD\uFE00" }, + "⤌": { "codepoints": [10508], "characters": "\u290C" }, + "❲": { "codepoints": [10098], "characters": "\u2772" }, + "{": { "codepoints": [123], "characters": "\u007B" }, + "[": { "codepoints": [91], "characters": "\u005B" }, + "⦋": { "codepoints": [10635], "characters": "\u298B" }, + "⦏": { "codepoints": [10639], "characters": "\u298F" }, + "⦍": { "codepoints": [10637], "characters": "\u298D" }, + "ľ": { "codepoints": [318], "characters": "\u013E" }, + "ļ": { "codepoints": [316], "characters": "\u013C" }, + "⌈": { "codepoints": [8968], "characters": "\u2308" }, + "{": { "codepoints": [123], "characters": "\u007B" }, + "л": { "codepoints": [1083], "characters": "\u043B" }, + "⤶": { "codepoints": [10550], "characters": "\u2936" }, + "“": { "codepoints": [8220], "characters": "\u201C" }, + "„": { "codepoints": [8222], "characters": "\u201E" }, + "⥧": { "codepoints": [10599], "characters": "\u2967" }, + "⥋": { "codepoints": [10571], "characters": "\u294B" }, + "↲": { "codepoints": [8626], "characters": "\u21B2" }, + "≤": { "codepoints": [8804], "characters": "\u2264" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "↢": { "codepoints": [8610], "characters": "\u21A2" }, + "↽": { "codepoints": [8637], "characters": "\u21BD" }, + "↼": { "codepoints": [8636], "characters": "\u21BC" }, + "⇇": { "codepoints": [8647], "characters": "\u21C7" }, + "↔": { "codepoints": [8596], "characters": "\u2194" }, + "⇆": { "codepoints": [8646], "characters": "\u21C6" }, + "⇋": { "codepoints": [8651], "characters": "\u21CB" }, + "↭": { "codepoints": [8621], "characters": "\u21AD" }, + "⋋": { "codepoints": [8907], "characters": "\u22CB" }, + "⋚": { "codepoints": [8922], "characters": "\u22DA" }, + "≤": { "codepoints": [8804], "characters": "\u2264" }, + "≦": { "codepoints": [8806], "characters": "\u2266" }, + "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, + "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, + "⪨": { "codepoints": [10920], "characters": "\u2AA8" }, + "⩿": { "codepoints": [10879], "characters": "\u2A7F" }, + "⪁": { "codepoints": [10881], "characters": "\u2A81" }, + "⪃": { "codepoints": [10883], "characters": "\u2A83" }, + "⋚︀": { "codepoints": [8922, 65024], "characters": "\u22DA\uFE00" }, + "⪓": { "codepoints": [10899], "characters": "\u2A93" }, + "⪅": { "codepoints": [10885], "characters": "\u2A85" }, + "⋖": { "codepoints": [8918], "characters": "\u22D6" }, + "⋚": { "codepoints": [8922], "characters": "\u22DA" }, + "⪋": { "codepoints": [10891], "characters": "\u2A8B" }, + "≶": { "codepoints": [8822], "characters": "\u2276" }, + "≲": { "codepoints": [8818], "characters": "\u2272" }, + "⥼": { "codepoints": [10620], "characters": "\u297C" }, + "⌊": { "codepoints": [8970], "characters": "\u230A" }, + "𝔩": { "codepoints": [120105], "characters": "\uD835\uDD29" }, + "≶": { "codepoints": [8822], "characters": "\u2276" }, + "⪑": { "codepoints": [10897], "characters": "\u2A91" }, + "↽": { "codepoints": [8637], "characters": "\u21BD" }, + "↼": { "codepoints": [8636], "characters": "\u21BC" }, + "⥪": { "codepoints": [10602], "characters": "\u296A" }, + "▄": { "codepoints": [9604], "characters": "\u2584" }, + "љ": { "codepoints": [1113], "characters": "\u0459" }, + "≪": { "codepoints": [8810], "characters": "\u226A" }, + "⇇": { "codepoints": [8647], "characters": "\u21C7" }, + "⌞": { "codepoints": [8990], "characters": "\u231E" }, + "⥫": { "codepoints": [10603], "characters": "\u296B" }, + "◺": { "codepoints": [9722], "characters": "\u25FA" }, + "ŀ": { "codepoints": [320], "characters": "\u0140" }, + "⎰": { "codepoints": [9136], "characters": "\u23B0" }, + "⎰": { "codepoints": [9136], "characters": "\u23B0" }, + "≨": { "codepoints": [8808], "characters": "\u2268" }, + "⪉": { "codepoints": [10889], "characters": "\u2A89" }, + "⪉": { "codepoints": [10889], "characters": "\u2A89" }, + "⪇": { "codepoints": [10887], "characters": "\u2A87" }, + "⪇": { "codepoints": [10887], "characters": "\u2A87" }, + "≨": { "codepoints": [8808], "characters": "\u2268" }, + "⋦": { "codepoints": [8934], "characters": "\u22E6" }, + "⟬": { "codepoints": [10220], "characters": "\u27EC" }, + "⇽": { "codepoints": [8701], "characters": "\u21FD" }, + "⟦": { "codepoints": [10214], "characters": "\u27E6" }, + "⟵": { "codepoints": [10229], "characters": "\u27F5" }, + "⟷": { "codepoints": [10231], "characters": "\u27F7" }, + "⟼": { "codepoints": [10236], "characters": "\u27FC" }, + "⟶": { "codepoints": [10230], "characters": "\u27F6" }, + "↫": { "codepoints": [8619], "characters": "\u21AB" }, + "↬": { "codepoints": [8620], "characters": "\u21AC" }, + "⦅": { "codepoints": [10629], "characters": "\u2985" }, + "𝕝": { "codepoints": [120157], "characters": "\uD835\uDD5D" }, + "⨭": { "codepoints": [10797], "characters": "\u2A2D" }, + "⨴": { "codepoints": [10804], "characters": "\u2A34" }, + "∗": { "codepoints": [8727], "characters": "\u2217" }, + "_": { "codepoints": [95], "characters": "\u005F" }, + "◊": { "codepoints": [9674], "characters": "\u25CA" }, + "◊": { "codepoints": [9674], "characters": "\u25CA" }, + "⧫": { "codepoints": [10731], "characters": "\u29EB" }, + "(": { "codepoints": [40], "characters": "\u0028" }, + "⦓": { "codepoints": [10643], "characters": "\u2993" }, + "⇆": { "codepoints": [8646], "characters": "\u21C6" }, + "⌟": { "codepoints": [8991], "characters": "\u231F" }, + "⇋": { "codepoints": [8651], "characters": "\u21CB" }, + "⥭": { "codepoints": [10605], "characters": "\u296D" }, + "‎": { "codepoints": [8206], "characters": "\u200E" }, + "⊿": { "codepoints": [8895], "characters": "\u22BF" }, + "‹": { "codepoints": [8249], "characters": "\u2039" }, + "𝓁": { "codepoints": [120001], "characters": "\uD835\uDCC1" }, + "↰": { "codepoints": [8624], "characters": "\u21B0" }, + "≲": { "codepoints": [8818], "characters": "\u2272" }, + "⪍": { "codepoints": [10893], "characters": "\u2A8D" }, + "⪏": { "codepoints": [10895], "characters": "\u2A8F" }, + "[": { "codepoints": [91], "characters": "\u005B" }, + "‘": { "codepoints": [8216], "characters": "\u2018" }, + "‚": { "codepoints": [8218], "characters": "\u201A" }, + "ł": { "codepoints": [322], "characters": "\u0142" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "<": { "codepoints": [60], "characters": "\u003C" }, + "⪦": { "codepoints": [10918], "characters": "\u2AA6" }, + "⩹": { "codepoints": [10873], "characters": "\u2A79" }, + "⋖": { "codepoints": [8918], "characters": "\u22D6" }, + "⋋": { "codepoints": [8907], "characters": "\u22CB" }, + "⋉": { "codepoints": [8905], "characters": "\u22C9" }, + "⥶": { "codepoints": [10614], "characters": "\u2976" }, + "⩻": { "codepoints": [10875], "characters": "\u2A7B" }, + "⦖": { "codepoints": [10646], "characters": "\u2996" }, + "◃": { "codepoints": [9667], "characters": "\u25C3" }, + "⊴": { "codepoints": [8884], "characters": "\u22B4" }, + "◂": { "codepoints": [9666], "characters": "\u25C2" }, + "⥊": { "codepoints": [10570], "characters": "\u294A" }, + "⥦": { "codepoints": [10598], "characters": "\u2966" }, + "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" }, + "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" }, + "∺": { "codepoints": [8762], "characters": "\u223A" }, + "¯": { "codepoints": [175], "characters": "\u00AF" }, + "¯": { "codepoints": [175], "characters": "\u00AF" }, + "♂": { "codepoints": [9794], "characters": "\u2642" }, + "✠": { "codepoints": [10016], "characters": "\u2720" }, + "✠": { "codepoints": [10016], "characters": "\u2720" }, + "↦": { "codepoints": [8614], "characters": "\u21A6" }, + "↦": { "codepoints": [8614], "characters": "\u21A6" }, + "↧": { "codepoints": [8615], "characters": "\u21A7" }, + "↤": { "codepoints": [8612], "characters": "\u21A4" }, + "↥": { "codepoints": [8613], "characters": "\u21A5" }, + "▮": { "codepoints": [9646], "characters": "\u25AE" }, + "⨩": { "codepoints": [10793], "characters": "\u2A29" }, + "м": { "codepoints": [1084], "characters": "\u043C" }, + "—": { "codepoints": [8212], "characters": "\u2014" }, + "∡": { "codepoints": [8737], "characters": "\u2221" }, + "𝔪": { "codepoints": [120106], "characters": "\uD835\uDD2A" }, + "℧": { "codepoints": [8487], "characters": "\u2127" }, + "µ": { "codepoints": [181], "characters": "\u00B5" }, + "µ": { "codepoints": [181], "characters": "\u00B5" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "*": { "codepoints": [42], "characters": "\u002A" }, + "⫰": { "codepoints": [10992], "characters": "\u2AF0" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "·": { "codepoints": [183], "characters": "\u00B7" }, + "−": { "codepoints": [8722], "characters": "\u2212" }, + "⊟": { "codepoints": [8863], "characters": "\u229F" }, + "∸": { "codepoints": [8760], "characters": "\u2238" }, + "⨪": { "codepoints": [10794], "characters": "\u2A2A" }, + "⫛": { "codepoints": [10971], "characters": "\u2ADB" }, + "…": { "codepoints": [8230], "characters": "\u2026" }, + "∓": { "codepoints": [8723], "characters": "\u2213" }, + "⊧": { "codepoints": [8871], "characters": "\u22A7" }, + "𝕞": { "codepoints": [120158], "characters": "\uD835\uDD5E" }, + "∓": { "codepoints": [8723], "characters": "\u2213" }, + "𝓂": { "codepoints": [120002], "characters": "\uD835\uDCC2" }, + "∾": { "codepoints": [8766], "characters": "\u223E" }, + "μ": { "codepoints": [956], "characters": "\u03BC" }, + "⊸": { "codepoints": [8888], "characters": "\u22B8" }, + "⊸": { "codepoints": [8888], "characters": "\u22B8" }, + "⋙̸": { "codepoints": [8921, 824], "characters": "\u22D9\u0338" }, + "≫⃒": { "codepoints": [8811, 8402], "characters": "\u226B\u20D2" }, + "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" }, + "⇍": { "codepoints": [8653], "characters": "\u21CD" }, + "⇎": { "codepoints": [8654], "characters": "\u21CE" }, + "⋘̸": { "codepoints": [8920, 824], "characters": "\u22D8\u0338" }, + "≪⃒": { "codepoints": [8810, 8402], "characters": "\u226A\u20D2" }, + "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" }, + "⇏": { "codepoints": [8655], "characters": "\u21CF" }, + "⊯": { "codepoints": [8879], "characters": "\u22AF" }, + "⊮": { "codepoints": [8878], "characters": "\u22AE" }, + "∇": { "codepoints": [8711], "characters": "\u2207" }, + "ń": { "codepoints": [324], "characters": "\u0144" }, + "∠⃒": { "codepoints": [8736, 8402], "characters": "\u2220\u20D2" }, + "≉": { "codepoints": [8777], "characters": "\u2249" }, + "⩰̸": { "codepoints": [10864, 824], "characters": "\u2A70\u0338" }, + "≋̸": { "codepoints": [8779, 824], "characters": "\u224B\u0338" }, + "ʼn": { "codepoints": [329], "characters": "\u0149" }, + "≉": { "codepoints": [8777], "characters": "\u2249" }, + "♮": { "codepoints": [9838], "characters": "\u266E" }, + "♮": { "codepoints": [9838], "characters": "\u266E" }, + "ℕ": { "codepoints": [8469], "characters": "\u2115" }, + " ": { "codepoints": [160], "characters": "\u00A0" }, + " ": { "codepoints": [160], "characters": "\u00A0" }, + "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" }, + "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" }, + "⩃": { "codepoints": [10819], "characters": "\u2A43" }, + "ň": { "codepoints": [328], "characters": "\u0148" }, + "ņ": { "codepoints": [326], "characters": "\u0146" }, + "≇": { "codepoints": [8775], "characters": "\u2247" }, + "⩭̸": { "codepoints": [10861, 824], "characters": "\u2A6D\u0338" }, + "⩂": { "codepoints": [10818], "characters": "\u2A42" }, + "н": { "codepoints": [1085], "characters": "\u043D" }, + "–": { "codepoints": [8211], "characters": "\u2013" }, + "≠": { "codepoints": [8800], "characters": "\u2260" }, + "⇗": { "codepoints": [8663], "characters": "\u21D7" }, + "⤤": { "codepoints": [10532], "characters": "\u2924" }, + "↗": { "codepoints": [8599], "characters": "\u2197" }, + "↗": { "codepoints": [8599], "characters": "\u2197" }, + "≐̸": { "codepoints": [8784, 824], "characters": "\u2250\u0338" }, + "≢": { "codepoints": [8802], "characters": "\u2262" }, + "⤨": { "codepoints": [10536], "characters": "\u2928" }, + "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" }, + "∄": { "codepoints": [8708], "characters": "\u2204" }, + "∄": { "codepoints": [8708], "characters": "\u2204" }, + "𝔫": { "codepoints": [120107], "characters": "\uD835\uDD2B" }, + "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, + "≱": { "codepoints": [8817], "characters": "\u2271" }, + "≱": { "codepoints": [8817], "characters": "\u2271" }, + "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, + "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, + "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, + "≵": { "codepoints": [8821], "characters": "\u2275" }, + "≯": { "codepoints": [8815], "characters": "\u226F" }, + "≯": { "codepoints": [8815], "characters": "\u226F" }, + "⇎": { "codepoints": [8654], "characters": "\u21CE" }, + "↮": { "codepoints": [8622], "characters": "\u21AE" }, + "⫲": { "codepoints": [10994], "characters": "\u2AF2" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "⋼": { "codepoints": [8956], "characters": "\u22FC" }, + "⋺": { "codepoints": [8954], "characters": "\u22FA" }, + "∋": { "codepoints": [8715], "characters": "\u220B" }, + "њ": { "codepoints": [1114], "characters": "\u045A" }, + "⇍": { "codepoints": [8653], "characters": "\u21CD" }, + "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" }, + "↚": { "codepoints": [8602], "characters": "\u219A" }, + "‥": { "codepoints": [8229], "characters": "\u2025" }, + "≰": { "codepoints": [8816], "characters": "\u2270" }, + "↚": { "codepoints": [8602], "characters": "\u219A" }, + "↮": { "codepoints": [8622], "characters": "\u21AE" }, + "≰": { "codepoints": [8816], "characters": "\u2270" }, + "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" }, + "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, + "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, + "≮": { "codepoints": [8814], "characters": "\u226E" }, + "≴": { "codepoints": [8820], "characters": "\u2274" }, + "≮": { "codepoints": [8814], "characters": "\u226E" }, + "⋪": { "codepoints": [8938], "characters": "\u22EA" }, + "⋬": { "codepoints": [8940], "characters": "\u22EC" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "𝕟": { "codepoints": [120159], "characters": "\uD835\uDD5F" }, + "¬": { "codepoints": [172], "characters": "\u00AC" }, + "¬": { "codepoints": [172], "characters": "\u00AC" }, + "∉": { "codepoints": [8713], "characters": "\u2209" }, + "⋹̸": { "codepoints": [8953, 824], "characters": "\u22F9\u0338" }, + "⋵̸": { "codepoints": [8949, 824], "characters": "\u22F5\u0338" }, + "∉": { "codepoints": [8713], "characters": "\u2209" }, + "⋷": { "codepoints": [8951], "characters": "\u22F7" }, + "⋶": { "codepoints": [8950], "characters": "\u22F6" }, + "∌": { "codepoints": [8716], "characters": "\u220C" }, + "∌": { "codepoints": [8716], "characters": "\u220C" }, + "⋾": { "codepoints": [8958], "characters": "\u22FE" }, + "⋽": { "codepoints": [8957], "characters": "\u22FD" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "⫽⃥": { "codepoints": [11005, 8421], "characters": "\u2AFD\u20E5" }, + "∂̸": { "codepoints": [8706, 824], "characters": "\u2202\u0338" }, + "⨔": { "codepoints": [10772], "characters": "\u2A14" }, + "⊀": { "codepoints": [8832], "characters": "\u2280" }, + "⋠": { "codepoints": [8928], "characters": "\u22E0" }, + "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, + "⊀": { "codepoints": [8832], "characters": "\u2280" }, + "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, + "⇏": { "codepoints": [8655], "characters": "\u21CF" }, + "↛": { "codepoints": [8603], "characters": "\u219B" }, + "⤳̸": { "codepoints": [10547, 824], "characters": "\u2933\u0338" }, + "↝̸": { "codepoints": [8605, 824], "characters": "\u219D\u0338" }, + "↛": { "codepoints": [8603], "characters": "\u219B" }, + "⋫": { "codepoints": [8939], "characters": "\u22EB" }, + "⋭": { "codepoints": [8941], "characters": "\u22ED" }, + "⊁": { "codepoints": [8833], "characters": "\u2281" }, + "⋡": { "codepoints": [8929], "characters": "\u22E1" }, + "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, + "𝓃": { "codepoints": [120003], "characters": "\uD835\uDCC3" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "≁": { "codepoints": [8769], "characters": "\u2241" }, + "≄": { "codepoints": [8772], "characters": "\u2244" }, + "≄": { "codepoints": [8772], "characters": "\u2244" }, + "∤": { "codepoints": [8740], "characters": "\u2224" }, + "∦": { "codepoints": [8742], "characters": "\u2226" }, + "⋢": { "codepoints": [8930], "characters": "\u22E2" }, + "⋣": { "codepoints": [8931], "characters": "\u22E3" }, + "⊄": { "codepoints": [8836], "characters": "\u2284" }, + "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" }, + "⊈": { "codepoints": [8840], "characters": "\u2288" }, + "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, + "⊈": { "codepoints": [8840], "characters": "\u2288" }, + "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" }, + "⊁": { "codepoints": [8833], "characters": "\u2281" }, + "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, + "⊅": { "codepoints": [8837], "characters": "\u2285" }, + "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" }, + "⊉": { "codepoints": [8841], "characters": "\u2289" }, + "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, + "⊉": { "codepoints": [8841], "characters": "\u2289" }, + "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" }, + "≹": { "codepoints": [8825], "characters": "\u2279" }, + "ñ": { "codepoints": [241], "characters": "\u00F1" }, + "ñ": { "codepoints": [241], "characters": "\u00F1" }, + "≸": { "codepoints": [8824], "characters": "\u2278" }, + "⋪": { "codepoints": [8938], "characters": "\u22EA" }, + "⋬": { "codepoints": [8940], "characters": "\u22EC" }, + "⋫": { "codepoints": [8939], "characters": "\u22EB" }, + "⋭": { "codepoints": [8941], "characters": "\u22ED" }, + "ν": { "codepoints": [957], "characters": "\u03BD" }, + "#": { "codepoints": [35], "characters": "\u0023" }, + "№": { "codepoints": [8470], "characters": "\u2116" }, + " ": { "codepoints": [8199], "characters": "\u2007" }, + "⊭": { "codepoints": [8877], "characters": "\u22AD" }, + "⤄": { "codepoints": [10500], "characters": "\u2904" }, + "≍⃒": { "codepoints": [8781, 8402], "characters": "\u224D\u20D2" }, + "⊬": { "codepoints": [8876], "characters": "\u22AC" }, + "≥⃒": { "codepoints": [8805, 8402], "characters": "\u2265\u20D2" }, + ">⃒": { "codepoints": [62, 8402], "characters": "\u003E\u20D2" }, + "⧞": { "codepoints": [10718], "characters": "\u29DE" }, + "⤂": { "codepoints": [10498], "characters": "\u2902" }, + "≤⃒": { "codepoints": [8804, 8402], "characters": "\u2264\u20D2" }, + "<⃒": { "codepoints": [60, 8402], "characters": "\u003C\u20D2" }, + "⊴⃒": { "codepoints": [8884, 8402], "characters": "\u22B4\u20D2" }, + "⤃": { "codepoints": [10499], "characters": "\u2903" }, + "⊵⃒": { "codepoints": [8885, 8402], "characters": "\u22B5\u20D2" }, + "∼⃒": { "codepoints": [8764, 8402], "characters": "\u223C\u20D2" }, + "⇖": { "codepoints": [8662], "characters": "\u21D6" }, + "⤣": { "codepoints": [10531], "characters": "\u2923" }, + "↖": { "codepoints": [8598], "characters": "\u2196" }, + "↖": { "codepoints": [8598], "characters": "\u2196" }, + "⤧": { "codepoints": [10535], "characters": "\u2927" }, + "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" }, + "ó": { "codepoints": [243], "characters": "\u00F3" }, + "ó": { "codepoints": [243], "characters": "\u00F3" }, + "⊛": { "codepoints": [8859], "characters": "\u229B" }, + "⊚": { "codepoints": [8858], "characters": "\u229A" }, + "ô": { "codepoints": [244], "characters": "\u00F4" }, + "ô": { "codepoints": [244], "characters": "\u00F4" }, + "о": { "codepoints": [1086], "characters": "\u043E" }, + "⊝": { "codepoints": [8861], "characters": "\u229D" }, + "ő": { "codepoints": [337], "characters": "\u0151" }, + "⨸": { "codepoints": [10808], "characters": "\u2A38" }, + "⊙": { "codepoints": [8857], "characters": "\u2299" }, + "⦼": { "codepoints": [10684], "characters": "\u29BC" }, + "œ": { "codepoints": [339], "characters": "\u0153" }, + "⦿": { "codepoints": [10687], "characters": "\u29BF" }, + "𝔬": { "codepoints": [120108], "characters": "\uD835\uDD2C" }, + "˛": { "codepoints": [731], "characters": "\u02DB" }, + "ò": { "codepoints": [242], "characters": "\u00F2" }, + "ò": { "codepoints": [242], "characters": "\u00F2" }, + "⧁": { "codepoints": [10689], "characters": "\u29C1" }, + "⦵": { "codepoints": [10677], "characters": "\u29B5" }, + "Ω": { "codepoints": [937], "characters": "\u03A9" }, + "∮": { "codepoints": [8750], "characters": "\u222E" }, + "↺": { "codepoints": [8634], "characters": "\u21BA" }, + "⦾": { "codepoints": [10686], "characters": "\u29BE" }, + "⦻": { "codepoints": [10683], "characters": "\u29BB" }, + "‾": { "codepoints": [8254], "characters": "\u203E" }, + "⧀": { "codepoints": [10688], "characters": "\u29C0" }, + "ō": { "codepoints": [333], "characters": "\u014D" }, + "ω": { "codepoints": [969], "characters": "\u03C9" }, + "ο": { "codepoints": [959], "characters": "\u03BF" }, + "⦶": { "codepoints": [10678], "characters": "\u29B6" }, + "⊖": { "codepoints": [8854], "characters": "\u2296" }, + "𝕠": { "codepoints": [120160], "characters": "\uD835\uDD60" }, + "⦷": { "codepoints": [10679], "characters": "\u29B7" }, + "⦹": { "codepoints": [10681], "characters": "\u29B9" }, + "⊕": { "codepoints": [8853], "characters": "\u2295" }, + "∨": { "codepoints": [8744], "characters": "\u2228" }, + "↻": { "codepoints": [8635], "characters": "\u21BB" }, + "⩝": { "codepoints": [10845], "characters": "\u2A5D" }, + "ℴ": { "codepoints": [8500], "characters": "\u2134" }, + "ℴ": { "codepoints": [8500], "characters": "\u2134" }, + "ª": { "codepoints": [170], "characters": "\u00AA" }, + "ª": { "codepoints": [170], "characters": "\u00AA" }, + "º": { "codepoints": [186], "characters": "\u00BA" }, + "º": { "codepoints": [186], "characters": "\u00BA" }, + "⊶": { "codepoints": [8886], "characters": "\u22B6" }, + "⩖": { "codepoints": [10838], "characters": "\u2A56" }, + "⩗": { "codepoints": [10839], "characters": "\u2A57" }, + "⩛": { "codepoints": [10843], "characters": "\u2A5B" }, + "ℴ": { "codepoints": [8500], "characters": "\u2134" }, + "ø": { "codepoints": [248], "characters": "\u00F8" }, + "ø": { "codepoints": [248], "characters": "\u00F8" }, + "⊘": { "codepoints": [8856], "characters": "\u2298" }, + "õ": { "codepoints": [245], "characters": "\u00F5" }, + "õ": { "codepoints": [245], "characters": "\u00F5" }, + "⊗": { "codepoints": [8855], "characters": "\u2297" }, + "⨶": { "codepoints": [10806], "characters": "\u2A36" }, + "ö": { "codepoints": [246], "characters": "\u00F6" }, + "ö": { "codepoints": [246], "characters": "\u00F6" }, + "⌽": { "codepoints": [9021], "characters": "\u233D" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "¶": { "codepoints": [182], "characters": "\u00B6" }, + "¶": { "codepoints": [182], "characters": "\u00B6" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "⫳": { "codepoints": [10995], "characters": "\u2AF3" }, + "⫽": { "codepoints": [11005], "characters": "\u2AFD" }, + "∂": { "codepoints": [8706], "characters": "\u2202" }, + "п": { "codepoints": [1087], "characters": "\u043F" }, + "%": { "codepoints": [37], "characters": "\u0025" }, + ".": { "codepoints": [46], "characters": "\u002E" }, + "‰": { "codepoints": [8240], "characters": "\u2030" }, + "⊥": { "codepoints": [8869], "characters": "\u22A5" }, + "‱": { "codepoints": [8241], "characters": "\u2031" }, + "𝔭": { "codepoints": [120109], "characters": "\uD835\uDD2D" }, + "φ": { "codepoints": [966], "characters": "\u03C6" }, + "ϕ": { "codepoints": [981], "characters": "\u03D5" }, + "ℳ": { "codepoints": [8499], "characters": "\u2133" }, + "☎": { "codepoints": [9742], "characters": "\u260E" }, + "π": { "codepoints": [960], "characters": "\u03C0" }, + "⋔": { "codepoints": [8916], "characters": "\u22D4" }, + "ϖ": { "codepoints": [982], "characters": "\u03D6" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "ℎ": { "codepoints": [8462], "characters": "\u210E" }, + "ℏ": { "codepoints": [8463], "characters": "\u210F" }, + "+": { "codepoints": [43], "characters": "\u002B" }, + "⨣": { "codepoints": [10787], "characters": "\u2A23" }, + "⊞": { "codepoints": [8862], "characters": "\u229E" }, + "⨢": { "codepoints": [10786], "characters": "\u2A22" }, + "∔": { "codepoints": [8724], "characters": "\u2214" }, + "⨥": { "codepoints": [10789], "characters": "\u2A25" }, + "⩲": { "codepoints": [10866], "characters": "\u2A72" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "⨦": { "codepoints": [10790], "characters": "\u2A26" }, + "⨧": { "codepoints": [10791], "characters": "\u2A27" }, + "±": { "codepoints": [177], "characters": "\u00B1" }, + "⨕": { "codepoints": [10773], "characters": "\u2A15" }, + "𝕡": { "codepoints": [120161], "characters": "\uD835\uDD61" }, + "£": { "codepoints": [163], "characters": "\u00A3" }, + "£": { "codepoints": [163], "characters": "\u00A3" }, + "≺": { "codepoints": [8826], "characters": "\u227A" }, + "⪳": { "codepoints": [10931], "characters": "\u2AB3" }, + "⪷": { "codepoints": [10935], "characters": "\u2AB7" }, + "≼": { "codepoints": [8828], "characters": "\u227C" }, + "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, + "≺": { "codepoints": [8826], "characters": "\u227A" }, + "⪷": { "codepoints": [10935], "characters": "\u2AB7" }, + "≼": { "codepoints": [8828], "characters": "\u227C" }, + "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, + "⪹": { "codepoints": [10937], "characters": "\u2AB9" }, + "⪵": { "codepoints": [10933], "characters": "\u2AB5" }, + "⋨": { "codepoints": [8936], "characters": "\u22E8" }, + "≾": { "codepoints": [8830], "characters": "\u227E" }, + "′": { "codepoints": [8242], "characters": "\u2032" }, + "ℙ": { "codepoints": [8473], "characters": "\u2119" }, + "⪵": { "codepoints": [10933], "characters": "\u2AB5" }, + "⪹": { "codepoints": [10937], "characters": "\u2AB9" }, + "⋨": { "codepoints": [8936], "characters": "\u22E8" }, + "∏": { "codepoints": [8719], "characters": "\u220F" }, + "⌮": { "codepoints": [9006], "characters": "\u232E" }, + "⌒": { "codepoints": [8978], "characters": "\u2312" }, + "⌓": { "codepoints": [8979], "characters": "\u2313" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "≾": { "codepoints": [8830], "characters": "\u227E" }, + "⊰": { "codepoints": [8880], "characters": "\u22B0" }, + "𝓅": { "codepoints": [120005], "characters": "\uD835\uDCC5" }, + "ψ": { "codepoints": [968], "characters": "\u03C8" }, + " ": { "codepoints": [8200], "characters": "\u2008" }, + "𝔮": { "codepoints": [120110], "characters": "\uD835\uDD2E" }, + "⨌": { "codepoints": [10764], "characters": "\u2A0C" }, + "𝕢": { "codepoints": [120162], "characters": "\uD835\uDD62" }, + "⁗": { "codepoints": [8279], "characters": "\u2057" }, + "𝓆": { "codepoints": [120006], "characters": "\uD835\uDCC6" }, + "ℍ": { "codepoints": [8461], "characters": "\u210D" }, + "⨖": { "codepoints": [10774], "characters": "\u2A16" }, + "?": { "codepoints": [63], "characters": "\u003F" }, + "≟": { "codepoints": [8799], "characters": "\u225F" }, + """: { "codepoints": [34], "characters": "\u0022" }, + """: { "codepoints": [34], "characters": "\u0022" }, + "⇛": { "codepoints": [8667], "characters": "\u21DB" }, + "⇒": { "codepoints": [8658], "characters": "\u21D2" }, + "⤜": { "codepoints": [10524], "characters": "\u291C" }, + "⤏": { "codepoints": [10511], "characters": "\u290F" }, + "⥤": { "codepoints": [10596], "characters": "\u2964" }, + "∽̱": { "codepoints": [8765, 817], "characters": "\u223D\u0331" }, + "ŕ": { "codepoints": [341], "characters": "\u0155" }, + "√": { "codepoints": [8730], "characters": "\u221A" }, + "⦳": { "codepoints": [10675], "characters": "\u29B3" }, + "⟩": { "codepoints": [10217], "characters": "\u27E9" }, + "⦒": { "codepoints": [10642], "characters": "\u2992" }, + "⦥": { "codepoints": [10661], "characters": "\u29A5" }, + "⟩": { "codepoints": [10217], "characters": "\u27E9" }, + "»": { "codepoints": [187], "characters": "\u00BB" }, + "»": { "codepoints": [187], "characters": "\u00BB" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "⥵": { "codepoints": [10613], "characters": "\u2975" }, + "⇥": { "codepoints": [8677], "characters": "\u21E5" }, + "⤠": { "codepoints": [10528], "characters": "\u2920" }, + "⤳": { "codepoints": [10547], "characters": "\u2933" }, + "⤞": { "codepoints": [10526], "characters": "\u291E" }, + "↪": { "codepoints": [8618], "characters": "\u21AA" }, + "↬": { "codepoints": [8620], "characters": "\u21AC" }, + "⥅": { "codepoints": [10565], "characters": "\u2945" }, + "⥴": { "codepoints": [10612], "characters": "\u2974" }, + "↣": { "codepoints": [8611], "characters": "\u21A3" }, + "↝": { "codepoints": [8605], "characters": "\u219D" }, + "⤚": { "codepoints": [10522], "characters": "\u291A" }, + "∶": { "codepoints": [8758], "characters": "\u2236" }, + "ℚ": { "codepoints": [8474], "characters": "\u211A" }, + "⤍": { "codepoints": [10509], "characters": "\u290D" }, + "❳": { "codepoints": [10099], "characters": "\u2773" }, + "}": { "codepoints": [125], "characters": "\u007D" }, + "]": { "codepoints": [93], "characters": "\u005D" }, + "⦌": { "codepoints": [10636], "characters": "\u298C" }, + "⦎": { "codepoints": [10638], "characters": "\u298E" }, + "⦐": { "codepoints": [10640], "characters": "\u2990" }, + "ř": { "codepoints": [345], "characters": "\u0159" }, + "ŗ": { "codepoints": [343], "characters": "\u0157" }, + "⌉": { "codepoints": [8969], "characters": "\u2309" }, + "}": { "codepoints": [125], "characters": "\u007D" }, + "р": { "codepoints": [1088], "characters": "\u0440" }, + "⤷": { "codepoints": [10551], "characters": "\u2937" }, + "⥩": { "codepoints": [10601], "characters": "\u2969" }, + "”": { "codepoints": [8221], "characters": "\u201D" }, + "”": { "codepoints": [8221], "characters": "\u201D" }, + "↳": { "codepoints": [8627], "characters": "\u21B3" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "ℛ": { "codepoints": [8475], "characters": "\u211B" }, + "ℜ": { "codepoints": [8476], "characters": "\u211C" }, + "ℝ": { "codepoints": [8477], "characters": "\u211D" }, + "▭": { "codepoints": [9645], "characters": "\u25AD" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "®": { "codepoints": [174], "characters": "\u00AE" }, + "⥽": { "codepoints": [10621], "characters": "\u297D" }, + "⌋": { "codepoints": [8971], "characters": "\u230B" }, + "𝔯": { "codepoints": [120111], "characters": "\uD835\uDD2F" }, + "⇁": { "codepoints": [8641], "characters": "\u21C1" }, + "⇀": { "codepoints": [8640], "characters": "\u21C0" }, + "⥬": { "codepoints": [10604], "characters": "\u296C" }, + "ρ": { "codepoints": [961], "characters": "\u03C1" }, + "ϱ": { "codepoints": [1009], "characters": "\u03F1" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "↣": { "codepoints": [8611], "characters": "\u21A3" }, + "⇁": { "codepoints": [8641], "characters": "\u21C1" }, + "⇀": { "codepoints": [8640], "characters": "\u21C0" }, + "⇄": { "codepoints": [8644], "characters": "\u21C4" }, + "⇌": { "codepoints": [8652], "characters": "\u21CC" }, + "⇉": { "codepoints": [8649], "characters": "\u21C9" }, + "↝": { "codepoints": [8605], "characters": "\u219D" }, + "⋌": { "codepoints": [8908], "characters": "\u22CC" }, + "˚": { "codepoints": [730], "characters": "\u02DA" }, + "≓": { "codepoints": [8787], "characters": "\u2253" }, + "⇄": { "codepoints": [8644], "characters": "\u21C4" }, + "⇌": { "codepoints": [8652], "characters": "\u21CC" }, + "‏": { "codepoints": [8207], "characters": "\u200F" }, + "⎱": { "codepoints": [9137], "characters": "\u23B1" }, + "⎱": { "codepoints": [9137], "characters": "\u23B1" }, + "⫮": { "codepoints": [10990], "characters": "\u2AEE" }, + "⟭": { "codepoints": [10221], "characters": "\u27ED" }, + "⇾": { "codepoints": [8702], "characters": "\u21FE" }, + "⟧": { "codepoints": [10215], "characters": "\u27E7" }, + "⦆": { "codepoints": [10630], "characters": "\u2986" }, + "𝕣": { "codepoints": [120163], "characters": "\uD835\uDD63" }, + "⨮": { "codepoints": [10798], "characters": "\u2A2E" }, + "⨵": { "codepoints": [10805], "characters": "\u2A35" }, + ")": { "codepoints": [41], "characters": "\u0029" }, + "⦔": { "codepoints": [10644], "characters": "\u2994" }, + "⨒": { "codepoints": [10770], "characters": "\u2A12" }, + "⇉": { "codepoints": [8649], "characters": "\u21C9" }, + "›": { "codepoints": [8250], "characters": "\u203A" }, + "𝓇": { "codepoints": [120007], "characters": "\uD835\uDCC7" }, + "↱": { "codepoints": [8625], "characters": "\u21B1" }, + "]": { "codepoints": [93], "characters": "\u005D" }, + "’": { "codepoints": [8217], "characters": "\u2019" }, + "’": { "codepoints": [8217], "characters": "\u2019" }, + "⋌": { "codepoints": [8908], "characters": "\u22CC" }, + "⋊": { "codepoints": [8906], "characters": "\u22CA" }, + "▹": { "codepoints": [9657], "characters": "\u25B9" }, + "⊵": { "codepoints": [8885], "characters": "\u22B5" }, + "▸": { "codepoints": [9656], "characters": "\u25B8" }, + "⧎": { "codepoints": [10702], "characters": "\u29CE" }, + "⥨": { "codepoints": [10600], "characters": "\u2968" }, + "℞": { "codepoints": [8478], "characters": "\u211E" }, + "ś": { "codepoints": [347], "characters": "\u015B" }, + "‚": { "codepoints": [8218], "characters": "\u201A" }, + "≻": { "codepoints": [8827], "characters": "\u227B" }, + "⪴": { "codepoints": [10932], "characters": "\u2AB4" }, + "⪸": { "codepoints": [10936], "characters": "\u2AB8" }, + "š": { "codepoints": [353], "characters": "\u0161" }, + "≽": { "codepoints": [8829], "characters": "\u227D" }, + "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, + "ş": { "codepoints": [351], "characters": "\u015F" }, + "ŝ": { "codepoints": [349], "characters": "\u015D" }, + "⪶": { "codepoints": [10934], "characters": "\u2AB6" }, + "⪺": { "codepoints": [10938], "characters": "\u2ABA" }, + "⋩": { "codepoints": [8937], "characters": "\u22E9" }, + "⨓": { "codepoints": [10771], "characters": "\u2A13" }, + "≿": { "codepoints": [8831], "characters": "\u227F" }, + "с": { "codepoints": [1089], "characters": "\u0441" }, + "⋅": { "codepoints": [8901], "characters": "\u22C5" }, + "⊡": { "codepoints": [8865], "characters": "\u22A1" }, + "⩦": { "codepoints": [10854], "characters": "\u2A66" }, + "⇘": { "codepoints": [8664], "characters": "\u21D8" }, + "⤥": { "codepoints": [10533], "characters": "\u2925" }, + "↘": { "codepoints": [8600], "characters": "\u2198" }, + "↘": { "codepoints": [8600], "characters": "\u2198" }, + "§": { "codepoints": [167], "characters": "\u00A7" }, + "§": { "codepoints": [167], "characters": "\u00A7" }, + ";": { "codepoints": [59], "characters": "\u003B" }, + "⤩": { "codepoints": [10537], "characters": "\u2929" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "✶": { "codepoints": [10038], "characters": "\u2736" }, + "𝔰": { "codepoints": [120112], "characters": "\uD835\uDD30" }, + "⌢": { "codepoints": [8994], "characters": "\u2322" }, + "♯": { "codepoints": [9839], "characters": "\u266F" }, + "щ": { "codepoints": [1097], "characters": "\u0449" }, + "ш": { "codepoints": [1096], "characters": "\u0448" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "­": { "codepoints": [173], "characters": "\u00AD" }, + "­": { "codepoints": [173], "characters": "\u00AD" }, + "σ": { "codepoints": [963], "characters": "\u03C3" }, + "ς": { "codepoints": [962], "characters": "\u03C2" }, + "ς": { "codepoints": [962], "characters": "\u03C2" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + "⩪": { "codepoints": [10858], "characters": "\u2A6A" }, + "≃": { "codepoints": [8771], "characters": "\u2243" }, + "≃": { "codepoints": [8771], "characters": "\u2243" }, + "⪞": { "codepoints": [10910], "characters": "\u2A9E" }, + "⪠": { "codepoints": [10912], "characters": "\u2AA0" }, + "⪝": { "codepoints": [10909], "characters": "\u2A9D" }, + "⪟": { "codepoints": [10911], "characters": "\u2A9F" }, + "≆": { "codepoints": [8774], "characters": "\u2246" }, + "⨤": { "codepoints": [10788], "characters": "\u2A24" }, + "⥲": { "codepoints": [10610], "characters": "\u2972" }, + "←": { "codepoints": [8592], "characters": "\u2190" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "⨳": { "codepoints": [10803], "characters": "\u2A33" }, + "⧤": { "codepoints": [10724], "characters": "\u29E4" }, + "∣": { "codepoints": [8739], "characters": "\u2223" }, + "⌣": { "codepoints": [8995], "characters": "\u2323" }, + "⪪": { "codepoints": [10922], "characters": "\u2AAA" }, + "⪬": { "codepoints": [10924], "characters": "\u2AAC" }, + "⪬︀": { "codepoints": [10924, 65024], "characters": "\u2AAC\uFE00" }, + "ь": { "codepoints": [1100], "characters": "\u044C" }, + "/": { "codepoints": [47], "characters": "\u002F" }, + "⧄": { "codepoints": [10692], "characters": "\u29C4" }, + "⌿": { "codepoints": [9023], "characters": "\u233F" }, + "𝕤": { "codepoints": [120164], "characters": "\uD835\uDD64" }, + "♠": { "codepoints": [9824], "characters": "\u2660" }, + "♠": { "codepoints": [9824], "characters": "\u2660" }, + "∥": { "codepoints": [8741], "characters": "\u2225" }, + "⊓": { "codepoints": [8851], "characters": "\u2293" }, + "⊓︀": { "codepoints": [8851, 65024], "characters": "\u2293\uFE00" }, + "⊔": { "codepoints": [8852], "characters": "\u2294" }, + "⊔︀": { "codepoints": [8852, 65024], "characters": "\u2294\uFE00" }, + "⊏": { "codepoints": [8847], "characters": "\u228F" }, + "⊑": { "codepoints": [8849], "characters": "\u2291" }, + "⊏": { "codepoints": [8847], "characters": "\u228F" }, + "⊑": { "codepoints": [8849], "characters": "\u2291" }, + "⊐": { "codepoints": [8848], "characters": "\u2290" }, + "⊒": { "codepoints": [8850], "characters": "\u2292" }, + "⊐": { "codepoints": [8848], "characters": "\u2290" }, + "⊒": { "codepoints": [8850], "characters": "\u2292" }, + "□": { "codepoints": [9633], "characters": "\u25A1" }, + "□": { "codepoints": [9633], "characters": "\u25A1" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "▪": { "codepoints": [9642], "characters": "\u25AA" }, + "→": { "codepoints": [8594], "characters": "\u2192" }, + "𝓈": { "codepoints": [120008], "characters": "\uD835\uDCC8" }, + "∖": { "codepoints": [8726], "characters": "\u2216" }, + "⌣": { "codepoints": [8995], "characters": "\u2323" }, + "⋆": { "codepoints": [8902], "characters": "\u22C6" }, + "☆": { "codepoints": [9734], "characters": "\u2606" }, + "★": { "codepoints": [9733], "characters": "\u2605" }, + "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, + "ϕ": { "codepoints": [981], "characters": "\u03D5" }, + "¯": { "codepoints": [175], "characters": "\u00AF" }, + "⊂": { "codepoints": [8834], "characters": "\u2282" }, + "⫅": { "codepoints": [10949], "characters": "\u2AC5" }, + "⪽": { "codepoints": [10941], "characters": "\u2ABD" }, + "⊆": { "codepoints": [8838], "characters": "\u2286" }, + "⫃": { "codepoints": [10947], "characters": "\u2AC3" }, + "⫁": { "codepoints": [10945], "characters": "\u2AC1" }, + "⫋": { "codepoints": [10955], "characters": "\u2ACB" }, + "⊊": { "codepoints": [8842], "characters": "\u228A" }, + "⪿": { "codepoints": [10943], "characters": "\u2ABF" }, + "⥹": { "codepoints": [10617], "characters": "\u2979" }, + "⊂": { "codepoints": [8834], "characters": "\u2282" }, + "⊆": { "codepoints": [8838], "characters": "\u2286" }, + "⫅": { "codepoints": [10949], "characters": "\u2AC5" }, + "⊊": { "codepoints": [8842], "characters": "\u228A" }, + "⫋": { "codepoints": [10955], "characters": "\u2ACB" }, + "⫇": { "codepoints": [10951], "characters": "\u2AC7" }, + "⫕": { "codepoints": [10965], "characters": "\u2AD5" }, + "⫓": { "codepoints": [10963], "characters": "\u2AD3" }, + "≻": { "codepoints": [8827], "characters": "\u227B" }, + "⪸": { "codepoints": [10936], "characters": "\u2AB8" }, + "≽": { "codepoints": [8829], "characters": "\u227D" }, + "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, + "⪺": { "codepoints": [10938], "characters": "\u2ABA" }, + "⪶": { "codepoints": [10934], "characters": "\u2AB6" }, + "⋩": { "codepoints": [8937], "characters": "\u22E9" }, + "≿": { "codepoints": [8831], "characters": "\u227F" }, + "∑": { "codepoints": [8721], "characters": "\u2211" }, + "♪": { "codepoints": [9834], "characters": "\u266A" }, + "¹": { "codepoints": [185], "characters": "\u00B9" }, + "¹": { "codepoints": [185], "characters": "\u00B9" }, + "²": { "codepoints": [178], "characters": "\u00B2" }, + "²": { "codepoints": [178], "characters": "\u00B2" }, + "³": { "codepoints": [179], "characters": "\u00B3" }, + "³": { "codepoints": [179], "characters": "\u00B3" }, + "⊃": { "codepoints": [8835], "characters": "\u2283" }, + "⫆": { "codepoints": [10950], "characters": "\u2AC6" }, + "⪾": { "codepoints": [10942], "characters": "\u2ABE" }, + "⫘": { "codepoints": [10968], "characters": "\u2AD8" }, + "⊇": { "codepoints": [8839], "characters": "\u2287" }, + "⫄": { "codepoints": [10948], "characters": "\u2AC4" }, + "⟉": { "codepoints": [10185], "characters": "\u27C9" }, + "⫗": { "codepoints": [10967], "characters": "\u2AD7" }, + "⥻": { "codepoints": [10619], "characters": "\u297B" }, + "⫂": { "codepoints": [10946], "characters": "\u2AC2" }, + "⫌": { "codepoints": [10956], "characters": "\u2ACC" }, + "⊋": { "codepoints": [8843], "characters": "\u228B" }, + "⫀": { "codepoints": [10944], "characters": "\u2AC0" }, + "⊃": { "codepoints": [8835], "characters": "\u2283" }, + "⊇": { "codepoints": [8839], "characters": "\u2287" }, + "⫆": { "codepoints": [10950], "characters": "\u2AC6" }, + "⊋": { "codepoints": [8843], "characters": "\u228B" }, + "⫌": { "codepoints": [10956], "characters": "\u2ACC" }, + "⫈": { "codepoints": [10952], "characters": "\u2AC8" }, + "⫔": { "codepoints": [10964], "characters": "\u2AD4" }, + "⫖": { "codepoints": [10966], "characters": "\u2AD6" }, + "⇙": { "codepoints": [8665], "characters": "\u21D9" }, + "⤦": { "codepoints": [10534], "characters": "\u2926" }, + "↙": { "codepoints": [8601], "characters": "\u2199" }, + "↙": { "codepoints": [8601], "characters": "\u2199" }, + "⤪": { "codepoints": [10538], "characters": "\u292A" }, + "ß": { "codepoints": [223], "characters": "\u00DF" }, + "ß": { "codepoints": [223], "characters": "\u00DF" }, + "⌖": { "codepoints": [8982], "characters": "\u2316" }, + "τ": { "codepoints": [964], "characters": "\u03C4" }, + "⎴": { "codepoints": [9140], "characters": "\u23B4" }, + "ť": { "codepoints": [357], "characters": "\u0165" }, + "ţ": { "codepoints": [355], "characters": "\u0163" }, + "т": { "codepoints": [1090], "characters": "\u0442" }, + "⃛": { "codepoints": [8411], "characters": "\u20DB" }, + "⌕": { "codepoints": [8981], "characters": "\u2315" }, + "𝔱": { "codepoints": [120113], "characters": "\uD835\uDD31" }, + "∴": { "codepoints": [8756], "characters": "\u2234" }, + "∴": { "codepoints": [8756], "characters": "\u2234" }, + "θ": { "codepoints": [952], "characters": "\u03B8" }, + "ϑ": { "codepoints": [977], "characters": "\u03D1" }, + "ϑ": { "codepoints": [977], "characters": "\u03D1" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + " ": { "codepoints": [8201], "characters": "\u2009" }, + "≈": { "codepoints": [8776], "characters": "\u2248" }, + "∼": { "codepoints": [8764], "characters": "\u223C" }, + "þ": { "codepoints": [254], "characters": "\u00FE" }, + "þ": { "codepoints": [254], "characters": "\u00FE" }, + "˜": { "codepoints": [732], "characters": "\u02DC" }, + "×": { "codepoints": [215], "characters": "\u00D7" }, + "×": { "codepoints": [215], "characters": "\u00D7" }, + "⊠": { "codepoints": [8864], "characters": "\u22A0" }, + "⨱": { "codepoints": [10801], "characters": "\u2A31" }, + "⨰": { "codepoints": [10800], "characters": "\u2A30" }, + "∭": { "codepoints": [8749], "characters": "\u222D" }, + "⤨": { "codepoints": [10536], "characters": "\u2928" }, + "⊤": { "codepoints": [8868], "characters": "\u22A4" }, + "⌶": { "codepoints": [9014], "characters": "\u2336" }, + "⫱": { "codepoints": [10993], "characters": "\u2AF1" }, + "𝕥": { "codepoints": [120165], "characters": "\uD835\uDD65" }, + "⫚": { "codepoints": [10970], "characters": "\u2ADA" }, + "⤩": { "codepoints": [10537], "characters": "\u2929" }, + "‴": { "codepoints": [8244], "characters": "\u2034" }, + "™": { "codepoints": [8482], "characters": "\u2122" }, + "▵": { "codepoints": [9653], "characters": "\u25B5" }, + "▿": { "codepoints": [9663], "characters": "\u25BF" }, + "◃": { "codepoints": [9667], "characters": "\u25C3" }, + "⊴": { "codepoints": [8884], "characters": "\u22B4" }, + "≜": { "codepoints": [8796], "characters": "\u225C" }, + "▹": { "codepoints": [9657], "characters": "\u25B9" }, + "⊵": { "codepoints": [8885], "characters": "\u22B5" }, + "◬": { "codepoints": [9708], "characters": "\u25EC" }, + "≜": { "codepoints": [8796], "characters": "\u225C" }, + "⨺": { "codepoints": [10810], "characters": "\u2A3A" }, + "⨹": { "codepoints": [10809], "characters": "\u2A39" }, + "⧍": { "codepoints": [10701], "characters": "\u29CD" }, + "⨻": { "codepoints": [10811], "characters": "\u2A3B" }, + "⏢": { "codepoints": [9186], "characters": "\u23E2" }, + "𝓉": { "codepoints": [120009], "characters": "\uD835\uDCC9" }, + "ц": { "codepoints": [1094], "characters": "\u0446" }, + "ћ": { "codepoints": [1115], "characters": "\u045B" }, + "ŧ": { "codepoints": [359], "characters": "\u0167" }, + "≬": { "codepoints": [8812], "characters": "\u226C" }, + "↞": { "codepoints": [8606], "characters": "\u219E" }, + "↠": { "codepoints": [8608], "characters": "\u21A0" }, + "⇑": { "codepoints": [8657], "characters": "\u21D1" }, + "⥣": { "codepoints": [10595], "characters": "\u2963" }, + "ú": { "codepoints": [250], "characters": "\u00FA" }, + "ú": { "codepoints": [250], "characters": "\u00FA" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "ў": { "codepoints": [1118], "characters": "\u045E" }, + "ŭ": { "codepoints": [365], "characters": "\u016D" }, + "û": { "codepoints": [251], "characters": "\u00FB" }, + "û": { "codepoints": [251], "characters": "\u00FB" }, + "у": { "codepoints": [1091], "characters": "\u0443" }, + "⇅": { "codepoints": [8645], "characters": "\u21C5" }, + "ű": { "codepoints": [369], "characters": "\u0171" }, + "⥮": { "codepoints": [10606], "characters": "\u296E" }, + "⥾": { "codepoints": [10622], "characters": "\u297E" }, + "𝔲": { "codepoints": [120114], "characters": "\uD835\uDD32" }, + "ù": { "codepoints": [249], "characters": "\u00F9" }, + "ù": { "codepoints": [249], "characters": "\u00F9" }, + "↿": { "codepoints": [8639], "characters": "\u21BF" }, + "↾": { "codepoints": [8638], "characters": "\u21BE" }, + "▀": { "codepoints": [9600], "characters": "\u2580" }, + "⌜": { "codepoints": [8988], "characters": "\u231C" }, + "⌜": { "codepoints": [8988], "characters": "\u231C" }, + "⌏": { "codepoints": [8975], "characters": "\u230F" }, + "◸": { "codepoints": [9720], "characters": "\u25F8" }, + "ū": { "codepoints": [363], "characters": "\u016B" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "¨": { "codepoints": [168], "characters": "\u00A8" }, + "ų": { "codepoints": [371], "characters": "\u0173" }, + "𝕦": { "codepoints": [120166], "characters": "\uD835\uDD66" }, + "↑": { "codepoints": [8593], "characters": "\u2191" }, + "↕": { "codepoints": [8597], "characters": "\u2195" }, + "↿": { "codepoints": [8639], "characters": "\u21BF" }, + "↾": { "codepoints": [8638], "characters": "\u21BE" }, + "⊎": { "codepoints": [8846], "characters": "\u228E" }, + "υ": { "codepoints": [965], "characters": "\u03C5" }, + "ϒ": { "codepoints": [978], "characters": "\u03D2" }, + "υ": { "codepoints": [965], "characters": "\u03C5" }, + "⇈": { "codepoints": [8648], "characters": "\u21C8" }, + "⌝": { "codepoints": [8989], "characters": "\u231D" }, + "⌝": { "codepoints": [8989], "characters": "\u231D" }, + "⌎": { "codepoints": [8974], "characters": "\u230E" }, + "ů": { "codepoints": [367], "characters": "\u016F" }, + "◹": { "codepoints": [9721], "characters": "\u25F9" }, + "𝓊": { "codepoints": [120010], "characters": "\uD835\uDCCA" }, + "⋰": { "codepoints": [8944], "characters": "\u22F0" }, + "ũ": { "codepoints": [361], "characters": "\u0169" }, + "▵": { "codepoints": [9653], "characters": "\u25B5" }, + "▴": { "codepoints": [9652], "characters": "\u25B4" }, + "⇈": { "codepoints": [8648], "characters": "\u21C8" }, + "ü": { "codepoints": [252], "characters": "\u00FC" }, + "ü": { "codepoints": [252], "characters": "\u00FC" }, + "⦧": { "codepoints": [10663], "characters": "\u29A7" }, + "⇕": { "codepoints": [8661], "characters": "\u21D5" }, + "⫨": { "codepoints": [10984], "characters": "\u2AE8" }, + "⫩": { "codepoints": [10985], "characters": "\u2AE9" }, + "⊨": { "codepoints": [8872], "characters": "\u22A8" }, + "⦜": { "codepoints": [10652], "characters": "\u299C" }, + "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, + "ϰ": { "codepoints": [1008], "characters": "\u03F0" }, + "∅": { "codepoints": [8709], "characters": "\u2205" }, + "ϕ": { "codepoints": [981], "characters": "\u03D5" }, + "ϖ": { "codepoints": [982], "characters": "\u03D6" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "↕": { "codepoints": [8597], "characters": "\u2195" }, + "ϱ": { "codepoints": [1009], "characters": "\u03F1" }, + "ς": { "codepoints": [962], "characters": "\u03C2" }, + "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" }, + "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" }, + "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" }, + "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" }, + "ϑ": { "codepoints": [977], "characters": "\u03D1" }, + "⊲": { "codepoints": [8882], "characters": "\u22B2" }, + "⊳": { "codepoints": [8883], "characters": "\u22B3" }, + "в": { "codepoints": [1074], "characters": "\u0432" }, + "⊢": { "codepoints": [8866], "characters": "\u22A2" }, + "∨": { "codepoints": [8744], "characters": "\u2228" }, + "⊻": { "codepoints": [8891], "characters": "\u22BB" }, + "≚": { "codepoints": [8794], "characters": "\u225A" }, + "⋮": { "codepoints": [8942], "characters": "\u22EE" }, + "|": { "codepoints": [124], "characters": "\u007C" }, + "|": { "codepoints": [124], "characters": "\u007C" }, + "𝔳": { "codepoints": [120115], "characters": "\uD835\uDD33" }, + "⊲": { "codepoints": [8882], "characters": "\u22B2" }, + "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, + "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, + "𝕧": { "codepoints": [120167], "characters": "\uD835\uDD67" }, + "∝": { "codepoints": [8733], "characters": "\u221D" }, + "⊳": { "codepoints": [8883], "characters": "\u22B3" }, + "𝓋": { "codepoints": [120011], "characters": "\uD835\uDCCB" }, + "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" }, + "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" }, + "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" }, + "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" }, + "⦚": { "codepoints": [10650], "characters": "\u299A" }, + "ŵ": { "codepoints": [373], "characters": "\u0175" }, + "⩟": { "codepoints": [10847], "characters": "\u2A5F" }, + "∧": { "codepoints": [8743], "characters": "\u2227" }, + "≙": { "codepoints": [8793], "characters": "\u2259" }, + "℘": { "codepoints": [8472], "characters": "\u2118" }, + "𝔴": { "codepoints": [120116], "characters": "\uD835\uDD34" }, + "𝕨": { "codepoints": [120168], "characters": "\uD835\uDD68" }, + "℘": { "codepoints": [8472], "characters": "\u2118" }, + "≀": { "codepoints": [8768], "characters": "\u2240" }, + "≀": { "codepoints": [8768], "characters": "\u2240" }, + "𝓌": { "codepoints": [120012], "characters": "\uD835\uDCCC" }, + "⋂": { "codepoints": [8898], "characters": "\u22C2" }, + "◯": { "codepoints": [9711], "characters": "\u25EF" }, + "⋃": { "codepoints": [8899], "characters": "\u22C3" }, + "▽": { "codepoints": [9661], "characters": "\u25BD" }, + "𝔵": { "codepoints": [120117], "characters": "\uD835\uDD35" }, + "⟺": { "codepoints": [10234], "characters": "\u27FA" }, + "⟷": { "codepoints": [10231], "characters": "\u27F7" }, + "ξ": { "codepoints": [958], "characters": "\u03BE" }, + "⟸": { "codepoints": [10232], "characters": "\u27F8" }, + "⟵": { "codepoints": [10229], "characters": "\u27F5" }, + "⟼": { "codepoints": [10236], "characters": "\u27FC" }, + "⋻": { "codepoints": [8955], "characters": "\u22FB" }, + "⨀": { "codepoints": [10752], "characters": "\u2A00" }, + "𝕩": { "codepoints": [120169], "characters": "\uD835\uDD69" }, + "⨁": { "codepoints": [10753], "characters": "\u2A01" }, + "⨂": { "codepoints": [10754], "characters": "\u2A02" }, + "⟹": { "codepoints": [10233], "characters": "\u27F9" }, + "⟶": { "codepoints": [10230], "characters": "\u27F6" }, + "𝓍": { "codepoints": [120013], "characters": "\uD835\uDCCD" }, + "⨆": { "codepoints": [10758], "characters": "\u2A06" }, + "⨄": { "codepoints": [10756], "characters": "\u2A04" }, + "△": { "codepoints": [9651], "characters": "\u25B3" }, + "⋁": { "codepoints": [8897], "characters": "\u22C1" }, + "⋀": { "codepoints": [8896], "characters": "\u22C0" }, + "ý": { "codepoints": [253], "characters": "\u00FD" }, + "ý": { "codepoints": [253], "characters": "\u00FD" }, + "я": { "codepoints": [1103], "characters": "\u044F" }, + "ŷ": { "codepoints": [375], "characters": "\u0177" }, + "ы": { "codepoints": [1099], "characters": "\u044B" }, + "¥": { "codepoints": [165], "characters": "\u00A5" }, + "¥": { "codepoints": [165], "characters": "\u00A5" }, + "𝔶": { "codepoints": [120118], "characters": "\uD835\uDD36" }, + "ї": { "codepoints": [1111], "characters": "\u0457" }, + "𝕪": { "codepoints": [120170], "characters": "\uD835\uDD6A" }, + "𝓎": { "codepoints": [120014], "characters": "\uD835\uDCCE" }, + "ю": { "codepoints": [1102], "characters": "\u044E" }, + "ÿ": { "codepoints": [255], "characters": "\u00FF" }, + "ÿ": { "codepoints": [255], "characters": "\u00FF" }, + "ź": { "codepoints": [378], "characters": "\u017A" }, + "ž": { "codepoints": [382], "characters": "\u017E" }, + "з": { "codepoints": [1079], "characters": "\u0437" }, + "ż": { "codepoints": [380], "characters": "\u017C" }, + "ℨ": { "codepoints": [8488], "characters": "\u2128" }, + "ζ": { "codepoints": [950], "characters": "\u03B6" }, + "𝔷": { "codepoints": [120119], "characters": "\uD835\uDD37" }, + "ж": { "codepoints": [1078], "characters": "\u0436" }, + "⇝": { "codepoints": [8669], "characters": "\u21DD" }, + "𝕫": { "codepoints": [120171], "characters": "\uD835\uDD6B" }, + "𝓏": { "codepoints": [120015], "characters": "\uD835\uDCCF" }, + "‍": { "codepoints": [8205], "characters": "\u200D" }, + "‌": { "codepoints": [8204], "characters": "\u200C" } +}
diff --git a/tool/expected_output.dart b/tool/expected_output.dart index 30d8fe9..b50adb0 100644 --- a/tool/expected_output.dart +++ b/tool/expected_output.dart
@@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:io'; -import 'dart:isolate'; import 'package:path/path.dart' as p; @@ -35,14 +34,14 @@ description = 'line ${i + 1}: $description'; } - var input = ''; + final input = StringBuffer(); while (!lines[i].startsWith('<<<')) { - input += '${lines[i++]}\n'; + input.writeln(lines[i++]); } - var expectedOutput = ''; + final expectedOutput = StringBuffer(); while (++i < lines.length && !lines[i].startsWith('>>>')) { - expectedOutput += '${lines[i]}\n'; + expectedOutput.writeln(lines[i]); } final dataCase = DataCase( @@ -51,8 +50,8 @@ front_matter: frontMatter.toString(), description: description, skip: skip, - input: input, - expectedOutput: expectedOutput, + input: input.toString(), + expectedOutput: expectedOutput.toString(), ); yield dataCase; } @@ -116,16 +115,12 @@ /// } /// } /// ``` -Stream<DataCase> dataCasesUnder({ +Iterable<DataCase> dataCasesUnder({ required String testDirectory, String extension = 'unit', bool recursive = true, -}) async* { - final packageUri = Uri.parse('package:markdown/markdown.dart'); - final isolateUri = await Isolate.resolvePackageUri(packageUri); - final markdownLibRoot = p.dirname(isolateUri!.toFilePath()); - final directory = - p.joinAll([p.dirname(markdownLibRoot), 'test', testDirectory]); +}) sync* { + final directory = p.join(p.current, 'test', testDirectory); for (final dataCase in _dataCases( directory: directory, extension: extension,
diff --git a/tool/gfm_stats.json b/tool/gfm_stats.json index 558b177..1460d3e 100644 --- a/tool/gfm_stats.json +++ b/tool/gfm_stats.json
@@ -34,24 +34,24 @@ "613": "strict", "614": "strict", "615": "strict", - "616": "fail", + "616": "strict", "617": "strict", "618": "strict", - "619": "fail", + "619": "strict", "620": "strict" }, "Autolinks (extension)": { "621": "strict", "622": "strict", "623": "strict", - "624": "fail", + "624": "strict", "625": "strict", "626": "loose", "627": "strict", "628": "strict", - "629": "fail", - "630": "fail", - "631": "fail" + "629": "strict", + "630": "strict", + "631": "strict" }, "Backslash escapes": { "308": "loose", @@ -260,7 +260,7 @@ }, "Entity and numeric character references": { "321": "loose", - "322": "loose", + "322": "strict", "323": "loose", "324": "loose", "325": "strict", @@ -268,12 +268,12 @@ "327": "strict", "328": "fail", "329": "fail", - "330": "fail", + "330": "strict", "331": "strict", "332": "strict", - "333": "loose", - "334": "loose", - "335": "loose", + "333": "strict", + "334": "strict", + "335": "strict", "336": "loose", "337": "strict" }, @@ -682,14 +682,14 @@ "492": "strict" }, "Tables (extension)": { - "198": "loose", - "199": "fail", - "200": "loose", - "201": "loose", - "202": "loose", - "203": "loose", - "204": "loose", - "205": "loose" + "198": "strict", + "199": "strict", + "200": "strict", + "201": "strict", + "202": "strict", + "203": "strict", + "204": "strict", + "205": "strict" }, "Tabs": { "1": "strict",
diff --git a/tool/gfm_stats.txt b/tool/gfm_stats.txt index 8b065e0..c455a49 100644 --- a/tool/gfm_stats.txt +++ b/tool/gfm_stats.txt
@@ -1,13 +1,13 @@ 17 of 18 – 94.4% ATX headings - 17 of 19 – 89.5% Autolinks - 7 of 11 – 63.6% Autolinks (extension) + 19 of 19 – 100.0% Autolinks + 11 of 11 – 100.0% Autolinks (extension) 12 of 13 – 92.3% Backslash escapes 1 of 1 – 100.0% Blank lines 23 of 25 – 92.0% Block quotes 22 of 22 – 100.0% Code spans 0 of 1 – 0.0% Disallowed Raw HTML (extension) 130 of 131 – 99.2% Emphasis and strong emphasis - 14 of 17 – 82.4% Entity and numeric character references + 15 of 17 – 88.2% Entity and numeric character references 28 of 29 – 96.6% Fenced code blocks 15 of 15 – 100.0% Hard line breaks 43 of 43 – 100.0% HTML blocks @@ -24,9 +24,9 @@ 26 of 27 – 96.3% Setext headings 2 of 2 – 100.0% Soft line breaks 2 of 2 – 100.0% Strikethrough (extension) - 7 of 8 – 87.5% Tables (extension) + 8 of 8 – 100.0% Tables (extension) 11 of 11 – 100.0% Tabs 3 of 3 – 100.0% Textual content 19 of 19 – 100.0% Thematic breaks - 632 of 671 – 94.2% TOTAL - 556 of 632 – 88.0% TOTAL Strict + 640 of 671 – 95.4% TOTAL + 575 of 640 – 89.8% TOTAL Strict
diff --git a/tool/stats.dart b/tool/stats.dart index d09b0df..4f952bb 100644 --- a/tool/stats.dart +++ b/tool/stats.dart
@@ -27,30 +27,26 @@ ) ..addFlag( 'raw', - defaultsTo: false, help: 'raw JSON format', negatable: false, ) ..addFlag( 'update-files', - defaultsTo: false, help: 'Update stats files in $toolDir', negatable: false, ) ..addFlag( 'verbose', - defaultsTo: false, help: 'Print details for failures and errors.', negatable: false, ) ..addFlag( 'verbose-loose', - defaultsTo: false, help: 'Print details for "loose" matches.', negatable: false, ) ..addOption('flavor', allowed: _configs.map((c) => c.prefix)) - ..addFlag('help', defaultsTo: false, negatable: false); + ..addFlag('help', negatable: false); ArgResults options; @@ -140,6 +136,7 @@ e, verboseFail: verbose, verboseLooseMatch: verboseLooseMatch, + extensions: e.extensions, ); units.add(DataCase( @@ -153,7 +150,7 @@ final nestedMap = scores.putIfAbsent( entry.key, - () => SplayTreeMap<int, CompareLevel>(), + SplayTreeMap<int, CompareLevel>.new, ); nestedMap[e.example] = result.compareLevel; } @@ -223,6 +220,7 @@ const encoder = JsonEncoder.withIndent(' ', _convert); try { sink.writeln(encoder.convert(scores)); + // ignore: avoid_catching_errors } on JsonUnsupportedObjectError catch (e) { stderr.writeln(e.cause); stderr.writeln(e.unsupportedObject.runtimeType);
diff --git a/tool/stats_lib.dart b/tool/stats_lib.dart index 125b34e..c1298f1 100644 --- a/tool/stats_lib.dart +++ b/tool/stats_lib.dart
@@ -8,7 +8,14 @@ import 'package:html/dom.dart' show Element; import 'package:html/parser.dart' show parseFragment; -import 'package:markdown/markdown.dart' show markdownToHtml, ExtensionSet; +import 'package:markdown/markdown.dart' + show + markdownToHtml, + InlineSyntax, + BlockSyntax, + AutolinkExtensionSyntax, + StrikethroughSyntax, + TableSyntax; import 'package:path/path.dart' as p; import '../test/util.dart'; @@ -54,19 +61,16 @@ static final Config commonMarkConfig = Config._( 'common_mark', 'http://spec.commonmark.org/0.28/', - null, ); static final Config gfmConfig = Config._( 'gfm', 'https://github.github.com/gfm/', - ExtensionSet.gitHubFlavored, ); final String prefix; final String baseUrl; - final ExtensionSet? extensionSet; - Config._(this.prefix, this.baseUrl, this.extensionSet); + Config._(this.prefix, this.baseUrl); } class CommonMarkTestCase { @@ -76,6 +80,7 @@ final String html; final int startLine; final int endLine; + final Set<String> extensions; CommonMarkTestCase( this.example, @@ -84,6 +89,7 @@ this.endLine, this.markdown, this.html, + this.extensions, ); factory CommonMarkTestCase.fromJson(Map<String, dynamic> json) { @@ -94,6 +100,9 @@ json['end_line'] as int, json['markdown'] as String /*!*/, json['html'] as String, + json['extensions'] == null + ? const {} + : Set.from(json['extensions'] as List), ); } @@ -117,11 +126,37 @@ bool throwOnError = false, bool verboseFail = false, bool verboseLooseMatch = false, + Set<String> extensions = const {}, }) { String output; + final inlineSyntaxes = <InlineSyntax>[]; + final blockSyntaxes = <BlockSyntax>[]; + + for (final extension in extensions) { + switch (extension) { + case 'autolink': + inlineSyntaxes.add(AutolinkExtensionSyntax()); + break; + case 'strikethrough': + inlineSyntaxes.add(StrikethroughSyntax()); + break; + case 'table': + blockSyntaxes.add(const TableSyntax()); + break; + case 'tagfilter': + // TODO(Zhiguang): https://github.com/dart-lang/markdown/pull/447 + break; + default: + throw UnimplementedError('Unimplemented extension "$extension"'); + } + } + try { - output = - markdownToHtml(testCase.markdown, extensionSet: config.extensionSet); + output = markdownToHtml( + testCase.markdown, + inlineSyntaxes: inlineSyntaxes, + blockSyntaxes: blockSyntaxes, + ); } catch (err, stackTrace) { if (throwOnError) { rethrow;
diff --git a/tool/update_blns.dart b/tool/update_blns.dart index 1f50e36..e2b5c62 100644 --- a/tool/update_blns.dart +++ b/tool/update_blns.dart
@@ -1,23 +1,14 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:io'; +import 'update_shared.dart'; + const _blnsJsonRawUrl = 'https://github.com/minimaxir/big-list-of-naughty-strings/raw/master/blns.json'; const _blnsFilePath = 'test/blns.dart'; Future<void> main() async { - final client = HttpClient(); - List<String> json; - try { - final request = await client.getUrl(Uri.parse(_blnsJsonRawUrl)); - final response = await request.close(); - final source = - await response.cast<List<int>>().transform(utf8.decoder).join(''); - json = (jsonDecode(source) as List).cast<String>(); - } finally { - client.close(); - } + final json = (await downloadJson(_blnsJsonRawUrl) as List).cast<String>(); final blnsContent = StringBuffer(''' // GENERATED FILE. DO NOT EDIT. //
diff --git a/tool/update_case_folding.dart b/tool/update_case_folding.dart index 02cbd16..e53f70b 100644 --- a/tool/update_case_folding.dart +++ b/tool/update_case_folding.dart
@@ -5,18 +5,17 @@ import 'dart:convert'; import 'dart:io'; +import 'package:path/path.dart' as p; + // Generates and updates unicode case folding map. // Here only extract status C + F capital letters. void main() { - final root = File(Platform.script.path).parent.parent.path; // Downloaded from http://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt - final file = File('$root/tool/case_folding.txt'); - final text = file.readAsStringSync(); - final lines = LineSplitter().convert(text); + final file = File('${p.current}/tool/case_folding.txt'); final result = <String, String>{}; - for (final line in lines) { + for (final line in file.readAsLinesSync()) { if (line.startsWith('#') || line.trim().isEmpty || !line.contains('CAPITAL LETTER')) { @@ -37,8 +36,8 @@ result[key] = value; } - final outputPath = '$root/lib/src/assets/case_folding.dart'; - final stringMap = JsonEncoder.withIndent(' ').convert(result); + final outputPath = '${p.current}/lib/src/assets/case_folding.dart'; + final stringMap = const JsonEncoder.withIndent(' ').convert(result); final output = ''' // Generated file. do not edit. //
diff --git a/tool/update_emojis.dart b/tool/update_emojis.dart index 396be33..dad59c7 100644 --- a/tool/update_emojis.dart +++ b/tool/update_emojis.dart
@@ -3,9 +3,10 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; -import 'dart:convert'; import 'dart:io'; +import 'update_shared.dart'; + // update_github_emojis.dart now generates the emoji list using the GitHub API // to retrieve the emoji list. It uses this emoji source as a source to keep // binary compatibility with the Unicode sequences for each emoji found here. @@ -14,14 +15,11 @@ const _emojisFilePath = 'lib/src/legacy_emojis.dart'; Future<void> main() async { - final client = HttpClient(); - final request = await client.getUrl(Uri.parse(_emojisJsonRawUrl)); - final response = await request.close(); - final json = jsonDecode( - await response.cast<List<int>>().transform(utf8.decoder).join('')) - .map((String alias, dynamic info) => - MapEntry(alias, info.cast<String, dynamic>())) - .cast<String, Map<String, dynamic>>(); + final json = + (await downloadJson(_emojisJsonRawUrl) as Map<String, dynamic>).map( + (String alias, dynamic info) => + MapEntry(alias, info as Map<String, dynamic>), + ); final emojisContent = StringBuffer(''' // GENERATED FILE. DO NOT EDIT. // @@ -35,7 +33,7 @@ final ignored = <String>[]; // Dump in sorted order now to facilitate comparison with new GitHub emoji. final sortedKeys = json.keys.toList()..sort(); - for (final String alias in sortedKeys) { + for (final alias in sortedKeys) { final info = json[alias] as Map<String, dynamic>; if (info['char'] != null) { emojisContent.writeln(" '$alias': '${info['char']}',"); @@ -50,5 +48,4 @@ 'emoji recognized by the markdown package, execute `update_github_emojis.dart`.\n'); print('Wrote data to $_emojisFilePath for $emojiCount emoji, ' 'ignoring ${ignored.length}: ${ignored.join(', ')}.'); - exit(0); }
diff --git a/tool/update_entities.dart b/tool/update_entities.dart new file mode 100644 index 0000000..2026ebc --- /dev/null +++ b/tool/update_entities.dart
@@ -0,0 +1,39 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; +import 'package:path/path.dart' as p; + +/// Generates and updates HTML entities. +void main() { + // Original file: https://html.spec.whatwg.org/entities.json + final file = File('${p.current}/tool/entities.json'); + final json = file.readAsStringSync(); + final map = Map<String, Map<String, dynamic>>.from(jsonDecode(json) as Map); + + final result = <String, String>{}; + for (var name in map.keys) { + if (name.endsWith(';')) { + final value = map[name]!['characters'] as String; + result[name] = value; + } + } + + final outputPath = '${p.current}/lib/src/assets/html_entities.dart'; + final stringMap = const JsonEncoder.withIndent(' ') + .convert(result) + .replaceAll(r'"$"', r'r"$"') + .replaceAll(r'"\\"', r'r"\"'); + final output = ''' +// Generated file. do not edit. +// +// Source: tool/entities.json +// Script: tool/update_entities.dart +// ignore_for_file: prefer_single_quotes + +const htmlEntitiesMap = $stringMap; +'''; + File(outputPath).writeAsStringSync(output); +}
diff --git a/tool/update_github_emojis.dart b/tool/update_github_emojis.dart index 5fbf60c..d5af661 100644 --- a/tool/update_github_emojis.dart +++ b/tool/update_github_emojis.dart
@@ -3,13 +3,13 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; -import 'dart:convert'; import 'dart:io'; import 'package:args/args.dart'; - import 'package:markdown/src/legacy_emojis.dart' as legacy; +import 'update_shared.dart'; + /// Regular expression to match GitHub emoji API output filenames. RegExp gitHubEmojiApiPattern = RegExp(r'^[\ \t]+"(.*?)".*unicode\/([A-Fa-f0-9\-]+)\.png'); @@ -140,7 +140,7 @@ const zeroWidthJoiner = 0x200D; try { - final String? rawHexList = gitHubEmojiUnicodeFromFilenamePattern + final rawHexList = gitHubEmojiUnicodeFromFilenamePattern .firstMatch(emojiFilename) ?.group(1); if (rawHexList == null) { @@ -183,7 +183,7 @@ } catch (e) { print( 'Invalid/Non-Conformant emoji filename encountered "$emojiFilename"!'); - return (errorSpecialReplacement); + return errorSpecialReplacement; } } @@ -215,22 +215,24 @@ try { results = parser.parse(args); } catch (e) { + print(e); printUsage(parser); - exit(0); + return; } if (results['help'] as bool) { printUsage(parser); - exit(0); + return; } var totalEmojiWithDifferentUnicodeSequences = 0; final useLegacyUnicodeSequences = !(results['useGitHubUnicodes'] as bool); final visualizeUnicodeDiffs = results['visualizeDifferentUnicodes'] as bool; - final dumpMarkdownShortCodes = - (results['dumpMarkdownShortCodes'].toLowerCase() == 'plain'); - final dumpMarkdownToolTipShortCodes = - (results['dumpMarkdownShortCodes'].toLowerCase() == 'tooltip'); + + final shortCodes = + (results['dumpMarkdownShortCodes'] as String).toLowerCase(); + final dumpMarkdownShortCodes = shortCodes == 'plain'; + final dumpMarkdownToolTipShortCodes = shortCodes == 'tooltip'; if (!useLegacyUnicodeSequences) { // Issue warning of the implications of using full GitHub emjoi Unicode sequences. @@ -240,14 +242,13 @@ print( 'The following emoji have different Unicode sequences from those of legacy versions:'); } - final client = HttpClient(); - final request = await client.getUrl(Uri.parse(_emojisJsonRawUrl)); - final response = await request.close(); - final shortcodeToEmoji = jsonDecode( - await response.cast<List<int>>().transform(utf8.decoder).join('')) - .map((String alias, dynamic filename) => MapEntry( - alias, parseGitHubFilenameIntoUnicodeString(filename as String))) - .cast<String, String>() as Map<String, String>; + final shortcodeToEmoji = + (await downloadJson(_emojisJsonRawUrl) as Map<String, dynamic>).map( + (String alias, dynamic filename) => MapEntry( + alias, + parseGitHubFilenameIntoUnicodeString(filename as String), + ), + ); // Now before we proceed we need to 'mix in' any legacy emoji alias shortcodes that // are missing from the GitHub emoji list. @@ -271,8 +272,8 @@ final errored = <String>[]; // Dump in sorted order now to facilitate comparison with new GitHub emoji. final sortedKeys = shortcodeToEmoji.keys.toList()..sort(); - for (final String shortCodeAlias in sortedKeys) { - String emojiUnicode = shortcodeToEmoji[shortCodeAlias]!; + for (final shortCodeAlias in sortedKeys) { + var emojiUnicode = shortcodeToEmoji[shortCodeAlias]!; if (useLegacyUnicodeSequences && legacyEmojis.containsKey(shortCodeAlias) && shortCodeAlias != 'cricket' && @@ -312,14 +313,13 @@ // is being captured, so we exit now to exclude the summary // report from being included in the emoji markdown we have // been outputing. - exit(0); + return; } print('''Wrote data to $_emojisFilePath for $emojiCount emoji, $totalEmojiWithDifferentUnicodeSequences emoji's Unicode sequences differ from legacy versions${!visualizeUnicodeDiffs ? " (run with -v flag to visualize)" : ""}, ignoring ${ignored.length}: ${ignored.join(', ')}, errored: ${errored.length} ${errored.join(', ')}.'''); - exit(0); } void printUsage(ArgParser parser) {
diff --git a/tool/update_shared.dart b/tool/update_shared.dart new file mode 100644 index 0000000..6992cd5 --- /dev/null +++ b/tool/update_shared.dart
@@ -0,0 +1,21 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +Future<Object?> downloadJson(String uri) async { + final client = HttpClient(); + try { + final request = await client.getUrl(Uri.parse(uri)); + final response = await request.close(); + + return response + .transform(utf8.decoder) + .transform(const JsonDecoder()) + .single; + } finally { + client.close(); + } +}