git.iko.soy/typeable/html-parse
on 2ab6186 help sign in
12 files changed+203−3131
since splitsnapshots
unifiedsplit
.github/workflows/haskell-ci.yml−332 .travis.yml+88 README.mkd−40 src/Text/HTML/Parser.hs → Text/HTML/Parser.hs+82−187 changelog.md−10 gen_entities.py−36 html-parse.cabal+11−54 src/Data/Trie.hs−34 src/Text/HTML/Parser/Entities.hs−2241 src/Text/HTML/Tree.hs−91 tests/Text/HTML/ParserSpec.hs+22−60 tests/Text/HTML/TreeSpec.hs−46
.github/workflows/haskell-ci.ymldeleted−332
@@ -1,332 +0,0 @@
1−# This GitHub workflow config has been generated by a script via
2−#
3−# haskell-ci 'github' 'html-parse.cabal'
4−#
5−# To regenerate the script (for example after adjusting tested-with) run
6−#
7−# haskell-ci regenerate
8−#
9−# For more information, see https://github.com/haskell-CI/haskell-ci
10−#
11−# version: 0.15.20220812
12−#
13−# REGENDATA ("0.15.20220812",["github","html-parse.cabal"])
14−#
15−name: Haskell-CI
16−on:
17− - push
18− - pull_request
19−jobs:
20− linux:
21− name: Haskell-CI - Linux - ${{ matrix.compiler }}
22− runs-on: ubuntu-20.04
23− timeout-minutes:
24− 60
25− container:
26− image: buildpack-deps:bionic
27− continue-on-error: ${{ matrix.allow-failure }}
28− strategy:
29− matrix:
30− include:
31− - compiler: ghc-9.4.1
32− compilerKind: ghc
33− compilerVersion: 9.4.1
34− setup-method: ghcup
35− allow-failure: false
36− - compiler: ghc-9.2.4
37− compilerKind: ghc
38− compilerVersion: 9.2.4
39− setup-method: ghcup
40− allow-failure: false
41− - compiler: ghc-9.2.3
42− compilerKind: ghc
43− compilerVersion: 9.2.3
44− setup-method: ghcup
45− allow-failure: false
46− - compiler: ghc-9.2.2
47− compilerKind: ghc
48− compilerVersion: 9.2.2
49− setup-method: ghcup
50− allow-failure: false
51− - compiler: ghc-9.2.1
52− compilerKind: ghc
53− compilerVersion: 9.2.1
54− setup-method: ghcup
55− allow-failure: false
56− - compiler: ghc-9.0.2
57− compilerKind: ghc
58− compilerVersion: 9.0.2
59− setup-method: ghcup
60− allow-failure: false
61− - compiler: ghc-9.0.1
62− compilerKind: ghc
63− compilerVersion: 9.0.1
64− setup-method: hvr-ppa
65− allow-failure: false
66− - compiler: ghc-8.10.7
67− compilerKind: ghc
68− compilerVersion: 8.10.7
69− setup-method: ghcup
70− allow-failure: false
71− - compiler: ghc-8.10.6
72− compilerKind: ghc
73− compilerVersion: 8.10.6
74− setup-method: ghcup
75− allow-failure: false
76− - compiler: ghc-8.10.5
77− compilerKind: ghc
78− compilerVersion: 8.10.5
79− setup-method: ghcup
80− allow-failure: false
81− - compiler: ghc-8.10.4
82− compilerKind: ghc
83− compilerVersion: 8.10.4
84− setup-method: hvr-ppa
85− allow-failure: false
86− - compiler: ghc-8.10.3
87− compilerKind: ghc
88− compilerVersion: 8.10.3
89− setup-method: hvr-ppa
90− allow-failure: false
91− - compiler: ghc-8.10.2
92− compilerKind: ghc
93− compilerVersion: 8.10.2
94− setup-method: hvr-ppa
95− allow-failure: false
96− - compiler: ghc-8.10.1
97− compilerKind: ghc
98− compilerVersion: 8.10.1
99− setup-method: hvr-ppa
100− allow-failure: false
101− - compiler: ghc-8.8.4
102− compilerKind: ghc
103− compilerVersion: 8.8.4
104− setup-method: hvr-ppa
105− allow-failure: false
106− - compiler: ghc-8.8.3
107− compilerKind: ghc
108− compilerVersion: 8.8.3
109− setup-method: hvr-ppa
110− allow-failure: false
111− - compiler: ghc-8.8.2
112− compilerKind: ghc
113− compilerVersion: 8.8.2
114− setup-method: hvr-ppa
115− allow-failure: false
116− - compiler: ghc-8.8.1
117− compilerKind: ghc
118− compilerVersion: 8.8.1
119− setup-method: hvr-ppa
120− allow-failure: false
121− - compiler: ghc-8.6.5
122− compilerKind: ghc
123− compilerVersion: 8.6.5
124− setup-method: hvr-ppa
125− allow-failure: false
126− - compiler: ghc-8.6.4
127− compilerKind: ghc
128− compilerVersion: 8.6.4
129− setup-method: hvr-ppa
130− allow-failure: false
131− - compiler: ghc-8.6.3
132− compilerKind: ghc
133− compilerVersion: 8.6.3
134− setup-method: hvr-ppa
135− allow-failure: false
136− - compiler: ghc-8.6.2
137− compilerKind: ghc
138− compilerVersion: 8.6.2
139− setup-method: hvr-ppa
140− allow-failure: false
141− - compiler: ghc-8.6.1
142− compilerKind: ghc
143− compilerVersion: 8.6.1
144− setup-method: hvr-ppa
145− allow-failure: false
146− - compiler: ghc-8.4.4
147− compilerKind: ghc
148− compilerVersion: 8.4.4
149− setup-method: hvr-ppa
150− allow-failure: false
151− - compiler: ghc-8.4.3
152− compilerKind: ghc
153− compilerVersion: 8.4.3
154− setup-method: hvr-ppa
155− allow-failure: false
156− - compiler: ghc-8.4.2
157− compilerKind: ghc
158− compilerVersion: 8.4.2
159− setup-method: hvr-ppa
160− allow-failure: false
161− - compiler: ghc-8.4.1
162− compilerKind: ghc
163− compilerVersion: 8.4.1
164− setup-method: hvr-ppa
165− allow-failure: false
166− fail-fast: false
167− steps:
168− - name: apt
169− run: |
170− apt-get update
171− apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
172− if [ "${{ matrix.setup-method }}" = ghcup ]; then
173− mkdir -p "$HOME/.ghcup/bin"
174− curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup"
175− chmod a+x "$HOME/.ghcup/bin/ghcup"
176− "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
177− "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
178− else
179− apt-add-repository -y 'ppa:hvr/ghc'
180− apt-get update
181− apt-get install -y "$HCNAME"
182− mkdir -p "$HOME/.ghcup/bin"
183− curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup"
184− chmod a+x "$HOME/.ghcup/bin/ghcup"
185− "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
186− fi
187− env:
188− HCKIND: ${{ matrix.compilerKind }}
189− HCNAME: ${{ matrix.compiler }}
190− HCVER: ${{ matrix.compilerVersion }}
191− - name: Set PATH and environment variables
192− run: |
193− echo "$HOME/.cabal/bin" >> $GITHUB_PATH
194− echo "LANG=C.UTF-8" >> "$GITHUB_ENV"
195− echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
196− echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
197− HCDIR=/opt/$HCKIND/$HCVER
198− if [ "${{ matrix.setup-method }}" = ghcup ]; then
199− HC=$HOME/.ghcup/bin/$HCKIND-$HCVER
200− echo "HC=$HC" >> "$GITHUB_ENV"
201− echo "HCPKG=$HOME/.ghcup/bin/$HCKIND-pkg-$HCVER" >> "$GITHUB_ENV"
202− echo "HADDOCK=$HOME/.ghcup/bin/haddock-$HCVER" >> "$GITHUB_ENV"
203− echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
204− else
205− HC=$HCDIR/bin/$HCKIND
206− echo "HC=$HC" >> "$GITHUB_ENV"
207− echo "HCPKG=$HCDIR/bin/$HCKIND-pkg" >> "$GITHUB_ENV"
208− echo "HADDOCK=$HCDIR/bin/haddock" >> "$GITHUB_ENV"
209− echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
210− fi
211−
212− HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
213− echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
214− echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
215− echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
216− echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
217− echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
218− echo "GHCJSARITH=0" >> "$GITHUB_ENV"
219− env:
220− HCKIND: ${{ matrix.compilerKind }}
221− HCNAME: ${{ matrix.compiler }}
222− HCVER: ${{ matrix.compilerVersion }}
223− - name: env
224− run: |
225− env
226− - name: write cabal config
227− run: |
228− mkdir -p $CABAL_DIR
229− cat >> $CABAL_CONFIG <<EOF
230− remote-build-reporting: anonymous
231− write-ghc-environment-files: never
232− remote-repo-cache: $CABAL_DIR/packages
233− logs-dir: $CABAL_DIR/logs
234− world-file: $CABAL_DIR/world
235− extra-prog-path: $CABAL_DIR/bin
236− symlink-bindir: $CABAL_DIR/bin
237− installdir: $CABAL_DIR/bin
238− build-summary: $CABAL_DIR/logs/build.log
239− store-dir: $CABAL_DIR/store
240− install-dirs user
241− prefix: $CABAL_DIR
242− repository hackage.haskell.org
243− url: http://hackage.haskell.org/
244− EOF
245− cat >> $CABAL_CONFIG <<EOF
246− program-default-options
247− ghc-options: $GHCJOBS +RTS -M3G -RTS
248− EOF
249− cat $CABAL_CONFIG
250− - name: versions
251− run: |
252− $HC --version || true
253− $HC --print-project-git-commit-id || true
254− $CABAL --version || true
255− - name: update cabal index
256− run: |
257− $CABAL v2-update -v
258− - name: install cabal-plan
259− run: |
260− mkdir -p $HOME/.cabal/bin
261− curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.6.2.0/cabal-plan-0.6.2.0-x86_64-linux.xz > cabal-plan.xz
262− echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
263− xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
264− rm -f cabal-plan.xz
265− chmod a+x $HOME/.cabal/bin/cabal-plan
266− cabal-plan --version
267− - name: checkout
268− uses: actions/checkout@v2
269− with:
270− path: source
271− - name: initial cabal.project for sdist
272− run: |
273− touch cabal.project
274− echo "packages: $GITHUB_WORKSPACE/source/." >> cabal.project
275− cat cabal.project
276− - name: sdist
277− run: |
278− mkdir -p sdist
279− $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist
280− - name: unpack
281− run: |
282− mkdir -p unpacked
283− find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \;
284− - name: generate cabal.project
285− run: |
286− PKGDIR_html_parse="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/html-parse-[0-9.]*')"
287− echo "PKGDIR_html_parse=${PKGDIR_html_parse}" >> "$GITHUB_ENV"
288− rm -f cabal.project cabal.project.local
289− touch cabal.project
290− touch cabal.project.local
291− echo "packages: ${PKGDIR_html_parse}" >> cabal.project
292− echo "package html-parse" >> cabal.project
293− echo " ghc-options: -Werror=missing-methods" >> cabal.project
294− cat >> cabal.project <<EOF
295− EOF
296− $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(html-parse)$/; }' >> cabal.project.local
297− cat cabal.project
298− cat cabal.project.local
299− - name: dump install plan
300− run: |
301− $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
302− cabal-plan
303− - name: cache
304− uses: actions/cache@v2
305− with:
306− key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
307− path: ~/.cabal/store
308− restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
309− - name: install dependencies
310− run: |
311− $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
312− $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all
313− - name: build w/o tests
314− run: |
315− $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
316− - name: build
317− run: |
318− $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always
319− - name: tests
320− run: |
321− $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct
322− - name: cabal check
323− run: |
324− cd ${PKGDIR_html_parse} || false
325− ${CABAL} -vnormal check
326− - name: haddock
327− run: |
328− $CABAL v2-haddock --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
329− - name: unconstrained build
330− run: |
331− rm -f cabal.project.local
332− $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
.travis.ymlnew file+88
@@ -0,0 +1,88 @@
1+# This Travis job script has been generated by a script via
2+#
3+# make_travis_yml_2.hs 'html-parse.cabal'
4+#
5+# For more information, see https://github.com/hvr/multi-ghc-travis
6+#
7+language: c
8+sudo: false
9+
10+git:
11+ submodules: false # whether to recursively clone submodules
12+
13+cache:
14+ directories:
15+ - $HOME/.cabal/packages
16+ - $HOME/.cabal/store
17+
18+before_cache:
19+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
20+ # remove files that are regenerated by 'cabal update'
21+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*
22+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json
23+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache
24+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
25+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
26+
27+matrix:
28+ include:
29+ - compiler: "ghc-7.8.4"
30+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
31+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.8.4], sources: [hvr-ghc]}}
32+ - compiler: "ghc-7.10.3"
33+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
34+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}}
35+ - compiler: "ghc-8.0.2"
36+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
37+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
38+
39+before_install:
40+ - HC=${CC}
41+ - unset CC
42+ - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
43+ - PKGNAME='html-parse'
44+
45+install:
46+ - cabal update && cabal install hspec-discover
47+ - cabal --version
48+ - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
49+ - BENCH=${BENCH---enable-benchmarks}
50+ - TEST=${TEST---enable-tests}
51+ - travis_retry cabal update -v
52+ - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
53+ - rm -fv cabal.project.local
54+ - "echo 'packages: .' > cabal.project"
55+ - rm -f cabal.project.freeze
56+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --dep -j2
57+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --dep -j2
58+
59+# Here starts the actual work to be performed for the package under test;
60+# any command which exits with a non-zero exit code causes the build to fail.
61+script:
62+ - if [ -f configure.ac ]; then autoreconf -i; fi
63+ - rm -rf dist/
64+ - cabal sdist # test that a source-distribution can be generated
65+ - cd dist/
66+ - SRCTAR=(${PKGNAME}-*.tar.gz)
67+ - SRC_BASENAME="${SRCTAR/%.tar.gz}"
68+ - tar -xvf "./$SRC_BASENAME.tar.gz"
69+ - cd "$SRC_BASENAME/"
70+## from here on, CWD is inside the extracted source-tarball
71+ - rm -fv cabal.project.local
72+ - "echo 'packages: .' > cabal.project"
73+ # this builds all libraries and executables (without tests/benchmarks)
74+ - rm -f cabal.project.freeze
75+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks
76+ # this builds all libraries and executables (including tests/benchmarks)
77+ # - rm -rf ./dist-newstyle
78+ - cabal new-build -w ${HC} ${TEST} ${BENCH}
79+
80+ # there's no 'cabal new-test' yet, so let's emulate for now
81+ - TESTS=( $(awk 'tolower($0) ~ /^test-suite / { print $2 }' *.cabal) )
82+ - if [ "$TEST" != "--enable-tests" ]; then TESTS=(); fi
83+ - shopt -s globstar;
84+ RC=true; for T in ${TESTS[@]}; do echo "== $T ==";
85+ if dist-newstyle/build/**/$SRC_BASENAME/**/build/$T/$T; then echo "= $T OK =";
86+ else echo "= $T FAILED ="; RC=false; fi; done; $RC
87+
88+# EOF
README.mkddeleted−40
@@ -1,40 +0,0 @@
1−# html-parse
2−
3−`html-parse` is an efficient, reasonably robust HTML tokenizer based on the
4−HTML5 tokenization
5−[specification](https://html.spec.whatwg.org/multipage/syntax.html#tokenization).
6−The parser is written using the fast `attoparsec` parsing library and can
7−exposes both a native `attoparsec` `Parser` as well as convenience functions for
8−lazily parsing token streams out of strict and lazy `Text` values.
9−
10−For instance,
11−```haskell
12−>>> parseTokens "<div><h1>Hello World</h1><br/><p class=widget>Example!</p></div>"
13−[TagOpen "div" [],TagOpen "h1" [],ContentText "Hello World",TagClose "h1",TagSelfClose "br" [],TagOpen "p" [Attr "class" "widget"],ContentText "Example!",TagClose "p",TagClose "div"]
14−```
15−
16−## Performance
17−
18−Here are some typical performance numbers taken from parsing a fairly
19−long [Wikipedia article](https://en.wikipedia.org/wiki/New_York_City),
20−```
21−benchmarking Forced/tagsoup fast Text
22−time 171.2 ms (166.4 ms .. 177.3 ms)
23− 0.999 R² (0.997 R² .. 1.000 R²)
24−mean 171.9 ms (169.4 ms .. 173.2 ms)
25−std dev 2.516 ms (1.104 ms .. 3.558 ms)
26−variance introduced by outliers: 12% (moderately inflated)
27−
28−benchmarking Forced/tagsoup normal Text
29−time 176.9 ms (167.3 ms .. 188.5 ms)
30− 0.998 R² (0.994 R² .. 1.000 R²)
31−mean 180.7 ms (177.5 ms .. 183.7 ms)
32−std dev 4.246 ms (2.316 ms .. 5.803 ms)
33−variance introduced by outliers: 14% (moderately inflated)
34−
35−benchmarking Forced/html-parser
36−time 20.88 ms (20.60 ms .. 21.25 ms)
37− 0.999 R² (0.998 R² .. 0.999 R²)
38−mean 20.99 ms (20.81 ms .. 21.20 ms)
39−std dev 446.1 μs (336.4 μs .. 596.2 μs)
40−```
src/Text/HTML/Parser.hs → Text/HTML/Parser.hsrenamed+82−187
@@ -2,8 +2,6 @@
22{-# LANGUAGE DeriveGeneric #-}
33{-# LANGUAGE LambdaCase #-}
44
5−{-# OPTIONS_GHC -O2 #-}
6−
75-- | This is a performance-oriented HTML tokenizer aim at web-crawling
86-- applications. It follows the HTML5 parsing specification quite closely,
97-- so it behaves reasonable well on ill-formed documents from the open Web.
@@ -42,11 +40,6 @@ import Data.Text.Lazy.Builder (Builder)
4240import qualified Data.Text.Lazy.Builder as B
4341import Prelude hiding (take, takeWhile)
4442
45−import Text.HTML.Parser.Entities (entities)
46−import qualified Data.Trie as Trie
47−
48−-- Section numbers refer to W3C HTML 5.2 specification.
49−
5043-- | A tag name (e.g. @body@)
5144type TagName = Text
5245
@@ -58,10 +51,8 @@ type AttrValue = Text
5851
5952-- | An HTML token
6053data Token
61− -- | An opening tag. Attribute ordering is arbitrary. Void elements have a 'TagOpen' but no corresponding 'TagClose'. See 'Text.HTML.Tree.nonClosing'.
54+ -- | An opening tag. Attribute ordering is arbitrary.
6255 = TagOpen !TagName [Attr]
63− -- | A self-closing tag.
64− | TagSelfClose !TagName [Attr]
6556 -- | A closing tag.
6657 | TagClose !TagName
6758 -- | The content between tags.
@@ -74,10 +65,6 @@ data Token
7465 | Doctype !Text
7566 deriving (Show, Ord, Eq, Generic)
7667
77−-- | This is a bit of a hack
78−endOfFileToken :: Token
79−endOfFileToken = ContentText ""
80−
8168-- | An attribute of a tag
8269data Attr = Attr !AttrName !AttrValue
8370 deriving (Show, Eq, Ord)
@@ -93,274 +80,183 @@ token = dataState -- Start in the data state.
9380-- | /§8.2.4.1/: Data state
9481dataState :: Parser Token
9582dataState = do
96− content <- takeWhile (\c -> c /= '<' && c /= '&')
83+ content <- takeWhile (/= '<')
9784 if not $ T.null content
9885 then return $ ContentText content
99− else choice
100− [ char '<' >> tagOpen
101− , try $ char '&' >> charRef
102− , ContentChar '&' <$ char '&'
103− ]
104−
105−charRef :: Parser Token
106−charRef = go entityTrie
107− where
108− go :: Trie.Trie Char Token -> Parser Token
109− go trie = do
110− c <- anyChar
111− case c of
112− ';' -> maybe empty return (Trie.terminal trie)
113− _ -> go (Trie.step c trie)
114−
115−entityTrie :: Trie.Trie Char Token
116−entityTrie = Trie.fromList
117− [ (T.unpack name, ContentText expansion)
118− | (name, expansion) <- entities
119− ]
120−
121−-- | /§8.2.4.6/: Tag open state
86+ else char '<' >> tagOpen
87+
88+-- | /§8.2.4.3/: Tag open state
12289tagOpen :: Parser Token
12390tagOpen =
12491 (char '!' >> markupDeclOpen)
12592 <|> (char '/' >> endTagOpen)
126− <|> (char '?' >> bogusComment mempty)
127− <|> tagNameOpen
93+ <|> (char '?' >> bogusComment)
94+ <|> tryStartTag
12895 <|> other
12996 where
97+ tryStartTag = do
98+ c <- peekChar'
99+ guard $ isAsciiUpper c || isAsciiLower c
100+ tagName
101+
130102 other = do
131103 return $ ContentChar '<'
132104
133−-- | /§8.2.4.7/: End tag open state
105+-- | /§8.2.4.9/: End tag open state
106+-- TODO: This isn't right
134107endTagOpen :: Parser Token
135−endTagOpen = tagNameClose
136−
137−-- | Equivalent to @inClass "\x09\x0a\x0c "@
138−isWhitespace :: Char -> Bool
139−isWhitespace '\x09' = True
140−isWhitespace '\x0a' = True
141−isWhitespace '\x0c' = True
142−isWhitespace '\x0d' = True
143−isWhitespace ' ' = True
144−isWhitespace _ = False
145−
146−orC :: (Char -> Bool) -> (Char -> Bool) -> Char -> Bool
147−orC f g c = f c || g c
148−{-# INLINE orC #-}
149−
150−isC :: Char -> Char -> Bool
151−isC = (==)
152−{-# INLINE isC #-}
153−
154−-- | /§8.2.4.8/: Tag name state: the open case
108+endTagOpen = do
109+ name <- takeWhile $ \c -> isAsciiUpper c || isAsciiLower c
110+ char '>'
111+ return $ TagClose name
112+
113+-- | /§8.2.4.10/: Tag name state
155114--
156−-- deviation: no lower-casing, don't handle NULL characters
157−tagNameOpen :: Parser Token
158−tagNameOpen = do
159− tag <- tagName'
160− id $ (satisfy isWhitespace >> beforeAttrName tag [])
115+-- deviation: no lower-casing
116+tagName :: Parser Token
117+tagName = do
118+ tag <- takeWhile $ notInClass "\x09\x0a\x0c />"
119+ id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag [])
161120 <|> (char '/' >> selfClosingStartTag tag [])
162121 <|> (char '>' >> return (TagOpen tag []))
163122
164−-- | /§8.2.4.10/: Tag name state: close case
165−tagNameClose :: Parser Token
166−tagNameClose = do
167− tag <- tagName'
168− char '>' >> return (TagClose tag)
169−
170−-- | /§8.2.4.10/: Tag name state: common code
171−--
172−-- deviation: no lower-casing, don't handle NULL characters
173−tagName' :: Parser Text
174−tagName' = do
175− c <- peekChar'
176− guard $ isAsciiUpper c || isAsciiLower c
177− takeWhile $ not . (isWhitespace `orC` isC '/' `orC` isC '<' `orC` isC '>')
178−
179−-- | /§8.2.4.40/: Self-closing start tag state
123+-- | /§8.2.4.43/: Self-closing start tag state
180124selfClosingStartTag :: TagName -> [Attr] -> Parser Token
181125selfClosingStartTag tag attrs = do
182− (char '>' >> return (TagSelfClose tag attrs))
183− <|> (endOfInput >> return endOfFileToken)
126+ (char '>' >> return (TagOpen tag attrs))
184127 <|> beforeAttrName tag attrs
185128
186−-- | /§8.2.4.32/: Before attribute name state
129+-- | /§8.2.4.34/: Before attribute name state
187130--
188131-- deviation: no lower-casing
189132beforeAttrName :: TagName -> [Attr] -> Parser Token
190133beforeAttrName tag attrs = do
191− skipWhile isWhitespace
134+ skipWhile $ inClass "\x09\x0a\x0c "
192135 id $ (char '/' >> selfClosingStartTag tag attrs)
193136 <|> (char '>' >> return (TagOpen tag attrs))
194137 -- <|> (char '\x00' >> attrName tag attrs) -- TODO: NULL
195138 <|> attrName tag attrs
196139
197−-- | /§8.2.4.33/: Attribute name state
140+-- | /§8.2.4.35/: Attribute name state
198141attrName :: TagName -> [Attr] -> Parser Token
199142attrName tag attrs = do
200− name <- takeWhile $ not . (isWhitespace `orC` isC '/' `orC` isC '=' `orC` isC '>')
201− id $ (endOfInput >> afterAttrName tag attrs name)
143+ name <- takeWhile $ notInClass "\x09\x0a\x0c /=>\x00"
144+ id $ (satisfy (inClass "\x09\x0a\x0c ") >> afterAttrName tag attrs name)
145+ <|> (char '/' >> selfClosingStartTag tag attrs)
202146 <|> (char '=' >> beforeAttrValue tag attrs name)
203− <|> try (do mc <- peekChar
204− case mc of
205− Just c | notNameChar c -> afterAttrName tag attrs name
206− _ -> empty)
147+ <|> (char '>' >> return (TagOpen tag (Attr name T.empty : attrs)))
207148 -- <|> -- TODO: NULL
208− where notNameChar = isWhitespace `orC` isC '/' `orC` isC '>'
209149
210−-- | /§8.2.4.34/: After attribute name state
150+-- | /§8.2.4.36/: After attribute name state
211151afterAttrName :: TagName -> [Attr] -> AttrName -> Parser Token
212152afterAttrName tag attrs name = do
213− skipWhile isWhitespace
153+ skipWhile $ inClass "\x09\x0a\x0c "
214154 id $ (char '/' >> selfClosingStartTag tag attrs)
215155 <|> (char '=' >> beforeAttrValue tag attrs name)
216156 <|> (char '>' >> return (TagOpen tag (Attr name T.empty : attrs)))
217− <|> (endOfInput >> return endOfFileToken)
218157 <|> attrName tag (Attr name T.empty : attrs) -- not exactly sure this is right
219158
220−-- | /§8.2.4.35/: Before attribute value state
159+-- | /§8.2.4.37/: Before attribute value state
221160beforeAttrValue :: TagName -> [Attr] -> AttrName -> Parser Token
222161beforeAttrValue tag attrs name = do
223− skipWhile isWhitespace
162+ skipWhile $ inClass "\x09\x0a\x0c "
224163 id $ (char '"' >> attrValueDQuoted tag attrs name)
225164 <|> (char '\'' >> attrValueSQuoted tag attrs name)
226165 <|> (char '>' >> return (TagOpen tag (Attr name T.empty : attrs)))
227166 <|> attrValueUnquoted tag attrs name
228167
229−-- | /§8.2.4.36/: Attribute value (double-quoted) state
168+-- | /§8.2.4.38/: Attribute value (double-quoted) state
230169attrValueDQuoted :: TagName -> [Attr] -> AttrName -> Parser Token
231170attrValueDQuoted tag attrs name = do
232171 value <- takeWhile (/= '"')
233− _ <- char '"'
172+ char '"'
234173 afterAttrValueQuoted tag attrs name value
235174
236−-- | /§8.2.4.37/: Attribute value (single-quoted) state
175+-- | /§8.2.4.39/: Attribute value (single-quoted) state
237176attrValueSQuoted :: TagName -> [Attr] -> AttrName -> Parser Token
238177attrValueSQuoted tag attrs name = do
239178 value <- takeWhile (/= '\'')
240− _ <- char '\''
179+ char '\''
241180 afterAttrValueQuoted tag attrs name value
242181
243−-- | /§8.2.4.38/: Attribute value (unquoted) state
182+-- | /§8.2.4.40/: Attribute value (unquoted) state
244183attrValueUnquoted :: TagName -> [Attr] -> AttrName -> Parser Token
245184attrValueUnquoted tag attrs name = do
246− value <- takeTill $ isWhitespace `orC` isC '>'
247− id $ (satisfy isWhitespace >> beforeAttrName tag attrs) -- unsure: don't emit?
185+ value <- takeTill (inClass "\x09\x0a\x0c >")
186+ id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag attrs) -- unsure: don't emit?
248187 <|> (char '>' >> return (TagOpen tag (Attr name value : attrs)))
249− <|> (endOfInput >> return endOfFileToken)
250188
251−-- | /§8.2.4.39/: After attribute value (quoted) state
189+-- | /§8.2.4.42/: After attribute value (quoted) state
252190afterAttrValueQuoted :: TagName -> [Attr] -> AttrName -> AttrValue -> Parser Token
253191afterAttrValueQuoted tag attrs name value =
254− (satisfy isWhitespace >> beforeAttrName tag attrs')
192+ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag attrs')
255193 <|> (char '/' >> selfClosingStartTag tag attrs')
256194 <|> (char '>' >> return (TagOpen tag attrs'))
257− <|> (endOfInput >> return endOfFileToken)
258195 where attrs' = Attr name value : attrs
259196
260−-- | /§8.2.4.41/: Bogus comment state
261−bogusComment :: Builder -> Parser Token
262−bogusComment content = do
263− (char '>' >> return (Comment content))
264− <|> (endOfInput >> return (Comment content))
265− <|> (char '\x00' >> bogusComment (content <> "\xfffd"))
266− <|> (anyChar >>= \c -> bogusComment (content <> B.singleton c))
267−
268−-- | /§8.2.4.42/: Markup declaration open state
197+-- | /§8.2.4.45/: Markup declaration open state
269198markupDeclOpen :: Parser Token
270199markupDeclOpen =
271− try comment_
200+ try comment
272201 <|> try docType
273− <|> bogusComment mempty
202+ -- TODO: Fix the rest
274203 where
275− comment_ = char '-' >> char '-' >> commentStart
204+ comment = string "--" >> commentStart
276205 docType = do
277206 -- switching this to asciiCI slowed things down by a factor of two
278207 s <- take 7
279208 guard $ T.toLower s == "doctype"
280209 doctype
281210
282−-- | /§8.2.4.43/: Comment start state
211+-- | /§8.2.4.46/: Comment start state
283212commentStart :: Parser Token
284213commentStart = do
285214 (char '-' >> commentStartDash)
286215 <|> (char '>' >> return (Comment mempty))
287216 <|> comment mempty
288217
289−-- | /§8.2.4.44/: Comment start dash state
218+-- | /§8.2.4.47/: Comment start dash state
290219commentStartDash :: Parser Token
291220commentStartDash =
292221 (char '-' >> commentEnd mempty)
293222 <|> (char '>' >> return (Comment mempty))
294− <|> (endOfInput >> return (Comment mempty))
295− <|> (comment (B.singleton '-'))
223+ <|> (do c <- anyChar
224+ comment (B.singleton '-' <> B.singleton c) )
296225
297−-- | /§8.2.4.45/: Comment state
226+-- | /§8.2.4.48/: Comment state
298227comment :: Builder -> Parser Token
299228comment content0 = do
300− content <- B.fromText <$> takeWhile (not . (isC '-' `orC` isC '\x00' `orC` isC '<'))
301− id $ (char '<' >> commentLessThan (content0 <> content <> "<"))
302− <|> (char '-' >> commentEndDash (content0 <> content))
229+ content <- B.fromText <$> takeWhile (notInClass "-")
230+ id $ (char '-' >> commentEndDash (content0 <> content))
303231 <|> (char '\x00' >> comment (content0 <> content <> B.singleton '\xfffd'))
304− <|> (endOfInput >> return (Comment $ content0 <> content))
305−
306−-- | /§8.2.46/: Comment less-than sign state
307−commentLessThan :: Builder -> Parser Token
308−commentLessThan content =
309− (char '!' >> commentLessThanBang (content <> "!"))
310− <|> (char '<' >> commentLessThan (content <> "<"))
311− <|> comment content
312−
313−-- | /§8.2.47/: Comment less-than sign bang state
314−commentLessThanBang :: Builder -> Parser Token
315−commentLessThanBang content =
316− (char '-' >> commentLessThanBangDash content)
317− <|> comment content
318−
319−-- | /§8.2.48/: Comment less-than sign bang dash state
320−commentLessThanBangDash :: Builder -> Parser Token
321−commentLessThanBangDash content =
322− (char '-' >> commentLessThanBangDashDash content)
323− <|> commentEndDash content
324−
325−-- | /§8.2.49/: Comment less-than sign bang dash dash state
326−commentLessThanBangDashDash :: Builder -> Parser Token
327−commentLessThanBangDashDash content =
328− (char '>' >> comment content)
329− <|> (endOfInput >> comment content)
330− <|> commentEnd content
331−
332−-- | /§8.2.4.50/: Comment end dash state
232+
233+-- | /§8.2.4.49/: Comment end dash state
333234commentEndDash :: Builder -> Parser Token
334235commentEndDash content = do
335236 (char '-' >> commentEnd content)
336− <|> (endOfInput >> return (Comment content))
337− <|> (comment (content <> "-"))
237+ <|> (char '\x00' >> comment (content <> "-\xfffd"))
238+ <|> (anyChar >>= \c -> comment (content <> "-" <> B.singleton c))
338239
339−-- | /§8.2.4.51/: Comment end state
240+-- | /§8.2.4.50/: Comment end state
340241commentEnd :: Builder -> Parser Token
341242commentEnd content = do
342243 (char '>' >> return (Comment content))
343− <|> (char '!' >> commentEndBang content)
344− <|> (char '-' >> commentEnd (content <> "-"))
345− <|> (endOfInput >> return (Comment content))
346− <|> (comment (content <> "--"))
347−
348−-- | /§8.2.4.52/: Comment end bang state
349−commentEndBang :: Builder -> Parser Token
350−commentEndBang content = do
351− (char '-' >> commentEndDash (content <> "--!"))
352− <|> (char '>' >> return (Comment content))
353− <|> (endOfInput >> return (Comment content))
354− <|> (comment (content <> "--!"))
355−
356−-- | /§8.2.4.53/: DOCTYPE state
244+ <|> (char '\x00' >> comment (content <> "-\xfffd"))
245+ -- <|> () TODO: other cases
246+ <|> (anyChar >>= \c -> comment (content <> "-" <> B.singleton c))
247+
248+-- | /§8.2.4.52/: DOCTYPE state
357249-- FIXME
358250doctype :: Parser Token
359251doctype = do
360252 content <- takeTill (=='>')
361− _ <- char '>'
253+ char '>'
362254 return $ Doctype content
363255
256+-- | /§8.2.4.44/: Bogus comment state
257+bogusComment :: Parser Token
258+bogusComment = fail "Bogus comment"
259+
364260-- | Parse a lazy list of tokens from strict 'Text'.
365261parseTokens :: Text -> [Token]
366262parseTokens = unfoldr f
@@ -396,14 +292,13 @@ renderTokens = mconcat . fmap renderToken
396292-- | (Somewhat) canonical string representation of 'Token'.
397293renderToken :: Token -> TL.Text
398294renderToken = TL.fromStrict . mconcat . \case
399− (TagOpen n []) -> ["<", n, ">"]
400− (TagOpen n attrs) -> ["<", n, " ", renderAttrs attrs, ">"]
401− (TagSelfClose n attrs) -> ["<", n, " ", renderAttrs attrs, " />"]
402− (TagClose n) -> ["</", n, ">"]
403− (ContentChar c) -> [T.singleton c]
404− (ContentText t) -> [t]
405− (Comment builder) -> ["<!--", TL.toStrict $ B.toLazyText builder, "-->"]
406− (Doctype t) -> ["<!DOCTYPE", t, ">"]
295+ (TagOpen n []) -> ["<", n, ">"]
296+ (TagOpen n attrs) -> ["<", n, " ", renderAttrs attrs, ">"]
297+ (TagClose n) -> ["</", n, ">"]
298+ (ContentChar c) -> [T.singleton c]
299+ (ContentText t) -> [t]
300+ (Comment builder) -> ["<!--", TL.toStrict $ B.toLazyText builder, "-->"]
301+ (Doctype t) -> ["<!DOCTYPE", t, ">"]
407302
408303-- | See 'renderAttr'.
409304renderAttrs :: [Attr] -> Text
@@ -413,8 +308,8 @@ renderAttrs = T.unwords . fmap renderAttr . reverse
413308renderAttr :: Attr -> Text
414309renderAttr (Attr k v) = mconcat [k, "=\"", v, "\""]
415310
416−-- | Meld neighoring 'ContentChar' and 'ContentText'
417−-- constructors together and drops empty text elements.
311+-- | Meld neighoring 'ContentChar' and 'ContentText' constructors together and drops empty text
312+-- elements.
418313canonicalizeTokens :: [Token] -> [Token]
419314canonicalizeTokens = filter (/= ContentText "") . meldTextTokens
420315
changelog.mddeleted−10
@@ -1,10 +0,0 @@
1−# Changelog for `html-parse`
2−
3−## 0.2.1.0
4−
5−- Added support for decoding of character references (#18)
6−- All self-closing elements are now recognized as such
7−
8−## Earlier
9−
10−There be dragons.
gen_entities.pydeleted−36
@@ -1,36 +0,0 @@
1−#!/usr/bin/env python3
2−
3−"""
4−Converts entity WHATWG HTML5 entity summary into
5−Text.HTML.Parser.Entities module.
6−
7−Usage:
8−
9− curl https://html.spec.whatwg.org/entities.json | python3 gen_entities.py > src/Text/HTML/Parser/Entities.hs
10−
11−"""
12−
13−import sys
14−import json
15−
16−entities = json.load(sys.stdin)
17−
18−def escape(details):
19− return ''.join(f'\\x{cp:04x}' for cp in details['codepoints'])
20−
21−print('''
22−{-# LANGUAGE OverloadedStrings #-}
23−
24−-- | N.B. This file is generated by @gen_entities.py@. Do not edit.
25−module Text.HTML.Parser.Entities (entities) where
26−
27−import Data.Text (Text)
28−
29−entities :: [(Text, Text)]
30−entities = [
31−'''.strip())
32−print(',\n'.join(
33− f''' ("{name[1:-1]}", "{escape(details)}")'''
34− for name, details in entities.items()
35−))
36−print(' ]')
html-parse.cabal+11−54
@@ -1,48 +1,14 @@
11name: html-parse
2−version: 0.2.1.0
2+version: 0.2.0.0
33synopsis: A high-performance HTML tokenizer
44description:
55 This package provides a fast and reasonably robust HTML5 tokenizer built
66 upon the @attoparsec@ library. The parsing strategy is based upon the HTML5
77 parsing specification with few deviations.
88 .
9− For instance,
10− .
11− >>> parseTokens "<div><h1 class=widget>Hello World</h1><br/>"
12− [TagOpen "div" [],
13− TagOpen "h1" [Attr "class" "widget"],
14− ContentText "Hello World",
15− TagClose "h1",
16− TagSelfClose "br" []]
17− .
189 The package targets similar use-cases to the venerable @tagsoup@ library,
19− but is significantly more efficient, achieving parsing speeds of over 80
20− megabytes per second on modern hardware and typical web documents.
21− Here are some typical performance numbers taken from parsing a Wikipedia
22− article of moderate length:
23− .
24− @
25− benchmarking Forced/tagsoup fast Text
26− time 186.1 ms (175.3 ms .. 194.6 ms)
27− 0.999 R² (0.995 R² .. 1.000 R²)
28− mean 191.7 ms (188.9 ms .. 198.3 ms)
29− std dev 5.053 ms (1.092 ms .. 6.809 ms)
30− variance introduced by outliers: 14% (moderately inflated)
31− .
32− benchmarking Forced/tagsoup normal Text
33− time 189.7 ms (182.8 ms .. 197.7 ms)
34− 0.999 R² (0.998 R² .. 1.000 R²)
35− mean 196.5 ms (193.1 ms .. 202.1 ms)
36− std dev 5.481 ms (2.141 ms .. 7.383 ms)
37− variance introduced by outliers: 14% (moderately inflated)
38− .
39− benchmarking Forced/html-parser
40− time 15.81 ms (15.75 ms .. 15.89 ms)
41− 1.000 R² (1.000 R² .. 1.000 R²)
42− mean 15.72 ms (15.66 ms .. 15.77 ms)
43− std dev 140.9 μs (113.6 μs .. 174.5 μs)
44− @
45−
10+ but is significantly more efficient, achieving parsing speeds of over 50
11+ megabytes per second on modern hardware with and typical web documents.
4612homepage: http://github.com/bgamari/html-parse
4713license: BSD3
4814license-file: LICENSE
@@ -52,8 +18,7 @@ copyright: (c) 2016 Ben Gamari
5218category: Text
5319build-type: Simple
5420cabal-version: >=1.10
55−tested-with: GHC==8.4.*, GHC==8.6.*, GHC==8.8.*, GHC==8.10.*, GHC==9.0.*, GHC==9.2.*, GHC==9.4.*, GHC==9.6.*
56−extra-source-files: changelog.md
21+tested-with: GHC==8.0.2, GHC==7.10.3, GHC==7.8.4
5722
5823
5924source-repository head
@@ -61,16 +26,12 @@ source-repository head
6126 location: git://github.com/bgamari/html-parse
6227
6328library
64− exposed-modules: Text.HTML.Parser, Text.HTML.Tree
65− other-modules: Text.HTML.Parser.Entities, Data.Trie
66− ghc-options: -Wall
67− hs-source-dirs: src
29+ exposed-modules: Text.HTML.Parser
6830 other-extensions: OverloadedStrings, DeriveGeneric
69− build-depends: base >=4.7 && <4.19,
70− deepseq >=1.3 && <1.5,
71− attoparsec >=0.13 && <0.15,
72− text >=1.2 && <2.1,
73− containers >=0.5 && <0.7
31+ build-depends: base >=4.7 && <4.10,
32+ deepseq >=1.4 && <1.5,
33+ attoparsec >=0.13 && <0.14,
34+ text >=1.2 && <1.3
7435 default-language: Haskell2010
7536
7637benchmark bench
@@ -82,19 +43,15 @@ benchmark bench
8243 attoparsec,
8344 text,
8445 tagsoup >= 0.13,
85− criterion >= 1.1,
86− html-parse
46+ criterion >= 1.1
8747 default-language: Haskell2010
8848
8949test-suite spec
9050 type: exitcode-stdio-1.0
91− hs-source-dirs: tests
9251 main-is: Spec.hs
93− other-modules: Text.HTML.ParserSpec, Text.HTML.TreeSpec
52+ hs-source-dirs: tests
9453 ghc-options: -Wall -with-rtsopts=-T
95− build-tool-depends: hspec-discover:hspec-discover
9654 build-depends: base,
97− containers,
9855 hspec,
9956 hspec-discover,
10057 html-parse,
src/Data/Trie.hsdeleted−34
@@ -1,34 +0,0 @@
1−module Data.Trie
2− ( Trie
3− , singleton, fromList
4− , terminal, step
5− ) where
6−
7−import Control.Applicative
8−
9−import qualified Data.Map.Strict as M
10−
11−data Trie k v
12− = TrieNode !(Maybe v) !(M.Map k (Trie k v))
13−
14−instance Ord k => Monoid (Trie k v) where
15− mempty = TrieNode Nothing M.empty
16−
17−instance Ord k => Semigroup (Trie k v) where
18− TrieNode v0 ys0 <> TrieNode v1 ys1 =
19− TrieNode (v1 <|> v0) (M.unionWith (<>) ys0 ys1)
20−
21−singleton :: Ord k => [k] -> v -> Trie k v
22−singleton = go
23− where
24− go [] v = TrieNode (Just v) M.empty
25− go (x:xs) v = TrieNode Nothing (M.singleton x (go xs v))
26−
27−fromList :: Ord k => [([k], v)] -> Trie k v
28−fromList = foldMap (uncurry singleton)
29−
30−terminal :: Trie k v -> Maybe v
31−terminal (TrieNode v _) = v
32−
33−step :: Ord k => k -> Trie k v -> Trie k v
34−step k (TrieNode _ xs) = M.findWithDefault mempty k xs
src/Text/HTML/Parser/Entities.hsdeleted−2241
@@ -1,2241 +0,0 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−
3−-- | N.B. This file is generated by @gen_entities.py@. Do not edit.
4−module Text.HTML.Parser.Entities (entities) where
5−
6−import Data.Text (Text)
7−
8−entities :: [(Text, Text)]
9−entities = [
10− ("AEli", "\x00c6"),
11− ("AElig", "\x00c6"),
12− ("AM", "\x0026"),
13− ("AMP", "\x0026"),
14− ("Aacut", "\x00c1"),
15− ("Aacute", "\x00c1"),
16− ("Abreve", "\x0102"),
17− ("Acir", "\x00c2"),
18− ("Acirc", "\x00c2"),
19− ("Acy", "\x0410"),
20− ("Afr", "\x1d504"),
21− ("Agrav", "\x00c0"),
22− ("Agrave", "\x00c0"),
23− ("Alpha", "\x0391"),
24− ("Amacr", "\x0100"),
25− ("And", "\x2a53"),
26− ("Aogon", "\x0104"),
27− ("Aopf", "\x1d538"),
28− ("ApplyFunction", "\x2061"),
29− ("Arin", "\x00c5"),
30− ("Aring", "\x00c5"),
31− ("Ascr", "\x1d49c"),
32− ("Assign", "\x2254"),
33− ("Atild", "\x00c3"),
34− ("Atilde", "\x00c3"),
35− ("Aum", "\x00c4"),
36− ("Auml", "\x00c4"),
37− ("Backslash", "\x2216"),
38− ("Barv", "\x2ae7"),
39− ("Barwed", "\x2306"),
40− ("Bcy", "\x0411"),
41− ("Because", "\x2235"),
42− ("Bernoullis", "\x212c"),
43− ("Beta", "\x0392"),
44− ("Bfr", "\x1d505"),
45− ("Bopf", "\x1d539"),
46− ("Breve", "\x02d8"),
47− ("Bscr", "\x212c"),
48− ("Bumpeq", "\x224e"),
49− ("CHcy", "\x0427"),
50− ("COP", "\x00a9"),
51− ("COPY", "\x00a9"),
52− ("Cacute", "\x0106"),
53− ("Cap", "\x22d2"),
54− ("CapitalDifferentialD", "\x2145"),
55− ("Cayleys", "\x212d"),
56− ("Ccaron", "\x010c"),
57− ("Ccedi", "\x00c7"),
58− ("Ccedil", "\x00c7"),
59− ("Ccirc", "\x0108"),
60− ("Cconint", "\x2230"),
61− ("Cdot", "\x010a"),
62− ("Cedilla", "\x00b8"),
63− ("CenterDot", "\x00b7"),
64− ("Cfr", "\x212d"),
65− ("Chi", "\x03a7"),
66− ("CircleDot", "\x2299"),
67− ("CircleMinus", "\x2296"),
68− ("CirclePlus", "\x2295"),
69− ("CircleTimes", "\x2297"),
70− ("ClockwiseContourIntegral", "\x2232"),
71− ("CloseCurlyDoubleQuote", "\x201d"),
72− ("CloseCurlyQuote", "\x2019"),
73− ("Colon", "\x2237"),
74− ("Colone", "\x2a74"),
75− ("Congruent", "\x2261"),
76− ("Conint", "\x222f"),
77− ("ContourIntegral", "\x222e"),
78− ("Copf", "\x2102"),
79− ("Coproduct", "\x2210"),
80− ("CounterClockwiseContourIntegral", "\x2233"),
81− ("Cross", "\x2a2f"),
82− ("Cscr", "\x1d49e"),
83− ("Cup", "\x22d3"),
84− ("CupCap", "\x224d"),
85− ("DD", "\x2145"),
86− ("DDotrahd", "\x2911"),
87− ("DJcy", "\x0402"),
88− ("DScy", "\x0405"),
89− ("DZcy", "\x040f"),
90− ("Dagger", "\x2021"),
91− ("Darr", "\x21a1"),
92− ("Dashv", "\x2ae4"),
93− ("Dcaron", "\x010e"),
94− ("Dcy", "\x0414"),
95− ("Del", "\x2207"),
96− ("Delta", "\x0394"),
97− ("Dfr", "\x1d507"),
98− ("DiacriticalAcute", "\x00b4"),
99− ("DiacriticalDot", "\x02d9"),
100− ("DiacriticalDoubleAcute", "\x02dd"),
101− ("DiacriticalGrave", "\x0060"),
102− ("DiacriticalTilde", "\x02dc"),
103− ("Diamond", "\x22c4"),
104− ("DifferentialD", "\x2146"),
105− ("Dopf", "\x1d53b"),
106− ("Dot", "\x00a8"),
107− ("DotDot", "\x20dc"),
108− ("DotEqual", "\x2250"),
109− ("DoubleContourIntegral", "\x222f"),
110− ("DoubleDot", "\x00a8"),
111− ("DoubleDownArrow", "\x21d3"),
112− ("DoubleLeftArrow", "\x21d0"),
113− ("DoubleLeftRightArrow", "\x21d4"),
114− ("DoubleLeftTee", "\x2ae4"),
115− ("DoubleLongLeftArrow", "\x27f8"),
116− ("DoubleLongLeftRightArrow", "\x27fa"),
117− ("DoubleLongRightArrow", "\x27f9"),
118− ("DoubleRightArrow", "\x21d2"),
119− ("DoubleRightTee", "\x22a8"),
120− ("DoubleUpArrow", "\x21d1"),
121− ("DoubleUpDownArrow", "\x21d5"),
122− ("DoubleVerticalBar", "\x2225"),
123− ("DownArrow", "\x2193"),
124− ("DownArrowBar", "\x2913"),
125− ("DownArrowUpArrow", "\x21f5"),
126− ("DownBreve", "\x0311"),
127− ("DownLeftRightVector", "\x2950"),
128− ("DownLeftTeeVector", "\x295e"),
129− ("DownLeftVector", "\x21bd"),
130− ("DownLeftVectorBar", "\x2956"),
131− ("DownRightTeeVector", "\x295f"),
132− ("DownRightVector", "\x21c1"),
133− ("DownRightVectorBar", "\x2957"),
134− ("DownTee", "\x22a4"),
135− ("DownTeeArrow", "\x21a7"),
136− ("Downarrow", "\x21d3"),
137− ("Dscr", "\x1d49f"),
138− ("Dstrok", "\x0110"),
139− ("ENG", "\x014a"),
140− ("ET", "\x00d0"),
141− ("ETH", "\x00d0"),
142− ("Eacut", "\x00c9"),
143− ("Eacute", "\x00c9"),
144− ("Ecaron", "\x011a"),
145− ("Ecir", "\x00ca"),
146− ("Ecirc", "\x00ca"),
147− ("Ecy", "\x042d"),
148− ("Edot", "\x0116"),
149− ("Efr", "\x1d508"),
150− ("Egrav", "\x00c8"),
151− ("Egrave", "\x00c8"),
152− ("Element", "\x2208"),
153− ("Emacr", "\x0112"),
154− ("EmptySmallSquare", "\x25fb"),
155− ("EmptyVerySmallSquare", "\x25ab"),
156− ("Eogon", "\x0118"),
157− ("Eopf", "\x1d53c"),
158− ("Epsilon", "\x0395"),
159− ("Equal", "\x2a75"),
160− ("EqualTilde", "\x2242"),
161− ("Equilibrium", "\x21cc"),
162− ("Escr", "\x2130"),
163− ("Esim", "\x2a73"),
164− ("Eta", "\x0397"),
165− ("Eum", "\x00cb"),
166− ("Euml", "\x00cb"),
167− ("Exists", "\x2203"),
168− ("ExponentialE", "\x2147"),
169− ("Fcy", "\x0424"),
170− ("Ffr", "\x1d509"),
171− ("FilledSmallSquare", "\x25fc"),
172− ("FilledVerySmallSquare", "\x25aa"),
173− ("Fopf", "\x1d53d"),
174− ("ForAll", "\x2200"),
175− ("Fouriertrf", "\x2131"),
176− ("Fscr", "\x2131"),
177− ("GJcy", "\x0403"),
178− ("G", "\x003e"),
179− ("GT", "\x003e"),
180− ("Gamma", "\x0393"),
181− ("Gammad", "\x03dc"),
182− ("Gbreve", "\x011e"),
183− ("Gcedil", "\x0122"),
184− ("Gcirc", "\x011c"),
185− ("Gcy", "\x0413"),
186− ("Gdot", "\x0120"),
187− ("Gfr", "\x1d50a"),
188− ("Gg", "\x22d9"),
189− ("Gopf", "\x1d53e"),
190− ("GreaterEqual", "\x2265"),
191− ("GreaterEqualLess", "\x22db"),
192− ("GreaterFullEqual", "\x2267"),
193− ("GreaterGreater", "\x2aa2"),
194− ("GreaterLess", "\x2277"),
195− ("GreaterSlantEqual", "\x2a7e"),
196− ("GreaterTilde", "\x2273"),
197− ("Gscr", "\x1d4a2"),
198− ("Gt", "\x226b"),
199− ("HARDcy", "\x042a"),
200− ("Hacek", "\x02c7"),
201− ("Hat", "\x005e"),
202− ("Hcirc", "\x0124"),
203− ("Hfr", "\x210c"),
204− ("HilbertSpace", "\x210b"),
205− ("Hopf", "\x210d"),
206− ("HorizontalLine", "\x2500"),
207− ("Hscr", "\x210b"),
208− ("Hstrok", "\x0126"),
209− ("HumpDownHump", "\x224e"),
210− ("HumpEqual", "\x224f"),
211− ("IEcy", "\x0415"),
212− ("IJlig", "\x0132"),
213− ("IOcy", "\x0401"),
214− ("Iacut", "\x00cd"),
215− ("Iacute", "\x00cd"),
216− ("Icir", "\x00ce"),
217− ("Icirc", "\x00ce"),
218− ("Icy", "\x0418"),
219− ("Idot", "\x0130"),
220− ("Ifr", "\x2111"),
221− ("Igrav", "\x00cc"),
222− ("Igrave", "\x00cc"),
223− ("Im", "\x2111"),
224− ("Imacr", "\x012a"),
225− ("ImaginaryI", "\x2148"),
226− ("Implies", "\x21d2"),
227− ("Int", "\x222c"),
228− ("Integral", "\x222b"),
229− ("Intersection", "\x22c2"),
230− ("InvisibleComma", "\x2063"),
231− ("InvisibleTimes", "\x2062"),
232− ("Iogon", "\x012e"),
233− ("Iopf", "\x1d540"),
234− ("Iota", "\x0399"),
235− ("Iscr", "\x2110"),
236− ("Itilde", "\x0128"),
237− ("Iukcy", "\x0406"),
238− ("Ium", "\x00cf"),
239− ("Iuml", "\x00cf"),
240− ("Jcirc", "\x0134"),
241− ("Jcy", "\x0419"),
242− ("Jfr", "\x1d50d"),
243− ("Jopf", "\x1d541"),
244− ("Jscr", "\x1d4a5"),
245− ("Jsercy", "\x0408"),
246− ("Jukcy", "\x0404"),
247− ("KHcy", "\x0425"),
248− ("KJcy", "\x040c"),
249− ("Kappa", "\x039a"),
250− ("Kcedil", "\x0136"),
251− ("Kcy", "\x041a"),
252− ("Kfr", "\x1d50e"),
253− ("Kopf", "\x1d542"),
254− ("Kscr", "\x1d4a6"),
255− ("LJcy", "\x0409"),
256− ("L", "\x003c"),
257− ("LT", "\x003c"),
258− ("Lacute", "\x0139"),
259− ("Lambda", "\x039b"),
260− ("Lang", "\x27ea"),
261− ("Laplacetrf", "\x2112"),
262− ("Larr", "\x219e"),
263− ("Lcaron", "\x013d"),
264− ("Lcedil", "\x013b"),
265− ("Lcy", "\x041b"),
266− ("LeftAngleBracket", "\x27e8"),
267− ("LeftArrow", "\x2190"),
268− ("LeftArrowBar", "\x21e4"),
269− ("LeftArrowRightArrow", "\x21c6"),
270− ("LeftCeiling", "\x2308"),
271− ("LeftDoubleBracket", "\x27e6"),
272− ("LeftDownTeeVector", "\x2961"),
273− ("LeftDownVector", "\x21c3"),
274− ("LeftDownVectorBar", "\x2959"),
275− ("LeftFloor", "\x230a"),
276− ("LeftRightArrow", "\x2194"),
277− ("LeftRightVector", "\x294e"),
278− ("LeftTee", "\x22a3"),
279− ("LeftTeeArrow", "\x21a4"),
280− ("LeftTeeVector", "\x295a"),
281− ("LeftTriangle", "\x22b2"),
282− ("LeftTriangleBar", "\x29cf"),
283− ("LeftTriangleEqual", "\x22b4"),
284− ("LeftUpDownVector", "\x2951"),
285− ("LeftUpTeeVector", "\x2960"),
286− ("LeftUpVector", "\x21bf"),
287− ("LeftUpVectorBar", "\x2958"),
288− ("LeftVector", "\x21bc"),
289− ("LeftVectorBar", "\x2952"),
290− ("Leftarrow", "\x21d0"),
291− ("Leftrightarrow", "\x21d4"),
292− ("LessEqualGreater", "\x22da"),
293− ("LessFullEqual", "\x2266"),
294− ("LessGreater", "\x2276"),
295− ("LessLess", "\x2aa1"),
296− ("LessSlantEqual", "\x2a7d"),
297− ("LessTilde", "\x2272"),
298− ("Lfr", "\x1d50f"),
299− ("Ll", "\x22d8"),
300− ("Lleftarrow", "\x21da"),
301− ("Lmidot", "\x013f"),
302− ("LongLeftArrow", "\x27f5"),
303− ("LongLeftRightArrow", "\x27f7"),
304− ("LongRightArrow", "\x27f6"),
305− ("Longleftarrow", "\x27f8"),
306− ("Longleftrightarrow", "\x27fa"),
307− ("Longrightarrow", "\x27f9"),
308− ("Lopf", "\x1d543"),
309− ("LowerLeftArrow", "\x2199"),
310− ("LowerRightArrow", "\x2198"),
311− ("Lscr", "\x2112"),
312− ("Lsh", "\x21b0"),
313− ("Lstrok", "\x0141"),
314− ("Lt", "\x226a"),
315− ("Map", "\x2905"),
316− ("Mcy", "\x041c"),
317− ("MediumSpace", "\x205f"),
318− ("Mellintrf", "\x2133"),
319− ("Mfr", "\x1d510"),
320− ("MinusPlus", "\x2213"),
321− ("Mopf", "\x1d544"),
322− ("Mscr", "\x2133"),
323− ("Mu", "\x039c"),
324− ("NJcy", "\x040a"),
325− ("Nacute", "\x0143"),
326− ("Ncaron", "\x0147"),
327− ("Ncedil", "\x0145"),
328− ("Ncy", "\x041d"),
329− ("NegativeMediumSpace", "\x200b"),
330− ("NegativeThickSpace", "\x200b"),
331− ("NegativeThinSpace", "\x200b"),
332− ("NegativeVeryThinSpace", "\x200b"),
333− ("NestedGreaterGreater", "\x226b"),
334− ("NestedLessLess", "\x226a"),
335− ("NewLine", "\x000a"),
336− ("Nfr", "\x1d511"),
337− ("NoBreak", "\x2060"),
338− ("NonBreakingSpace", "\x00a0"),
339− ("Nopf", "\x2115"),
340− ("Not", "\x2aec"),
341− ("NotCongruent", "\x2262"),
342− ("NotCupCap", "\x226d"),
343− ("NotDoubleVerticalBar", "\x2226"),
344− ("NotElement", "\x2209"),
345− ("NotEqual", "\x2260"),
346− ("NotEqualTilde", "\x2242\x0338"),
347− ("NotExists", "\x2204"),
348− ("NotGreater", "\x226f"),
349− ("NotGreaterEqual", "\x2271"),
350− ("NotGreaterFullEqual", "\x2267\x0338"),
351− ("NotGreaterGreater", "\x226b\x0338"),
352− ("NotGreaterLess", "\x2279"),
353− ("NotGreaterSlantEqual", "\x2a7e\x0338"),
354− ("NotGreaterTilde", "\x2275"),
355− ("NotHumpDownHump", "\x224e\x0338"),
356− ("NotHumpEqual", "\x224f\x0338"),
357− ("NotLeftTriangle", "\x22ea"),
358− ("NotLeftTriangleBar", "\x29cf\x0338"),
359− ("NotLeftTriangleEqual", "\x22ec"),
360− ("NotLess", "\x226e"),
361− ("NotLessEqual", "\x2270"),
362− ("NotLessGreater", "\x2278"),
363− ("NotLessLess", "\x226a\x0338"),
364− ("NotLessSlantEqual", "\x2a7d\x0338"),
365− ("NotLessTilde", "\x2274"),
366− ("NotNestedGreaterGreater", "\x2aa2\x0338"),
367− ("NotNestedLessLess", "\x2aa1\x0338"),
368− ("NotPrecedes", "\x2280"),
369− ("NotPrecedesEqual", "\x2aaf\x0338"),
370− ("NotPrecedesSlantEqual", "\x22e0"),
371− ("NotReverseElement", "\x220c"),
372− ("NotRightTriangle", "\x22eb"),
373− ("NotRightTriangleBar", "\x29d0\x0338"),
374− ("NotRightTriangleEqual", "\x22ed"),
375− ("NotSquareSubset", "\x228f\x0338"),
376− ("NotSquareSubsetEqual", "\x22e2"),
377− ("NotSquareSuperset", "\x2290\x0338"),
378− ("NotSquareSupersetEqual", "\x22e3"),
379− ("NotSubset", "\x2282\x20d2"),
380− ("NotSubsetEqual", "\x2288"),
381− ("NotSucceeds", "\x2281"),
382− ("NotSucceedsEqual", "\x2ab0\x0338"),
383− ("NotSucceedsSlantEqual", "\x22e1"),
384− ("NotSucceedsTilde", "\x227f\x0338"),
385− ("NotSuperset", "\x2283\x20d2"),
386− ("NotSupersetEqual", "\x2289"),
387− ("NotTilde", "\x2241"),
388− ("NotTildeEqual", "\x2244"),
389− ("NotTildeFullEqual", "\x2247"),
390− ("NotTildeTilde", "\x2249"),
391− ("NotVerticalBar", "\x2224"),
392− ("Nscr", "\x1d4a9"),
393− ("Ntild", "\x00d1"),
394− ("Ntilde", "\x00d1"),
395− ("Nu", "\x039d"),
396− ("OElig", "\x0152"),
397− ("Oacut", "\x00d3"),
398− ("Oacute", "\x00d3"),
399− ("Ocir", "\x00d4"),
400− ("Ocirc", "\x00d4"),
401− ("Ocy", "\x041e"),
402− ("Odblac", "\x0150"),
403− ("Ofr", "\x1d512"),
404− ("Ograv", "\x00d2"),
405− ("Ograve", "\x00d2"),
406− ("Omacr", "\x014c"),
407− ("Omega", "\x03a9"),
408− ("Omicron", "\x039f"),
409− ("Oopf", "\x1d546"),
410− ("OpenCurlyDoubleQuote", "\x201c"),
411− ("OpenCurlyQuote", "\x2018"),
412− ("Or", "\x2a54"),
413− ("Oscr", "\x1d4aa"),
414− ("Oslas", "\x00d8"),
415− ("Oslash", "\x00d8"),
416− ("Otild", "\x00d5"),
417− ("Otilde", "\x00d5"),
418− ("Otimes", "\x2a37"),
419− ("Oum", "\x00d6"),
420− ("Ouml", "\x00d6"),
421− ("OverBar", "\x203e"),
422− ("OverBrace", "\x23de"),
423− ("OverBracket", "\x23b4"),
424− ("OverParenthesis", "\x23dc"),
425− ("PartialD", "\x2202"),
426− ("Pcy", "\x041f"),
427− ("Pfr", "\x1d513"),
428− ("Phi", "\x03a6"),
429− ("Pi", "\x03a0"),
430− ("PlusMinus", "\x00b1"),
431− ("Poincareplane", "\x210c"),
432− ("Popf", "\x2119"),
433− ("Pr", "\x2abb"),
434− ("Precedes", "\x227a"),
435− ("PrecedesEqual", "\x2aaf"),
436− ("PrecedesSlantEqual", "\x227c"),
437− ("PrecedesTilde", "\x227e"),
438− ("Prime", "\x2033"),
439− ("Product", "\x220f"),
440− ("Proportion", "\x2237"),
441− ("Proportional", "\x221d"),
442− ("Pscr", "\x1d4ab"),
443− ("Psi", "\x03a8"),
444− ("QUO", "\x0022"),
445− ("QUOT", "\x0022"),
446− ("Qfr", "\x1d514"),
447− ("Qopf", "\x211a"),
448− ("Qscr", "\x1d4ac"),
449− ("RBarr", "\x2910"),
450− ("RE", "\x00ae"),
451− ("REG", "\x00ae"),
452− ("Racute", "\x0154"),
453− ("Rang", "\x27eb"),
454− ("Rarr", "\x21a0"),
455− ("Rarrtl", "\x2916"),
456− ("Rcaron", "\x0158"),
457− ("Rcedil", "\x0156"),
458− ("Rcy", "\x0420"),
459− ("Re", "\x211c"),
460− ("ReverseElement", "\x220b"),
461− ("ReverseEquilibrium", "\x21cb"),
462− ("ReverseUpEquilibrium", "\x296f"),
463− ("Rfr", "\x211c"),
464− ("Rho", "\x03a1"),
465− ("RightAngleBracket", "\x27e9"),
466− ("RightArrow", "\x2192"),
467− ("RightArrowBar", "\x21e5"),
468− ("RightArrowLeftArrow", "\x21c4"),
469− ("RightCeiling", "\x2309"),
470− ("RightDoubleBracket", "\x27e7"),
471− ("RightDownTeeVector", "\x295d"),
472− ("RightDownVector", "\x21c2"),
473− ("RightDownVectorBar", "\x2955"),
474− ("RightFloor", "\x230b"),
475− ("RightTee", "\x22a2"),
476− ("RightTeeArrow", "\x21a6"),
477− ("RightTeeVector", "\x295b"),
478− ("RightTriangle", "\x22b3"),
479− ("RightTriangleBar", "\x29d0"),
480− ("RightTriangleEqual", "\x22b5"),
481− ("RightUpDownVector", "\x294f"),
482− ("RightUpTeeVector", "\x295c"),
483− ("RightUpVector", "\x21be"),
484− ("RightUpVectorBar", "\x2954"),
485− ("RightVector", "\x21c0"),
486− ("RightVectorBar", "\x2953"),
487− ("Rightarrow", "\x21d2"),
488− ("Ropf", "\x211d"),
489− ("RoundImplies", "\x2970"),
490− ("Rrightarrow", "\x21db"),
491− ("Rscr", "\x211b"),
492− ("Rsh", "\x21b1"),
493− ("RuleDelayed", "\x29f4"),
494− ("SHCHcy", "\x0429"),
495− ("SHcy", "\x0428"),
496− ("SOFTcy", "\x042c"),
497− ("Sacute", "\x015a"),
498− ("Sc", "\x2abc"),
499− ("Scaron", "\x0160"),
500− ("Scedil", "\x015e"),
501− ("Scirc", "\x015c"),
502− ("Scy", "\x0421"),
503− ("Sfr", "\x1d516"),
504− ("ShortDownArrow", "\x2193"),
505− ("ShortLeftArrow", "\x2190"),
506− ("ShortRightArrow", "\x2192"),
507− ("ShortUpArrow", "\x2191"),
508− ("Sigma", "\x03a3"),
509− ("SmallCircle", "\x2218"),
510− ("Sopf", "\x1d54a"),
511− ("Sqrt", "\x221a"),
512− ("Square", "\x25a1"),
513− ("SquareIntersection", "\x2293"),
514− ("SquareSubset", "\x228f"),
515− ("SquareSubsetEqual", "\x2291"),
516− ("SquareSuperset", "\x2290"),
517− ("SquareSupersetEqual", "\x2292"),
518− ("SquareUnion", "\x2294"),
519− ("Sscr", "\x1d4ae"),
520− ("Star", "\x22c6"),
521− ("Sub", "\x22d0"),
522− ("Subset", "\x22d0"),
523− ("SubsetEqual", "\x2286"),
524− ("Succeeds", "\x227b"),
525− ("SucceedsEqual", "\x2ab0"),
526− ("SucceedsSlantEqual", "\x227d"),
527− ("SucceedsTilde", "\x227f"),
528− ("SuchThat", "\x220b"),
529− ("Sum", "\x2211"),
530− ("Sup", "\x22d1"),
531− ("Superset", "\x2283"),
532− ("SupersetEqual", "\x2287"),
533− ("Supset", "\x22d1"),
534− ("THOR", "\x00de"),
535− ("THORN", "\x00de"),
536− ("TRADE", "\x2122"),
537− ("TSHcy", "\x040b"),
538− ("TScy", "\x0426"),
539− ("Tab", "\x0009"),
540− ("Tau", "\x03a4"),
541− ("Tcaron", "\x0164"),
542− ("Tcedil", "\x0162"),
543− ("Tcy", "\x0422"),
544− ("Tfr", "\x1d517"),
545− ("Therefore", "\x2234"),
546− ("Theta", "\x0398"),
547− ("ThickSpace", "\x205f\x200a"),
548− ("ThinSpace", "\x2009"),
549− ("Tilde", "\x223c"),
550− ("TildeEqual", "\x2243"),
551− ("TildeFullEqual", "\x2245"),
552− ("TildeTilde", "\x2248"),
553− ("Topf", "\x1d54b"),
554− ("TripleDot", "\x20db"),
555− ("Tscr", "\x1d4af"),
556− ("Tstrok", "\x0166"),
557− ("Uacut", "\x00da"),
558− ("Uacute", "\x00da"),
559− ("Uarr", "\x219f"),
560− ("Uarrocir", "\x2949"),
561− ("Ubrcy", "\x040e"),
562− ("Ubreve", "\x016c"),
563− ("Ucir", "\x00db"),
564− ("Ucirc", "\x00db"),
565− ("Ucy", "\x0423"),
566− ("Udblac", "\x0170"),
567− ("Ufr", "\x1d518"),
568− ("Ugrav", "\x00d9"),
569− ("Ugrave", "\x00d9"),
570− ("Umacr", "\x016a"),
571− ("UnderBar", "\x005f"),
572− ("UnderBrace", "\x23df"),
573− ("UnderBracket", "\x23b5"),
574− ("UnderParenthesis", "\x23dd"),
575− ("Union", "\x22c3"),
576− ("UnionPlus", "\x228e"),
577− ("Uogon", "\x0172"),
578− ("Uopf", "\x1d54c"),
579− ("UpArrow", "\x2191"),
580− ("UpArrowBar", "\x2912"),
581− ("UpArrowDownArrow", "\x21c5"),
582− ("UpDownArrow", "\x2195"),
583− ("UpEquilibrium", "\x296e"),
584− ("UpTee", "\x22a5"),
585− ("UpTeeArrow", "\x21a5"),
586− ("Uparrow", "\x21d1"),
587− ("Updownarrow", "\x21d5"),
588− ("UpperLeftArrow", "\x2196"),
589− ("UpperRightArrow", "\x2197"),
590− ("Upsi", "\x03d2"),
591− ("Upsilon", "\x03a5"),
592− ("Uring", "\x016e"),
593− ("Uscr", "\x1d4b0"),
594− ("Utilde", "\x0168"),
595− ("Uum", "\x00dc"),
596− ("Uuml", "\x00dc"),
597− ("VDash", "\x22ab"),
598− ("Vbar", "\x2aeb"),
599− ("Vcy", "\x0412"),
600− ("Vdash", "\x22a9"),
601− ("Vdashl", "\x2ae6"),
602− ("Vee", "\x22c1"),
603− ("Verbar", "\x2016"),
604− ("Vert", "\x2016"),
605− ("VerticalBar", "\x2223"),
606− ("VerticalLine", "\x007c"),
607− ("VerticalSeparator", "\x2758"),
608− ("VerticalTilde", "\x2240"),
609− ("VeryThinSpace", "\x200a"),
610− ("Vfr", "\x1d519"),
611− ("Vopf", "\x1d54d"),
612− ("Vscr", "\x1d4b1"),
613− ("Vvdash", "\x22aa"),
614− ("Wcirc", "\x0174"),
615− ("Wedge", "\x22c0"),
616− ("Wfr", "\x1d51a"),
617− ("Wopf", "\x1d54e"),
618− ("Wscr", "\x1d4b2"),
619− ("Xfr", "\x1d51b"),
620− ("Xi", "\x039e"),
621− ("Xopf", "\x1d54f"),
622− ("Xscr", "\x1d4b3"),
623− ("YAcy", "\x042f"),
624− ("YIcy", "\x0407"),
625− ("YUcy", "\x042e"),
626− ("Yacut", "\x00dd"),
627− ("Yacute", "\x00dd"),
628− ("Ycirc", "\x0176"),
629− ("Ycy", "\x042b"),
630− ("Yfr", "\x1d51c"),
631− ("Yopf", "\x1d550"),
632− ("Yscr", "\x1d4b4"),
633− ("Yuml", "\x0178"),
634− ("ZHcy", "\x0416"),
635− ("Zacute", "\x0179"),
636− ("Zcaron", "\x017d"),
637− ("Zcy", "\x0417"),
638− ("Zdot", "\x017b"),
639− ("ZeroWidthSpace", "\x200b"),
640− ("Zeta", "\x0396"),
641− ("Zfr", "\x2128"),
642− ("Zopf", "\x2124"),
643− ("Zscr", "\x1d4b5"),
644− ("aacut", "\x00e1"),
645− ("aacute", "\x00e1"),
646− ("abreve", "\x0103"),
647− ("ac", "\x223e"),
648− ("acE", "\x223e\x0333"),
649− ("acd", "\x223f"),
650− ("acir", "\x00e2"),
651− ("acirc", "\x00e2"),
652− ("acut", "\x00b4"),
653− ("acute", "\x00b4"),
654− ("acy", "\x0430"),
655− ("aeli", "\x00e6"),
656− ("aelig", "\x00e6"),
657− ("af", "\x2061"),
658− ("afr", "\x1d51e"),
659− ("agrav", "\x00e0"),
660− ("agrave", "\x00e0"),
661− ("alefsym", "\x2135"),
662− ("aleph", "\x2135"),
663− ("alpha", "\x03b1"),
664− ("amacr", "\x0101"),
665− ("amalg", "\x2a3f"),
666− ("am", "\x0026"),
667− ("amp", "\x0026"),
668− ("and", "\x2227"),
669− ("andand", "\x2a55"),
670− ("andd", "\x2a5c"),
671− ("andslope", "\x2a58"),
672− ("andv", "\x2a5a"),
673− ("ang", "\x2220"),
674− ("ange", "\x29a4"),
675− ("angle", "\x2220"),
676− ("angmsd", "\x2221"),
677− ("angmsdaa", "\x29a8"),
678− ("angmsdab", "\x29a9"),
679− ("angmsdac", "\x29aa"),
680− ("angmsdad", "\x29ab"),
681− ("angmsdae", "\x29ac"),
682− ("angmsdaf", "\x29ad"),
683− ("angmsdag", "\x29ae"),
684− ("angmsdah", "\x29af"),
685− ("angrt", "\x221f"),
686− ("angrtvb", "\x22be"),
687− ("angrtvbd", "\x299d"),
688− ("angsph", "\x2222"),
689− ("angst", "\x00c5"),
690− ("angzarr", "\x237c"),
691− ("aogon", "\x0105"),
692− ("aopf", "\x1d552"),
693− ("ap", "\x2248"),
694− ("apE", "\x2a70"),
695− ("apacir", "\x2a6f"),
696− ("ape", "\x224a"),
697− ("apid", "\x224b"),
698− ("apos", "\x0027"),
699− ("approx", "\x2248"),
700− ("approxeq", "\x224a"),
701− ("arin", "\x00e5"),
702− ("aring", "\x00e5"),
703− ("ascr", "\x1d4b6"),
704− ("ast", "\x002a"),
705− ("asymp", "\x2248"),
706− ("asympeq", "\x224d"),
707− ("atild", "\x00e3"),
708− ("atilde", "\x00e3"),
709− ("aum", "\x00e4"),
710− ("auml", "\x00e4"),
711− ("awconint", "\x2233"),
712− ("awint", "\x2a11"),
713− ("bNot", "\x2aed"),
714− ("backcong", "\x224c"),
715− ("backepsilon", "\x03f6"),
716− ("backprime", "\x2035"),
717− ("backsim", "\x223d"),
718− ("backsimeq", "\x22cd"),
719− ("barvee", "\x22bd"),
720− ("barwed", "\x2305"),
721− ("barwedge", "\x2305"),
722− ("bbrk", "\x23b5"),
723− ("bbrktbrk", "\x23b6"),
724− ("bcong", "\x224c"),
725− ("bcy", "\x0431"),
726− ("bdquo", "\x201e"),
727− ("becaus", "\x2235"),
728− ("because", "\x2235"),
729− ("bemptyv", "\x29b0"),
730− ("bepsi", "\x03f6"),
731− ("bernou", "\x212c"),
732− ("beta", "\x03b2"),
733− ("beth", "\x2136"),
734− ("between", "\x226c"),
735− ("bfr", "\x1d51f"),
736− ("bigcap", "\x22c2"),
737− ("bigcirc", "\x25ef"),
738− ("bigcup", "\x22c3"),
739− ("bigodot", "\x2a00"),
740− ("bigoplus", "\x2a01"),
741− ("bigotimes", "\x2a02"),
742− ("bigsqcup", "\x2a06"),
743− ("bigstar", "\x2605"),
744− ("bigtriangledown", "\x25bd"),
745− ("bigtriangleup", "\x25b3"),
746− ("biguplus", "\x2a04"),
747− ("bigvee", "\x22c1"),
748− ("bigwedge", "\x22c0"),
749− ("bkarow", "\x290d"),
750− ("blacklozenge", "\x29eb"),
751− ("blacksquare", "\x25aa"),
752− ("blacktriangle", "\x25b4"),
753− ("blacktriangledown", "\x25be"),
754− ("blacktriangleleft", "\x25c2"),
755− ("blacktriangleright", "\x25b8"),
756− ("blank", "\x2423"),
757− ("blk12", "\x2592"),
758− ("blk14", "\x2591"),
759− ("blk34", "\x2593"),
760− ("block", "\x2588"),
761− ("bne", "\x003d\x20e5"),
762− ("bnequiv", "\x2261\x20e5"),
763− ("bnot", "\x2310"),
764− ("bopf", "\x1d553"),
765− ("bot", "\x22a5"),
766− ("bottom", "\x22a5"),
767− ("bowtie", "\x22c8"),
768− ("boxDL", "\x2557"),
769− ("boxDR", "\x2554"),
770− ("boxDl", "\x2556"),
771− ("boxDr", "\x2553"),
772− ("boxH", "\x2550"),
773− ("boxHD", "\x2566"),
774− ("boxHU", "\x2569"),
775− ("boxHd", "\x2564"),
776− ("boxHu", "\x2567"),
777− ("boxUL", "\x255d"),
778− ("boxUR", "\x255a"),
779− ("boxUl", "\x255c"),
780− ("boxUr", "\x2559"),
781− ("boxV", "\x2551"),
782− ("boxVH", "\x256c"),
783− ("boxVL", "\x2563"),
784− ("boxVR", "\x2560"),
785− ("boxVh", "\x256b"),
786− ("boxVl", "\x2562"),
787− ("boxVr", "\x255f"),
788− ("boxbox", "\x29c9"),
789− ("boxdL", "\x2555"),
790− ("boxdR", "\x2552"),
791− ("boxdl", "\x2510"),
792− ("boxdr", "\x250c"),
793− ("boxh", "\x2500"),
794− ("boxhD", "\x2565"),
795− ("boxhU", "\x2568"),
796− ("boxhd", "\x252c"),
797− ("boxhu", "\x2534"),
798− ("boxminus", "\x229f"),
799− ("boxplus", "\x229e"),
800− ("boxtimes", "\x22a0"),
801− ("boxuL", "\x255b"),
802− ("boxuR", "\x2558"),
803− ("boxul", "\x2518"),
804− ("boxur", "\x2514"),
805− ("boxv", "\x2502"),
806− ("boxvH", "\x256a"),
807− ("boxvL", "\x2561"),
808− ("boxvR", "\x255e"),
809− ("boxvh", "\x253c"),
810− ("boxvl", "\x2524"),
811− ("boxvr", "\x251c"),
812− ("bprime", "\x2035"),
813− ("breve", "\x02d8"),
814− ("brvba", "\x00a6"),
815− ("brvbar", "\x00a6"),
816− ("bscr", "\x1d4b7"),
817− ("bsemi", "\x204f"),
818− ("bsim", "\x223d"),
819− ("bsime", "\x22cd"),
820− ("bsol", "\x005c"),
821− ("bsolb", "\x29c5"),
822− ("bsolhsub", "\x27c8"),
823− ("bull", "\x2022"),
824− ("bullet", "\x2022"),
825− ("bump", "\x224e"),
826− ("bumpE", "\x2aae"),
827− ("bumpe", "\x224f"),
828− ("bumpeq", "\x224f"),
829− ("cacute", "\x0107"),
830− ("cap", "\x2229"),
831− ("capand", "\x2a44"),
832− ("capbrcup", "\x2a49"),
833− ("capcap", "\x2a4b"),
834− ("capcup", "\x2a47"),
835− ("capdot", "\x2a40"),
836− ("caps", "\x2229\xfe00"),
837− ("caret", "\x2041"),
838− ("caron", "\x02c7"),
839− ("ccaps", "\x2a4d"),
840− ("ccaron", "\x010d"),
841− ("ccedi", "\x00e7"),
842− ("ccedil", "\x00e7"),
843− ("ccirc", "\x0109"),
844− ("ccups", "\x2a4c"),
845− ("ccupssm", "\x2a50"),
846− ("cdot", "\x010b"),
847− ("cedi", "\x00b8"),
848− ("cedil", "\x00b8"),
849− ("cemptyv", "\x29b2"),
850− ("cen", "\x00a2"),
851− ("cent", "\x00a2"),
852− ("centerdot", "\x00b7"),
853− ("cfr", "\x1d520"),
854− ("chcy", "\x0447"),
855− ("check", "\x2713"),
856− ("checkmark", "\x2713"),
857− ("chi", "\x03c7"),
858− ("cir", "\x25cb"),
859− ("cirE", "\x29c3"),
860− ("circ", "\x02c6"),
861− ("circeq", "\x2257"),
862− ("circlearrowleft", "\x21ba"),
863− ("circlearrowright", "\x21bb"),
864− ("circledR", "\x00ae"),
865− ("circledS", "\x24c8"),
866− ("circledast", "\x229b"),
867− ("circledcirc", "\x229a"),
868− ("circleddash", "\x229d"),
869− ("cire", "\x2257"),
870− ("cirfnint", "\x2a10"),
871− ("cirmid", "\x2aef"),
872− ("cirscir", "\x29c2"),
873− ("clubs", "\x2663"),
874− ("clubsuit", "\x2663"),
875− ("colon", "\x003a"),
876− ("colone", "\x2254"),
877− ("coloneq", "\x2254"),
878− ("comma", "\x002c"),
879− ("commat", "\x0040"),
880− ("comp", "\x2201"),
881− ("compfn", "\x2218"),
882− ("complement", "\x2201"),
883− ("complexes", "\x2102"),
884− ("cong", "\x2245"),
885− ("congdot", "\x2a6d"),
886− ("conint", "\x222e"),
887− ("copf", "\x1d554"),
888− ("coprod", "\x2210"),
889− ("cop", "\x00a9"),
890− ("copy", "\x00a9"),
891− ("copysr", "\x2117"),
892− ("crarr", "\x21b5"),
893− ("cross", "\x2717"),
894− ("cscr", "\x1d4b8"),
895− ("csub", "\x2acf"),
896− ("csube", "\x2ad1"),
897− ("csup", "\x2ad0"),
898− ("csupe", "\x2ad2"),
899− ("ctdot", "\x22ef"),
900− ("cudarrl", "\x2938"),
901− ("cudarrr", "\x2935"),
902− ("cuepr", "\x22de"),
903− ("cuesc", "\x22df"),
904− ("cularr", "\x21b6"),
905− ("cularrp", "\x293d"),
906− ("cup", "\x222a"),
907− ("cupbrcap", "\x2a48"),
908− ("cupcap", "\x2a46"),
909− ("cupcup", "\x2a4a"),
910− ("cupdot", "\x228d"),
911− ("cupor", "\x2a45"),
912− ("cups", "\x222a\xfe00"),
913− ("curarr", "\x21b7"),
914− ("curarrm", "\x293c"),
915− ("curlyeqprec", "\x22de"),
916− ("curlyeqsucc", "\x22df"),
917− ("curlyvee", "\x22ce"),
918− ("curlywedge", "\x22cf"),
919− ("curre", "\x00a4"),
920− ("curren", "\x00a4"),
921− ("curvearrowleft", "\x21b6"),
922− ("curvearrowright", "\x21b7"),
923− ("cuvee", "\x22ce"),
924− ("cuwed", "\x22cf"),
925− ("cwconint", "\x2232"),
926− ("cwint", "\x2231"),
927− ("cylcty", "\x232d"),
928− ("dArr", "\x21d3"),
929− ("dHar", "\x2965"),
930− ("dagger", "\x2020"),
931− ("daleth", "\x2138"),
932− ("darr", "\x2193"),
933− ("dash", "\x2010"),
934− ("dashv", "\x22a3"),
935− ("dbkarow", "\x290f"),
936− ("dblac", "\x02dd"),
937− ("dcaron", "\x010f"),
938− ("dcy", "\x0434"),
939− ("dd", "\x2146"),
940− ("ddagger", "\x2021"),
941− ("ddarr", "\x21ca"),
942− ("ddotseq", "\x2a77"),
943− ("de", "\x00b0"),
944− ("deg", "\x00b0"),
945− ("delta", "\x03b4"),
946− ("demptyv", "\x29b1"),
947− ("dfisht", "\x297f"),
948− ("dfr", "\x1d521"),
949− ("dharl", "\x21c3"),
950− ("dharr", "\x21c2"),
951− ("diam", "\x22c4"),
952− ("diamond", "\x22c4"),
953− ("diamondsuit", "\x2666"),
954− ("diams", "\x2666"),
955− ("die", "\x00a8"),
956− ("digamma", "\x03dd"),
957− ("disin", "\x22f2"),
958− ("div", "\x00f7"),
959− ("divid", "\x00f7"),
960− ("divide", "\x00f7"),
961− ("divideontimes", "\x22c7"),
962− ("divonx", "\x22c7"),
963− ("djcy", "\x0452"),
964− ("dlcorn", "\x231e"),
965− ("dlcrop", "\x230d"),
966− ("dollar", "\x0024"),
967− ("dopf", "\x1d555"),
968− ("dot", "\x02d9"),
969− ("doteq", "\x2250"),
970− ("doteqdot", "\x2251"),
971− ("dotminus", "\x2238"),
972− ("dotplus", "\x2214"),
973− ("dotsquare", "\x22a1"),
974− ("doublebarwedge", "\x2306"),
975− ("downarrow", "\x2193"),
976− ("downdownarrows", "\x21ca"),
977− ("downharpoonleft", "\x21c3"),
978− ("downharpoonright", "\x21c2"),
979− ("drbkarow", "\x2910"),
980− ("drcorn", "\x231f"),
981− ("drcrop", "\x230c"),
982− ("dscr", "\x1d4b9"),
983− ("dscy", "\x0455"),
984− ("dsol", "\x29f6"),
985− ("dstrok", "\x0111"),
986− ("dtdot", "\x22f1"),
987− ("dtri", "\x25bf"),
988− ("dtrif", "\x25be"),
989− ("duarr", "\x21f5"),
990− ("duhar", "\x296f"),
991− ("dwangle", "\x29a6"),
992− ("dzcy", "\x045f"),
993− ("dzigrarr", "\x27ff"),
994− ("eDDot", "\x2a77"),
995− ("eDot", "\x2251"),
996− ("eacut", "\x00e9"),
997− ("eacute", "\x00e9"),
998− ("easter", "\x2a6e"),
999− ("ecaron", "\x011b"),
1000− ("ecir", "\x2256"),
1001− ("ecir", "\x00ea"),
1002− ("ecirc", "\x00ea"),
1003− ("ecolon", "\x2255"),
1004− ("ecy", "\x044d"),
1005− ("edot", "\x0117"),
1006− ("ee", "\x2147"),
1007− ("efDot", "\x2252"),
1008− ("efr", "\x1d522"),
1009− ("eg", "\x2a9a"),
1010− ("egrav", "\x00e8"),
1011− ("egrave", "\x00e8"),
1012− ("egs", "\x2a96"),
1013− ("egsdot", "\x2a98"),
1014− ("el", "\x2a99"),
1015− ("elinters", "\x23e7"),
1016− ("ell", "\x2113"),
1017− ("els", "\x2a95"),
1018− ("elsdot", "\x2a97"),
1019− ("emacr", "\x0113"),
1020− ("empty", "\x2205"),
1021− ("emptyset", "\x2205"),
1022− ("emptyv", "\x2205"),
1023− ("emsp13", "\x2004"),
1024− ("emsp14", "\x2005"),
1025− ("emsp", "\x2003"),
1026− ("eng", "\x014b"),
1027− ("ensp", "\x2002"),
1028− ("eogon", "\x0119"),
1029− ("eopf", "\x1d556"),
1030− ("epar", "\x22d5"),
1031− ("eparsl", "\x29e3"),
1032− ("eplus", "\x2a71"),
1033− ("epsi", "\x03b5"),
1034− ("epsilon", "\x03b5"),
1035− ("epsiv", "\x03f5"),
1036− ("eqcirc", "\x2256"),
1037− ("eqcolon", "\x2255"),
1038− ("eqsim", "\x2242"),
1039− ("eqslantgtr", "\x2a96"),
1040− ("eqslantless", "\x2a95"),
1041− ("equals", "\x003d"),
1042− ("equest", "\x225f"),
1043− ("equiv", "\x2261"),
1044− ("equivDD", "\x2a78"),
1045− ("eqvparsl", "\x29e5"),
1046− ("erDot", "\x2253"),
1047− ("erarr", "\x2971"),
1048− ("escr", "\x212f"),
1049− ("esdot", "\x2250"),
1050− ("esim", "\x2242"),
1051− ("eta", "\x03b7"),
1052− ("et", "\x00f0"),
1053− ("eth", "\x00f0"),
1054− ("eum", "\x00eb"),
1055− ("euml", "\x00eb"),
1056− ("euro", "\x20ac"),
1057− ("excl", "\x0021"),
1058− ("exist", "\x2203"),
1059− ("expectation", "\x2130"),
1060− ("exponentiale", "\x2147"),
1061− ("fallingdotseq", "\x2252"),
1062− ("fcy", "\x0444"),
1063− ("female", "\x2640"),
1064− ("ffilig", "\xfb03"),
1065− ("fflig", "\xfb00"),
1066− ("ffllig", "\xfb04"),
1067− ("ffr", "\x1d523"),
1068− ("filig", "\xfb01"),
1069− ("fjlig", "\x0066\x006a"),
1070− ("flat", "\x266d"),
1071− ("fllig", "\xfb02"),
1072− ("fltns", "\x25b1"),
1073− ("fnof", "\x0192"),
1074− ("fopf", "\x1d557"),
1075− ("forall", "\x2200"),
1076− ("fork", "\x22d4"),
1077− ("forkv", "\x2ad9"),
1078− ("fpartint", "\x2a0d"),
1079− ("frac1", "\x00bd"),
1080− ("frac12", "\x00bd"),
1081− ("frac13", "\x2153"),
1082− ("frac1", "\x00bc"),
1083− ("frac14", "\x00bc"),
1084− ("frac15", "\x2155"),
1085− ("frac16", "\x2159"),
1086− ("frac18", "\x215b"),
1087− ("frac23", "\x2154"),
1088− ("frac25", "\x2156"),
1089− ("frac3", "\x00be"),
1090− ("frac34", "\x00be"),
1091− ("frac35", "\x2157"),
1092− ("frac38", "\x215c"),
1093− ("frac45", "\x2158"),
1094− ("frac56", "\x215a"),
1095− ("frac58", "\x215d"),
1096− ("frac78", "\x215e"),
1097− ("frasl", "\x2044"),
1098− ("frown", "\x2322"),
1099− ("fscr", "\x1d4bb"),
1100− ("gE", "\x2267"),
1101− ("gEl", "\x2a8c"),
1102− ("gacute", "\x01f5"),
1103− ("gamma", "\x03b3"),
1104− ("gammad", "\x03dd"),
1105− ("gap", "\x2a86"),
1106− ("gbreve", "\x011f"),
1107− ("gcirc", "\x011d"),
1108− ("gcy", "\x0433"),
1109− ("gdot", "\x0121"),
1110− ("ge", "\x2265"),
1111− ("gel", "\x22db"),
1112− ("geq", "\x2265"),
1113− ("geqq", "\x2267"),
1114− ("geqslant", "\x2a7e"),
1115− ("ges", "\x2a7e"),
1116− ("gescc", "\x2aa9"),
1117− ("gesdot", "\x2a80"),
1118− ("gesdoto", "\x2a82"),
1119− ("gesdotol", "\x2a84"),
1120− ("gesl", "\x22db\xfe00"),
1121− ("gesles", "\x2a94"),
1122− ("gfr", "\x1d524"),
1123− ("gg", "\x226b"),
1124− ("ggg", "\x22d9"),
1125− ("gimel", "\x2137"),
1126− ("gjcy", "\x0453"),
1127− ("gl", "\x2277"),
1128− ("glE", "\x2a92"),
1129− ("gla", "\x2aa5"),
1130− ("glj", "\x2aa4"),
1131− ("gnE", "\x2269"),
1132− ("gnap", "\x2a8a"),
1133− ("gnapprox", "\x2a8a"),
1134− ("gne", "\x2a88"),
1135− ("gneq", "\x2a88"),
1136− ("gneqq", "\x2269"),
1137− ("gnsim", "\x22e7"),
1138− ("gopf", "\x1d558"),
1139− ("grave", "\x0060"),
1140− ("gscr", "\x210a"),
1141− ("gsim", "\x2273"),
1142− ("gsime", "\x2a8e"),
1143− ("gsiml", "\x2a90"),
1144− ("g", "\x003e"),
1145− ("gt", "\x003e"),
1146− ("gtcc", "\x2aa7"),
1147− ("gtcir", "\x2a7a"),
1148− ("gtdot", "\x22d7"),
1149− ("gtlPar", "\x2995"),
1150− ("gtquest", "\x2a7c"),
1151− ("gtrapprox", "\x2a86"),
1152− ("gtrarr", "\x2978"),
1153− ("gtrdot", "\x22d7"),
1154− ("gtreqless", "\x22db"),
1155− ("gtreqqless", "\x2a8c"),
1156− ("gtrless", "\x2277"),
1157− ("gtrsim", "\x2273"),
1158− ("gvertneqq", "\x2269\xfe00"),
1159− ("gvnE", "\x2269\xfe00"),
1160− ("hArr", "\x21d4"),
1161− ("hairsp", "\x200a"),
1162− ("half", "\x00bd"),
1163− ("hamilt", "\x210b"),
1164− ("hardcy", "\x044a"),
1165− ("harr", "\x2194"),
1166− ("harrcir", "\x2948"),
1167− ("harrw", "\x21ad"),
1168− ("hbar", "\x210f"),
1169− ("hcirc", "\x0125"),
1170− ("hearts", "\x2665"),
1171− ("heartsuit", "\x2665"),
1172− ("hellip", "\x2026"),
1173− ("hercon", "\x22b9"),
1174− ("hfr", "\x1d525"),
1175− ("hksearow", "\x2925"),
1176− ("hkswarow", "\x2926"),
1177− ("hoarr", "\x21ff"),
1178− ("homtht", "\x223b"),
1179− ("hookleftarrow", "\x21a9"),
1180− ("hookrightarrow", "\x21aa"),
1181− ("hopf", "\x1d559"),
1182− ("horbar", "\x2015"),
1183− ("hscr", "\x1d4bd"),
1184− ("hslash", "\x210f"),
1185− ("hstrok", "\x0127"),
1186− ("hybull", "\x2043"),
1187− ("hyphen", "\x2010"),
1188− ("iacut", "\x00ed"),
1189− ("iacute", "\x00ed"),
1190− ("ic", "\x2063"),
1191− ("icir", "\x00ee"),
1192− ("icirc", "\x00ee"),
1193− ("icy", "\x0438"),
1194− ("iecy", "\x0435"),
1195− ("iexc", "\x00a1"),
1196− ("iexcl", "\x00a1"),
1197− ("iff", "\x21d4"),
1198− ("ifr", "\x1d526"),
1199− ("igrav", "\x00ec"),
1200− ("igrave", "\x00ec"),
1201− ("ii", "\x2148"),
1202− ("iiiint", "\x2a0c"),
1203− ("iiint", "\x222d"),
1204− ("iinfin", "\x29dc"),
1205− ("iiota", "\x2129"),
1206− ("ijlig", "\x0133"),
1207− ("imacr", "\x012b"),
1208− ("image", "\x2111"),
1209− ("imagline", "\x2110"),
1210− ("imagpart", "\x2111"),
1211− ("imath", "\x0131"),
1212− ("imof", "\x22b7"),
1213− ("imped", "\x01b5"),
1214− ("in", "\x2208"),
1215− ("incare", "\x2105"),
1216− ("infin", "\x221e"),
1217− ("infintie", "\x29dd"),
1218− ("inodot", "\x0131"),
1219− ("int", "\x222b"),
1220− ("intcal", "\x22ba"),
1221− ("integers", "\x2124"),
1222− ("intercal", "\x22ba"),
1223− ("intlarhk", "\x2a17"),
1224− ("intprod", "\x2a3c"),
1225− ("iocy", "\x0451"),
1226− ("iogon", "\x012f"),
1227− ("iopf", "\x1d55a"),
1228− ("iota", "\x03b9"),
1229− ("iprod", "\x2a3c"),
1230− ("iques", "\x00bf"),
1231− ("iquest", "\x00bf"),
1232− ("iscr", "\x1d4be"),
1233− ("isin", "\x2208"),
1234− ("isinE", "\x22f9"),
1235− ("isindot", "\x22f5"),
1236− ("isins", "\x22f4"),
1237− ("isinsv", "\x22f3"),
1238− ("isinv", "\x2208"),
1239− ("it", "\x2062"),
1240− ("itilde", "\x0129"),
1241− ("iukcy", "\x0456"),
1242− ("ium", "\x00ef"),
1243− ("iuml", "\x00ef"),
1244− ("jcirc", "\x0135"),
1245− ("jcy", "\x0439"),
1246− ("jfr", "\x1d527"),
1247− ("jmath", "\x0237"),
1248− ("jopf", "\x1d55b"),
1249− ("jscr", "\x1d4bf"),
1250− ("jsercy", "\x0458"),
1251− ("jukcy", "\x0454"),
1252− ("kappa", "\x03ba"),
1253− ("kappav", "\x03f0"),
1254− ("kcedil", "\x0137"),
1255− ("kcy", "\x043a"),
1256− ("kfr", "\x1d528"),
1257− ("kgreen", "\x0138"),
1258− ("khcy", "\x0445"),
1259− ("kjcy", "\x045c"),
1260− ("kopf", "\x1d55c"),
1261− ("kscr", "\x1d4c0"),
1262− ("lAarr", "\x21da"),
1263− ("lArr", "\x21d0"),
1264− ("lAtail", "\x291b"),
1265− ("lBarr", "\x290e"),
1266− ("lE", "\x2266"),
1267− ("lEg", "\x2a8b"),
1268− ("lHar", "\x2962"),
1269− ("lacute", "\x013a"),
1270− ("laemptyv", "\x29b4"),
1271− ("lagran", "\x2112"),
1272− ("lambda", "\x03bb"),
1273− ("lang", "\x27e8"),
1274− ("langd", "\x2991"),
1275− ("langle", "\x27e8"),
1276− ("lap", "\x2a85"),
1277− ("laqu", "\x00ab"),
1278− ("laquo", "\x00ab"),
1279− ("larr", "\x2190"),
1280− ("larrb", "\x21e4"),
1281− ("larrbfs", "\x291f"),
1282− ("larrfs", "\x291d"),
1283− ("larrhk", "\x21a9"),
1284− ("larrlp", "\x21ab"),
1285− ("larrpl", "\x2939"),
1286− ("larrsim", "\x2973"),
1287− ("larrtl", "\x21a2"),
1288− ("lat", "\x2aab"),
1289− ("latail", "\x2919"),
1290− ("late", "\x2aad"),
1291− ("lates", "\x2aad\xfe00"),
1292− ("lbarr", "\x290c"),
1293− ("lbbrk", "\x2772"),
1294− ("lbrace", "\x007b"),
1295− ("lbrack", "\x005b"),
1296− ("lbrke", "\x298b"),
1297− ("lbrksld", "\x298f"),
1298− ("lbrkslu", "\x298d"),
1299− ("lcaron", "\x013e"),
1300− ("lcedil", "\x013c"),
1301− ("lceil", "\x2308"),
1302− ("lcub", "\x007b"),
1303− ("lcy", "\x043b"),
1304− ("ldca", "\x2936"),
1305− ("ldquo", "\x201c"),
1306− ("ldquor", "\x201e"),
1307− ("ldrdhar", "\x2967"),
1308− ("ldrushar", "\x294b"),
1309− ("ldsh", "\x21b2"),
1310− ("le", "\x2264"),
1311− ("leftarrow", "\x2190"),
1312− ("leftarrowtail", "\x21a2"),
1313− ("leftharpoondown", "\x21bd"),
1314− ("leftharpoonup", "\x21bc"),
1315− ("leftleftarrows", "\x21c7"),
1316− ("leftrightarrow", "\x2194"),
1317− ("leftrightarrows", "\x21c6"),
1318− ("leftrightharpoons", "\x21cb"),
1319− ("leftrightsquigarrow", "\x21ad"),
1320− ("leftthreetimes", "\x22cb"),
1321− ("leg", "\x22da"),
1322− ("leq", "\x2264"),
1323− ("leqq", "\x2266"),
1324− ("leqslant", "\x2a7d"),
1325− ("les", "\x2a7d"),
1326− ("lescc", "\x2aa8"),
1327− ("lesdot", "\x2a7f"),
1328− ("lesdoto", "\x2a81"),
1329− ("lesdotor", "\x2a83"),
1330− ("lesg", "\x22da\xfe00"),
1331− ("lesges", "\x2a93"),
1332− ("lessapprox", "\x2a85"),
1333− ("lessdot", "\x22d6"),
1334− ("lesseqgtr", "\x22da"),
1335− ("lesseqqgtr", "\x2a8b"),
1336− ("lessgtr", "\x2276"),
1337− ("lesssim", "\x2272"),
1338− ("lfisht", "\x297c"),
1339− ("lfloor", "\x230a"),
1340− ("lfr", "\x1d529"),
1341− ("lg", "\x2276"),
1342− ("lgE", "\x2a91"),
1343− ("lhard", "\x21bd"),
1344− ("lharu", "\x21bc"),
1345− ("lharul", "\x296a"),
1346− ("lhblk", "\x2584"),
1347− ("ljcy", "\x0459"),
1348− ("ll", "\x226a"),
1349− ("llarr", "\x21c7"),
1350− ("llcorner", "\x231e"),
1351− ("llhard", "\x296b"),
1352− ("lltri", "\x25fa"),
1353− ("lmidot", "\x0140"),
1354− ("lmoust", "\x23b0"),
1355− ("lmoustache", "\x23b0"),
1356− ("lnE", "\x2268"),
1357− ("lnap", "\x2a89"),
1358− ("lnapprox", "\x2a89"),
1359− ("lne", "\x2a87"),
1360− ("lneq", "\x2a87"),
1361− ("lneqq", "\x2268"),
1362− ("lnsim", "\x22e6"),
1363− ("loang", "\x27ec"),
1364− ("loarr", "\x21fd"),
1365− ("lobrk", "\x27e6"),
1366− ("longleftarrow", "\x27f5"),
1367− ("longleftrightarrow", "\x27f7"),
1368− ("longmapsto", "\x27fc"),
1369− ("longrightarrow", "\x27f6"),
1370− ("looparrowleft", "\x21ab"),
1371− ("looparrowright", "\x21ac"),
1372− ("lopar", "\x2985"),
1373− ("lopf", "\x1d55d"),
1374− ("loplus", "\x2a2d"),
1375− ("lotimes", "\x2a34"),
1376− ("lowast", "\x2217"),
1377− ("lowbar", "\x005f"),
1378− ("loz", "\x25ca"),
1379− ("lozenge", "\x25ca"),
1380− ("lozf", "\x29eb"),
1381− ("lpar", "\x0028"),
1382− ("lparlt", "\x2993"),
1383− ("lrarr", "\x21c6"),
1384− ("lrcorner", "\x231f"),
1385− ("lrhar", "\x21cb"),
1386− ("lrhard", "\x296d"),
1387− ("lrm", "\x200e"),
1388− ("lrtri", "\x22bf"),
1389− ("lsaquo", "\x2039"),
1390− ("lscr", "\x1d4c1"),
1391− ("lsh", "\x21b0"),
1392− ("lsim", "\x2272"),
1393− ("lsime", "\x2a8d"),
1394− ("lsimg", "\x2a8f"),
1395− ("lsqb", "\x005b"),
1396− ("lsquo", "\x2018"),
1397− ("lsquor", "\x201a"),
1398− ("lstrok", "\x0142"),
1399− ("l", "\x003c"),
1400− ("lt", "\x003c"),
1401− ("ltcc", "\x2aa6"),
1402− ("ltcir", "\x2a79"),
1403− ("ltdot", "\x22d6"),
1404− ("lthree", "\x22cb"),
1405− ("ltimes", "\x22c9"),
1406− ("ltlarr", "\x2976"),
1407− ("ltquest", "\x2a7b"),
1408− ("ltrPar", "\x2996"),
1409− ("ltri", "\x25c3"),
1410− ("ltrie", "\x22b4"),
1411− ("ltrif", "\x25c2"),
1412− ("lurdshar", "\x294a"),
1413− ("luruhar", "\x2966"),
1414− ("lvertneqq", "\x2268\xfe00"),
1415− ("lvnE", "\x2268\xfe00"),
1416− ("mDDot", "\x223a"),
1417− ("mac", "\x00af"),
1418− ("macr", "\x00af"),
1419− ("male", "\x2642"),
1420− ("malt", "\x2720"),
1421− ("maltese", "\x2720"),
1422− ("map", "\x21a6"),
1423− ("mapsto", "\x21a6"),
1424− ("mapstodown", "\x21a7"),
1425− ("mapstoleft", "\x21a4"),
1426− ("mapstoup", "\x21a5"),
1427− ("marker", "\x25ae"),
1428− ("mcomma", "\x2a29"),
1429− ("mcy", "\x043c"),
1430− ("mdash", "\x2014"),
1431− ("measuredangle", "\x2221"),
1432− ("mfr", "\x1d52a"),
1433− ("mho", "\x2127"),
1434− ("micr", "\x00b5"),
1435− ("micro", "\x00b5"),
1436− ("mid", "\x2223"),
1437− ("midast", "\x002a"),
1438− ("midcir", "\x2af0"),
1439− ("middo", "\x00b7"),
1440− ("middot", "\x00b7"),
1441− ("minus", "\x2212"),
1442− ("minusb", "\x229f"),
1443− ("minusd", "\x2238"),
1444− ("minusdu", "\x2a2a"),
1445− ("mlcp", "\x2adb"),
1446− ("mldr", "\x2026"),
1447− ("mnplus", "\x2213"),
1448− ("models", "\x22a7"),
1449− ("mopf", "\x1d55e"),
1450− ("mp", "\x2213"),
1451− ("mscr", "\x1d4c2"),
1452− ("mstpos", "\x223e"),
1453− ("mu", "\x03bc"),
1454− ("multimap", "\x22b8"),
1455− ("mumap", "\x22b8"),
1456− ("nGg", "\x22d9\x0338"),
1457− ("nGt", "\x226b\x20d2"),
1458− ("nGtv", "\x226b\x0338"),
1459− ("nLeftarrow", "\x21cd"),
1460− ("nLeftrightarrow", "\x21ce"),
1461− ("nLl", "\x22d8\x0338"),
1462− ("nLt", "\x226a\x20d2"),
1463− ("nLtv", "\x226a\x0338"),
1464− ("nRightarrow", "\x21cf"),
1465− ("nVDash", "\x22af"),
1466− ("nVdash", "\x22ae"),
1467− ("nabla", "\x2207"),
1468− ("nacute", "\x0144"),
1469− ("nang", "\x2220\x20d2"),
1470− ("nap", "\x2249"),
1471− ("napE", "\x2a70\x0338"),
1472− ("napid", "\x224b\x0338"),
1473− ("napos", "\x0149"),
1474− ("napprox", "\x2249"),
1475− ("natur", "\x266e"),
1476− ("natural", "\x266e"),
1477− ("naturals", "\x2115"),
1478− ("nbs", "\x00a0"),
1479− ("nbsp", "\x00a0"),
1480− ("nbump", "\x224e\x0338"),
1481− ("nbumpe", "\x224f\x0338"),
1482− ("ncap", "\x2a43"),
1483− ("ncaron", "\x0148"),
1484− ("ncedil", "\x0146"),
1485− ("ncong", "\x2247"),
1486− ("ncongdot", "\x2a6d\x0338"),
1487− ("ncup", "\x2a42"),
1488− ("ncy", "\x043d"),
1489− ("ndash", "\x2013"),
1490− ("ne", "\x2260"),
1491− ("neArr", "\x21d7"),
1492− ("nearhk", "\x2924"),
1493− ("nearr", "\x2197"),
1494− ("nearrow", "\x2197"),
1495− ("nedot", "\x2250\x0338"),
1496− ("nequiv", "\x2262"),
1497− ("nesear", "\x2928"),
1498− ("nesim", "\x2242\x0338"),
1499− ("nexist", "\x2204"),
1500− ("nexists", "\x2204"),
1501− ("nfr", "\x1d52b"),
1502− ("ngE", "\x2267\x0338"),
1503− ("nge", "\x2271"),
1504− ("ngeq", "\x2271"),
1505− ("ngeqq", "\x2267\x0338"),
1506− ("ngeqslant", "\x2a7e\x0338"),
1507− ("nges", "\x2a7e\x0338"),
1508− ("ngsim", "\x2275"),
1509− ("ngt", "\x226f"),
1510− ("ngtr", "\x226f"),
1511− ("nhArr", "\x21ce"),
1512− ("nharr", "\x21ae"),
1513− ("nhpar", "\x2af2"),
1514− ("ni", "\x220b"),
1515− ("nis", "\x22fc"),
1516− ("nisd", "\x22fa"),
1517− ("niv", "\x220b"),
1518− ("njcy", "\x045a"),
1519− ("nlArr", "\x21cd"),
1520− ("nlE", "\x2266\x0338"),
1521− ("nlarr", "\x219a"),
1522− ("nldr", "\x2025"),
1523− ("nle", "\x2270"),
1524− ("nleftarrow", "\x219a"),
1525− ("nleftrightarrow", "\x21ae"),
1526− ("nleq", "\x2270"),
1527− ("nleqq", "\x2266\x0338"),
1528− ("nleqslant", "\x2a7d\x0338"),
1529− ("nles", "\x2a7d\x0338"),
1530− ("nless", "\x226e"),
1531− ("nlsim", "\x2274"),
1532− ("nlt", "\x226e"),
1533− ("nltri", "\x22ea"),
1534− ("nltrie", "\x22ec"),
1535− ("nmid", "\x2224"),
1536− ("nopf", "\x1d55f"),
1537− ("no", "\x00ac"),
1538− ("not", "\x00ac"),
1539− ("notin", "\x2209"),
1540− ("notinE", "\x22f9\x0338"),
1541− ("notindot", "\x22f5\x0338"),
1542− ("notinva", "\x2209"),
1543− ("notinvb", "\x22f7"),
1544− ("notinvc", "\x22f6"),
1545− ("notni", "\x220c"),
1546− ("notniva", "\x220c"),
1547− ("notnivb", "\x22fe"),
1548− ("notnivc", "\x22fd"),
1549− ("npar", "\x2226"),
1550− ("nparallel", "\x2226"),
1551− ("nparsl", "\x2afd\x20e5"),
1552− ("npart", "\x2202\x0338"),
1553− ("npolint", "\x2a14"),
1554− ("npr", "\x2280"),
1555− ("nprcue", "\x22e0"),
1556− ("npre", "\x2aaf\x0338"),
1557− ("nprec", "\x2280"),
1558− ("npreceq", "\x2aaf\x0338"),
1559− ("nrArr", "\x21cf"),
1560− ("nrarr", "\x219b"),
1561− ("nrarrc", "\x2933\x0338"),
1562− ("nrarrw", "\x219d\x0338"),
1563− ("nrightarrow", "\x219b"),
1564− ("nrtri", "\x22eb"),
1565− ("nrtrie", "\x22ed"),
1566− ("nsc", "\x2281"),
1567− ("nsccue", "\x22e1"),
1568− ("nsce", "\x2ab0\x0338"),
1569− ("nscr", "\x1d4c3"),
1570− ("nshortmid", "\x2224"),
1571− ("nshortparallel", "\x2226"),
1572− ("nsim", "\x2241"),
1573− ("nsime", "\x2244"),
1574− ("nsimeq", "\x2244"),
1575− ("nsmid", "\x2224"),
1576− ("nspar", "\x2226"),
1577− ("nsqsube", "\x22e2"),
1578− ("nsqsupe", "\x22e3"),
1579− ("nsub", "\x2284"),
1580− ("nsubE", "\x2ac5\x0338"),
1581− ("nsube", "\x2288"),
1582− ("nsubset", "\x2282\x20d2"),
1583− ("nsubseteq", "\x2288"),
1584− ("nsubseteqq", "\x2ac5\x0338"),
1585− ("nsucc", "\x2281"),
1586− ("nsucceq", "\x2ab0\x0338"),
1587− ("nsup", "\x2285"),
1588− ("nsupE", "\x2ac6\x0338"),
1589− ("nsupe", "\x2289"),
1590− ("nsupset", "\x2283\x20d2"),
1591− ("nsupseteq", "\x2289"),
1592− ("nsupseteqq", "\x2ac6\x0338"),
1593− ("ntgl", "\x2279"),
1594− ("ntild", "\x00f1"),
1595− ("ntilde", "\x00f1"),
1596− ("ntlg", "\x2278"),
1597− ("ntriangleleft", "\x22ea"),
1598− ("ntrianglelefteq", "\x22ec"),
1599− ("ntriangleright", "\x22eb"),
1600− ("ntrianglerighteq", "\x22ed"),
1601− ("nu", "\x03bd"),
1602− ("num", "\x0023"),
1603− ("numero", "\x2116"),
1604− ("numsp", "\x2007"),
1605− ("nvDash", "\x22ad"),
1606− ("nvHarr", "\x2904"),
1607− ("nvap", "\x224d\x20d2"),
1608− ("nvdash", "\x22ac"),
1609− ("nvge", "\x2265\x20d2"),
1610− ("nvgt", "\x003e\x20d2"),
1611− ("nvinfin", "\x29de"),
1612− ("nvlArr", "\x2902"),
1613− ("nvle", "\x2264\x20d2"),
1614− ("nvlt", "\x003c\x20d2"),
1615− ("nvltrie", "\x22b4\x20d2"),
1616− ("nvrArr", "\x2903"),
1617− ("nvrtrie", "\x22b5\x20d2"),
1618− ("nvsim", "\x223c\x20d2"),
1619− ("nwArr", "\x21d6"),
1620− ("nwarhk", "\x2923"),
1621− ("nwarr", "\x2196"),
1622− ("nwarrow", "\x2196"),
1623− ("nwnear", "\x2927"),
1624− ("oS", "\x24c8"),
1625− ("oacut", "\x00f3"),
1626− ("oacute", "\x00f3"),
1627− ("oast", "\x229b"),
1628− ("ocir", "\x229a"),
1629− ("ocir", "\x00f4"),
1630− ("ocirc", "\x00f4"),
1631− ("ocy", "\x043e"),
1632− ("odash", "\x229d"),
1633− ("odblac", "\x0151"),
1634− ("odiv", "\x2a38"),
1635− ("odot", "\x2299"),
1636− ("odsold", "\x29bc"),
1637− ("oelig", "\x0153"),
1638− ("ofcir", "\x29bf"),
1639− ("ofr", "\x1d52c"),
1640− ("ogon", "\x02db"),
1641− ("ograv", "\x00f2"),
1642− ("ograve", "\x00f2"),
1643− ("ogt", "\x29c1"),
1644− ("ohbar", "\x29b5"),
1645− ("ohm", "\x03a9"),
1646− ("oint", "\x222e"),
1647− ("olarr", "\x21ba"),
1648− ("olcir", "\x29be"),
1649− ("olcross", "\x29bb"),
1650− ("oline", "\x203e"),
1651− ("olt", "\x29c0"),
1652− ("omacr", "\x014d"),
1653− ("omega", "\x03c9"),
1654− ("omicron", "\x03bf"),
1655− ("omid", "\x29b6"),
1656− ("ominus", "\x2296"),
1657− ("oopf", "\x1d560"),
1658− ("opar", "\x29b7"),
1659− ("operp", "\x29b9"),
1660− ("oplus", "\x2295"),
1661− ("or", "\x2228"),
1662− ("orarr", "\x21bb"),
1663− ("ord", "\x2a5d"),
1664− ("order", "\x2134"),
1665− ("orderof", "\x2134"),
1666− ("ord", "\x00aa"),
1667− ("ordf", "\x00aa"),
1668− ("ord", "\x00ba"),
1669− ("ordm", "\x00ba"),
1670− ("origof", "\x22b6"),
1671− ("oror", "\x2a56"),
1672− ("orslope", "\x2a57"),
1673− ("orv", "\x2a5b"),
1674− ("oscr", "\x2134"),
1675− ("oslas", "\x00f8"),
1676− ("oslash", "\x00f8"),
1677− ("osol", "\x2298"),
1678− ("otild", "\x00f5"),
1679− ("otilde", "\x00f5"),
1680− ("otimes", "\x2297"),
1681− ("otimesas", "\x2a36"),
1682− ("oum", "\x00f6"),
1683− ("ouml", "\x00f6"),
1684− ("ovbar", "\x233d"),
1685− ("par", "\x2225"),
1686− ("par", "\x00b6"),
1687− ("para", "\x00b6"),
1688− ("parallel", "\x2225"),
1689− ("parsim", "\x2af3"),
1690− ("parsl", "\x2afd"),
1691− ("part", "\x2202"),
1692− ("pcy", "\x043f"),
1693− ("percnt", "\x0025"),
1694− ("period", "\x002e"),
1695− ("permil", "\x2030"),
1696− ("perp", "\x22a5"),
1697− ("pertenk", "\x2031"),
1698− ("pfr", "\x1d52d"),
1699− ("phi", "\x03c6"),
1700− ("phiv", "\x03d5"),
1701− ("phmmat", "\x2133"),
1702− ("phone", "\x260e"),
1703− ("pi", "\x03c0"),
1704− ("pitchfork", "\x22d4"),
1705− ("piv", "\x03d6"),
1706− ("planck", "\x210f"),
1707− ("planckh", "\x210e"),
1708− ("plankv", "\x210f"),
1709− ("plus", "\x002b"),
1710− ("plusacir", "\x2a23"),
1711− ("plusb", "\x229e"),
1712− ("pluscir", "\x2a22"),
1713− ("plusdo", "\x2214"),
1714− ("plusdu", "\x2a25"),
1715− ("pluse", "\x2a72"),
1716− ("plusm", "\x00b1"),
1717− ("plusmn", "\x00b1"),
1718− ("plussim", "\x2a26"),
1719− ("plustwo", "\x2a27"),
1720− ("pm", "\x00b1"),
1721− ("pointint", "\x2a15"),
1722− ("popf", "\x1d561"),
1723− ("poun", "\x00a3"),
1724− ("pound", "\x00a3"),
1725− ("pr", "\x227a"),
1726− ("prE", "\x2ab3"),
1727− ("prap", "\x2ab7"),
1728− ("prcue", "\x227c"),
1729− ("pre", "\x2aaf"),
1730− ("prec", "\x227a"),
1731− ("precapprox", "\x2ab7"),
1732− ("preccurlyeq", "\x227c"),
1733− ("preceq", "\x2aaf"),
1734− ("precnapprox", "\x2ab9"),
1735− ("precneqq", "\x2ab5"),
1736− ("precnsim", "\x22e8"),
1737− ("precsim", "\x227e"),
1738− ("prime", "\x2032"),
1739− ("primes", "\x2119"),
1740− ("prnE", "\x2ab5"),
1741− ("prnap", "\x2ab9"),
1742− ("prnsim", "\x22e8"),
1743− ("prod", "\x220f"),
1744− ("profalar", "\x232e"),
1745− ("profline", "\x2312"),
1746− ("profsurf", "\x2313"),
1747− ("prop", "\x221d"),
1748− ("propto", "\x221d"),
1749− ("prsim", "\x227e"),
1750− ("prurel", "\x22b0"),
1751− ("pscr", "\x1d4c5"),
1752− ("psi", "\x03c8"),
1753− ("puncsp", "\x2008"),
1754− ("qfr", "\x1d52e"),
1755− ("qint", "\x2a0c"),
1756− ("qopf", "\x1d562"),
1757− ("qprime", "\x2057"),
1758− ("qscr", "\x1d4c6"),
1759− ("quaternions", "\x210d"),
1760− ("quatint", "\x2a16"),
1761− ("quest", "\x003f"),
1762− ("questeq", "\x225f"),
1763− ("quo", "\x0022"),
1764− ("quot", "\x0022"),
1765− ("rAarr", "\x21db"),
1766− ("rArr", "\x21d2"),
1767− ("rAtail", "\x291c"),
1768− ("rBarr", "\x290f"),
1769− ("rHar", "\x2964"),
1770− ("race", "\x223d\x0331"),
1771− ("racute", "\x0155"),
1772− ("radic", "\x221a"),
1773− ("raemptyv", "\x29b3"),
1774− ("rang", "\x27e9"),
1775− ("rangd", "\x2992"),
1776− ("range", "\x29a5"),
1777− ("rangle", "\x27e9"),
1778− ("raqu", "\x00bb"),
1779− ("raquo", "\x00bb"),
1780− ("rarr", "\x2192"),
1781− ("rarrap", "\x2975"),
1782− ("rarrb", "\x21e5"),
1783− ("rarrbfs", "\x2920"),
1784− ("rarrc", "\x2933"),
1785− ("rarrfs", "\x291e"),
1786− ("rarrhk", "\x21aa"),
1787− ("rarrlp", "\x21ac"),
1788− ("rarrpl", "\x2945"),
1789− ("rarrsim", "\x2974"),
1790− ("rarrtl", "\x21a3"),
1791− ("rarrw", "\x219d"),
1792− ("ratail", "\x291a"),
1793− ("ratio", "\x2236"),
1794− ("rationals", "\x211a"),
1795− ("rbarr", "\x290d"),
1796− ("rbbrk", "\x2773"),
1797− ("rbrace", "\x007d"),
1798− ("rbrack", "\x005d"),
1799− ("rbrke", "\x298c"),
1800− ("rbrksld", "\x298e"),
1801− ("rbrkslu", "\x2990"),
1802− ("rcaron", "\x0159"),
1803− ("rcedil", "\x0157"),
1804− ("rceil", "\x2309"),
1805− ("rcub", "\x007d"),
1806− ("rcy", "\x0440"),
1807− ("rdca", "\x2937"),
1808− ("rdldhar", "\x2969"),
1809− ("rdquo", "\x201d"),
1810− ("rdquor", "\x201d"),
1811− ("rdsh", "\x21b3"),
1812− ("real", "\x211c"),
1813− ("realine", "\x211b"),
1814− ("realpart", "\x211c"),
1815− ("reals", "\x211d"),
1816− ("rect", "\x25ad"),
1817− ("re", "\x00ae"),
1818− ("reg", "\x00ae"),
1819− ("rfisht", "\x297d"),
1820− ("rfloor", "\x230b"),
1821− ("rfr", "\x1d52f"),
1822− ("rhard", "\x21c1"),
1823− ("rharu", "\x21c0"),
1824− ("rharul", "\x296c"),
1825− ("rho", "\x03c1"),
1826− ("rhov", "\x03f1"),
1827− ("rightarrow", "\x2192"),
1828− ("rightarrowtail", "\x21a3"),
1829− ("rightharpoondown", "\x21c1"),
1830− ("rightharpoonup", "\x21c0"),
1831− ("rightleftarrows", "\x21c4"),
1832− ("rightleftharpoons", "\x21cc"),
1833− ("rightrightarrows", "\x21c9"),
1834− ("rightsquigarrow", "\x219d"),
1835− ("rightthreetimes", "\x22cc"),
1836− ("ring", "\x02da"),
1837− ("risingdotseq", "\x2253"),
1838− ("rlarr", "\x21c4"),
1839− ("rlhar", "\x21cc"),
1840− ("rlm", "\x200f"),
1841− ("rmoust", "\x23b1"),
1842− ("rmoustache", "\x23b1"),
1843− ("rnmid", "\x2aee"),
1844− ("roang", "\x27ed"),
1845− ("roarr", "\x21fe"),
1846− ("robrk", "\x27e7"),
1847− ("ropar", "\x2986"),
1848− ("ropf", "\x1d563"),
1849− ("roplus", "\x2a2e"),
1850− ("rotimes", "\x2a35"),
1851− ("rpar", "\x0029"),
1852− ("rpargt", "\x2994"),
1853− ("rppolint", "\x2a12"),
1854− ("rrarr", "\x21c9"),
1855− ("rsaquo", "\x203a"),
1856− ("rscr", "\x1d4c7"),
1857− ("rsh", "\x21b1"),
1858− ("rsqb", "\x005d"),
1859− ("rsquo", "\x2019"),
1860− ("rsquor", "\x2019"),
1861− ("rthree", "\x22cc"),
1862− ("rtimes", "\x22ca"),
1863− ("rtri", "\x25b9"),
1864− ("rtrie", "\x22b5"),
1865− ("rtrif", "\x25b8"),
1866− ("rtriltri", "\x29ce"),
1867− ("ruluhar", "\x2968"),
1868− ("rx", "\x211e"),
1869− ("sacute", "\x015b"),
1870− ("sbquo", "\x201a"),
1871− ("sc", "\x227b"),
1872− ("scE", "\x2ab4"),
1873− ("scap", "\x2ab8"),
1874− ("scaron", "\x0161"),
1875− ("sccue", "\x227d"),
1876− ("sce", "\x2ab0"),
1877− ("scedil", "\x015f"),
1878− ("scirc", "\x015d"),
1879− ("scnE", "\x2ab6"),
1880− ("scnap", "\x2aba"),
1881− ("scnsim", "\x22e9"),
1882− ("scpolint", "\x2a13"),
1883− ("scsim", "\x227f"),
1884− ("scy", "\x0441"),
1885− ("sdot", "\x22c5"),
1886− ("sdotb", "\x22a1"),
1887− ("sdote", "\x2a66"),
1888− ("seArr", "\x21d8"),
1889− ("searhk", "\x2925"),
1890− ("searr", "\x2198"),
1891− ("searrow", "\x2198"),
1892− ("sec", "\x00a7"),
1893− ("sect", "\x00a7"),
1894− ("semi", "\x003b"),
1895− ("seswar", "\x2929"),
1896− ("setminus", "\x2216"),
1897− ("setmn", "\x2216"),
1898− ("sext", "\x2736"),
1899− ("sfr", "\x1d530"),
1900− ("sfrown", "\x2322"),
1901− ("sharp", "\x266f"),
1902− ("shchcy", "\x0449"),
1903− ("shcy", "\x0448"),
1904− ("shortmid", "\x2223"),
1905− ("shortparallel", "\x2225"),
1906− ("sh", "\x00ad"),
1907− ("shy", "\x00ad"),
1908− ("sigma", "\x03c3"),
1909− ("sigmaf", "\x03c2"),
1910− ("sigmav", "\x03c2"),
1911− ("sim", "\x223c"),
1912− ("simdot", "\x2a6a"),
1913− ("sime", "\x2243"),
1914− ("simeq", "\x2243"),
1915− ("simg", "\x2a9e"),
1916− ("simgE", "\x2aa0"),
1917− ("siml", "\x2a9d"),
1918− ("simlE", "\x2a9f"),
1919− ("simne", "\x2246"),
1920− ("simplus", "\x2a24"),
1921− ("simrarr", "\x2972"),
1922− ("slarr", "\x2190"),
1923− ("smallsetminus", "\x2216"),
1924− ("smashp", "\x2a33"),
1925− ("smeparsl", "\x29e4"),
1926− ("smid", "\x2223"),
1927− ("smile", "\x2323"),
1928− ("smt", "\x2aaa"),
1929− ("smte", "\x2aac"),
1930− ("smtes", "\x2aac\xfe00"),
1931− ("softcy", "\x044c"),
1932− ("sol", "\x002f"),
1933− ("solb", "\x29c4"),
1934− ("solbar", "\x233f"),
1935− ("sopf", "\x1d564"),
1936− ("spades", "\x2660"),
1937− ("spadesuit", "\x2660"),
1938− ("spar", "\x2225"),
1939− ("sqcap", "\x2293"),
1940− ("sqcaps", "\x2293\xfe00"),
1941− ("sqcup", "\x2294"),
1942− ("sqcups", "\x2294\xfe00"),
1943− ("sqsub", "\x228f"),
1944− ("sqsube", "\x2291"),
1945− ("sqsubset", "\x228f"),
1946− ("sqsubseteq", "\x2291"),
1947− ("sqsup", "\x2290"),
1948− ("sqsupe", "\x2292"),
1949− ("sqsupset", "\x2290"),
1950− ("sqsupseteq", "\x2292"),
1951− ("squ", "\x25a1"),
1952− ("square", "\x25a1"),
1953− ("squarf", "\x25aa"),
1954− ("squf", "\x25aa"),
1955− ("srarr", "\x2192"),
1956− ("sscr", "\x1d4c8"),
1957− ("ssetmn", "\x2216"),
1958− ("ssmile", "\x2323"),
1959− ("sstarf", "\x22c6"),
1960− ("star", "\x2606"),
1961− ("starf", "\x2605"),
1962− ("straightepsilon", "\x03f5"),
1963− ("straightphi", "\x03d5"),
1964− ("strns", "\x00af"),
1965− ("sub", "\x2282"),
1966− ("subE", "\x2ac5"),
1967− ("subdot", "\x2abd"),
1968− ("sube", "\x2286"),
1969− ("subedot", "\x2ac3"),
1970− ("submult", "\x2ac1"),
1971− ("subnE", "\x2acb"),
1972− ("subne", "\x228a"),
1973− ("subplus", "\x2abf"),
1974− ("subrarr", "\x2979"),
1975− ("subset", "\x2282"),
1976− ("subseteq", "\x2286"),
1977− ("subseteqq", "\x2ac5"),
1978− ("subsetneq", "\x228a"),
1979− ("subsetneqq", "\x2acb"),
1980− ("subsim", "\x2ac7"),
1981− ("subsub", "\x2ad5"),
1982− ("subsup", "\x2ad3"),
1983− ("succ", "\x227b"),
1984− ("succapprox", "\x2ab8"),
1985− ("succcurlyeq", "\x227d"),
1986− ("succeq", "\x2ab0"),
1987− ("succnapprox", "\x2aba"),
1988− ("succneqq", "\x2ab6"),
1989− ("succnsim", "\x22e9"),
1990− ("succsim", "\x227f"),
1991− ("sum", "\x2211"),
1992− ("sung", "\x266a"),
1993− ("sup", "\x00b9"),
1994− ("sup1", "\x00b9"),
1995− ("sup", "\x00b2"),
1996− ("sup2", "\x00b2"),
1997− ("sup", "\x00b3"),
1998− ("sup3", "\x00b3"),
1999− ("sup", "\x2283"),
2000− ("supE", "\x2ac6"),
2001− ("supdot", "\x2abe"),
2002− ("supdsub", "\x2ad8"),
2003− ("supe", "\x2287"),
2004− ("supedot", "\x2ac4"),
2005− ("suphsol", "\x27c9"),
2006− ("suphsub", "\x2ad7"),
2007− ("suplarr", "\x297b"),
2008− ("supmult", "\x2ac2"),
2009− ("supnE", "\x2acc"),
2010− ("supne", "\x228b"),
2011− ("supplus", "\x2ac0"),
2012− ("supset", "\x2283"),
2013− ("supseteq", "\x2287"),
2014− ("supseteqq", "\x2ac6"),
2015− ("supsetneq", "\x228b"),
2016− ("supsetneqq", "\x2acc"),
2017− ("supsim", "\x2ac8"),
2018− ("supsub", "\x2ad4"),
2019− ("supsup", "\x2ad6"),
2020− ("swArr", "\x21d9"),
2021− ("swarhk", "\x2926"),
2022− ("swarr", "\x2199"),
2023− ("swarrow", "\x2199"),
2024− ("swnwar", "\x292a"),
2025− ("szli", "\x00df"),
2026− ("szlig", "\x00df"),
2027− ("target", "\x2316"),
2028− ("tau", "\x03c4"),
2029− ("tbrk", "\x23b4"),
2030− ("tcaron", "\x0165"),
2031− ("tcedil", "\x0163"),
2032− ("tcy", "\x0442"),
2033− ("tdot", "\x20db"),
2034− ("telrec", "\x2315"),
2035− ("tfr", "\x1d531"),
2036− ("there4", "\x2234"),
2037− ("therefore", "\x2234"),
2038− ("theta", "\x03b8"),
2039− ("thetasym", "\x03d1"),
2040− ("thetav", "\x03d1"),
2041− ("thickapprox", "\x2248"),
2042− ("thicksim", "\x223c"),
2043− ("thinsp", "\x2009"),
2044− ("thkap", "\x2248"),
2045− ("thksim", "\x223c"),
2046− ("thor", "\x00fe"),
2047− ("thorn", "\x00fe"),
2048− ("tilde", "\x02dc"),
2049− ("time", "\x00d7"),
2050− ("times", "\x00d7"),
2051− ("timesb", "\x22a0"),
2052− ("timesbar", "\x2a31"),
2053− ("timesd", "\x2a30"),
2054− ("tint", "\x222d"),
2055− ("toea", "\x2928"),
2056− ("top", "\x22a4"),
2057− ("topbot", "\x2336"),
2058− ("topcir", "\x2af1"),
2059− ("topf", "\x1d565"),
2060− ("topfork", "\x2ada"),
2061− ("tosa", "\x2929"),
2062− ("tprime", "\x2034"),
2063− ("trade", "\x2122"),
2064− ("triangle", "\x25b5"),
2065− ("triangledown", "\x25bf"),
2066− ("triangleleft", "\x25c3"),
2067− ("trianglelefteq", "\x22b4"),
2068− ("triangleq", "\x225c"),
2069− ("triangleright", "\x25b9"),
2070− ("trianglerighteq", "\x22b5"),
2071− ("tridot", "\x25ec"),
2072− ("trie", "\x225c"),
2073− ("triminus", "\x2a3a"),
2074− ("triplus", "\x2a39"),
2075− ("trisb", "\x29cd"),
2076− ("tritime", "\x2a3b"),
2077− ("trpezium", "\x23e2"),
2078− ("tscr", "\x1d4c9"),
2079− ("tscy", "\x0446"),
2080− ("tshcy", "\x045b"),
2081− ("tstrok", "\x0167"),
2082− ("twixt", "\x226c"),
2083− ("twoheadleftarrow", "\x219e"),
2084− ("twoheadrightarrow", "\x21a0"),
2085− ("uArr", "\x21d1"),
2086− ("uHar", "\x2963"),
2087− ("uacut", "\x00fa"),
2088− ("uacute", "\x00fa"),
2089− ("uarr", "\x2191"),
2090− ("ubrcy", "\x045e"),
2091− ("ubreve", "\x016d"),
2092− ("ucir", "\x00fb"),
2093− ("ucirc", "\x00fb"),
2094− ("ucy", "\x0443"),
2095− ("udarr", "\x21c5"),
2096− ("udblac", "\x0171"),
2097− ("udhar", "\x296e"),
2098− ("ufisht", "\x297e"),
2099− ("ufr", "\x1d532"),
2100− ("ugrav", "\x00f9"),
2101− ("ugrave", "\x00f9"),
2102− ("uharl", "\x21bf"),
2103− ("uharr", "\x21be"),
2104− ("uhblk", "\x2580"),
2105− ("ulcorn", "\x231c"),
2106− ("ulcorner", "\x231c"),
2107− ("ulcrop", "\x230f"),
2108− ("ultri", "\x25f8"),
2109− ("umacr", "\x016b"),
2110− ("um", "\x00a8"),
2111− ("uml", "\x00a8"),
2112− ("uogon", "\x0173"),
2113− ("uopf", "\x1d566"),
2114− ("uparrow", "\x2191"),
2115− ("updownarrow", "\x2195"),
2116− ("upharpoonleft", "\x21bf"),
2117− ("upharpoonright", "\x21be"),
2118− ("uplus", "\x228e"),
2119− ("upsi", "\x03c5"),
2120− ("upsih", "\x03d2"),
2121− ("upsilon", "\x03c5"),
2122− ("upuparrows", "\x21c8"),
2123− ("urcorn", "\x231d"),
2124− ("urcorner", "\x231d"),
2125− ("urcrop", "\x230e"),
2126− ("uring", "\x016f"),
2127− ("urtri", "\x25f9"),
2128− ("uscr", "\x1d4ca"),
2129− ("utdot", "\x22f0"),
2130− ("utilde", "\x0169"),
2131− ("utri", "\x25b5"),
2132− ("utrif", "\x25b4"),
2133− ("uuarr", "\x21c8"),
2134− ("uum", "\x00fc"),
2135− ("uuml", "\x00fc"),
2136− ("uwangle", "\x29a7"),
2137− ("vArr", "\x21d5"),
2138− ("vBar", "\x2ae8"),
2139− ("vBarv", "\x2ae9"),
2140− ("vDash", "\x22a8"),
2141− ("vangrt", "\x299c"),
2142− ("varepsilon", "\x03f5"),
2143− ("varkappa", "\x03f0"),
2144− ("varnothing", "\x2205"),
2145− ("varphi", "\x03d5"),
2146− ("varpi", "\x03d6"),
2147− ("varpropto", "\x221d"),
2148− ("varr", "\x2195"),
2149− ("varrho", "\x03f1"),
2150− ("varsigma", "\x03c2"),
2151− ("varsubsetneq", "\x228a\xfe00"),
2152− ("varsubsetneqq", "\x2acb\xfe00"),
2153− ("varsupsetneq", "\x228b\xfe00"),
2154− ("varsupsetneqq", "\x2acc\xfe00"),
2155− ("vartheta", "\x03d1"),
2156− ("vartriangleleft", "\x22b2"),
2157− ("vartriangleright", "\x22b3"),
2158− ("vcy", "\x0432"),
2159− ("vdash", "\x22a2"),
2160− ("vee", "\x2228"),
2161− ("veebar", "\x22bb"),
2162− ("veeeq", "\x225a"),
2163− ("vellip", "\x22ee"),
2164− ("verbar", "\x007c"),
2165− ("vert", "\x007c"),
2166− ("vfr", "\x1d533"),
2167− ("vltri", "\x22b2"),
2168− ("vnsub", "\x2282\x20d2"),
2169− ("vnsup", "\x2283\x20d2"),
2170− ("vopf", "\x1d567"),
2171− ("vprop", "\x221d"),
2172− ("vrtri", "\x22b3"),
2173− ("vscr", "\x1d4cb"),
2174− ("vsubnE", "\x2acb\xfe00"),
2175− ("vsubne", "\x228a\xfe00"),
2176− ("vsupnE", "\x2acc\xfe00"),
2177− ("vsupne", "\x228b\xfe00"),
2178− ("vzigzag", "\x299a"),
2179− ("wcirc", "\x0175"),
2180− ("wedbar", "\x2a5f"),
2181− ("wedge", "\x2227"),
2182− ("wedgeq", "\x2259"),
2183− ("weierp", "\x2118"),
2184− ("wfr", "\x1d534"),
2185− ("wopf", "\x1d568"),
2186− ("wp", "\x2118"),
2187− ("wr", "\x2240"),
2188− ("wreath", "\x2240"),
2189− ("wscr", "\x1d4cc"),
2190− ("xcap", "\x22c2"),
2191− ("xcirc", "\x25ef"),
2192− ("xcup", "\x22c3"),
2193− ("xdtri", "\x25bd"),
2194− ("xfr", "\x1d535"),
2195− ("xhArr", "\x27fa"),
2196− ("xharr", "\x27f7"),
2197− ("xi", "\x03be"),
2198− ("xlArr", "\x27f8"),
2199− ("xlarr", "\x27f5"),
2200− ("xmap", "\x27fc"),
2201− ("xnis", "\x22fb"),
2202− ("xodot", "\x2a00"),
2203− ("xopf", "\x1d569"),
2204− ("xoplus", "\x2a01"),
2205− ("xotime", "\x2a02"),
2206− ("xrArr", "\x27f9"),
2207− ("xrarr", "\x27f6"),
2208− ("xscr", "\x1d4cd"),
2209− ("xsqcup", "\x2a06"),
2210− ("xuplus", "\x2a04"),
2211− ("xutri", "\x25b3"),
2212− ("xvee", "\x22c1"),
2213− ("xwedge", "\x22c0"),
2214− ("yacut", "\x00fd"),
2215− ("yacute", "\x00fd"),
2216− ("yacy", "\x044f"),
2217− ("ycirc", "\x0177"),
2218− ("ycy", "\x044b"),
2219− ("ye", "\x00a5"),
2220− ("yen", "\x00a5"),
2221− ("yfr", "\x1d536"),
2222− ("yicy", "\x0457"),
2223− ("yopf", "\x1d56a"),
2224− ("yscr", "\x1d4ce"),
2225− ("yucy", "\x044e"),
2226− ("yum", "\x00ff"),
2227− ("yuml", "\x00ff"),
2228− ("zacute", "\x017a"),
2229− ("zcaron", "\x017e"),
2230− ("zcy", "\x0437"),
2231− ("zdot", "\x017c"),
2232− ("zeetrf", "\x2128"),
2233− ("zeta", "\x03b6"),
2234− ("zfr", "\x1d537"),
2235− ("zhcy", "\x0436"),
2236− ("zigrarr", "\x21dd"),
2237− ("zopf", "\x1d56b"),
2238− ("zscr", "\x1d4cf"),
2239− ("zwj", "\x200d"),
2240− ("zwnj", "\x200c")
2241− ]
src/Text/HTML/Tree.hsdeleted−91
@@ -1,91 +0,0 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−{-# LANGUAGE ViewPatterns #-}
3−
4−module Text.HTML.Tree
5− ( -- * Constructing forests
6− tokensToForest
7− , ParseTokenForestError(..), PStack(..)
8− , nonClosing
9− -- * Deconstructing forests
10− , tokensFromForest
11− , tokensFromTree
12− ) where
13−
14−import Data.Monoid
15−import Data.Text (Text)
16−import Data.Tree
17−import Prelude
18−
19−import Text.HTML.Parser
20−
21−-- | construct a 'Forest' from a 'Token' list.
22−--
23−-- This code correctly handles void elements. Void elements are required to have a start tag and must not have an end tag. See 'nonClosing'.
24−--
25−-- This code does __not__ correctly handle optional tags. It assumes all optional start and end tags are present.
26−--
27−-- <https:\/\/www.w3.org\/TR\/html52\/syntax.html#optional-tags>
28−tokensToForest :: [Token] -> Either ParseTokenForestError (Forest Token)
29−tokensToForest = f (PStack [] [])
30− where
31− f (PStack ss []) [] = Right (reverse ss)
32− f pstack [] = Left $ ParseTokenForestErrorBracketMismatch pstack Nothing
33− f pstack (t : ts) = case t of
34− TagOpen n _ -> if n `elem` nonClosing
35− then f (pushFlatSibling t pstack) ts
36− else f (pushParent t pstack) ts
37− TagSelfClose {} -> f (pushFlatSibling t pstack) ts
38− TagClose n -> (`f` ts) =<< popParent n pstack
39− ContentChar _ -> f (pushFlatSibling t pstack) ts
40− ContentText _ -> f (pushFlatSibling t pstack) ts
41− Comment _ -> f (pushFlatSibling t pstack) ts
42− Doctype _ -> f (pushFlatSibling t pstack) ts
43−
44−-- | void elements which must not have an end tag
45−--
46−-- This list does not include the obsolete @\<command\>@ and @\<keygen\>@ elements.
47−--
48−-- @ nonClosing = ["br", "hr", "img", "meta", "area", "base", "col", "embed", "input", "link", "param", "source", "track", "wbr"] @
49−--
50−-- <https:\/\/www.w3.org\/TR\/html52\/syntax.html#void-elements>
51−nonClosing :: [Text]
52−nonClosing = ["br", "hr", "img", "meta", "area", "base", "col", "embed", "input", "link", "param", "source", "track", "wbr"]
53−
54−data ParseTokenForestError =
55− ParseTokenForestErrorBracketMismatch PStack (Maybe Token)
56− deriving (Eq, Show)
57−
58−data PStack = PStack
59− { _pstackToplevelSiblings :: Forest Token
60− , _pstackParents :: [(Token, Forest Token)]
61− }
62− deriving (Eq, Show)
63−
64−pushParent :: Token -> PStack -> PStack
65−pushParent t (PStack ss ps) = PStack [] ((t, ss) : ps)
66−
67−popParent :: TagName -> PStack -> Either ParseTokenForestError PStack
68−popParent n (PStack ss ((p@(TagOpen n' _), ss') : ps))
69− | n == n' = Right $ PStack (Node p (reverse ss) : ss') ps
70−popParent n pstack
71− = Left $ ParseTokenForestErrorBracketMismatch pstack (Just $ TagClose n)
72−
73−pushFlatSibling :: Token -> PStack -> PStack
74−pushFlatSibling t (PStack ss ps) = PStack (Node t [] : ss) ps
75−
76−-- | convert a 'Forest' of 'Token' into a list of 'Token'.
77−--
78−-- This code correctly handles void elements. Void elements are required to have a start tag and must not have an end tag. See 'nonClosing'.
79−tokensFromForest :: Forest Token -> [Token]
80−tokensFromForest = mconcat . fmap tokensFromTree
81−
82−-- | convert a 'Tree' of 'Token' into a list of 'Token'.
83−--
84−-- This code correctly handles void elements. Void elements are required to have a start tag and must not have an end tag. See 'nonClosing'.
85−tokensFromTree :: Tree Token -> [Token]
86−tokensFromTree (Node o@(TagOpen n _) ts) | n `notElem` nonClosing
87− = [o] <> tokensFromForest ts <> [TagClose n]
88−tokensFromTree (Node t [])
89− = [t]
90−tokensFromTree _
91− = error "renderTokenTree: leaf node with children."
tests/Text/HTML/ParserSpec.hs+22−60
@@ -4,14 +4,11 @@
44{-# LANGUAGE ScopedTypeVariables #-}
55{-# LANGUAGE ViewPatterns #-}
66
7−{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans -fno-warn-unused-imports #-}
7+{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans #-}
88
99module Text.HTML.ParserSpec
1010where
1111
12−import Control.Applicative
13−import Data.Monoid
14−import Data.List ((\\))
1512import qualified Data.Text as T
1613import qualified Data.Text.Lazy as TL
1714import qualified Data.Text.Lazy.Builder as B
@@ -24,89 +21,54 @@ import Text.HTML.Parser
2421instance Arbitrary Token where
2522 arbitrary = oneof [validOpen, validClose, validFlat]
2623
27− shrink (TagOpen n as) = TagOpen n <$> shrink as
28− shrink (TagSelfClose n as) = TagSelfClose n <$> shrink as
29− shrink (TagClose _) = []
30− shrink (ContentText _) = []
31− shrink (ContentChar _) = []
32− shrink (Comment b) = Comment . B.fromText <$> (shrink . TL.toStrict . B.toLazyText $ b)
33− shrink (Doctype t) = Doctype <$> shrink t
24+ shrink (TagOpen n as) = TagOpen n <$> shrink as
25+ shrink (TagClose _) = []
26+ shrink (ContentText _) = []
27+ shrink (ContentChar _) = []
28+ shrink (Comment b) = Comment . B.fromText <$> (shrink . TL.toStrict . B.toLazyText $ b)
29+ shrink (Doctype t) = Doctype <$> shrink t
3430
3531instance Arbitrary Attr where
36− arbitrary = Attr <$> validXmlAttrName <*> validXmlAttrValue
32+ arbitrary = Attr <$> validXmlTag <*> validXmlText
3733 shrink (Attr k v) = Attr <$> shrink k <*> shrink v
3834
3935validOpen :: Gen Token
40−validOpen = TagOpen <$> validXmlTagName <*> arbitrary
36+validOpen = TagOpen <$> validXmlTag <*> arbitrary
4137
4238validClose :: Gen Token
43−validClose = TagClose <$> validXmlTagName
39+validClose = TagClose <$> validXmlTag
4440
4541validFlat :: Gen Token
4642validFlat = oneof
47− [ TagSelfClose <$> validXmlTagName <*> arbitrary
48− , ContentChar <$> validXmlChar
43+ [ ContentChar <$> validXmlChar
4944 , ContentText <$> validXmlText
50− , Comment . B.fromText <$> validXmlCommentText
45+ , Comment . B.fromText <$> validXmlText
5146 , Doctype <$> validXmlText
5247 ]
5348
54−-- FIXME: sometimes it is allowed to use '<' as text token, and we don't test that yet. (whether we
55−-- like this choice or not, we may want to follow the standard here.) (same in tag names, attr
56−-- names). We also avoid '&' since this may produce spurious character references.
5749validXmlChar :: Gen Char
58−validXmlChar = elements (['\x20'..'\x7E'] \\ "\x09\x0a\x0c &/<>")
50+validXmlChar = elements (' ' : ['a'..'z']) -- FIXME: generate wider range of values
51+
52+validXmlTag :: Gen T.Text
53+validXmlTag = T.pack <$> sized (`maxListOf1` elements ['a'..'z']) -- FIXME: generate wider range of values
5954
6055validXmlText :: Gen T.Text
61−validXmlText = T.pack <$> sized (`maxListOf` validXmlChar)
62−
63−validXmlTagName :: Gen T.Text
64−validXmlTagName = do
65− initchar <- elements $ ['a'..'z'] <> ['A'..'Z']
66− thenchars <- sized (`maxListOf` elements (['\x20'..'\x7E'] \\ "\x09\x0a\x0c &/<>"))
67− pure . T.pack $ initchar : thenchars
68−
69−validXmlAttrName :: Gen T.Text
70−validXmlAttrName = do
71− initchar <- elements $ ['a'..'z'] <> ['A'..'Z']
72− thenchars <- sized (`maxListOf` elements (['\x20'..'\x7E'] \\ "\x09\x0a\x0c /=<>\x00"))
73− pure . T.pack $ initchar : thenchars
74−
75−-- FIXME: not sure if @Attr "key" "\""@ should be parseable, but it's not, so we don't test it.
76−validXmlAttrValue :: Gen T.Text
77−validXmlAttrValue = do
78− T.pack <$> sized (`maxListOf` elements (['\x20'..'\x7E'] \\ "\x09\x0a\x0c /=<>\x00\""))
79−
80−-- FIXME: i think this should be 'validXmlChar', but that will fail the test suite.
81−validXmlCommentText :: Gen T.Text
82−validXmlCommentText = do
83− T.pack <$> sized (`maxListOf` elements (['\x20'..'\x7E'] \\ "\x09\x0a\x0c /=<>\x00\"-"))
56+validXmlText = mconcat <$> sized (`maxListOf` (T.cons <$> validXmlChar <*> validXmlTag)) -- FIXME: generate wider range of values
8457
8558maxListOf :: Int -> Gen a -> Gen [a]
8659maxListOf n g = take n <$> listOf g
8760
61+maxListOf1 :: Int -> Gen a -> Gen [a]
62+maxListOf1 (min 1 -> n) g = take n <$> listOf1 g
63+
64+
8865
8966spec :: Spec
9067spec = do
9168 it "parseTokens and renderTokens are inverse" . property . forAllShrink arbitrary shrink $
9269 \(canonicalizeTokens -> tokens)
93− -> (canonicalizeTokens . parseTokens . TL.toStrict . renderTokens $ tokens) `shouldBe` tokens
70+ -> (parseTokens . TL.toStrict . renderTokens $ tokens) `shouldBe` tokens
9471
9572 it "canonicalizeTokens is idempotent" . property . forAllShrink arbitrary shrink $
9673 \tokens
9774 -> canonicalizeTokens tokens `shouldBe` canonicalizeTokens (canonicalizeTokens tokens)
98−
99− describe "regression tests" $ do
100− describe "parseTokens" $ do
101− it "works on `<h1>Heading</h1>`" $ do
102− parseTokens "<h1>Heading</h1>" `shouldBe` [TagOpen "h1" [], ContentText "Heading", TagClose "h1"]
103− it "terminates on truncated tags" $ do
104− parseTokens "19 -167.44 <A HREF=\"http://walrus.wr.usgs" `shouldBe` [ContentText "19 -167.44 ", ContentText ""]
105− it "parses comment correctly" $ do
106− parseTokens "<!-- 3. Change Banner -->" `shouldBe` [Comment " 3. Change Banner "]
107− it "parses commented tag correctly" $ do
108− parseTokens "<!-- img src=\"/www_images/NCEP_GFS.gif\">" `shouldBe` [Comment " img src=\"/www_images/NCEP_GFS.gif\">"]
109− it "parses funky comment" $ do
110− parseTokens "<!-- img src=\"/www_images/NCEP_GFS.gif\"><!- -------------------------------------------------------- >" `shouldBe` [Comment " img src=\"/www_images/NCEP_GFS.gif\"><!- -------------------------------------------------------- >"]
111− it "parses entity" $ do
112− parseTokens "&lt;" `shouldBe` [ContentText "<"]
tests/Text/HTML/TreeSpec.hsdeleted−46
@@ -1,46 +0,0 @@
1−{-# LANGUAGE FlexibleInstances #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE ScopedTypeVariables #-}
4−
5−{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans #-}
6−
7−module Text.HTML.TreeSpec
8−where
9−
10−import Control.Applicative
11−import Data.Tree
12−import Test.Hspec
13−import Test.QuickCheck
14−import Test.QuickCheck.Instances ()
15−import Text.HTML.Parser
16−import Text.HTML.ParserSpec
17−import Text.HTML.Tree
18−import Prelude
19−
20−
21−arbitraryTokenForest :: Gen (Forest Token)
22−arbitraryTokenForest = listOf arbitraryTokenTree
23−
24−arbitraryTokenTree :: Gen (Tree Token)
25−arbitraryTokenTree = oneof
26− [ Node <$> validClosingOpen <*> scale (`div` 5) arbitraryTokenForest
27− , Node <$> validNonClosingOpen <*> pure []
28− , Node <$> validFlat <*> pure []
29− ]
30−
31−
32−validNonClosingOpen :: Gen Token
33−validNonClosingOpen = TagOpen <$> elements nonClosing <*> arbitrary
34−
35−validClosingOpen :: Gen Token
36−validClosingOpen = do
37− n <- validXmlTagName
38− let n' = if n `elem` nonClosing then "_" else n
39− TagOpen n' <$> arbitrary
40−
41−
42−spec :: Spec
43−spec = do
44− it "parseTokenForests and renderTokenForest are inverses"
45− . property . forAllShrink arbitraryTokenForest shrink $
46− \forest -> tokensToForest (tokensFromForest forest) `shouldBe` Right forest