From 109da8c92ee256585324e900e7ec9194566fa3fc Mon Sep 17 00:00:00 2001 From: Oskar Jarczyk Date: Tue, 12 Nov 2013 18:33:32 +0100 Subject: [PATCH] re-integrated with some changes from paulmillr --- Makefile | 5 +- Makefile2 => Makefile.old | 0 README.md | 53 +- check-logins.coffee | 1 + format-users.coffee | 17 +- formatted/active.md | 287 + get-details.coffee | 6 +- get-details.js | 71 + get-users.coffee | 10 +- node_modules/cheerio/.npmignore | 8 + node_modules/cheerio/.travis.yml | 4 + node_modules/cheerio/History.md | 223 + node_modules/cheerio/Makefile | 18 + node_modules/cheerio/Readme.md | 587 + node_modules/cheerio/benchmarks/htmlparser.js | 14 + node_modules/cheerio/index.js | 13 + node_modules/cheerio/lib/api/attributes.js | 149 + node_modules/cheerio/lib/api/manipulation.js | 192 + node_modules/cheerio/lib/api/traversing.js | 116 + node_modules/cheerio/lib/cheerio.js | 143 + node_modules/cheerio/lib/parse.js | 97 + node_modules/cheerio/lib/render.js | 121 + node_modules/cheerio/lib/static.js | 95 + node_modules/cheerio/lib/utils.js | 30 + .../node_modules/cheerio-select/.npmignore | 4 + .../node_modules/cheerio-select/.travis.yml | 5 + .../node_modules/cheerio-select/History.md | 18 + .../node_modules/cheerio-select/Makefile | 7 + .../node_modules/cheerio-select/Readme.md | 51 + .../node_modules/cheerio-select/index.js | 9 + .../node_modules/cheerio-select/lib/select.js | 37 + .../node_modules/CSSselect/.travis.yml | 8 + .../node_modules/CSSselect/LICENSE | 11 + .../node_modules/CSSselect/README.md | 20 + .../CSSselect/browser_functions.js | 35 + .../node_modules/CSSselect/index.js | 736 + .../node_modules/CSSwhat/.travis.yml | 7 + .../CSSselect/node_modules/CSSwhat/LICENSE | 11 + .../CSSselect/node_modules/CSSwhat/index.js | 128 + .../node_modules/CSSwhat/package.json | 33 + .../CSSselect/node_modules/CSSwhat/readme.md | 3 + .../node_modules/CSSwhat/tests/test.js | 42 + .../node_modules/CSSselect/package.json | 45 + .../node_modules/CSSselect/tests/bench.js | 10 + .../CSSselect/tests/docs/W3C_Selectors.html | 2034 +++ .../node_modules/CSSselect/tests/helper.js | 27 + .../CSSselect/tests/nwmatcher/LICENSE | 1 + .../CSSselect/tests/nwmatcher/scotch.js | 359 + .../CSSselect/tests/nwmatcher/test.html | 92 + .../CSSselect/tests/qwery/index.html | 132 + .../CSSselect/tests/qwery/index.js | 548 + .../CSSselect/tests/slickspeed.js | 76 + .../node_modules/cheerio-select/package.json | 36 + .../cheerio/node_modules/entities/LICENSE | 11 + .../node_modules/entities/entities/html4.json | 1 + .../node_modules/entities/entities/html5.json | 1 + .../node_modules/entities/entities/xml.json | 1 + .../cheerio/node_modules/entities/index.js | 117 + .../node_modules/entities/package.json | 44 + .../cheerio/node_modules/entities/readme.md | 27 + .../node_modules/entities/test/mocha.opts | 2 + .../node_modules/entities/test/test.js | 68 + .../node_modules/htmlparser2/.travis.yml | 5 + .../cheerio/node_modules/htmlparser2/LICENSE | 18 + .../node_modules/htmlparser2/README.md | 72 + .../htmlparser2/lib/ElementType.js | 10 + .../htmlparser2/lib/FeedHandler.js | 87 + .../node_modules/htmlparser2/lib/Parser.js | 397 + .../htmlparser2/lib/ProxyHandler.js | 19 + .../node_modules/htmlparser2/lib/Stream.js | 35 + .../htmlparser2/lib/WritableStream.js | 19 + .../node_modules/htmlparser2/lib/index.js | 60 + .../node_modules/domelementtype/LICENSE | 11 + .../node_modules/domelementtype/index.js | 14 + .../node_modules/domelementtype/package.json | 33 + .../node_modules/domelementtype/readme.md | 1 + .../node_modules/domhandler/.travis.yml | 6 + .../node_modules/domhandler/LICENSE | 11 + .../node_modules/domhandler/index.js | 161 + .../node_modules/domhandler/package.json | 43 + .../node_modules/domhandler/readme.md | 99 + .../node_modules/domhandler/runtests.js | 51 + .../domhandler/tests/01-basic.json | 44 + .../domhandler/tests/02-single_tag_1.json | 19 + .../domhandler/tests/03-single_tag_2.json | 24 + .../tests/04-unescaped_in_script.json | 30 + .../domhandler/tests/05-tags_in_comment.json | 21 + .../tests/06-comment_in_script.json | 21 + .../tests/07-unescaped_in_style.json | 23 + .../tests/08-extra_spaces_in_tag.json | 23 + .../domhandler/tests/09-unquoted_attrib.json | 23 + .../tests/10-singular_attribute.json | 18 + .../tests/11-text_outside_tags.json | 23 + .../domhandler/tests/12-text_only.json | 14 + .../domhandler/tests/13-comment_in_text.json | 22 + .../tests/14-comment_in_text_in_script.json | 21 + .../domhandler/tests/15-non-verbose.json | 25 + .../tests/16-ignore_whitespace.json | 46 + .../domhandler/tests/17-xml_namespace.json | 21 + .../tests/18-enforce_empty_tags.json | 19 + .../tests/19-ignore_empty_tags.json | 23 + .../tests/20-template_script_tags.json | 23 + .../tests/21-conditional_comments.json | 18 + .../domhandler/tests/22-lowercase_tags.json | 46 + .../node_modules/domutils/index.js | 224 + .../node_modules/domutils/package.json | 44 + .../node_modules/domutils/readme.md | 1 + .../domutils/tests/00-runtests.js | 64 + .../domutils/tests/02-dom_utils.js | 15 + .../domutils/tests/DomUtils/01-by_id.js | 56 + .../domutils/tests/DomUtils/02-by_tagname.js | 23 + .../domutils/tests/DomUtils/03-by_type.js | 23 + .../domutils/tests/DomUtils/04-outer_html.js | 10 + .../domutils/tests/DomUtils/05-inner_html.js | 10 + .../node_modules/htmlparser2/package.json | 65 + .../htmlparser2/tests/00-runtests.js | 49 + .../htmlparser2/tests/01-events.js | 41 + .../htmlparser2/tests/02-stream.js | 53 + .../node_modules/htmlparser2/tests/03-feed.js | 19 + .../htmlparser2/tests/99-benchmark.js | 26 + .../tests/Documents/Atom_Example.xml | 25 + .../htmlparser2/tests/Documents/Basic.html | 1 + .../tests/Documents/RDF_Example.xml | 63 + .../tests/Documents/RSS_Example.xml | 48 + .../htmlparser2/tests/Events/01-simple.json | 44 + .../htmlparser2/tests/Events/02-template.json | 62 + .../tests/Events/03-lowercase_tags.json | 46 + .../htmlparser2/tests/Events/04-cdata.json | 85 + .../tests/Events/05-cdata-special.json | 89 + .../tests/Events/06-leading-lt.json | 22 + .../tests/Events/07-self-closing.json | 67 + .../tests/Events/08-implicit-close-tags.json | 59 + .../htmlparser2/tests/Feeds/01-rss.js | 34 + .../htmlparser2/tests/Feeds/02-atom.js | 18 + .../htmlparser2/tests/Feeds/_03-rdf.js | 20 + .../htmlparser2/tests/Stream/01-basic.json | 83 + .../htmlparser2/tests/Stream/02-RSS.json | 1093 ++ .../node_modules/htmlparser2/tests/bench.js | 100 + .../htmlparser2/tests/test-helper.js | 22 + .../node_modules/underscore/.npmignore | 4 + .../node_modules/underscore/.travis.yml | 5 + .../cheerio/node_modules/underscore/CNAME | 1 + .../node_modules/underscore/CONTRIBUTING.md | 9 + .../cheerio/node_modules/underscore/LICENSE | 22 + .../cheerio/node_modules/underscore/README.md | 19 + .../node_modules/underscore/favicon.ico | Bin 0 -> 1406 bytes .../node_modules/underscore/index.html | 2467 +++ .../cheerio/node_modules/underscore/index.js | 1 + .../node_modules/underscore/package.json | 42 + .../node_modules/underscore/underscore-min.js | 1 + .../node_modules/underscore/underscore.js | 1226 ++ node_modules/cheerio/package.json | 47 + node_modules/cheerio/test/api.attributes.js | 216 + node_modules/cheerio/test/api.manipulation.js | 312 + node_modules/cheerio/test/api.traversing.js | 254 + node_modules/cheerio/test/api.utils.js | 94 + node_modules/cheerio/test/cheerio.js | 190 + node_modules/cheerio/test/fixtures.js | 21 + node_modules/cheerio/test/mocha.opts | 2 + node_modules/cheerio/test/parse.js | 336 + node_modules/cheerio/test/render.js | 53 + node_modules/cheerio/test/utilities.js | 33 + package.json | 6 +- raw/github-languages-stats.json | 30 + raw/github-users-stats.json | 14676 ++++++++++++++++ sync.sh | 3 + temp-logins.json | 1001 ++ 167 files changed, 32504 insertions(+), 27 deletions(-) rename Makefile2 => Makefile.old (100%) create mode 100644 formatted/active.md create mode 100644 get-details.js create mode 100644 node_modules/cheerio/.npmignore create mode 100644 node_modules/cheerio/.travis.yml create mode 100644 node_modules/cheerio/History.md create mode 100644 node_modules/cheerio/Makefile create mode 100644 node_modules/cheerio/Readme.md create mode 100644 node_modules/cheerio/benchmarks/htmlparser.js create mode 100644 node_modules/cheerio/index.js create mode 100644 node_modules/cheerio/lib/api/attributes.js create mode 100644 node_modules/cheerio/lib/api/manipulation.js create mode 100644 node_modules/cheerio/lib/api/traversing.js create mode 100644 node_modules/cheerio/lib/cheerio.js create mode 100644 node_modules/cheerio/lib/parse.js create mode 100644 node_modules/cheerio/lib/render.js create mode 100644 node_modules/cheerio/lib/static.js create mode 100644 node_modules/cheerio/lib/utils.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/.npmignore create mode 100644 node_modules/cheerio/node_modules/cheerio-select/.travis.yml create mode 100644 node_modules/cheerio/node_modules/cheerio-select/History.md create mode 100644 node_modules/cheerio/node_modules/cheerio-select/Makefile create mode 100644 node_modules/cheerio/node_modules/cheerio-select/Readme.md create mode 100644 node_modules/cheerio/node_modules/cheerio-select/index.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/lib/select.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/.travis.yml create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/LICENSE create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/README.md create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/browser_functions.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/index.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/node_modules/CSSwhat/.travis.yml create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/node_modules/CSSwhat/LICENSE create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/node_modules/CSSwhat/index.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/node_modules/CSSwhat/package.json create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/node_modules/CSSwhat/readme.md create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/node_modules/CSSwhat/tests/test.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/package.json create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/bench.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/docs/W3C_Selectors.html create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/helper.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/nwmatcher/LICENSE create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/nwmatcher/scotch.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/nwmatcher/test.html create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.html create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/slickspeed.js create mode 100644 node_modules/cheerio/node_modules/cheerio-select/package.json create mode 100644 node_modules/cheerio/node_modules/entities/LICENSE create mode 100644 node_modules/cheerio/node_modules/entities/entities/html4.json create mode 100644 node_modules/cheerio/node_modules/entities/entities/html5.json create mode 100644 node_modules/cheerio/node_modules/entities/entities/xml.json create mode 100644 node_modules/cheerio/node_modules/entities/index.js create mode 100644 node_modules/cheerio/node_modules/entities/package.json create mode 100644 node_modules/cheerio/node_modules/entities/readme.md create mode 100644 node_modules/cheerio/node_modules/entities/test/mocha.opts create mode 100644 node_modules/cheerio/node_modules/entities/test/test.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/.travis.yml create mode 100644 node_modules/cheerio/node_modules/htmlparser2/LICENSE create mode 100644 node_modules/cheerio/node_modules/htmlparser2/README.md create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/ElementType.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/FeedHandler.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/ProxyHandler.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/Stream.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/WritableStream.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/lib/index.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domelementtype/LICENSE create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domelementtype/index.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domelementtype/package.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domelementtype/readme.md create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/.travis.yml create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/LICENSE create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/package.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/readme.md create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/runtests.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/01-basic.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/02-single_tag_1.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/03-single_tag_2.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/04-unescaped_in_script.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/05-tags_in_comment.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/06-comment_in_script.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/07-unescaped_in_style.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/08-extra_spaces_in_tag.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/09-unquoted_attrib.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/10-singular_attribute.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/11-text_outside_tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/12-text_only.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/13-comment_in_text.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/14-comment_in_text_in_script.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/15-non-verbose.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/16-ignore_whitespace.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/17-xml_namespace.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/18-enforce_empty_tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/19-ignore_empty_tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/20-template_script_tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/21-conditional_comments.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/22-lowercase_tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/index.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/package.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/readme.md create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/00-runtests.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/02-dom_utils.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/01-by_id.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/02-by_tagname.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/03-by_type.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/04-outer_html.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/05-inner_html.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/package.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/00-runtests.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/01-events.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/02-stream.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/03-feed.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/99-benchmark.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Documents/Atom_Example.xml create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Documents/Basic.html create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Documents/RDF_Example.xml create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Documents/RSS_Example.xml create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/01-simple.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/02-template.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/03-lowercase_tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/04-cdata.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/05-cdata-special.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/06-leading-lt.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/07-self-closing.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Events/08-implicit-close-tags.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Feeds/01-rss.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Feeds/02-atom.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Feeds/_03-rdf.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Stream/01-basic.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/Stream/02-RSS.json create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/bench.js create mode 100644 node_modules/cheerio/node_modules/htmlparser2/tests/test-helper.js create mode 100644 node_modules/cheerio/node_modules/underscore/.npmignore create mode 100644 node_modules/cheerio/node_modules/underscore/.travis.yml create mode 100644 node_modules/cheerio/node_modules/underscore/CNAME create mode 100644 node_modules/cheerio/node_modules/underscore/CONTRIBUTING.md create mode 100644 node_modules/cheerio/node_modules/underscore/LICENSE create mode 100644 node_modules/cheerio/node_modules/underscore/README.md create mode 100644 node_modules/cheerio/node_modules/underscore/favicon.ico create mode 100644 node_modules/cheerio/node_modules/underscore/index.html create mode 100644 node_modules/cheerio/node_modules/underscore/index.js create mode 100644 node_modules/cheerio/node_modules/underscore/package.json create mode 100644 node_modules/cheerio/node_modules/underscore/underscore-min.js create mode 100644 node_modules/cheerio/node_modules/underscore/underscore.js create mode 100644 node_modules/cheerio/package.json create mode 100644 node_modules/cheerio/test/api.attributes.js create mode 100644 node_modules/cheerio/test/api.manipulation.js create mode 100644 node_modules/cheerio/test/api.traversing.js create mode 100644 node_modules/cheerio/test/api.utils.js create mode 100644 node_modules/cheerio/test/cheerio.js create mode 100644 node_modules/cheerio/test/fixtures.js create mode 100644 node_modules/cheerio/test/mocha.opts create mode 100644 node_modules/cheerio/test/parse.js create mode 100644 node_modules/cheerio/test/render.js create mode 100644 node_modules/cheerio/test/utilities.js create mode 100644 raw/github-languages-stats.json create mode 100644 raw/github-users-stats.json create mode 100644 sync.sh create mode 100644 temp-logins.json diff --git a/Makefile b/Makefile index 2b0f3d2..c705658 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,9 @@ all: get format get: - ../node_modules/coffee-script/bin/coffee -c get-repositories.coffee - ../node_modules/coffee-script/bin/coffee -c get-details.coffee + ../node_modules/coffee-script/bin/coffee get-users.coffee + ../node_modules/coffee-script/bin/coffee get-details.coffee format: ../node_modules/coffee-script/bin/coffee format-languages.coffee ../node_modules/coffee-script/bin/coffee format-users.coffee - ../node_modules/coffee-script/bin/coffee format-repositories.coffee diff --git a/Makefile2 b/Makefile.old similarity index 100% rename from Makefile2 rename to Makefile.old diff --git a/README.md b/README.md index 9c8a441..2ff6004 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,46 @@ -cs-github-wikiteams -=================== +# GitHub top users -This software is available to public +Generated stats: [git.io/top](http://git.io/top). -Copyright (C) 2013 - WikiTeams contributors +## Usage -cs-github-wikiteams is for free. You don't have to pay for it, and you can use it any way you want. It is developed as an Open Source project under the GNU General Public License (GPL). That means you have full access to the source code of this program. You can find it on our website at https://github.com/wikiteams/cs-github-wikiteams -Should you wish to modify or redistribute this program, or any part of it, you should read the full terms and conditions set out in the license agreement before doing so. A copy of the license is available on our website. -If you simply wish to install and use this software, you need only be aware of the disclaimer conditions in the license, which are set out below. -NO WARRANTY -Because the program is licensed free of charge, there is no warranty for the program, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide the program "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the program is with you. Should the program prove defective, you assume the cost of all necessary servicing, repair or correction. -In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute the program as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to use the program (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the program to operate with any other programs), even if such holder or other party has been advised of the possibility of such damages. +Make sure you’ve got node.js and coffeescript installed. -This script allows to parse 1000 "biggest repositories" with a coffescript +```bash +# Install deps. +npm install +# Download and format everything. +make + +# or + +# Download data. +make get + +# Generate stats. +make format +``` + +## License + +The MIT License (MIT) + +Copyright (c) 2013 Paul Miller (http://paulmillr.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/check-logins.coffee b/check-logins.coffee index dd7bab8..1e3ecac 100644 --- a/check-logins.coffee +++ b/check-logins.coffee @@ -14,5 +14,6 @@ filtered = prev .sort (a, b) -> b.followers - a.followers +console.log 'Filtered logins:' console.log filtered console.log JSON.stringify filtered.map(utils.prop 'login'), null, 2 diff --git a/format-users.coffee b/format-users.coffee index 1bb2006..8f3a851 100644 --- a/format-users.coffee +++ b/format-users.coffee @@ -1,6 +1,13 @@ #!/usr/bin/env coffee fs = require 'fs' +# Reducer. +minimum = (min, current) -> + if current < min + current + else + min + top = (stats, field, type) -> get = (stat) -> value = stat[field] @@ -23,9 +30,9 @@ top = (stats, field, type) -> .join ', ' stats2markdown = (datafile, mdfile, title) -> - minFollowers = 176 - maxNumber = 256 stats = require(datafile) + minFollowers = stats.map((_) -> _.followers).reduce(minimum, 1000) + maxNumber = 256 today = new Date() from = new Date() @@ -46,12 +53,12 @@ stats2markdown = (datafile, mdfile, title) -> .slice(0, #{maxNumber}) ``` - Made with data mining of GitHub.com ([raw data](https://gist.github.com/4524946), [script](https://github.com/paulmillr/top-github-users)) by [@paulmillr](https://github.com/paulmillr) with contribs of [@lifesinger](https://githubcom/lifesinger). Updated every sunday. + Made with data mining of GitHub.com ([raw data](https://gist.github.com/4524946), [script](https://github.com/paulmillr/top-github-users)) by [@paulmillr](https://github.com/paulmillr) with contribs of [@lifesinger](https://github.com/lifesinger). Updated once per week. - - + + diff --git a/formatted/active.md b/formatted/active.md new file mode 100644 index 0000000..81b280d --- /dev/null +++ b/formatted/active.md @@ -0,0 +1,287 @@ +# Most active GitHub users ([git.io/top](http://git.io/top)) + +The count of contributions (summary of Pull Requests, opened issues and commits) to public repos at GitHub.com from **Mon, 12 Nov 2012 16:47:35 GMT** till **Tue, 12 Nov 2013 16:47:35 GMT**. + +Only first 1000 GitHub users according to the count of followers are taken. +This is because of limitations of GitHub search. Sorting algo in pseudocode: + +```coffeescript +githubUsers + .filter((user) -> user.followers > 29) + .sortBy('contributions') + .slice(0, 256) +``` + +Made with data mining of GitHub.com ([raw data](https://gist.github.com/4524946), [script](https://github.com/paulmillr/top-github-users)) by [@paulmillr](https://github.com/paulmillr) with contribs of [@lifesinger](https://github.com/lifesinger). Updated once per week. + +
#UsernameContributionsUserContribs Language Location
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#UserContribsLanguageLocation
#1 weierophinney (Matthew Weier O'Phinney) 7873 PHP Sioux Falls, SD, USA
#2 fabpot (Fabien Potencier) 7476 PHP Paris, France
#3 brianchandotcom (Brian Chan) 5915 Java Los Angeles, CA
#4 jdalton (John-David Dalton) 5786 JavaScript http://twitter.com/jdalton
#5 taylorotwell (Taylor Otwell) 5760 PHP Arkansas
#6 tmcw (Tom MacWright) 5610 JavaScript Washington, DC
#7 tokuhirom (Tokuhiro Matsuno) 5239 Perl Tokyo, Japan
#8 substack (James Halliday) 5153 JavaScript Oakland, California, USA
#9 ekmett (Edward Kmett) 5023 Haskell Cambridge, MA
#10 visionmedia (TJ Holowaychuk) 5009 JavaScript Victoria, BC, Canada
#11 michaelklishin (Michael Klishin) 4990 Ruby
#12 dominictarr (Dominic Tarr) 4876 JavaScript New Zealand
#13 fsouza (Francisco Souza) 4811 Python Rio de Janeiro, Brazil
#14 c9s (Pedro) 4653 Perl Taiwan
#15 balupton (Benjamin Arthur Lupton) 4591 JavaScript Sydney, Australia
#16 mitchellh (Mitchell Hashimoto) 4315 Ruby San Francisco, CA
#17 kripken (Alon Zakai) 4170 JavaScript
#18 mdo (Mark Otto) 4031 CSS San Francisco, CA
#19 lepture (Hsiaoming Yang) 4009 Python Shenzhen, China
#20 zenorocha (Zeno Rocha) 3811 JavaScript Brazil
#21 ornicar (Thibault Duplessis) 3801 PHP France
#22 jspahrsummers (Justin Spahr-Summers) 3712 Objective-C Seattle, WA
#23 sferik (Erik Michaels-Ober) 3697 Ruby Berlin and San Francisco
#24 pippinsplugins (Pippin Williamson) 3697 PHP Lawrence, KS
#25 kennethreitz (Kenneth Reitz) 3680 Python Winchester, VA
#26 feross (Feross Aboukhadijeh) 3622 JavaScript Stanford, CA
#27 springmeyer (Dane Springmeyer) 3596 C Winthrop, WA
#28 fogus (Fogus) 3479 Clojure DC
#29 ujihisa 3445 Ruby Vancouver, Canada
#30 kytrinyx (Katrina Owen) 3437 Ruby Denver, Colorado
#31 dcramer (David Cramer) 3416 Python San Francisco, CA
#32 gka 3383 JavaScript Germany
#33 randx (Dmitriy Zaporozhets) 3261 Ruby Kharkiv, UA
#34 drnic (Dr Nic Williams) 3258 Ruby Palo Alto, CA, USA
#35 rstacruz (Rico Sta. Cruz) 3249 Ruby Manila, Philippines
#36 rvagg (Rod Vagg) 3207 JavaScript South Coast NSW, Australia
#37 josevalim (José Valim) 3115 Ruby Kraków, Poland
#38 bergie (Henri Bergius) 3106 JavaScript Berlin, Germany
#39 mattn (mattn) 3009 VimL Osaka, Japan
#40 lifesinger (lifesinger) 3004 JavaScript Hangzhou, China
#41 lsmith77 (Lukas Kahwe Smith) 2990 PHP Zurich, Switzerland
#42 hadley (Hadley Wickham) 2985 R Houston, TX
#43 alex (Alex Gaynor) 2974 Python San Francisco
#44 kohsuke (Kohsuke Kawaguchi) 2973 Java San Jose, California
#45 paulmillr (Paul Miller) 2966 JavaScript Ukraine
#46 steveklabnik (Steve Klabnik) 2953 Ruby Santa Monica, CA
#47 maxogden (Max Ogden) 2927 JavaScript Oakland, CA
#48 ednapiranha (Jen Fong-Adwent) 2916 JavaScript Portland, Oregon
#49 radar (Ryan Bigg) 2907 Ruby Melbourne, Australia
#50 andrewsmedina (Andrews Medina) 2884 Python Rio de Janeiro
#51 postmodern (Postmodern) 2882 Ruby
#52 willdurand (William Durand) 2873 PHP France
#53 sindresorhus (Sindre Sorhus) 2862 JavaScript Norway
#54 bbatsov (Bozhidar Batsov) 2856 Emacs Sofia, Bulgaria
#55 hueniverse (Eran Hammer) 2814 JavaScript Los Gatos, CA
#56 markstory (Mark Story) 2803 PHP Toronto, Ontario
#57 jeromeetienne (Jerome Etienne) 2784 JavaScript Paris, france
#58 jwiegley (John Wiegley) 2776 Haskell Peoria, Illinois, USA
#59 example42 (Alessandro Franceschi) 2746 Puppet Milan, Italy
#60 benbalter (Ben Balter) 2743 JavaScript Washington, DC
#61 jordansissel (Jordan Sissel) 2733 Ruby Silicon Valley
#62 yihui (Yihui Xie) 2728 R Ames, IA
#63 Raynos (Raynos (Jake Verbaten)) 2721 JavaScript San Francisco
#64 qiangxue (Qiang Xue) 2672 Virginia, U.S.A.
#65 Ocramius (Marco Pivetta) 2668 PHP Germany
#66 scribu (Cristi Burcă) 2653 PHP Cluj-Napoca, Romania
#67 jcasimir (Jeff Casimir) 2638 Ruby Denver, CO
#68 Shougo (Shougo) 2619 VimL Japan
#69 eduardolundgren (Eduardo Lundgren) 2612 JavaScript Brazil
#70 JakeWharton (Jake Wharton) 2589 Java San Francisco, CA
#71 pydanny (Daniel Greenfeld) 2571 Python Inland Empire, CA
#72 rafaelfranca (Rafael Mendonça França) 2562 Ruby São Paulo, Brazil
#73 snoyberg (Michael Snoyman) 2493 Haskell Israel
#74 samuelclay (Samuel Clay) 2458 JavaScript San Francisco
#75 jtimberman (Joshua Timberman) 2426 Ruby Denver, CO
#76 aheckmann (Aaron Heckmann) 2407 JavaScript San Jose, CA
#77 jaredhanson (Jared Hanson) 2387 JavaScript Oakland, CA
#78 purcell (Steve Purcell) 2364 Emacs Chester, UK
#79 ayende (Ayende Rahien) 2364 C Israel
#80 audreyt (唐鳳) 2327 Perl Taipei, Taiwan
#81 dkubb (Dan Kubb) 2317 Ruby Mission, BC, Canada
#82 mbostock (Mike Bostock) 2264 JavaScript San Francisco, CA
#83 viatropos (Lance Pollard) 2243 JavaScript San Francisco
#84 dg (David Grudl) 2240 PHP
#85 paulcbetts (Paul Betts) 2233 C San Francisco, CA
#86 torvalds (Linus Torvalds) 2229 C Portland, OR
#87 freddix (Fryderyk Dziarmagowski) 2212 Shell
#88 isaacs (Isaac Z. Schlueter) 2211 JavaScript Oakland CA
#89 miyagawa (Tatsuhiko Miyagawa) 2204 Perl San Francisco, CA
#90 mythz (Demis Bellot) 2199 Shell New York
#91 headius (Charles Oliver Nutter) 2183 Ruby
#92 domenic (Domenic Denicola) 2179 JavaScript New York, NY
#93 creationix (Tim Caswell) 2177 JavaScript Red Lick, TX, USA
#94 Cocoanetics (Oliver Drobnik) 2176 Objective-C Weistrach, Austria
#95 ianstormtaylor (Ian Storm Taylor) 2174 JavaScript San Francisco, CA
#96 rjbs (Ricardo Signes) 2167 Perl Bethlehem, PA, USA
#97 roojs (Alan Knowles) 2159 PHP Hong Kong
#98 mattt (Mattt Thompson) 2146 Ruby San Francisco, CA
#99 ask (Ask Solem Hoel) 2117 Python London, UK
#100 igorw (Igor Wiedler) 2086 PHP Winterthur, Zürich, Switzerland
#101 romaonthego (Roman Efimov) 2055 Objective-C Chicago
#102 andrew (Andrew Nesbitt) 2024 JavaScript Bath, UK
#103 remy (Remy Sharp) 1998 JavaScript Brighton, UK
#104 gitster (Junio C Hamano) 1995 Perl Mountain View, CA
#105 rkh (Konstantin Haase) 1973 Ruby Berlin
#106 agentzh (Yichun Zhang) 1973 Perl San Francisco, CA, USA
#107 tenderlove (Aaron Patterson) 1971 Ruby Seattle
#108 jamesward (James Ward) 1922 Java
#109 dustin (Dustin Sallings) 1920 Go Santa Clara, CA
#110 koush (Koushik Dutta) 1920 Shell Seattle, WA
#111 drogus (Piotr Sarnacki) 1899 Ruby Warsaw
#112 kevinsawicki (Kevin Sawicki) 1885 JavaScript Redwood City, CA
#113 steipete (Peter Steinberger) 1871 Objective-C Vienna, Austria
#114 robashton (Rob "Hurricane" Ashton) 1862 JavaScript London
#115 gfx (Fuji, Goro) 1850 Perl Tokyo, Japan
#116 marijnh (Marijn Haverbeke) 1829 JavaScript Berlin
#117 mikejolley (Mike Jolley) 1815 PHP England, UK
#118 davidfowl (David Fowler) 1808 C Bellevue, WA
#119 faux123 (Paul Reioux) 1801 Shell Los Angeles
#120 ai (Andrey Sitnik) 1783 Ruby Saint Petersburg, Russia
#121 n1k0 (Nicolas Perriault) 1777 JavaScript Montpellier, France
#122 SamSaffron (Sam) 1774 Ruby Sydney, Australia
#123 jgm (John MacFarlane) 1769 Haskell Berkeley, CA
#124 mourner (Vladimir Agafonkin) 1760 JavaScript Kiev, Ukraine
#125 hsbt (SHIBATA Hiroshi) 1739 Ruby Japan
#126 r7kamura (r7kamura) 1736 Ruby Tokyo, Japan
#127 3rd-Eden (Arnout Kazemier) 1729 JavaScript Drachten, the Netherlands
#128 obviousjim (James George) 1724 C Brooklyn, New York
#129 FooBarWidget (Hongli Lai) 1721 Ruby Earth
#130 indutny (Fedor Indutny) 1714 JavaScript Russia
#131 sorbits (Allan Odgaard) 1714 Ruby Denmark
#132 weaverryan (Ryan Weaver) 1712 PHP Nashville, TN
#133 mizzy (Gosuke Miyashita) 1708 Ruby Kanagawa, Japan
#134 necolas (Nicolas Gallagher) 1698 JavaScript San Francisco, CA
#135 RubyLouvre (司徒正美) 1690 JavaScript China
#136 leafo (leaf) 1688 MoonScript San Francisco
#137 durran (Durran Jordan) 1673 Ruby Berlin, Deutschland
#138 graemerocher 1672 Groovy
#139 shama (Kyle ☱☲☳☴☵☷ ☶ Robinson ☱☲ ☳☴☵☶☷ Young) 1669 JavaScript Napa, CA
#140 TooTallNate (Nathan Rajlich) 1655 JavaScript San Rafael, CA
#141 Seldaek (Jordi Boggiano) 1651 PHP Zürich, Zurich, Switzerland
#142 shiffman (Daniel Shiffman) 1622 Java
#143 addyosmani (Addy Osmani) 1620 JavaScript London, England
#144 jedi4ever (Patrick Debois) 1612 Ruby Belgium
#145 aslakhellesoy (Aslak Hellesøy) 1606 Ruby London, UK
#146 kraih (Sebastian Riedel) 1603 Perl Germany
#147 azer (Azer Koçulu) 1589 JavaScript Oakland, CA
#148 tommy351 (SkyArrow) 1578 JavaScript Taipei
#149 jmettraux (John Mettraux) 1577 Ruby Hiroshima
#150 carlosantoniodasilva (Carlos Antonio da Silva) 1574 Ruby Rio do Sul, Santa Catarina, Brasil
#151 scottgonzalez (Scott González) 1571 JavaScript York, PA
#152 MatthewMueller (Matthew Mueller) 1568 JavaScript San Francisco, CA
#153 soyjavi (Javi Jiménez) 1568 CoffeeScript Bilbao, ES
#154 solnic (Piotr Solnica) 1553 Ruby Poland, Kraków
#155 audreyr (Audrey Roy) 1553 Python Inland Empire, CA
#156 thomasdavis (Thomas Davis) 1550 JavaScript Brisbane, Australia
#157 mrdoob (Mr.doob) 1550 JavaScript Barcelona, Spain
#158 michael (Michael Aufreiter) 1548 JavaScript Linz, Austria
#159 ericholscher (Eric Holscher) 1545 Python Portland, Or
#160 desandro (David DeSandro) 1543 JavaScript Brooklyn, NY
#161 jsuereth (Josh Suereth) 1519 Scala Pittsburgh, PA
#162 ebidel (Eric Bidelman) 1519 JavaScript San Francisco, CA
#163 svenfuchs (Sven Fuchs) 1518 Ruby Germany/Berlin
#164 jcoglan (James Coglan) 1513 Ruby London, UK
#165 vojtajina (Vojta Jina) 1492 JavaScript San Francisco Bay Area
#166 amatsuda (Akira Matsuda) 1491 Ruby Tokyo
#167 phalcon (Phalcon) 1481 PHP
#168 beberlei (Benjamin Eberlei) 1479 PHP Germany
#169 jashkenas (Jeremy Ashkenas) 1446 Ruby On the Road
#170 benoitc (Benoit Chesneau) 1431 Python Creil, France
#171 gregkh (Greg Kroah-Hartman) 1429 C
#172 charliesome (Charlie Somerville) 1421 Ruby Melbourne, Australia
#173 jtauber (James Tauber) 1384 Python Burlington, MA
#174 indexzero (Charlie Robbins) 1373 JavaScript NYC
#175 mathiasbynens (Mathias Bynens) 1368 JavaScript Belgium
#176 josegonzalez (Jose Diaz-Gonzalez) 1367 PHP New York, NY
#177 kana (Kana Natsuno) 1366 VimL Tokyo, Japan
#178 ryanseys (Ryan Seys) 1360 JavaScript Toronto
#179 tarcieri (Tony Arcieri) 1351 Ruby San Francisco, CA
#180 indirect (André Arko) 1346 Ruby San Francisco
#181 johnmyleswhite (John Myles White) 1338 Julia Brooklyn, NY
#182 davglass (Dav Glass) 1335 JavaScript Marion, IL
#183 darkwing (David Walsh) 1328 JavaScript Madison, Wisconsin, United States
#184 carljm (Carl Meyer) 1328 Python Rapid City, SD
#185 pengwynn (Wynn Netherland) 1308 Ruby TX
#186 yinwang0 (Yin Wang) 1289 Scheme San Francisco
#187 swannodette (David Nolen) 1266 Clojure New York
#188 bitprophet (Jeff Forcier) 1262 Python Lafayette, CA
#189 btford (Brian Ford) 1256 JavaScript Mountain View, CA
#190 fengmk2 (fengmk2) 1246 JavaScript Hangzhou, China
#191 csswizardry (Harry Roberts) 1238 Shell Leeds, UK
#192 jezdez (Jannis Leidel) 1237 Python Berlin, Germany
#193 seancribbs (Sean Cribbs) 1236 Ruby DeKalb, IL
#194 parndt (Philip Arndt) 1235 Ruby Christchurch, New Zealand
#195 yuvipanda (Yuvi Panda) 1234 Python Chennai
#196 samdark (Alexander Makarov) 1230 PHP Russia
#197 karmi (Karel Minarik) 1225 Ruby Prague, Czech Republic
#198 klen (Kirill Klenov) 1218 Python Russia, Moscow
#199 chloerei (Rei) 1215 Ruby china, beijing
#200 alloy (Eloy Durán) 1215 Ruby Amsterdam, the Netherlands
#201 mmalecki (Maciej Małecki) 1212 JavaScript Poznań, Poland
#202 ericam (Eric Meyer) 1208 Ruby Denver, CO
#203 joshaber (Josh Abernathy) 1206 Objective-C Yellow Springs, OH
#204 saberma 1197 Ruby ShenZhen China
#205 Gozala (Irakli Gozalishvili) 1190 JavaScript San Francisco, USA
#206 chjj (Christopher Jeffrey) 1185 JavaScript MN
#207 JacksonTian (Jackson Tian) 1177 JavaScript Hangzhou, China
#208 soffes (Sam Soffes) 1175 Ruby San Francisco
#209 twada (Takuto Wada) 1173 JavaScript Tokyo, Japan
#210 jrburke (James Burke) 1170 JavaScript
#211 levey (朱建刚) 1168 Objective-C Hangzhou, China
#212 lloyd (Lloyd Hilaiel) 1164 JavaScript Denver, Colorado
#213 kangax (Juriy Zaytsev) 1155 JavaScript New York
#214 ingydotnet (Ingy döt Net) 1153 Perl Seattle
#215 jnunemaker (John Nunemaker) 1151 Ruby South Bend, IN, USA
#216 bnoordhuis (Ben Noordhuis) 1149 C Gouda, the Netherlands
#217 mitsuhiko (Armin Ronacher) 1148 Python United Kingdom / Austria
#218 technomancy (Phil Hagelberg) 1148 Clojure Seattle, WA, USA
#219 kaepora (Nadim Kobeissi) 1146 JavaScript Montréal, QC
#220 ProLoser (Dean Sofer) 1145 PHP San Francisco
#221 arturoc (arturo) 1141 C
#222 tpope (Tim Pope) 1134 VimL Brooklyn, NY
#223 kylemcdonald (Kyle McDonald) 1130 C Brooklyn, New York
#224 rwaldron (Rick Waldron) 1129 JavaScript Brooklyn, NY
#225 sdiehl (Stephen Diehl) 1126 Python Boston, MA
#226 rmcc (Ricardo Cerqueira) 1121 C
#227 loopj (James Smith) 1114 JavaScript San Francisco, CA
#228 maryrosecook (Mary Rose Cook) 1110 JavaScript New York City
#229 zenspider (Ryan Davis) 1104 Ruby Seattle, WA
#230 samaaron (Sam Aaron) 1101 Clojure Cambridge, UK
#231 kriskowal (Kris Kowal) 1091 JavaScript Pasadena, CA, USA
#232 xushiwei 1090 C
#233 derickr (Derick Rethans) 1089 PHP London, England
#234 jmathai (Jaisen Mathai) 1088 PHP San Francisco / Sunnyvale, CA USA
#235 pgte (Pedro Teixeira) 1086 JavaScript Funchal, Portugal
#236 felixge (Felix Geisendörfer) 1086 JavaScript Berlin, Germany
#237 rdegges (Randall Degges) 1085 Python Bakersfield
#238 cowboy (Ben Alman) 1084 JavaScript Boston, MA
#239 mde (Matthew Eernisse) 1080 JavaScript San Francisco, California, USA
#240 bradfitz (Brad Fitzpatrick) 1079 Go San Francisco, CA
#241 soimort (Mort Yao) 1077 Shell Skåne, Sweden
#242 Raynes (Anthony Grimes) 1076 Clojure Los Angeles, CA
#243 daleharvey (Dale Harvey) 1069 JavaScript Edinburgh, Scotland
#244 ricardoquesada (Ricardo Quesada) 1068 Objective-C San Francisco, CA. USA
#245 jaspervdj (Jasper Van der Jeugt) 1066 Haskell Lokeren & Ghent, Belgium
#246 lilydjwg (依云) 1065 Python
#247 matz (Yukihiro "Matz" Matsumoto) 1063 Matsue, Japan
#248 quarnster (Fredrik Ehnbom) 1057 Python Stockholm, Sweden
#249 roidrage (Mathias Meyer) 1054 Ruby Berlin, Germany
#250 schneems (Richard Schneeman) 1052 Ruby Austin, Tx
#251 Haacked (Phil Haack) 1046 C Bellevue, WA
#252 naoya (Naoya Ito) 1043 Perl Tokyo, Japan
#253 jesusabdullah (Joshua Holbrook) 1036 JavaScript South Salt Lake, Utah
#254 wycats (Yehuda Katz) 1035 Ruby San Francisco
#255 kentaro (Kentaro Kuribayashi) 1025 Ruby Tokyo, Japan
#256 gabrielfalcao (Gabriel Falcão) 1025 Python Brooklyn, NY
+ +## Top 10 users from this list by other metrics: + +* **Followers:** [mojombo](https://github.com/mojombo) (16k), [torvalds](https://github.com/torvalds) (13k), [defunkt](https://github.com/defunkt) (12k), [schacon](https://github.com/schacon) (9.7k), [paulirish](https://github.com/paulirish) (9.1k), [pjhyett](https://github.com/pjhyett) (8k), [visionmedia](https://github.com/visionmedia) (6.3k), [jeresig](https://github.com/jeresig) (6k), [addyosmani](https://github.com/addyosmani) (5.6k), [ryanb](https://github.com/ryanb) (5.1k), [douglascrockford](https://github.com/douglascrockford) (5k), [dhh](https://github.com/dhh) (4.6k), [jashkenas](https://github.com/jashkenas) (4.5k), [wycats](https://github.com/wycats) (4.4k), [kennethreitz](https://github.com/kennethreitz) (4.2k) +* **Current contributions streak:** [sferik](https://github.com/sferik) (366), [paulmillr](https://github.com/paulmillr) (314), [dustin](https://github.com/dustin) (312), [soimort](https://github.com/soimort) (312), [Ocramius](https://github.com/Ocramius) (310), [qiangxue](https://github.com/qiangxue) (184), [michaelklishin](https://github.com/michaelklishin) (157), [kytrinyx](https://github.com/kytrinyx) (156), [jtauber](https://github.com/jtauber) (134), [leafo](https://github.com/leafo) (128), [jmettraux](https://github.com/jmettraux) (123), [jdalton](https://github.com/jdalton) (112), [markstory](https://github.com/markstory) (108), [lotem](https://github.com/lotem) (73), [BYVoid](https://github.com/BYVoid) (72) +* **Organisations:** [leto](https://github.com/leto) (20), [paulirish](https://github.com/paulirish) (19), [sferik](https://github.com/sferik) (17), [steveklabnik](https://github.com/steveklabnik) (15), [rafl](https://github.com/rafl) (14), [addyosmani](https://github.com/addyosmani) (14), [hsbt](https://github.com/hsbt) (14), [wycats](https://github.com/wycats) (14), [rkh](https://github.com/rkh) (13), [yrashk](https://github.com/yrashk) (13), [sindresorhus](https://github.com/sindresorhus) (13), [viljamis](https://github.com/viljamis) (12), [dscape](https://github.com/dscape) (12), [EvanDotPro](https://github.com/EvanDotPro) (11), [mattt](https://github.com/mattt) (11) \ No newline at end of file diff --git a/get-details.coffee b/get-details.coffee index 1719c55..2d0fa47 100644 --- a/get-details.coffee +++ b/get-details.coffee @@ -8,9 +8,9 @@ getStats = (html, url) -> $ = cheerio.load html byProp = (field) -> $("[itemprop='#{field}']") getInt = (text) -> parseInt text.replace ',', '' - getOrgName = (index, item) -> $(item).attr('title') + getOrgName = (item) -> $(item).attr('title') getFollowers = -> - text = $('.stats li:nth-child(1) a').text().trim() + text = $('.vcard-stats > a:nth-child(1) > .vcard-stat-count').text().trim() multiplier = if text.indexOf('k') > 0 then 1000 else 1 (parseFloat text) * multiplier @@ -23,7 +23,7 @@ getStats = (html, url) -> language: (/\sin ([\w-]+)/.exec(pageDesc)?[1] ? '') gravatar: byProp('image').attr('href') followers: getFollowers() - organizations: $('.orgs li > a').map(getOrgName) + organizations: $('.vcard-orgs .vcard-org-avatar').toArray().map(getOrgName) contributions: getInt $('.contrib-day > .num').text() contributionsStreak: getInt $('.contrib-streak > .num').text() contributionsCurrentStreak: getInt $('.contrib-streak-current > .num').text() diff --git a/get-details.js b/get-details.js new file mode 100644 index 0000000..a7f5462 --- /dev/null +++ b/get-details.js @@ -0,0 +1,71 @@ +// Generated by CoffeeScript 1.6.1 +(function() { + var cheerio, getStats, saveStats, sortStats, stats, utils; + + cheerio = require('cheerio'); + + utils = require('./utils'); + + stats = {}; + + getStats = function(html, url) { + var $, byProp, getFollowers, getInt, getOrgName, pageDesc, userStats, _ref, _ref1; + $ = cheerio.load(html); + byProp = function(field) { + return $("[itemprop='" + field + "']"); + }; + getInt = function(text) { + return parseInt(text.replace(',', '')); + }; + getOrgName = function(index, item) { + return $(item).attr('title'); + }; + getFollowers = function() { + var multiplier, text; + text = $('.stats li:nth-child(1) a').text().trim(); + multiplier = text.indexOf('k') > 0 ? 1000 : 1; + return (parseFloat(text)) * multiplier; + }; + pageDesc = $('meta[name="description"]').attr('content'); + userStats = { + name: byProp('name').text().trim(), + login: byProp('additionalName').text().trim(), + location: byProp('homeLocation').text().trim(), + language: (_ref = (_ref1 = /\sin ([\w-]+)/.exec(pageDesc)) != null ? _ref1[1] : void 0) != null ? _ref : '', + gravatar: byProp('image').attr('href'), + followers: getFollowers(), + organizations: $('.orgs li > a').map(getOrgName), + contributions: getInt($('.contrib-day > .num').text()), + contributionsStreak: getInt($('.contrib-streak > .num').text()), + contributionsCurrentStreak: getInt($('.contrib-streak-current > .num').text()) + }; + stats[userStats.login] = userStats; + return userStats; + }; + + sortStats = function(stats) { + var minContributions; + minContributions = 1; + return Object.keys(stats).filter(function(login) { + return stats[login].contributions >= minContributions; + }).sort(function(a, b) { + return stats[b].contributions - stats[a].contributions; + }).map(function(login) { + return stats[login]; + }); + }; + + saveStats = function() { + var logins, urls; + logins = require('./temp-logins.json'); + urls = logins.map(function(login) { + return "https://github.com/" + login; + }); + return utils.batchGet(urls, getStats, function() { + return utils.writeStats('./raw/github-users-stats.json', sortStats(stats)); + }); + }; + + saveStats(); + +}).call(this); diff --git a/get-users.coffee b/get-users.coffee index a41dff2..c11a208 100644 --- a/get-users.coffee +++ b/get-users.coffee @@ -2,8 +2,12 @@ fs = require 'fs' utils = require './utils' +DISQUALIFIED = [ + 'gugod' # 7K commits in 4 days. +] + saveTopLogins = -> - MIN_FOLLOWERS = 170 + MIN_FOLLOWERS = 200 MAX_PAGES = 10 urls = utils.range(1, MAX_PAGES + 1).map (page) -> "https://api.github.com/legacy/user/search/followers:%3E#{MIN_FOLLOWERS}?sort=followers&order=desc&start_page=#{page}" @@ -13,6 +17,8 @@ saveTopLogins = -> utils.batchGet urls, parse, (all) -> logins = [].concat.apply [], all - utils.writeStats './temp-logins.json', logins + filtered = logins.filter (name) -> + name not in DISQUALIFIED + utils.writeStats './temp-logins.json', filtered saveTopLogins() diff --git a/node_modules/cheerio/.npmignore b/node_modules/cheerio/.npmignore new file mode 100644 index 0000000..64b7e3f --- /dev/null +++ b/node_modules/cheerio/.npmignore @@ -0,0 +1,8 @@ +src/ +support/ +tests/ +examples/ +*.sock +*.tmproj +coverage.html +lib-cov diff --git a/node_modules/cheerio/.travis.yml b/node_modules/cheerio/.travis.yml new file mode 100644 index 0000000..8111245 --- /dev/null +++ b/node_modules/cheerio/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 \ No newline at end of file diff --git a/node_modules/cheerio/History.md b/node_modules/cheerio/History.md new file mode 100644 index 0000000..38ebf8b --- /dev/null +++ b/node_modules/cheerio/History.md @@ -0,0 +1,223 @@ + +0.10.8 / 2013-03-11 +================== + +* Add slice method (SBoudrias) + +0.10.7 / 2013-02-10 +================== + +* Code & doc cleanup (davidchambers) +* Fixed bug in filter (jugglinmike) + +0.10.6 / 2013-01-29 +================== + +* Added `$.contains(...)` (jugglinmike) +* formatting cleanup (davidchambers) +* Bug fix for `.children()` (jugglinmike & davidchambers) +* Remove global `render` bug (wvl) + +0.10.5 / 2012-12-18 +=================== + +* Fixed botched publish from 0.10.4 - changes should now be present + +0.10.4 / 2012-12-16 +================== + +* $.find should query descendants only (@jugglinmike) +* Tighter underscore dependency + +0.10.3 / 2012-11-18 +=================== + +* fixed outer html bug +* Updated documentation for $(...).html() and $.html() + +0.10.2 / 2012-11-17 +=================== + +* Added a toString() method (@bensheldon) +* use `_.each` and `_.map` to simplify cheerio namesakes (@davidchambers) +* Added filter() with tests and updated readme (@bensheldon & @davidchambers) +* Added spaces between attributes rewritten by removeClass (@jos3000) +* updated docs to remove reference to size method (@ironchefpython) +* removed tidy from cheerio + +0.10.1 / 2012-10-04 +=================== + +* Fixed regression, filtering with a context (#106) + +0.10.0 / 2012-09-24 +=================== + +* Greatly simplified and reorganized the library, reducing the loc by 30% +* Now supports mocha's test-coverage +* Deprecated self-closing tags (HTML5 doesn't require them) +* Fixed error thrown in removeClass(...) @robashton + +0.9.2 / 2012-08-10 +================== + +* added $(...).map(fn) +* manipulation: refactor `makeCheerioArray` +* make .removeClass() remove *all* occurrences (#64) + +0.9.1 / 2012-08-03 +================== + +* fixed bug causing options not to make it to the parser + +0.9.0 / 2012-07-24 +================== + +* Added node 8.x support +* Removed node 4.x support +* Add html(dom) support (@wvl) +* fixed xss vulnerabilities on .attr(), .text(), & .html() (@benatkin, @FB55) +* Rewrote tests into javascript, removing coffeescript dependency (@davidchambers) +* Tons of cleanup (@davidchambers) + +0.8.3 / 2012-06-12 +================== + +* Fixed minor package regression (closes #60) + +0.8.2 / 2012-06-11 +================== + +* Now fails gracefully in cases that involve special chars, which is inline with jQuery (closes #59) +* text() now decode special entities (closes #52) +* updated travis.yml to test node 4.x + +0.8.1 / 2012-06-02 +================== + +* fixed regression where if you created an element, it would update the root +* compatible with node 4.x (again) + +0.8.0 / 2012-05-27 +================== + +* Updated CSS parser to use FB55/CSSselect. Cheerio now supports most CSS3 psuedo selectors thanks to @FB55. +* ignoreWhitespace now on by default again. See #55 for context. +* Changed $(':root') to $.root(), cleaned up $.clone() +* Support for .eq(i) thanks to @alexbardas +* Removed support for node 0.4.x +* Fixed memory leak where package.json was continually loaded +* Tons more tests + +0.7.0 / 2012-04-08 +================== + +* Now testing with node v0.7.7 +* Added travis-ci integration +* Replaced should.js with expect.js. Browser testing to come +* Fixed spacing between attributes and their values +* Added HTML pretty print +* Exposed node-htmlparser2 parsing options +* Revert .replaceWith(...) to be consistent with jQuery + +0.6.2 / 2012-02-12 +================== + +* Fixed .replaceWith(...) regression + +0.6.1 / 2012-02-12 +================== + +* Added .first(), .last(), and .clone() commands. +* Option to parse using whitespace added to `.load`. +* Many bug fixes to make cheerio more aligned with jQuery. +* Added $(':root') to select the highest level element. + +Many thanks to the contributors that made this release happen: @ironchefpython and @siddMahen + +0.6.0 / 2012-02-07 +================== + +* *Important:* `$(...).html()` now returns inner HTML, which is in line with the jQuery spec +* `$.html()` returns the full HTML string. `$.html([cheerioObject])` will return the outer(selected element's tag) and inner HTML of that object +* Fixed bug that prevented HTML strings with depth (eg. `append('')`) from getting `parent`, `next`, `prev` attributes. +* Halted [htmlparser2](https://github.com/FB55/node-htmlparser) at v2.2.2 until single attributes bug gets fixed. + +0.5.1 / 2012-02-05 +================== + +* Fixed minor regression: $(...).text(fn) would fail + +0.5.1 / 2012-02-05 +================== + +* Fixed regression: HTML pages with comments would fail + +0.5.0 / 2012-02-04 +================== + +* Transitioned from Coffeescript back to Javascript +* Parser now ignores whitespace +* Fixed issue with double slashes on self-enclosing tags +* Added boolean attributes to html rendering + +0.4.2 / 2012-01-16 +================== + +* Multiple selectors support: $('.apple, .orange'). Thanks @siddMahen! +* Update package.json to always use latest cheerio-soupselect +* Fix memory leak in index.js + +0.4.1 / 2011-12-19 +================== +* Minor packaging changes to allow `make test` to work from npm installation + +0.4.0 / 2011-12-19 +================== + +* Rewrote all unit tests as cheerio transitioned from vows -> mocha +* Internally, renderer.render -> render(...), parser.parse -> parse(...) +* Append, prepend, html, before, after all work with only text (no tags) +* Bugfix: Attributes can now be removed from script and style tags +* Added yield as a single tag +* Cheerio now compatible with node >=0.4.7 + +0.3.2 / 2011-12-1 +================= + +* Fixed $(...).text(...) to work with "root" element + +0.3.1 / 2011-11-25 +================== + +* Now relying on cheerio-soupselect instead of node-soupselect +* Removed all lingering htmlparser dependencies +* parser now returns parent "root" element. Root now never needs to be updated when there is multiple roots. This fixes ongoing issues with before(...), after(...) and other manipulation functions +* Added jQuery's $(...).replaceWith(...) + +0.3.0 / 2011-11-19 +================== + +* Now using htmlparser2 for parsing (2x speed increase, cleaner, actively developed) +* Added benchmark directory for future speed tests +* $('...').dom() was funky, so it was removed in favor of $('...').get(). $.dom() still works the same. +* $.root now correctly static across all instances of $ +* Added a screencast + +0.2.2 / 2011-11-9 +================= + +* Traversing will select ` + + + + +
+
+ + +
+ + diff --git a/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.html b/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.html new file mode 100644 index 0000000..d7bfb28 --- /dev/null +++ b/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.html @@ -0,0 +1,132 @@ + + + + + Qwery tests + + + + + + + + +

Qwery Tests

+
+
    +
  1. hello
  2. +
  3. world
  4. +
      +
    1. world
    2. +
    3. hello
    4. +
    +
  5. humans
  6. +
+
+

+

+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+ + + +
+ +
+
+
+
+
+
+
+
+
+ aname +
+
+
+
+
+ +
+
+
+
+
+

+ + + +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

+

+

+
+
+
+ + + +
+
+
    + + + + diff --git a/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.js b/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.js new file mode 100644 index 0000000..d241c06 --- /dev/null +++ b/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/qwery/index.js @@ -0,0 +1,548 @@ +"use strict"; + +var expect = require("expect.js"), + DomUtils = require("htmlparser2").DomUtils, + helper = require("../helper.js"), + document = helper.getDOM(require("fs").readFileSync(__dirname + "/index.html")+""), + CSSselect = helper.CSSselect; + +var location = {hash: ""}; +CSSselect.pseudos.target = function(elem){ + return elem.attribs && elem.attribs.id === location.hash.substr(1); +}; + +//--- + +/* + The following is taken from https://github.com/ded/qwery/blob/master/tests/tests.js +*/ + +CSSselect.pseudos.humanoid = function(e, v) { return CSSselect.is(e, 'li:contains(human)') || CSSselect.is(e, 'ol:contains(human)'); }; + +var frag = helper.getDOM( + '
    ' + + '

    ' + + '
    ' + + '

    ' + + '

    ' + + '

    ' +); + +var doc = helper.getDOM( + '
    ' + + '
    ' + + '

    ' + + '' + + '' + + '
    ' + + '

    ' + + '
    ' + + '
    ' +); + +var el = DomUtils.getElementById('attr-child-boosh', document); + +var pseudos = DomUtils.getElementById('pseudos', document).children; + +module.exports = { + +'Contexts': { + + 'should be able to pass optional context': function () { + expect(CSSselect('.a', document)).to.have.length(3); //no context found 3 elements (.a) + expect(CSSselect('.a', CSSselect('#boosh', document))).to.have.length(2); //context found 2 elements (#boosh .a) + }, + +/* + 'should be able to pass string as context': function() { + expect(CSSselect('.a', '#boosh')).to.have.length(2); //context found 2 elements(.a, #boosh) + expect(CSSselect('.a', '.a')).to.be.empty(); //context found 0 elements(.a, .a) + expect(CSSselect('.a', '.b')).to.have.length(1); //context found 1 elements(.a, .b) + expect(CSSselect('.a', '#boosh .b')).to.have.length(1); //context found 1 elements(.a, #boosh .b) + expect(CSSselect('.b', '#boosh .b')).to.be.empty(); //context found 0 elements(.b, #boosh .b) + }, +*/ +/* + 'should be able to pass qwery result as context': function() { + expect(CSSselect('.a', CSSselect('#boosh', document))).to.have.length(2); //context found 2 elements(.a, #boosh) + expect(CSSselect('.a', CSSselect('.a', document))).to.be.empty(); //context found 0 elements(.a, .a) + expect(CSSselect('.a', CSSselect('.b', document))).to.have.length(1); //context found 1 elements(.a, .b) + expect(CSSselect('.a', CSSselect('#boosh .b', document))).to.have.length(1); //context found 1 elements(.a, #boosh .b) + expect(CSSselect('.b', CSSselect('#boosh .b', document))).to.be.empty(); //context found 0 elements(.b, #boosh .b) + }, +*/ + 'should not return duplicates from combinators': function () { + expect(CSSselect('#boosh,#boosh', document)).to.have.length(1); //two booshes dont make a thing go right + expect(CSSselect('#boosh,.apples,#boosh', document)).to.have.length(1); //two booshes and an apple dont make a thing go right + }, + + 'byId sub-queries within context': function() { + expect(CSSselect('#booshTest', CSSselect('#boosh', document))).to.have.length(1); //found "#id #id" + expect(CSSselect('.a.b #booshTest', CSSselect('#boosh', document))).to.have.length(1); //found ".class.class #id" + expect(CSSselect('.a>#booshTest', CSSselect('#boosh', document))).to.have.length(1); //found ".class>#id" + expect(CSSselect('>.a>#booshTest', CSSselect('#boosh', document))).to.have.length(1); //found ">.class>#id" + expect(CSSselect('#boosh', CSSselect('#booshTest', document)).length).to.not.be.ok(); //shouldn't find #boosh (ancestor) within #booshTest (descendent) + expect(CSSselect('#boosh', CSSselect('#lonelyBoosh', document)).length).to.not.be.ok(); //shouldn't find #boosh within #lonelyBoosh (unrelated) + } +}, + +'CSS 1': { + 'get element by id': function () { + var result = CSSselect('#boosh', document); + expect(result[0]).to.be.ok(); //found element with id=boosh + expect(CSSselect('h1', document)[0]).to.be.ok(); //found 1 h1 + }, + + 'byId sub-queries': function() { + expect(CSSselect('#boosh #booshTest', document)).to.have.length(1); //found "#id #id" + expect(CSSselect('.a.b #booshTest', document)).to.have.length(1); //found ".class.class #id" + expect(CSSselect('#boosh>.a>#booshTest', document)).to.have.length(1); //found "#id>.class>#id" + expect(CSSselect('.a>#booshTest', document)).to.have.length(1); //found ".class>#id" + }, + + 'get elements by class': function () { + expect(CSSselect('#boosh .a', document)).to.have.length(2); //found two elements + expect(CSSselect('#boosh div.a', document)[0]).to.be.ok(); //found one element + expect(CSSselect('#boosh div', document)).to.have.length(2); //found two {div} elements + expect(CSSselect('#boosh span', document)[0]).to.be.ok(); //found one {span} element + expect(CSSselect('#boosh div div', document)[0]).to.be.ok(); //found a single div + expect(CSSselect('a.odd', document)).to.have.length(1); //found single a + }, + + 'combos': function () { + expect(CSSselect('#boosh div,#boosh span', document)).to.have.length(3); //found 2 divs and 1 span + }, + + 'class with dashes': function() { + expect(CSSselect('.class-with-dashes', document)).to.have.length(1); //found something + }, + + 'should ignore comment nodes': function() { + expect(CSSselect('#boosh *', document)).to.have.length(4); //found only 4 elements under #boosh + }, + + 'deep messy relationships': function() { + // these are mostly characterised by a combination of tight relationships and loose relationships + // on the right side of the query it's easy to find matches but they tighten up quickly as you + // go to the left + // they are useful for making sure the dom crawler doesn't stop short or over-extend as it works + // up the tree the crawl needs to be comprehensive + expect(CSSselect('div#fixtures > div a', document)).to.have.length(5); //found four results for "div#fixtures > div a" + expect(CSSselect('.direct-descend > .direct-descend .lvl2', document)).to.have.length(1); //found one result for ".direct-descend > .direct-descend .lvl2" + expect(CSSselect('.direct-descend > .direct-descend div', document)).to.have.length(1); //found one result for ".direct-descend > .direct-descend div" + expect(CSSselect('.direct-descend > .direct-descend div', document)).to.have.length(1); //found one result for ".direct-descend > .direct-descend div" + expect(CSSselect('div#fixtures div ~ a div', document)).to.be.empty(); //found no results for odd query + expect(CSSselect('.direct-descend > .direct-descend > .direct-descend ~ .lvl2', document)).to.be.empty(); //found no results for another odd query + } +}, + +'CSS 2': { + + 'get elements by attribute': function () { + var wanted = CSSselect('#boosh div[test]', document)[0]; + var expected = DomUtils.getElementById('booshTest', document); + expect(wanted).to.be(expected); //found attribute + expect(CSSselect('#boosh div[test=fg]', document)[0]).to.be(expected); //found attribute with value + expect(CSSselect('em[rel~="copyright"]', document)).to.have.length(1); //found em[rel~="copyright"] + expect(CSSselect('em[nopass~="copyright"]', document)).to.be.empty(); //found em[nopass~="copyright"] + }, + + 'should not throw error by attribute selector': function () { + expect(CSSselect('[foo^="bar"]', document)).to.have.length(1); //found 1 element + }, + + 'crazy town': function () { + var el = DomUtils.getElementById('attr-test3', document); + expect(CSSselect('div#attr-test3.found.you[title="whatup duders"]', document)[0]).to.be(el); //found the right element + } + +}, + +'attribute selectors': { + + /* CSS 2 SPEC */ + + '[attr]': function () { + var expected = DomUtils.getElementById('attr-test-1', document); + expect(CSSselect('#attributes div[unique-test]', document)[0]).to.be(expected); //found attribute with [attr] + }, + + '[attr=val]': function () { + var expected = DomUtils.getElementById('attr-test-2', document); + expect(CSSselect('#attributes div[test="two-foo"]', document)[0]).to.be(expected); //found attribute with = + expect(CSSselect("#attributes div[test='two-foo']", document)[0]).to.be(expected); //found attribute with = + expect(CSSselect('#attributes div[test=two-foo]', document)[0]).to.be(expected); //found attribute with = + }, + + '[attr~=val]': function () { + var expected = DomUtils.getElementById('attr-test-3', document); + expect(CSSselect('#attributes div[test~=three]', document)[0]).to.be(expected); //found attribute with ~= + }, + + '[attr|=val]': function () { + var expected = DomUtils.getElementById('attr-test-2', document); + expect(CSSselect('#attributes div[test|="two-foo"]', document)[0]).to.be(expected); //found attribute with |= + expect(CSSselect('#attributes div[test|=two]', document)[0]).to.be(expected); //found attribute with |= + }, + + '[href=#x] special case': function () { + var expected = DomUtils.getElementById('attr-test-4', document); + expect(CSSselect('#attributes a[href="#aname"]', document)[0]).to.be(expected); //found attribute with href=#x + }, + + /* CSS 3 SPEC */ + + '[attr^=val]': function () { + var expected = DomUtils.getElementById('attr-test-2', document); + expect(CSSselect('#attributes div[test^=two]', document)[0]).to.be(expected); //found attribute with ^= + }, + + '[attr$=val]': function () { + var expected = DomUtils.getElementById('attr-test-2', document); + expect(CSSselect('#attributes div[test$=foo]', document)[0]).to.be(expected); //found attribute with $= + }, + + '[attr*=val]': function () { + var expected = DomUtils.getElementById('attr-test-3', document); + expect(CSSselect('#attributes div[test*=hree]', document)[0]).to.be(expected); //found attribute with *= + }, + + 'direct descendants': function () { + expect(CSSselect('#direct-descend > .direct-descend', document)).to.have.length(2); //found two direct descendents + expect(CSSselect('#direct-descend > .direct-descend > .lvl2', document)).to.have.length(3); //found three second-level direct descendents + }, + + 'sibling elements': function () { + expect(CSSselect('#sibling-selector ~ .sibling-selector', document)).to.have.length(2); //found two siblings + expect(CSSselect('#sibling-selector ~ div.sibling-selector', document)).to.have.length(2); //found two siblings + expect(CSSselect('#sibling-selector + div.sibling-selector', document)).to.have.length(1); //found one sibling + expect(CSSselect('#sibling-selector + .sibling-selector', document)).to.have.length(1); //found one sibling + + expect(CSSselect('.parent .oldest ~ .sibling', document)).to.have.length(4); //found four younger siblings + expect(CSSselect('.parent .middle ~ .sibling', document)).to.have.length(2); //found two younger siblings + expect(CSSselect('.parent .middle ~ h4', document)).to.have.length(1); //found next sibling by tag + expect(CSSselect('.parent .middle ~ h4.younger', document)).to.have.length(1); //found next sibling by tag and class + expect(CSSselect('.parent .middle ~ h3', document)).to.be.empty(); //an element can't be its own sibling + expect(CSSselect('.parent .middle ~ h2', document)).to.be.empty(); //didn't find an older sibling + expect(CSSselect('.parent .youngest ~ .sibling', document)).to.be.empty(); //found no younger siblings + + expect(CSSselect('.parent .oldest + .sibling', document)).to.have.length(1); //found next sibling + expect(CSSselect('.parent .middle + .sibling', document)).to.have.length(1); //found next sibling + expect(CSSselect('.parent .middle + h4', document)).to.have.length(1); //found next sibling by tag + expect(CSSselect('.parent .middle + h3', document)).to.be.empty(); //an element can't be its own sibling + expect(CSSselect('.parent .middle + h2', document)).to.be.empty(); //didn't find an older sibling + expect(CSSselect('.parent .youngest + .sibling', document)).to.be.empty(); //found no younger siblings + } + +}, + +/* +'Uniq': { + 'duplicates arent found in arrays': function () { + expect(CSSselect.uniq(['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e'])).to.have.length(5); //result should be a, b, c, d, e + expect(CSSselect.uniq(['a', 'b', 'c', 'c', 'c'])).to.have.length(3); //result should be a, b, c + } +}, +*/ + + +'element-context queries': { + +/* + 'relationship-first queries': function() { + expect(CSSselect('> .direct-descend', CSSselect('#direct-descend', document))).to.have.length(2); //found two direct descendents using > first + expect(CSSselect('~ .sibling-selector', CSSselect('#sibling-selector', document))).to.have.length(2); //found two siblings with ~ first + expect(CSSselect('+ .sibling-selector', CSSselect('#sibling-selector', document))).to.have.length(1); //found one sibling with + first + expect(CSSselect('> .tokens a', CSSselect('.idless', document)[0])).to.have.length(1); //found one sibling from a root with no id + }, +*/ + + // should be able to query on an element that hasn't been inserted into the dom + 'detached fragments': function() { + expect(CSSselect('.a span', frag)).to.have.length(1); //should find child elements of fragment + //expect(CSSselect('> div p em', frag)).to.have.length(2); //should find child elements of fragment, relationship first + }, + + 'byId sub-queries within detached fragment': function () { + expect(CSSselect('#emem', frag)).to.have.length(1); //found "#id" in fragment + expect(CSSselect('.d.i #emem', frag)).to.have.length(1); //found ".class.class #id" in fragment + expect(CSSselect('.d #oooo #emem', frag)).to.have.length(1); //found ".class #id #id" in fragment + //expect(CSSselect('> div #oooo', frag)).to.have.length(1); //found "> .class #id" in fragment + expect(CSSselect('#oooo', CSSselect('#emem', frag)).length).to.not.be.ok(); //shouldn't find #oooo (ancestor) within #emem (descendent) + expect(CSSselect('#sep', CSSselect('#emem', frag)).length).to.not.be.ok(); //shouldn't find #sep within #emem (unrelated) + }, + +/* + 'exclude self in match': function() { + expect(CSSselect('.order-matters', CSSselect('#order-matters', document))).to.have.length(4); //should not include self in element-context queries + }, +*/ + + // because form's have .length + 'forms can be used as contexts': function() { + expect(CSSselect('*', CSSselect('form', document)[0])).to.have.length(3); //found 3 elements under <form> + } +}, + +'tokenizer': { + + 'should not get weird tokens': function () { + expect(CSSselect('div .tokens[title="one"]', document)[0]).to.be(DomUtils.getElementById('token-one', document)); //found div .tokens[title="one"] + expect(CSSselect('div .tokens[title="one two"]', document)[0]).to.be(DomUtils.getElementById('token-two', document)); //found div .tokens[title="one two"] + expect(CSSselect('div .tokens[title="one two three #%"]', document)[0]).to.be(DomUtils.getElementById('token-three', document)); //found div .tokens[title="one two three #%"] + expect(CSSselect("div .tokens[title='one two three #%'] a", document)[0]).to.be(DomUtils.getElementById('token-four', document)); //found div .tokens[title=\'one two three #%\'] a + expect(CSSselect('div .tokens[title="one two three #%"] a[href$=foo] div', document)[0]).to.be(DomUtils.getElementById('token-five', document)); //found div .tokens[title="one two three #%"] a[href=foo] div + } + +}, + +'interesting syntaxes': { + 'should parse bad selectors': function () { + expect(CSSselect('#spaced-tokens p em a', document).length).to.be.ok(); //found element with funny tokens + } +}, + +'order matters': { + + //
    + //

    + // + // + // + //
    + + 'the order of elements return matters': function () { + function tag(el) { + return el.name.toLowerCase(); + } + var els = CSSselect('#order-matters .order-matters', document); + expect(tag(els[0])).to.be('p'); //first element matched is a {p} tag + expect(tag(els[1])).to.be('a'); //first element matched is a {a} tag + expect(tag(els[2])).to.be('em'); //first element matched is a {em} tag + expect(tag(els[3])).to.be('b'); //first element matched is a {b} tag + } + +}, + +'pseudo-selectors': { + ':contains': function() { + expect(CSSselect('li:contains(humans)', document)).to.have.length(1); //found by "element:contains(text)" + expect(CSSselect(':contains(humans)', document)).to.have.length(5); //found by ":contains(text)", including all ancestors + // * is an important case, can cause weird errors + expect(CSSselect('*:contains(humans)', document)).to.have.length(5); //found by "*:contains(text)", including all ancestors + expect(CSSselect('ol:contains(humans)', document)).to.have.length(1); //found by "ancestor:contains(text)" + }, + + ':not': function() { + expect(CSSselect('.odd:not(div)', document)).to.have.length(1); //found one .odd :not an <a> + }, + + ':first-child': function () { + expect(CSSselect('#pseudos div:first-child', document)[0]).to.be(pseudos[0]); //found first child + expect(CSSselect('#pseudos div:first-child', document)).to.have.length(1); //found only 1 + }, + + ':last-child': function () { + var all = DomUtils.getElementsByTagName('div', pseudos); + expect(CSSselect('#pseudos div:last-child', document)[0]).to.be(all[all.length - 1]); //found last child + expect(CSSselect('#pseudos div:last-child', document)).to.have.length(1); //found only 1 + }, + + 'ol > li[attr="boosh"]:last-child': function () { + var expected = DomUtils.getElementById('attr-child-boosh', document); + expect(CSSselect('ol > li[attr="boosh"]:last-child', document)).to.have.length(1); //only 1 element found + expect(CSSselect('ol > li[attr="boosh"]:last-child', document)[0]).to.be(expected); //found correct element + }, + + ':nth-child(odd|even|x)': function () { + var second = DomUtils.getElementsByTagName('div', pseudos)[1]; + expect(CSSselect('#pseudos :nth-child(odd)', document)).to.have.length(4); //found 4 odd elements + expect(CSSselect('#pseudos div:nth-child(odd)', document)).to.have.length(3); //found 3 odd elements with div tag + expect(CSSselect('#pseudos div:nth-child(even)', document)).to.have.length(3); //found 3 even elements with div tag + expect(CSSselect('#pseudos div:nth-child(2)', document)[0]).to.be(second); //found 2nd nth-child of pseudos + }, + + ':nth-child(expr)': function () { + var fifth = DomUtils.getElementsByTagName('a', pseudos)[0]; + var sixth = DomUtils.getElementsByTagName('div', pseudos)[4]; + + expect(CSSselect('#pseudos :nth-child(3n+1)', document)).to.have.length(3); //found 3 elements + expect(CSSselect('#pseudos :nth-child(+3n-2)', document)).to.have.length(3); //found 3 elements' + expect(CSSselect('#pseudos :nth-child(-n+6)', document)).to.have.length(6); //found 6 elements + expect(CSSselect('#pseudos :nth-child(-n+5)', document)).to.have.length(5); //found 5 elements + expect(CSSselect('#pseudos :nth-child(3n+2)', document)[1]).to.be(fifth); //second :nth-child(3n+2) is the fifth child + expect(CSSselect('#pseudos :nth-child(3n)', document)[1]).to.be(sixth); //second :nth-child(3n) is the sixth child + }, + + ':nth-last-child(odd|even|x)': function () { + var second = DomUtils.getElementsByTagName('div', pseudos)[1]; + expect(CSSselect('#pseudos :nth-last-child(odd)', document)).to.have.length(4); //found 4 odd elements + expect(CSSselect('#pseudos div:nth-last-child(odd)', document)).to.have.length(3); //found 3 odd elements with div tag + expect(CSSselect('#pseudos div:nth-last-child(even)', document)).to.have.length(3); //found 3 even elements with div tag + expect(CSSselect('#pseudos div:nth-last-child(6)', document)[0]).to.be(second); //6th nth-last-child should be 2nd of 7 elements + }, + + ':nth-last-child(expr)': function () { + var third = DomUtils.getElementsByTagName('div', pseudos)[2]; + + expect(CSSselect('#pseudos :nth-last-child(3n+1)', document)).to.have.length(3); //found 3 elements + expect(CSSselect('#pseudos :nth-last-child(3n-2)', document)).to.have.length(3); //found 3 elements + expect(CSSselect('#pseudos :nth-last-child(-n+6)', document)).to.have.length(6); //found 6 elements + expect(CSSselect('#pseudos :nth-last-child(-n+5)', document)).to.have.length(5); //found 5 elements + expect(CSSselect('#pseudos :nth-last-child(3n+2)', document)[0]).to.be(third); //first :nth-last-child(3n+2) is the third child + }, + + ':nth-of-type(expr)': function () { + var a = DomUtils.getElementsByTagName('a', pseudos)[0]; + + expect(CSSselect('#pseudos div:nth-of-type(3n+1)', document)).to.have.length(2); //found 2 div elements + expect(CSSselect('#pseudos a:nth-of-type(3n+1)', document)).to.have.length(1); //found 1 a element + expect(CSSselect('#pseudos a:nth-of-type(3n+1)', document)[0]).to.be(a); //found the right a element + expect(CSSselect('#pseudos a:nth-of-type(3n)', document)).to.be.empty(); //no matches for every third a + expect(CSSselect('#pseudos a:nth-of-type(odd)', document)).to.have.length(1); //found the odd a + expect(CSSselect('#pseudos a:nth-of-type(1)', document)).to.have.length(1); //found the first a + }, + + ':nth-last-of-type(expr)': function () { + var second = DomUtils.getElementsByTagName('div', pseudos)[1]; + + expect(CSSselect('#pseudos div:nth-last-of-type(3n+1)', document)).to.have.length(2); //found 2 div elements + expect(CSSselect('#pseudos a:nth-last-of-type(3n+1)', document)).to.have.length(1); //found 1 a element + expect(CSSselect('#pseudos div:nth-last-of-type(5)', document)[0]).to.be(second); //5th nth-last-of-type should be 2nd of 7 elements + }, + + ':first-of-type': function () { + expect(CSSselect('#pseudos a:first-of-type', document)[0]).to.be(DomUtils.getElementsByTagName('a', pseudos)[0]); //found first a element + expect(CSSselect('#pseudos a:first-of-type', document)).to.have.length(1); //found only 1 + }, + + ':last-of-type': function () { + var all = DomUtils.getElementsByTagName('div', pseudos); + expect(CSSselect('#pseudos div:last-of-type', document)[0]).to.be(all[all.length - 1]); //found last div element + expect(CSSselect('#pseudos div:last-of-type', document)).to.have.length(1); //found only 1 + }, + + ':only-of-type': function () { + expect(CSSselect('#pseudos a:only-of-type', document)[0]).to.be(DomUtils.getElementsByTagName('a', pseudos)[0]); //found the only a element + expect(CSSselect('#pseudos a:first-of-type', document)).to.have.length(1); //found only 1 + }, + + ':target': function () { + location.hash = ''; + expect(CSSselect('#pseudos:target', document)).to.be.empty(); //#pseudos is not the target + location.hash = '#pseudos'; + expect(CSSselect('#pseudos:target', document)).to.have.length(1); //now #pseudos is the target + location.hash = ''; + }, + + 'custom pseudos': function() { + // :humanoid implemented just for testing purposes + expect(CSSselect(':humanoid', document)).to.have.length(2); //selected using custom pseudo + } + +}, + +/* +'argument types': { + + 'should be able to pass in nodes as arguments': function () { + var el = DomUtils.getElementById('boosh', document); + expect(CSSselect(el)[0]).to.be(el); //CSSselect(el)[0] == el + expect(CSSselect(el, 'body')[0]).to.be(el); //CSSselect(el, 'body')[0] == el + expect(CSSselect(el, document)[0]).to.be(el); //CSSselect(el, document)[0] == el + expect(CSSselect(window)[0]).to.be(window); //CSSselect(window)[0] == window + expect(CSSselect(document)[0]).to.be(document); //CSSselect(document)[0] == document + }, + + 'should be able to pass in an array of results as arguments': function () { + var el = DomUtils.getElementById('boosh', document); + var result = CSSselect([CSSselect('#boosh', document), CSSselect(document), CSSselect(window)]); + expect(result).to.have.length(3); //3 elements in the combined set + expect(result[0]).to.be(el); //result[0] == el + expect(result[1]).to.be(document); //result[0] == document + expect(result[2]).to.be(window); //result[0] == window + expect(CSSselect([CSSselect('#pseudos div.odd', document), CSSselect('#pseudos div.even', document)])).to.have.length(6); //found all the odd and even divs + } + +}, +*/ + +'is()': { + 'simple selectors': function () { + expect(CSSselect.is(el, 'li')).to.be.ok(); //tag + expect(CSSselect.is(el, '*')).to.be.ok(); //wildcard + expect(CSSselect.is(el, '#attr-child-boosh')).to.be.ok(); //#id + expect(CSSselect.is(el, '[attr]')).to.be.ok(); //[attr] + expect(CSSselect.is(el, '[attr=boosh]')).to.be.ok(); //[attr=val] + expect(CSSselect.is(el, 'div')).to.not.be.ok(); //wrong tag + expect(CSSselect.is(el, '#foo')).to.not.be.ok(); //wrong #id + expect(CSSselect.is(el, '[foo]')).to.not.be.ok(); //wrong [attr] + expect(CSSselect.is(el, '[attr=foo]')).to.not.be.ok(); //wrong [attr=val] + }, + 'selector sequences': function () { + expect(CSSselect.is(el, 'li#attr-child-boosh[attr=boosh]')).to.be.ok(); //tag#id[attr=val] + expect(CSSselect.is(el, 'div#attr-child-boosh[attr=boosh]')).to.not.be.ok(); //wrong tag#id[attr=val] + }, + 'selector sequences combinators': function () { + expect(CSSselect.is(el, 'ol li')).to.be.ok(); //tag tag + expect(CSSselect.is(el, 'ol>li')).to.be.ok(); //tag>tag + expect(CSSselect.is(el, 'ol>li+li')).to.be.ok(); //tab>tag+tag + expect(CSSselect.is(el, 'ol#list li#attr-child-boosh[attr=boosh]')).to.be.ok(); //tag#id tag#id[attr=val] + expect(CSSselect.is(el, 'ol#list>li#attr-child-boosh[attr=boosh]')).to.not.be.ok(); //wrong tag#id>tag#id[attr=val] + expect(CSSselect.is(el, 'ol ol li#attr-child-boosh[attr=boosh]')).to.be.ok(); //tag tag tag#id[attr=val] + expect(CSSselect.is(CSSselect('#token-four', document)[0], 'div#fixtures>div a')).to.be.ok(); //tag#id>tag tag where ambiguous middle tag requires backtracking + }, + 'pseudos': function() { + //TODO: more tests! + expect(CSSselect.is(el, 'li:contains(hello)')).to.be.ok(); //matching :contains(text) + expect(CSSselect.is(el, 'li:contains(human)')).to.not.be.ok(); //non-matching :contains(text) + expect(CSSselect.is(CSSselect('#list>li', document)[2], ':humanoid')).to.be.ok(); //matching custom pseudo + expect(CSSselect.is(CSSselect('#list>li', document)[1], ':humanoid')).to.not.be.ok(); //non-matching custom pseudo + }/*, + 'context': function () { + expect(CSSselect.is(el, 'li#attr-child-boosh[attr=boosh]', CSSselect('#list', document)[0])).to.be.ok(); //context + expect(CSSselect.is(el, 'ol#list li#attr-child-boosh[attr=boosh]', CSSselect('#boosh', document)[0])).to.not.be.ok(); //wrong context + }*/ +}, + +'selecting elements in other documents': { + 'get element by id': function () { + var result = CSSselect('#hsoob', doc); + expect(result[0]).to.be.ok(); //found element with id=hsoob + }, + + 'get elements by class': function () { + expect(CSSselect('#hsoob .a', doc)).to.have.length(2); //found two elements + expect(CSSselect('#hsoob div.a', doc)[0]).to.be.ok(); //found one element + expect(CSSselect('#hsoob div', doc)).to.have.length(2); //found two {div} elements + expect(CSSselect('#hsoob span', doc)[0]).to.be.ok(); //found one {span} element + expect(CSSselect('#hsoob div div', doc)[0]).to.be.ok(); //found a single div + expect(CSSselect('p.odd', doc)).to.have.length(1); //found single br + }, + + 'complex selectors': function () { + expect(CSSselect('.d ~ .sib', doc)).to.have.length(2); //found one ~ sibling + expect(CSSselect('.a .d + .sib', doc)).to.have.length(1); //found 2 + siblings + expect(CSSselect('#hsoob > div > .h', doc)).to.have.length(1); //found span using child selectors + expect(CSSselect('.a .d ~ .sib[test="f g"]', doc)).to.have.length(1); //found 1 ~ sibling with test attribute + }, + + 'byId sub-queries': function () { + expect(CSSselect('#hsoob #spanny', doc)).to.have.length(1); //found "#id #id" in frame + expect(CSSselect('.a #spanny', doc)).to.have.length(1); //found ".class #id" in frame + expect(CSSselect('.a #booshTest #spanny', doc)).to.have.length(1); //found ".class #id #id" in frame + //ok(CSSselect('> #hsoob', doc).length == 1, 'found "> #id" in frame') --> would be good to support this, needs some tweaking though + }, + + 'byId sub-queries within sub-context': function () { + expect(CSSselect('#spanny', CSSselect('#hsoob', doc))).to.have.length(1); //found "#id -> #id" in frame + expect(CSSselect('.a #spanny', CSSselect('#hsoob', doc))).to.have.length(1); //found ".class #id" in frame + expect(CSSselect('.a #booshTest #spanny', CSSselect('#hsoob', doc))).to.have.length(1); //found ".class #id #id" in frame + expect(CSSselect('.a > #booshTest', CSSselect('#hsoob', doc))).to.have.length(1); //found "> .class #id" in frame + expect(CSSselect('#booshTest', CSSselect('#spanny', doc)).length).to.not.be.ok(); //shouldn't find #booshTest (ancestor) within #spanny (descendent) + expect(CSSselect('#booshTest', CSSselect('#lonelyHsoob', doc)).length).to.not.be.ok(); //shouldn't find #booshTest within #lonelyHsoob (unrelated) + } + +} + +}; diff --git a/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/slickspeed.js b/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/slickspeed.js new file mode 100644 index 0000000..53a16ba --- /dev/null +++ b/node_modules/cheerio/node_modules/cheerio-select/node_modules/CSSselect/tests/slickspeed.js @@ -0,0 +1,76 @@ +var helper = require("./helper.js"), + doc = helper.getFile("W3C_Selectors.html"), + CSSselect = require("../"), + soupselect = require("cheerio-soupselect"), + selectors = ["body", "div", "body div", "div p", "div > p", "div + p", "div ~ p", "div[class^=exa][class$=mple]", "div p a", "div, p, a", ".note", "div.example", "ul .tocline2", "div.example, div.note", "#title", "h1#title", "div #title", "ul.toc li.tocline2", "ul.toc > li.tocline2", "h1#title + div > p", "h1[id]:contains(Selectors)", "a[href][lang][class]", "div[class]", "div[class=example]", "div[class^=exa]", "div[class$=mple]", "div[class*=e]", "div[class|=dialog]", "div[class!=made_up]", "div[class~=example]"/*, "div:not(.example)", "p:contains(selectors)", "p:nth-child(even)", "p:nth-child(2n)", "p:nth-child(odd)", "p:nth-child(2n+1)", "p:nth-child(n)", "p:only-child", "p:last-child", "p:first-child"*/]; + +var engines = [function(a,b){return CSSselect.iterate(b,a);}, soupselect.select]; + +//returns true when an error occurs +function testResult(rule, index){ + var results = engines + .map(function(func){ return func(doc, rule); }); + + //check if both had the same result + for(var i = 1; i < results.length; i++){ + //TODO: might be hard to debug with more engines + if(results[i-1].length !== results[i].length){ + //console.log(rule, results[i-1].length, results[i].length); + return true; + } + for(var j = 0; j < results[i].length; j++){ + if(results[i-1][j] !== results[i][j]){ + if(results[i-1].indexOf(results[i][j]) === -1){ + return true; + } + } + } + //require("assert").deepEqual(results[i-1], results[i], rule + ": not the same elements"); + } + + return false; +} + +selectors.filter(testResult).forEach(function(rule){ print(rule, "failed!\n"); }); + +process.exit(0); //don't run speed tests + +print("-----\n\nChecking performance\n\n"); + +//test the speed +var ben = require("ben"); + +function testSpeed(rule){ + print(rule, Array(28-rule.length).join(" ")); + + var results = engines + .map(function(func){ return function(){ return func(doc, rule); }}); + + //also add a precompiled CSSselect test + var compiled = CSSselect(rule); + results.unshift(function(){ return CSSselect.iterate(compiled, doc); }); + + results = results.map(ben); + + var min = Math.min.apply(null, results); + var max = Math.max.apply(null, results); + + results.forEach(function(result){ + if(result === min) return print(" +", result, "+"); + if(result === max) return print(" !", result, "!"); + if(Math.abs(result-min) > Math.abs(result-max)){ + return print(" =", result, "="); + } + print(" ~", result, "~"); + }); + + print("\n"); +} + +print("RULE ", "CSSselect (pc)", "CSSselect", "soupselect\n"); + +selectors.forEach(testSpeed); + +function print(){ + process.stdout.write(Array.prototype.join.call(arguments, " ")); +} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/cheerio-select/package.json b/node_modules/cheerio/node_modules/cheerio-select/package.json new file mode 100644 index 0000000..4dbab84 --- /dev/null +++ b/node_modules/cheerio/node_modules/cheerio-select/package.json @@ -0,0 +1,36 @@ +{ + "name": "cheerio-select", + "version": "0.0.3", + "description": "Selector engine for cheerio", + "keywords": [], + "author": { + "name": "Matt Mueller", + "email": "mattmuelle@gmail.com" + }, + "dependencies": { + "CSSselect": "0.x" + }, + "devDependencies": { + "mocha": "*", + "cheerio": "*", + "expect.js": "*", + "underscore": "*" + }, + "main": "index", + "engines": { + "node": ">= 0.4.7" + }, + "scripts": { + "test": "make test" + }, + "_id": "cheerio-select@0.0.3", + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.4", + "_nodeVersion": "v0.6.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "4ee6ac788f7d6f08d8344b75c699cb4783ec2c05" + }, + "_from": "cheerio-select@*" +} diff --git a/node_modules/cheerio/node_modules/entities/LICENSE b/node_modules/cheerio/node_modules/entities/LICENSE new file mode 100644 index 0000000..c464f86 --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/LICENSE @@ -0,0 +1,11 @@ +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/cheerio/node_modules/entities/entities/html4.json b/node_modules/cheerio/node_modules/entities/entities/html4.json new file mode 100644 index 0000000..0253d1a --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/entities/html4.json @@ -0,0 +1 @@ +{"Aacute;":"\u00C1","Aacute":"\u00C1","aacute;":"\u00E1","aacute":"\u00E1","Acirc;":"\u00C2","Acirc":"\u00C2","acirc;":"\u00E2","acirc":"\u00E2","acute;":"\u00B4","acute":"\u00B4","AElig;":"\u00C6","AElig":"\u00C6","aelig;":"\u00E6","aelig":"\u00E6","Agrave;":"\u00C0","Agrave":"\u00C0","agrave;":"\u00E0","agrave":"\u00E0","alefsym;":"\u2135","Alpha;":"\u0391","alpha;":"\u03B1","amp":"\u0026","and;":"\u2227","ang;":"\u2220","apos":"\u0027","Aring;":"\u00C5","Aring":"\u00C5","aring;":"\u00E5","aring":"\u00E5","asymp;":"\u2248","Atilde;":"\u00C3","Atilde":"\u00C3","atilde;":"\u00E3","atilde":"\u00E3","Auml;":"\u00C4","Auml":"\u00C4","auml;":"\u00E4","auml":"\u00E4","bdquo;":"\u201E","Beta;":"\u0392","beta;":"\u03B2","brvbar;":"\u00A6","brvbar":"\u00A6","bull;":"\u2022","cap;":"\u2229","Ccedil;":"\u00C7","Ccedil":"\u00C7","ccedil;":"\u00E7","ccedil":"\u00E7","cedil;":"\u00B8","cedil":"\u00B8","cent;":"\u00A2","cent":"\u00A2","Chi;":"\u03A7","chi;":"\u03C7","circ;":"\u02C6","clubs;":"\u2663","cong;":"\u2245","copy;":"\u00A9","copy":"\u00A9","crarr;":"\u21B5","cup;":"\u222A","curren;":"\u00A4","curren":"\u00A4","dagger;":"\u2020","Dagger;":"\u2021","darr;":"\u2193","dArr;":"\u21D3","deg;":"\u00B0","deg":"\u00B0","Delta;":"\u0394","delta;":"\u03B4","diams;":"\u2666","divide;":"\u00F7","divide":"\u00F7","Eacute;":"\u00C9","Eacute":"\u00C9","eacute;":"\u00E9","eacute":"\u00E9","Ecirc;":"\u00CA","Ecirc":"\u00CA","ecirc;":"\u00EA","ecirc":"\u00EA","Egrave;":"\u00C8","Egrave":"\u00C8","egrave;":"\u00E8","egrave":"\u00E8","empty;":"\u2205","emsp;":"\u2003","ensp;":"\u2002","Epsilon;":"\u0395","epsilon;":"\u03B5","equiv;":"\u2261","Eta;":"\u0397","eta;":"\u03B7","ETH;":"\u00D0","ETH":"\u00D0","eth;":"\u00F0","eth":"\u00F0","Euml;":"\u00CB","Euml":"\u00CB","euml;":"\u00EB","euml":"\u00EB","euro;":"\u20AC","exist;":"\u2203","fnof;":"\u0192","forall;":"\u2200","frac12;":"\u00BD","frac12":"\u00BD","frac14;":"\u00BC","frac14":"\u00BC","frac34;":"\u00BE","frac34":"\u00BE","frasl;":"\u2044","Gamma;":"\u0393","gamma;":"\u03B3","ge;":"\u2265","gt":"\u003E","harr;":"\u2194","hArr;":"\u21D4","hearts;":"\u2665","hellip;":"\u2026","Iacute;":"\u00CD","Iacute":"\u00CD","iacute;":"\u00ED","iacute":"\u00ED","Icirc;":"\u00CE","Icirc":"\u00CE","icirc;":"\u00EE","icirc":"\u00EE","iexcl;":"\u00A1","iexcl":"\u00A1","Igrave;":"\u00CC","Igrave":"\u00CC","igrave;":"\u00EC","igrave":"\u00EC","image;":"\u2111","infin;":"\u221E","int;":"\u222B","Iota;":"\u0399","iota;":"\u03B9","iquest;":"\u00BF","iquest":"\u00BF","isin;":"\u2208","Iuml;":"\u00CF","Iuml":"\u00CF","iuml;":"\u00EF","iuml":"\u00EF","Kappa;":"\u039A","kappa;":"\u03BA","Lambda;":"\u039B","lambda;":"\u03BB","lang;":"\u27E8","laquo;":"\u00AB","laquo":"\u00AB","larr;":"\u2190","lArr;":"\u21D0","lceil;":"\u2308","ldquo;":"\u201C","le;":"\u2264","lfloor;":"\u230A","lowast;":"\u2217","loz;":"\u25CA","lrm;":"\u200E","lsaquo;":"\u2039","lsquo;":"\u2018","lt":"\u003C","macr;":"\u00AF","macr":"\u00AF","mdash;":"\u2014","micro;":"\u00B5","micro":"\u00B5","middot;":"\u00B7","middot":"\u00B7","minus;":"\u2212","Mu;":"\u039C","mu;":"\u03BC","nabla;":"\u2207","nbsp;":"\u00A0","nbsp":"\u00A0","ndash;":"\u2013","ne;":"\u2260","ni;":"\u220B","not;":"\u00AC","not":"\u00AC","notin;":"\u2209","nsub;":"\u2284","Ntilde;":"\u00D1","Ntilde":"\u00D1","ntilde;":"\u00F1","ntilde":"\u00F1","Nu;":"\u039D","nu;":"\u03BD","Oacute;":"\u00D3","Oacute":"\u00D3","oacute;":"\u00F3","oacute":"\u00F3","Ocirc;":"\u00D4","Ocirc":"\u00D4","ocirc;":"\u00F4","ocirc":"\u00F4","OElig;":"\u0152","oelig;":"\u0153","Ograve;":"\u00D2","Ograve":"\u00D2","ograve;":"\u00F2","ograve":"\u00F2","oline;":"\u203E","Omega;":"\u03A9","omega;":"\u03C9","Omicron;":"\u039F","omicron;":"\u03BF","oplus;":"\u2295","or;":"\u2228","ordf;":"\u00AA","ordf":"\u00AA","ordm;":"\u00BA","ordm":"\u00BA","Oslash;":"\u00D8","Oslash":"\u00D8","oslash;":"\u00F8","oslash":"\u00F8","Otilde;":"\u00D5","Otilde":"\u00D5","otilde;":"\u00F5","otilde":"\u00F5","otimes;":"\u2297","Ouml;":"\u00D6","Ouml":"\u00D6","ouml;":"\u00F6","ouml":"\u00F6","para;":"\u00B6","para":"\u00B6","part;":"\u2202","permil;":"\u2030","perp;":"\u22A5","Phi;":"\u03A6","phi;":"\u03C6","Pi;":"\u03A0","pi;":"\u03C0","piv;":"\u03D6","plusmn;":"\u00B1","plusmn":"\u00B1","pound;":"\u00A3","pound":"\u00A3","prime;":"\u2032","Prime;":"\u2033","prod;":"\u220F","prop;":"\u221D","Psi;":"\u03A8","psi;":"\u03C8","quot":"\u0022","radic;":"\u221A","rang;":"\u27E9","raquo;":"\u00BB","raquo":"\u00BB","rarr;":"\u2192","rArr;":"\u21D2","rceil;":"\u2309","rdquo;":"\u201D","real;":"\u211C","reg;":"\u00AE","reg":"\u00AE","rfloor;":"\u230B","Rho;":"\u03A1","rho;":"\u03C1","rlm;":"\u200F","rsaquo;":"\u203A","rsquo;":"\u2019","sbquo;":"\u201A","Scaron;":"\u0160","scaron;":"\u0161","sdot;":"\u22C5","sect;":"\u00A7","sect":"\u00A7","shy;":"\u00AD","shy":"\u00AD","Sigma;":"\u03A3","sigma;":"\u03C3","sigmaf;":"\u03C2","sim;":"\u223C","spades;":"\u2660","sub;":"\u2282","sube;":"\u2286","sum;":"\u2211","sup1;":"\u00B9","sup1":"\u00B9","sup2;":"\u00B2","sup2":"\u00B2","sup3;":"\u00B3","sup3":"\u00B3","sup;":"\u2283","supe;":"\u2287","szlig;":"\u00DF","szlig":"\u00DF","Tau;":"\u03A4","tau;":"\u03C4","there4;":"\u2234","Theta;":"\u0398","theta;":"\u03B8","thetasym;":"\u03D1","thinsp;":"\u2009","THORN;":"\u00DE","THORN":"\u00DE","thorn;":"\u00FE","thorn":"\u00FE","tilde;":"\u02DC","times;":"\u00D7","times":"\u00D7","trade;":"\u2122","Uacute;":"\u00DA","Uacute":"\u00DA","uacute;":"\u00FA","uacute":"\u00FA","uarr;":"\u2191","uArr;":"\u21D1","Ucirc;":"\u00DB","Ucirc":"\u00DB","ucirc;":"\u00FB","ucirc":"\u00FB","Ugrave;":"\u00D9","Ugrave":"\u00D9","ugrave;":"\u00F9","ugrave":"\u00F9","uml;":"\u00A8","uml":"\u00A8","upsih;":"\u03D2","Upsilon;":"\u03A5","upsilon;":"\u03C5","Uuml;":"\u00DC","Uuml":"\u00DC","uuml;":"\u00FC","uuml":"\u00FC","weierp;":"\u2118","Xi;":"\u039E","xi;":"\u03BE","Yacute;":"\u00DD","Yacute":"\u00DD","yacute;":"\u00FD","yacute":"\u00FD","yen;":"\u00A5","yen":"\u00A5","yuml;":"\u00FF","yuml":"\u00FF","Yuml;":"\u0178","Zeta;":"\u0396","zeta;":"\u03B6","zwj;":"\u200D","zwnj;":"\u200C"} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/entities/entities/html5.json b/node_modules/cheerio/node_modules/entities/entities/html5.json new file mode 100644 index 0000000..61dd35a --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/entities/html5.json @@ -0,0 +1 @@ +{"Abreve;":"\u0102","abreve;":"\u0103","ac;":"\u223E","acd;":"\u223F","acE;":"\u223E\u0333","Acy;":"\u0410","acy;":"\u0430","af;":"\u2061","Afr;":"\uD835\uDD04","afr;":"\uD835\uDD1E","aleph;":"\u2135","Amacr;":"\u0100","amacr;":"\u0101","amalg;":"\u2A3F","AMP;":"\u0026","AMP":"\u0026","andand;":"\u2A55","And;":"\u2A53","andd;":"\u2A5C","andslope;":"\u2A58","andv;":"\u2A5A","ange;":"\u29A4","angle;":"\u2220","angmsdaa;":"\u29A8","angmsdab;":"\u29A9","angmsdac;":"\u29AA","angmsdad;":"\u29AB","angmsdae;":"\u29AC","angmsdaf;":"\u29AD","angmsdag;":"\u29AE","angmsdah;":"\u29AF","angmsd;":"\u2221","angrt;":"\u221F","angrtvb;":"\u22BE","angrtvbd;":"\u299D","angsph;":"\u2222","angst;":"\u00C5","angzarr;":"\u237C","Aogon;":"\u0104","aogon;":"\u0105","Aopf;":"\uD835\uDD38","aopf;":"\uD835\uDD52","apacir;":"\u2A6F","ap;":"\u2248","apE;":"\u2A70","ape;":"\u224A","apid;":"\u224B","ApplyFunction;":"\u2061","approx;":"\u2248","approxeq;":"\u224A","Ascr;":"\uD835\uDC9C","ascr;":"\uD835\uDCB6","Assign;":"\u2254","ast;":"\u002A","asympeq;":"\u224D","awconint;":"\u2233","awint;":"\u2A11","backcong;":"\u224C","backepsilon;":"\u03F6","backprime;":"\u2035","backsim;":"\u223D","backsimeq;":"\u22CD","Backslash;":"\u2216","Barv;":"\u2AE7","barvee;":"\u22BD","barwed;":"\u2305","Barwed;":"\u2306","barwedge;":"\u2305","bbrk;":"\u23B5","bbrktbrk;":"\u23B6","bcong;":"\u224C","Bcy;":"\u0411","bcy;":"\u0431","becaus;":"\u2235","because;":"\u2235","Because;":"\u2235","bemptyv;":"\u29B0","bepsi;":"\u03F6","bernou;":"\u212C","Bernoullis;":"\u212C","beth;":"\u2136","between;":"\u226C","Bfr;":"\uD835\uDD05","bfr;":"\uD835\uDD1F","bigcap;":"\u22C2","bigcirc;":"\u25EF","bigcup;":"\u22C3","bigodot;":"\u2A00","bigoplus;":"\u2A01","bigotimes;":"\u2A02","bigsqcup;":"\u2A06","bigstar;":"\u2605","bigtriangledown;":"\u25BD","bigtriangleup;":"\u25B3","biguplus;":"\u2A04","bigvee;":"\u22C1","bigwedge;":"\u22C0","bkarow;":"\u290D","blacklozenge;":"\u29EB","blacksquare;":"\u25AA","blacktriangle;":"\u25B4","blacktriangledown;":"\u25BE","blacktriangleleft;":"\u25C2","blacktriangleright;":"\u25B8","blank;":"\u2423","blk12;":"\u2592","blk14;":"\u2591","blk34;":"\u2593","block;":"\u2588","bne;":"\u003D\u20E5","bnequiv;":"\u2261\u20E5","bNot;":"\u2AED","bnot;":"\u2310","Bopf;":"\uD835\uDD39","bopf;":"\uD835\uDD53","bot;":"\u22A5","bottom;":"\u22A5","bowtie;":"\u22C8","boxbox;":"\u29C9","boxdl;":"\u2510","boxdL;":"\u2555","boxDl;":"\u2556","boxDL;":"\u2557","boxdr;":"\u250C","boxdR;":"\u2552","boxDr;":"\u2553","boxDR;":"\u2554","boxh;":"\u2500","boxH;":"\u2550","boxhd;":"\u252C","boxHd;":"\u2564","boxhD;":"\u2565","boxHD;":"\u2566","boxhu;":"\u2534","boxHu;":"\u2567","boxhU;":"\u2568","boxHU;":"\u2569","boxminus;":"\u229F","boxplus;":"\u229E","boxtimes;":"\u22A0","boxul;":"\u2518","boxuL;":"\u255B","boxUl;":"\u255C","boxUL;":"\u255D","boxur;":"\u2514","boxuR;":"\u2558","boxUr;":"\u2559","boxUR;":"\u255A","boxv;":"\u2502","boxV;":"\u2551","boxvh;":"\u253C","boxvH;":"\u256A","boxVh;":"\u256B","boxVH;":"\u256C","boxvl;":"\u2524","boxvL;":"\u2561","boxVl;":"\u2562","boxVL;":"\u2563","boxvr;":"\u251C","boxvR;":"\u255E","boxVr;":"\u255F","boxVR;":"\u2560","bprime;":"\u2035","breve;":"\u02D8","Breve;":"\u02D8","bscr;":"\uD835\uDCB7","Bscr;":"\u212C","bsemi;":"\u204F","bsim;":"\u223D","bsime;":"\u22CD","bsolb;":"\u29C5","bsol;":"\u005C","bsolhsub;":"\u27C8","bullet;":"\u2022","bump;":"\u224E","bumpE;":"\u2AAE","bumpe;":"\u224F","Bumpeq;":"\u224E","bumpeq;":"\u224F","Cacute;":"\u0106","cacute;":"\u0107","capand;":"\u2A44","capbrcup;":"\u2A49","capcap;":"\u2A4B","Cap;":"\u22D2","capcup;":"\u2A47","capdot;":"\u2A40","CapitalDifferentialD;":"\u2145","caps;":"\u2229\uFE00","caret;":"\u2041","caron;":"\u02C7","Cayleys;":"\u212D","ccaps;":"\u2A4D","Ccaron;":"\u010C","ccaron;":"\u010D","Ccirc;":"\u0108","ccirc;":"\u0109","Cconint;":"\u2230","ccups;":"\u2A4C","ccupssm;":"\u2A50","Cdot;":"\u010A","cdot;":"\u010B","Cedilla;":"\u00B8","cemptyv;":"\u29B2","centerdot;":"\u00B7","CenterDot;":"\u00B7","cfr;":"\uD835\uDD20","Cfr;":"\u212D","CHcy;":"\u0427","chcy;":"\u0447","check;":"\u2713","checkmark;":"\u2713","circeq;":"\u2257","circlearrowleft;":"\u21BA","circlearrowright;":"\u21BB","circledast;":"\u229B","circledcirc;":"\u229A","circleddash;":"\u229D","CircleDot;":"\u2299","circledR;":"\u00AE","circledS;":"\u24C8","CircleMinus;":"\u2296","CirclePlus;":"\u2295","CircleTimes;":"\u2297","cir;":"\u25CB","cirE;":"\u29C3","cire;":"\u2257","cirfnint;":"\u2A10","cirmid;":"\u2AEF","cirscir;":"\u29C2","ClockwiseContourIntegral;":"\u2232","CloseCurlyDoubleQuote;":"\u201D","CloseCurlyQuote;":"\u2019","clubsuit;":"\u2663","colon;":"\u003A","Colon;":"\u2237","Colone;":"\u2A74","colone;":"\u2254","coloneq;":"\u2254","comma;":"\u002C","commat;":"\u0040","comp;":"\u2201","compfn;":"\u2218","complement;":"\u2201","complexes;":"\u2102","congdot;":"\u2A6D","Congruent;":"\u2261","conint;":"\u222E","Conint;":"\u222F","ContourIntegral;":"\u222E","copf;":"\uD835\uDD54","Copf;":"\u2102","coprod;":"\u2210","Coproduct;":"\u2210","COPY;":"\u00A9","COPY":"\u00A9","copysr;":"\u2117","CounterClockwiseContourIntegral;":"\u2233","cross;":"\u2717","Cross;":"\u2A2F","Cscr;":"\uD835\uDC9E","cscr;":"\uD835\uDCB8","csub;":"\u2ACF","csube;":"\u2AD1","csup;":"\u2AD0","csupe;":"\u2AD2","ctdot;":"\u22EF","cudarrl;":"\u2938","cudarrr;":"\u2935","cuepr;":"\u22DE","cuesc;":"\u22DF","cularr;":"\u21B6","cularrp;":"\u293D","cupbrcap;":"\u2A48","cupcap;":"\u2A46","CupCap;":"\u224D","Cup;":"\u22D3","cupcup;":"\u2A4A","cupdot;":"\u228D","cupor;":"\u2A45","cups;":"\u222A\uFE00","curarr;":"\u21B7","curarrm;":"\u293C","curlyeqprec;":"\u22DE","curlyeqsucc;":"\u22DF","curlyvee;":"\u22CE","curlywedge;":"\u22CF","curvearrowleft;":"\u21B6","curvearrowright;":"\u21B7","cuvee;":"\u22CE","cuwed;":"\u22CF","cwconint;":"\u2232","cwint;":"\u2231","cylcty;":"\u232D","daleth;":"\u2138","Darr;":"\u21A1","dash;":"\u2010","Dashv;":"\u2AE4","dashv;":"\u22A3","dbkarow;":"\u290F","dblac;":"\u02DD","Dcaron;":"\u010E","dcaron;":"\u010F","Dcy;":"\u0414","dcy;":"\u0434","ddagger;":"\u2021","ddarr;":"\u21CA","DD;":"\u2145","dd;":"\u2146","DDotrahd;":"\u2911","ddotseq;":"\u2A77","Del;":"\u2207","demptyv;":"\u29B1","dfisht;":"\u297F","Dfr;":"\uD835\uDD07","dfr;":"\uD835\uDD21","dHar;":"\u2965","dharl;":"\u21C3","dharr;":"\u21C2","DiacriticalAcute;":"\u00B4","DiacriticalDot;":"\u02D9","DiacriticalDoubleAcute;":"\u02DD","DiacriticalGrave;":"\u0060","DiacriticalTilde;":"\u02DC","diam;":"\u22C4","diamond;":"\u22C4","Diamond;":"\u22C4","diamondsuit;":"\u2666","die;":"\u00A8","DifferentialD;":"\u2146","digamma;":"\u03DD","disin;":"\u22F2","div;":"\u00F7","divideontimes;":"\u22C7","divonx;":"\u22C7","DJcy;":"\u0402","djcy;":"\u0452","dlcorn;":"\u231E","dlcrop;":"\u230D","dollar;":"\u0024","Dopf;":"\uD835\uDD3B","dopf;":"\uD835\uDD55","Dot;":"\u00A8","dot;":"\u02D9","DotDot;":"\u20DC","doteq;":"\u2250","doteqdot;":"\u2251","DotEqual;":"\u2250","dotminus;":"\u2238","dotplus;":"\u2214","dotsquare;":"\u22A1","doublebarwedge;":"\u2306","DoubleContourIntegral;":"\u222F","DoubleDot;":"\u00A8","DoubleDownArrow;":"\u21D3","DoubleLeftArrow;":"\u21D0","DoubleLeftRightArrow;":"\u21D4","DoubleLeftTee;":"\u2AE4","DoubleLongLeftArrow;":"\u27F8","DoubleLongLeftRightArrow;":"\u27FA","DoubleLongRightArrow;":"\u27F9","DoubleRightArrow;":"\u21D2","DoubleRightTee;":"\u22A8","DoubleUpArrow;":"\u21D1","DoubleUpDownArrow;":"\u21D5","DoubleVerticalBar;":"\u2225","DownArrowBar;":"\u2913","downarrow;":"\u2193","DownArrow;":"\u2193","Downarrow;":"\u21D3","DownArrowUpArrow;":"\u21F5","DownBreve;":"\u0311","downdownarrows;":"\u21CA","downharpoonleft;":"\u21C3","downharpoonright;":"\u21C2","DownLeftRightVector;":"\u2950","DownLeftTeeVector;":"\u295E","DownLeftVectorBar;":"\u2956","DownLeftVector;":"\u21BD","DownRightTeeVector;":"\u295F","DownRightVectorBar;":"\u2957","DownRightVector;":"\u21C1","DownTeeArrow;":"\u21A7","DownTee;":"\u22A4","drbkarow;":"\u2910","drcorn;":"\u231F","drcrop;":"\u230C","Dscr;":"\uD835\uDC9F","dscr;":"\uD835\uDCB9","DScy;":"\u0405","dscy;":"\u0455","dsol;":"\u29F6","Dstrok;":"\u0110","dstrok;":"\u0111","dtdot;":"\u22F1","dtri;":"\u25BF","dtrif;":"\u25BE","duarr;":"\u21F5","duhar;":"\u296F","dwangle;":"\u29A6","DZcy;":"\u040F","dzcy;":"\u045F","dzigrarr;":"\u27FF","easter;":"\u2A6E","Ecaron;":"\u011A","ecaron;":"\u011B","ecir;":"\u2256","ecolon;":"\u2255","Ecy;":"\u042D","ecy;":"\u044D","eDDot;":"\u2A77","Edot;":"\u0116","edot;":"\u0117","eDot;":"\u2251","ee;":"\u2147","efDot;":"\u2252","Efr;":"\uD835\uDD08","efr;":"\uD835\uDD22","eg;":"\u2A9A","egs;":"\u2A96","egsdot;":"\u2A98","el;":"\u2A99","Element;":"\u2208","elinters;":"\u23E7","ell;":"\u2113","els;":"\u2A95","elsdot;":"\u2A97","Emacr;":"\u0112","emacr;":"\u0113","emptyset;":"\u2205","EmptySmallSquare;":"\u25FB","emptyv;":"\u2205","EmptyVerySmallSquare;":"\u25AB","emsp13;":"\u2004","emsp14;":"\u2005","ENG;":"\u014A","eng;":"\u014B","Eogon;":"\u0118","eogon;":"\u0119","Eopf;":"\uD835\uDD3C","eopf;":"\uD835\uDD56","epar;":"\u22D5","eparsl;":"\u29E3","eplus;":"\u2A71","epsi;":"\u03B5","epsiv;":"\u03F5","eqcirc;":"\u2256","eqcolon;":"\u2255","eqsim;":"\u2242","eqslantgtr;":"\u2A96","eqslantless;":"\u2A95","Equal;":"\u2A75","equals;":"\u003D","EqualTilde;":"\u2242","equest;":"\u225F","Equilibrium;":"\u21CC","equivDD;":"\u2A78","eqvparsl;":"\u29E5","erarr;":"\u2971","erDot;":"\u2253","escr;":"\u212F","Escr;":"\u2130","esdot;":"\u2250","Esim;":"\u2A73","esim;":"\u2242","excl;":"\u0021","Exists;":"\u2203","expectation;":"\u2130","exponentiale;":"\u2147","ExponentialE;":"\u2147","fallingdotseq;":"\u2252","Fcy;":"\u0424","fcy;":"\u0444","female;":"\u2640","ffilig;":"\uFB03","fflig;":"\uFB00","ffllig;":"\uFB04","Ffr;":"\uD835\uDD09","ffr;":"\uD835\uDD23","filig;":"\uFB01","FilledSmallSquare;":"\u25FC","FilledVerySmallSquare;":"\u25AA","fjlig;":"\u0066\u006A","flat;":"\u266D","fllig;":"\uFB02","fltns;":"\u25B1","Fopf;":"\uD835\uDD3D","fopf;":"\uD835\uDD57","ForAll;":"\u2200","fork;":"\u22D4","forkv;":"\u2AD9","Fouriertrf;":"\u2131","fpartint;":"\u2A0D","frac13;":"\u2153","frac15;":"\u2155","frac16;":"\u2159","frac18;":"\u215B","frac23;":"\u2154","frac25;":"\u2156","frac35;":"\u2157","frac38;":"\u215C","frac45;":"\u2158","frac56;":"\u215A","frac58;":"\u215D","frac78;":"\u215E","frown;":"\u2322","fscr;":"\uD835\uDCBB","Fscr;":"\u2131","gacute;":"\u01F5","Gammad;":"\u03DC","gammad;":"\u03DD","gap;":"\u2A86","Gbreve;":"\u011E","gbreve;":"\u011F","Gcedil;":"\u0122","Gcirc;":"\u011C","gcirc;":"\u011D","Gcy;":"\u0413","gcy;":"\u0433","Gdot;":"\u0120","gdot;":"\u0121","gE;":"\u2267","gEl;":"\u2A8C","gel;":"\u22DB","geq;":"\u2265","geqq;":"\u2267","geqslant;":"\u2A7E","gescc;":"\u2AA9","ges;":"\u2A7E","gesdot;":"\u2A80","gesdoto;":"\u2A82","gesdotol;":"\u2A84","gesl;":"\u22DB\uFE00","gesles;":"\u2A94","Gfr;":"\uD835\uDD0A","gfr;":"\uD835\uDD24","gg;":"\u226B","Gg;":"\u22D9","ggg;":"\u22D9","gimel;":"\u2137","GJcy;":"\u0403","gjcy;":"\u0453","gla;":"\u2AA5","gl;":"\u2277","glE;":"\u2A92","glj;":"\u2AA4","gnap;":"\u2A8A","gnapprox;":"\u2A8A","gne;":"\u2A88","gnE;":"\u2269","gneq;":"\u2A88","gneqq;":"\u2269","gnsim;":"\u22E7","Gopf;":"\uD835\uDD3E","gopf;":"\uD835\uDD58","grave;":"\u0060","GreaterEqual;":"\u2265","GreaterEqualLess;":"\u22DB","GreaterFullEqual;":"\u2267","GreaterGreater;":"\u2AA2","GreaterLess;":"\u2277","GreaterSlantEqual;":"\u2A7E","GreaterTilde;":"\u2273","Gscr;":"\uD835\uDCA2","gscr;":"\u210A","gsim;":"\u2273","gsime;":"\u2A8E","gsiml;":"\u2A90","gtcc;":"\u2AA7","gtcir;":"\u2A7A","GT;":"\u003E","GT":"\u003E","Gt;":"\u226B","gtdot;":"\u22D7","gtlPar;":"\u2995","gtquest;":"\u2A7C","gtrapprox;":"\u2A86","gtrarr;":"\u2978","gtrdot;":"\u22D7","gtreqless;":"\u22DB","gtreqqless;":"\u2A8C","gtrless;":"\u2277","gtrsim;":"\u2273","gvertneqq;":"\u2269\uFE00","gvnE;":"\u2269\uFE00","Hacek;":"\u02C7","hairsp;":"\u200A","half;":"\u00BD","hamilt;":"\u210B","HARDcy;":"\u042A","hardcy;":"\u044A","harrcir;":"\u2948","harrw;":"\u21AD","Hat;":"\u005E","hbar;":"\u210F","Hcirc;":"\u0124","hcirc;":"\u0125","heartsuit;":"\u2665","hercon;":"\u22B9","hfr;":"\uD835\uDD25","Hfr;":"\u210C","HilbertSpace;":"\u210B","hksearow;":"\u2925","hkswarow;":"\u2926","hoarr;":"\u21FF","homtht;":"\u223B","hookleftarrow;":"\u21A9","hookrightarrow;":"\u21AA","hopf;":"\uD835\uDD59","Hopf;":"\u210D","horbar;":"\u2015","HorizontalLine;":"\u2500","hscr;":"\uD835\uDCBD","Hscr;":"\u210B","hslash;":"\u210F","Hstrok;":"\u0126","hstrok;":"\u0127","HumpDownHump;":"\u224E","HumpEqual;":"\u224F","hybull;":"\u2043","hyphen;":"\u2010","ic;":"\u2063","Icy;":"\u0418","icy;":"\u0438","Idot;":"\u0130","IEcy;":"\u0415","iecy;":"\u0435","iff;":"\u21D4","ifr;":"\uD835\uDD26","Ifr;":"\u2111","ii;":"\u2148","iiiint;":"\u2A0C","iiint;":"\u222D","iinfin;":"\u29DC","iiota;":"\u2129","IJlig;":"\u0132","ijlig;":"\u0133","Imacr;":"\u012A","imacr;":"\u012B","ImaginaryI;":"\u2148","imagline;":"\u2110","imagpart;":"\u2111","imath;":"\u0131","Im;":"\u2111","imof;":"\u22B7","imped;":"\u01B5","Implies;":"\u21D2","incare;":"\u2105","in;":"\u2208","infintie;":"\u29DD","inodot;":"\u0131","intcal;":"\u22BA","Int;":"\u222C","integers;":"\u2124","Integral;":"\u222B","intercal;":"\u22BA","Intersection;":"\u22C2","intlarhk;":"\u2A17","intprod;":"\u2A3C","InvisibleComma;":"\u2063","InvisibleTimes;":"\u2062","IOcy;":"\u0401","iocy;":"\u0451","Iogon;":"\u012E","iogon;":"\u012F","Iopf;":"\uD835\uDD40","iopf;":"\uD835\uDD5A","iprod;":"\u2A3C","iscr;":"\uD835\uDCBE","Iscr;":"\u2110","isindot;":"\u22F5","isinE;":"\u22F9","isins;":"\u22F4","isinsv;":"\u22F3","isinv;":"\u2208","it;":"\u2062","Itilde;":"\u0128","itilde;":"\u0129","Iukcy;":"\u0406","iukcy;":"\u0456","Jcirc;":"\u0134","jcirc;":"\u0135","Jcy;":"\u0419","jcy;":"\u0439","Jfr;":"\uD835\uDD0D","jfr;":"\uD835\uDD27","jmath;":"\u0237","Jopf;":"\uD835\uDD41","jopf;":"\uD835\uDD5B","Jscr;":"\uD835\uDCA5","jscr;":"\uD835\uDCBF","Jsercy;":"\u0408","jsercy;":"\u0458","Jukcy;":"\u0404","jukcy;":"\u0454","kappav;":"\u03F0","Kcedil;":"\u0136","kcedil;":"\u0137","Kcy;":"\u041A","kcy;":"\u043A","Kfr;":"\uD835\uDD0E","kfr;":"\uD835\uDD28","kgreen;":"\u0138","KHcy;":"\u0425","khcy;":"\u0445","KJcy;":"\u040C","kjcy;":"\u045C","Kopf;":"\uD835\uDD42","kopf;":"\uD835\uDD5C","Kscr;":"\uD835\uDCA6","kscr;":"\uD835\uDCC0","lAarr;":"\u21DA","Lacute;":"\u0139","lacute;":"\u013A","laemptyv;":"\u29B4","lagran;":"\u2112","Lang;":"\u27EA","langd;":"\u2991","langle;":"\u27E8","lap;":"\u2A85","Laplacetrf;":"\u2112","larrb;":"\u21E4","larrbfs;":"\u291F","Larr;":"\u219E","larrfs;":"\u291D","larrhk;":"\u21A9","larrlp;":"\u21AB","larrpl;":"\u2939","larrsim;":"\u2973","larrtl;":"\u21A2","latail;":"\u2919","lAtail;":"\u291B","lat;":"\u2AAB","late;":"\u2AAD","lates;":"\u2AAD\uFE00","lbarr;":"\u290C","lBarr;":"\u290E","lbbrk;":"\u2772","lbrace;":"\u007B","lbrack;":"\u005B","lbrke;":"\u298B","lbrksld;":"\u298F","lbrkslu;":"\u298D","Lcaron;":"\u013D","lcaron;":"\u013E","Lcedil;":"\u013B","lcedil;":"\u013C","lcub;":"\u007B","Lcy;":"\u041B","lcy;":"\u043B","ldca;":"\u2936","ldquor;":"\u201E","ldrdhar;":"\u2967","ldrushar;":"\u294B","ldsh;":"\u21B2","lE;":"\u2266","LeftAngleBracket;":"\u27E8","LeftArrowBar;":"\u21E4","leftarrow;":"\u2190","LeftArrow;":"\u2190","Leftarrow;":"\u21D0","LeftArrowRightArrow;":"\u21C6","leftarrowtail;":"\u21A2","LeftCeiling;":"\u2308","LeftDoubleBracket;":"\u27E6","LeftDownTeeVector;":"\u2961","LeftDownVectorBar;":"\u2959","LeftDownVector;":"\u21C3","LeftFloor;":"\u230A","leftharpoondown;":"\u21BD","leftharpoonup;":"\u21BC","leftleftarrows;":"\u21C7","leftrightarrow;":"\u2194","LeftRightArrow;":"\u2194","Leftrightarrow;":"\u21D4","leftrightarrows;":"\u21C6","leftrightharpoons;":"\u21CB","leftrightsquigarrow;":"\u21AD","LeftRightVector;":"\u294E","LeftTeeArrow;":"\u21A4","LeftTee;":"\u22A3","LeftTeeVector;":"\u295A","leftthreetimes;":"\u22CB","LeftTriangleBar;":"\u29CF","LeftTriangle;":"\u22B2","LeftTriangleEqual;":"\u22B4","LeftUpDownVector;":"\u2951","LeftUpTeeVector;":"\u2960","LeftUpVectorBar;":"\u2958","LeftUpVector;":"\u21BF","LeftVectorBar;":"\u2952","LeftVector;":"\u21BC","lEg;":"\u2A8B","leg;":"\u22DA","leq;":"\u2264","leqq;":"\u2266","leqslant;":"\u2A7D","lescc;":"\u2AA8","les;":"\u2A7D","lesdot;":"\u2A7F","lesdoto;":"\u2A81","lesdotor;":"\u2A83","lesg;":"\u22DA\uFE00","lesges;":"\u2A93","lessapprox;":"\u2A85","lessdot;":"\u22D6","lesseqgtr;":"\u22DA","lesseqqgtr;":"\u2A8B","LessEqualGreater;":"\u22DA","LessFullEqual;":"\u2266","LessGreater;":"\u2276","lessgtr;":"\u2276","LessLess;":"\u2AA1","lesssim;":"\u2272","LessSlantEqual;":"\u2A7D","LessTilde;":"\u2272","lfisht;":"\u297C","Lfr;":"\uD835\uDD0F","lfr;":"\uD835\uDD29","lg;":"\u2276","lgE;":"\u2A91","lHar;":"\u2962","lhard;":"\u21BD","lharu;":"\u21BC","lharul;":"\u296A","lhblk;":"\u2584","LJcy;":"\u0409","ljcy;":"\u0459","llarr;":"\u21C7","ll;":"\u226A","Ll;":"\u22D8","llcorner;":"\u231E","Lleftarrow;":"\u21DA","llhard;":"\u296B","lltri;":"\u25FA","Lmidot;":"\u013F","lmidot;":"\u0140","lmoustache;":"\u23B0","lmoust;":"\u23B0","lnap;":"\u2A89","lnapprox;":"\u2A89","lne;":"\u2A87","lnE;":"\u2268","lneq;":"\u2A87","lneqq;":"\u2268","lnsim;":"\u22E6","loang;":"\u27EC","loarr;":"\u21FD","lobrk;":"\u27E6","longleftarrow;":"\u27F5","LongLeftArrow;":"\u27F5","Longleftarrow;":"\u27F8","longleftrightarrow;":"\u27F7","LongLeftRightArrow;":"\u27F7","Longleftrightarrow;":"\u27FA","longmapsto;":"\u27FC","longrightarrow;":"\u27F6","LongRightArrow;":"\u27F6","Longrightarrow;":"\u27F9","looparrowleft;":"\u21AB","looparrowright;":"\u21AC","lopar;":"\u2985","Lopf;":"\uD835\uDD43","lopf;":"\uD835\uDD5D","loplus;":"\u2A2D","lotimes;":"\u2A34","lowbar;":"\u005F","LowerLeftArrow;":"\u2199","LowerRightArrow;":"\u2198","lozenge;":"\u25CA","lozf;":"\u29EB","lpar;":"\u0028","lparlt;":"\u2993","lrarr;":"\u21C6","lrcorner;":"\u231F","lrhar;":"\u21CB","lrhard;":"\u296D","lrtri;":"\u22BF","lscr;":"\uD835\uDCC1","Lscr;":"\u2112","lsh;":"\u21B0","Lsh;":"\u21B0","lsim;":"\u2272","lsime;":"\u2A8D","lsimg;":"\u2A8F","lsqb;":"\u005B","lsquor;":"\u201A","Lstrok;":"\u0141","lstrok;":"\u0142","ltcc;":"\u2AA6","ltcir;":"\u2A79","LT;":"\u003C","LT":"\u003C","Lt;":"\u226A","ltdot;":"\u22D6","lthree;":"\u22CB","ltimes;":"\u22C9","ltlarr;":"\u2976","ltquest;":"\u2A7B","ltri;":"\u25C3","ltrie;":"\u22B4","ltrif;":"\u25C2","ltrPar;":"\u2996","lurdshar;":"\u294A","luruhar;":"\u2966","lvertneqq;":"\u2268\uFE00","lvnE;":"\u2268\uFE00","male;":"\u2642","malt;":"\u2720","maltese;":"\u2720","Map;":"\u2905","map;":"\u21A6","mapsto;":"\u21A6","mapstodown;":"\u21A7","mapstoleft;":"\u21A4","mapstoup;":"\u21A5","marker;":"\u25AE","mcomma;":"\u2A29","Mcy;":"\u041C","mcy;":"\u043C","mDDot;":"\u223A","measuredangle;":"\u2221","MediumSpace;":"\u205F","Mellintrf;":"\u2133","Mfr;":"\uD835\uDD10","mfr;":"\uD835\uDD2A","mho;":"\u2127","midast;":"\u002A","midcir;":"\u2AF0","mid;":"\u2223","minusb;":"\u229F","minusd;":"\u2238","minusdu;":"\u2A2A","MinusPlus;":"\u2213","mlcp;":"\u2ADB","mldr;":"\u2026","mnplus;":"\u2213","models;":"\u22A7","Mopf;":"\uD835\uDD44","mopf;":"\uD835\uDD5E","mp;":"\u2213","mscr;":"\uD835\uDCC2","Mscr;":"\u2133","mstpos;":"\u223E","multimap;":"\u22B8","mumap;":"\u22B8","Nacute;":"\u0143","nacute;":"\u0144","nang;":"\u2220\u20D2","nap;":"\u2249","napE;":"\u2A70\u0338","napid;":"\u224B\u0338","napos;":"\u0149","napprox;":"\u2249","natural;":"\u266E","naturals;":"\u2115","natur;":"\u266E","nbump;":"\u224E\u0338","nbumpe;":"\u224F\u0338","ncap;":"\u2A43","Ncaron;":"\u0147","ncaron;":"\u0148","Ncedil;":"\u0145","ncedil;":"\u0146","ncong;":"\u2247","ncongdot;":"\u2A6D\u0338","ncup;":"\u2A42","Ncy;":"\u041D","ncy;":"\u043D","nearhk;":"\u2924","nearr;":"\u2197","neArr;":"\u21D7","nearrow;":"\u2197","nedot;":"\u2250\u0338","NegativeMediumSpace;":"\u200B","NegativeThickSpace;":"\u200B","NegativeThinSpace;":"\u200B","NegativeVeryThinSpace;":"\u200B","nequiv;":"\u2262","nesear;":"\u2928","nesim;":"\u2242\u0338","NestedGreaterGreater;":"\u226B","NestedLessLess;":"\u226A","NewLine;":"\u000A","nexist;":"\u2204","nexists;":"\u2204","Nfr;":"\uD835\uDD11","nfr;":"\uD835\uDD2B","ngE;":"\u2267\u0338","nge;":"\u2271","ngeq;":"\u2271","ngeqq;":"\u2267\u0338","ngeqslant;":"\u2A7E\u0338","nges;":"\u2A7E\u0338","nGg;":"\u22D9\u0338","ngsim;":"\u2275","nGt;":"\u226B\u20D2","ngt;":"\u226F","ngtr;":"\u226F","nGtv;":"\u226B\u0338","nharr;":"\u21AE","nhArr;":"\u21CE","nhpar;":"\u2AF2","nis;":"\u22FC","nisd;":"\u22FA","niv;":"\u220B","NJcy;":"\u040A","njcy;":"\u045A","nlarr;":"\u219A","nlArr;":"\u21CD","nldr;":"\u2025","nlE;":"\u2266\u0338","nle;":"\u2270","nleftarrow;":"\u219A","nLeftarrow;":"\u21CD","nleftrightarrow;":"\u21AE","nLeftrightarrow;":"\u21CE","nleq;":"\u2270","nleqq;":"\u2266\u0338","nleqslant;":"\u2A7D\u0338","nles;":"\u2A7D\u0338","nless;":"\u226E","nLl;":"\u22D8\u0338","nlsim;":"\u2274","nLt;":"\u226A\u20D2","nlt;":"\u226E","nltri;":"\u22EA","nltrie;":"\u22EC","nLtv;":"\u226A\u0338","nmid;":"\u2224","NoBreak;":"\u2060","NonBreakingSpace;":"\u00A0","nopf;":"\uD835\uDD5F","Nopf;":"\u2115","Not;":"\u2AEC","NotCongruent;":"\u2262","NotCupCap;":"\u226D","NotDoubleVerticalBar;":"\u2226","NotElement;":"\u2209","NotEqual;":"\u2260","NotEqualTilde;":"\u2242\u0338","NotExists;":"\u2204","NotGreater;":"\u226F","NotGreaterEqual;":"\u2271","NotGreaterFullEqual;":"\u2267\u0338","NotGreaterGreater;":"\u226B\u0338","NotGreaterLess;":"\u2279","NotGreaterSlantEqual;":"\u2A7E\u0338","NotGreaterTilde;":"\u2275","NotHumpDownHump;":"\u224E\u0338","NotHumpEqual;":"\u224F\u0338","notindot;":"\u22F5\u0338","notinE;":"\u22F9\u0338","notinva;":"\u2209","notinvb;":"\u22F7","notinvc;":"\u22F6","NotLeftTriangleBar;":"\u29CF\u0338","NotLeftTriangle;":"\u22EA","NotLeftTriangleEqual;":"\u22EC","NotLess;":"\u226E","NotLessEqual;":"\u2270","NotLessGreater;":"\u2278","NotLessLess;":"\u226A\u0338","NotLessSlantEqual;":"\u2A7D\u0338","NotLessTilde;":"\u2274","NotNestedGreaterGreater;":"\u2AA2\u0338","NotNestedLessLess;":"\u2AA1\u0338","notni;":"\u220C","notniva;":"\u220C","notnivb;":"\u22FE","notnivc;":"\u22FD","NotPrecedes;":"\u2280","NotPrecedesEqual;":"\u2AAF\u0338","NotPrecedesSlantEqual;":"\u22E0","NotReverseElement;":"\u220C","NotRightTriangleBar;":"\u29D0\u0338","NotRightTriangle;":"\u22EB","NotRightTriangleEqual;":"\u22ED","NotSquareSubset;":"\u228F\u0338","NotSquareSubsetEqual;":"\u22E2","NotSquareSuperset;":"\u2290\u0338","NotSquareSupersetEqual;":"\u22E3","NotSubset;":"\u2282\u20D2","NotSubsetEqual;":"\u2288","NotSucceeds;":"\u2281","NotSucceedsEqual;":"\u2AB0\u0338","NotSucceedsSlantEqual;":"\u22E1","NotSucceedsTilde;":"\u227F\u0338","NotSuperset;":"\u2283\u20D2","NotSupersetEqual;":"\u2289","NotTilde;":"\u2241","NotTildeEqual;":"\u2244","NotTildeFullEqual;":"\u2247","NotTildeTilde;":"\u2249","NotVerticalBar;":"\u2224","nparallel;":"\u2226","npar;":"\u2226","nparsl;":"\u2AFD\u20E5","npart;":"\u2202\u0338","npolint;":"\u2A14","npr;":"\u2280","nprcue;":"\u22E0","nprec;":"\u2280","npreceq;":"\u2AAF\u0338","npre;":"\u2AAF\u0338","nrarrc;":"\u2933\u0338","nrarr;":"\u219B","nrArr;":"\u21CF","nrarrw;":"\u219D\u0338","nrightarrow;":"\u219B","nRightarrow;":"\u21CF","nrtri;":"\u22EB","nrtrie;":"\u22ED","nsc;":"\u2281","nsccue;":"\u22E1","nsce;":"\u2AB0\u0338","Nscr;":"\uD835\uDCA9","nscr;":"\uD835\uDCC3","nshortmid;":"\u2224","nshortparallel;":"\u2226","nsim;":"\u2241","nsime;":"\u2244","nsimeq;":"\u2244","nsmid;":"\u2224","nspar;":"\u2226","nsqsube;":"\u22E2","nsqsupe;":"\u22E3","nsubE;":"\u2AC5\u0338","nsube;":"\u2288","nsubset;":"\u2282\u20D2","nsubseteq;":"\u2288","nsubseteqq;":"\u2AC5\u0338","nsucc;":"\u2281","nsucceq;":"\u2AB0\u0338","nsup;":"\u2285","nsupE;":"\u2AC6\u0338","nsupe;":"\u2289","nsupset;":"\u2283\u20D2","nsupseteq;":"\u2289","nsupseteqq;":"\u2AC6\u0338","ntgl;":"\u2279","ntlg;":"\u2278","ntriangleleft;":"\u22EA","ntrianglelefteq;":"\u22EC","ntriangleright;":"\u22EB","ntrianglerighteq;":"\u22ED","num;":"\u0023","numero;":"\u2116","numsp;":"\u2007","nvap;":"\u224D\u20D2","nvdash;":"\u22AC","nvDash;":"\u22AD","nVdash;":"\u22AE","nVDash;":"\u22AF","nvge;":"\u2265\u20D2","nvgt;":"\u003E\u20D2","nvHarr;":"\u2904","nvinfin;":"\u29DE","nvlArr;":"\u2902","nvle;":"\u2264\u20D2","nvlt;":"\u003C\u20D2","nvltrie;":"\u22B4\u20D2","nvrArr;":"\u2903","nvrtrie;":"\u22B5\u20D2","nvsim;":"\u223C\u20D2","nwarhk;":"\u2923","nwarr;":"\u2196","nwArr;":"\u21D6","nwarrow;":"\u2196","nwnear;":"\u2927","oast;":"\u229B","ocir;":"\u229A","Ocy;":"\u041E","ocy;":"\u043E","odash;":"\u229D","Odblac;":"\u0150","odblac;":"\u0151","odiv;":"\u2A38","odot;":"\u2299","odsold;":"\u29BC","ofcir;":"\u29BF","Ofr;":"\uD835\uDD12","ofr;":"\uD835\uDD2C","ogon;":"\u02DB","ogt;":"\u29C1","ohbar;":"\u29B5","ohm;":"\u03A9","oint;":"\u222E","olarr;":"\u21BA","olcir;":"\u29BE","olcross;":"\u29BB","olt;":"\u29C0","Omacr;":"\u014C","omacr;":"\u014D","omid;":"\u29B6","ominus;":"\u2296","Oopf;":"\uD835\uDD46","oopf;":"\uD835\uDD60","opar;":"\u29B7","OpenCurlyDoubleQuote;":"\u201C","OpenCurlyQuote;":"\u2018","operp;":"\u29B9","orarr;":"\u21BB","Or;":"\u2A54","ord;":"\u2A5D","order;":"\u2134","orderof;":"\u2134","origof;":"\u22B6","oror;":"\u2A56","orslope;":"\u2A57","orv;":"\u2A5B","oS;":"\u24C8","Oscr;":"\uD835\uDCAA","oscr;":"\u2134","osol;":"\u2298","otimesas;":"\u2A36","Otimes;":"\u2A37","ovbar;":"\u233D","OverBar;":"\u203E","OverBrace;":"\u23DE","OverBracket;":"\u23B4","OverParenthesis;":"\u23DC","parallel;":"\u2225","par;":"\u2225","parsim;":"\u2AF3","parsl;":"\u2AFD","PartialD;":"\u2202","Pcy;":"\u041F","pcy;":"\u043F","percnt;":"\u0025","period;":"\u002E","pertenk;":"\u2031","Pfr;":"\uD835\uDD13","pfr;":"\uD835\uDD2D","phiv;":"\u03D5","phmmat;":"\u2133","phone;":"\u260E","pitchfork;":"\u22D4","planck;":"\u210F","planckh;":"\u210E","plankv;":"\u210F","plusacir;":"\u2A23","plusb;":"\u229E","pluscir;":"\u2A22","plus;":"\u002B","plusdo;":"\u2214","plusdu;":"\u2A25","pluse;":"\u2A72","PlusMinus;":"\u00B1","plussim;":"\u2A26","plustwo;":"\u2A27","pm;":"\u00B1","Poincareplane;":"\u210C","pointint;":"\u2A15","popf;":"\uD835\uDD61","Popf;":"\u2119","prap;":"\u2AB7","Pr;":"\u2ABB","pr;":"\u227A","prcue;":"\u227C","precapprox;":"\u2AB7","prec;":"\u227A","preccurlyeq;":"\u227C","Precedes;":"\u227A","PrecedesEqual;":"\u2AAF","PrecedesSlantEqual;":"\u227C","PrecedesTilde;":"\u227E","preceq;":"\u2AAF","precnapprox;":"\u2AB9","precneqq;":"\u2AB5","precnsim;":"\u22E8","pre;":"\u2AAF","prE;":"\u2AB3","precsim;":"\u227E","primes;":"\u2119","prnap;":"\u2AB9","prnE;":"\u2AB5","prnsim;":"\u22E8","Product;":"\u220F","profalar;":"\u232E","profline;":"\u2312","profsurf;":"\u2313","Proportional;":"\u221D","Proportion;":"\u2237","propto;":"\u221D","prsim;":"\u227E","prurel;":"\u22B0","Pscr;":"\uD835\uDCAB","pscr;":"\uD835\uDCC5","puncsp;":"\u2008","Qfr;":"\uD835\uDD14","qfr;":"\uD835\uDD2E","qint;":"\u2A0C","qopf;":"\uD835\uDD62","Qopf;":"\u211A","qprime;":"\u2057","Qscr;":"\uD835\uDCAC","qscr;":"\uD835\uDCC6","quaternions;":"\u210D","quatint;":"\u2A16","quest;":"\u003F","questeq;":"\u225F","QUOT;":"\u0022","QUOT":"\u0022","rAarr;":"\u21DB","race;":"\u223D\u0331","Racute;":"\u0154","racute;":"\u0155","raemptyv;":"\u29B3","Rang;":"\u27EB","rangd;":"\u2992","range;":"\u29A5","rangle;":"\u27E9","rarrap;":"\u2975","rarrb;":"\u21E5","rarrbfs;":"\u2920","rarrc;":"\u2933","Rarr;":"\u21A0","rarrfs;":"\u291E","rarrhk;":"\u21AA","rarrlp;":"\u21AC","rarrpl;":"\u2945","rarrsim;":"\u2974","Rarrtl;":"\u2916","rarrtl;":"\u21A3","rarrw;":"\u219D","ratail;":"\u291A","rAtail;":"\u291C","ratio;":"\u2236","rationals;":"\u211A","rbarr;":"\u290D","rBarr;":"\u290F","RBarr;":"\u2910","rbbrk;":"\u2773","rbrace;":"\u007D","rbrack;":"\u005D","rbrke;":"\u298C","rbrksld;":"\u298E","rbrkslu;":"\u2990","Rcaron;":"\u0158","rcaron;":"\u0159","Rcedil;":"\u0156","rcedil;":"\u0157","rcub;":"\u007D","Rcy;":"\u0420","rcy;":"\u0440","rdca;":"\u2937","rdldhar;":"\u2969","rdquor;":"\u201D","rdsh;":"\u21B3","realine;":"\u211B","realpart;":"\u211C","reals;":"\u211D","Re;":"\u211C","rect;":"\u25AD","REG;":"\u00AE","REG":"\u00AE","ReverseElement;":"\u220B","ReverseEquilibrium;":"\u21CB","ReverseUpEquilibrium;":"\u296F","rfisht;":"\u297D","rfr;":"\uD835\uDD2F","Rfr;":"\u211C","rHar;":"\u2964","rhard;":"\u21C1","rharu;":"\u21C0","rharul;":"\u296C","rhov;":"\u03F1","RightAngleBracket;":"\u27E9","RightArrowBar;":"\u21E5","rightarrow;":"\u2192","RightArrow;":"\u2192","Rightarrow;":"\u21D2","RightArrowLeftArrow;":"\u21C4","rightarrowtail;":"\u21A3","RightCeiling;":"\u2309","RightDoubleBracket;":"\u27E7","RightDownTeeVector;":"\u295D","RightDownVectorBar;":"\u2955","RightDownVector;":"\u21C2","RightFloor;":"\u230B","rightharpoondown;":"\u21C1","rightharpoonup;":"\u21C0","rightleftarrows;":"\u21C4","rightleftharpoons;":"\u21CC","rightrightarrows;":"\u21C9","rightsquigarrow;":"\u219D","RightTeeArrow;":"\u21A6","RightTee;":"\u22A2","RightTeeVector;":"\u295B","rightthreetimes;":"\u22CC","RightTriangleBar;":"\u29D0","RightTriangle;":"\u22B3","RightTriangleEqual;":"\u22B5","RightUpDownVector;":"\u294F","RightUpTeeVector;":"\u295C","RightUpVectorBar;":"\u2954","RightUpVector;":"\u21BE","RightVectorBar;":"\u2953","RightVector;":"\u21C0","ring;":"\u02DA","risingdotseq;":"\u2253","rlarr;":"\u21C4","rlhar;":"\u21CC","rmoustache;":"\u23B1","rmoust;":"\u23B1","rnmid;":"\u2AEE","roang;":"\u27ED","roarr;":"\u21FE","robrk;":"\u27E7","ropar;":"\u2986","ropf;":"\uD835\uDD63","Ropf;":"\u211D","roplus;":"\u2A2E","rotimes;":"\u2A35","RoundImplies;":"\u2970","rpar;":"\u0029","rpargt;":"\u2994","rppolint;":"\u2A12","rrarr;":"\u21C9","Rrightarrow;":"\u21DB","rscr;":"\uD835\uDCC7","Rscr;":"\u211B","rsh;":"\u21B1","Rsh;":"\u21B1","rsqb;":"\u005D","rsquor;":"\u2019","rthree;":"\u22CC","rtimes;":"\u22CA","rtri;":"\u25B9","rtrie;":"\u22B5","rtrif;":"\u25B8","rtriltri;":"\u29CE","RuleDelayed;":"\u29F4","ruluhar;":"\u2968","rx;":"\u211E","Sacute;":"\u015A","sacute;":"\u015B","scap;":"\u2AB8","Sc;":"\u2ABC","sc;":"\u227B","sccue;":"\u227D","sce;":"\u2AB0","scE;":"\u2AB4","Scedil;":"\u015E","scedil;":"\u015F","Scirc;":"\u015C","scirc;":"\u015D","scnap;":"\u2ABA","scnE;":"\u2AB6","scnsim;":"\u22E9","scpolint;":"\u2A13","scsim;":"\u227F","Scy;":"\u0421","scy;":"\u0441","sdotb;":"\u22A1","sdote;":"\u2A66","searhk;":"\u2925","searr;":"\u2198","seArr;":"\u21D8","searrow;":"\u2198","semi;":"\u003B","seswar;":"\u2929","setminus;":"\u2216","setmn;":"\u2216","sext;":"\u2736","Sfr;":"\uD835\uDD16","sfr;":"\uD835\uDD30","sfrown;":"\u2322","sharp;":"\u266F","SHCHcy;":"\u0429","shchcy;":"\u0449","SHcy;":"\u0428","shcy;":"\u0448","ShortDownArrow;":"\u2193","ShortLeftArrow;":"\u2190","shortmid;":"\u2223","shortparallel;":"\u2225","ShortRightArrow;":"\u2192","ShortUpArrow;":"\u2191","sigmav;":"\u03C2","simdot;":"\u2A6A","sime;":"\u2243","simeq;":"\u2243","simg;":"\u2A9E","simgE;":"\u2AA0","siml;":"\u2A9D","simlE;":"\u2A9F","simne;":"\u2246","simplus;":"\u2A24","simrarr;":"\u2972","slarr;":"\u2190","SmallCircle;":"\u2218","smallsetminus;":"\u2216","smashp;":"\u2A33","smeparsl;":"\u29E4","smid;":"\u2223","smile;":"\u2323","smt;":"\u2AAA","smte;":"\u2AAC","smtes;":"\u2AAC\uFE00","SOFTcy;":"\u042C","softcy;":"\u044C","solbar;":"\u233F","solb;":"\u29C4","sol;":"\u002F","Sopf;":"\uD835\uDD4A","sopf;":"\uD835\uDD64","spadesuit;":"\u2660","spar;":"\u2225","sqcap;":"\u2293","sqcaps;":"\u2293\uFE00","sqcup;":"\u2294","sqcups;":"\u2294\uFE00","Sqrt;":"\u221A","sqsub;":"\u228F","sqsube;":"\u2291","sqsubset;":"\u228F","sqsubseteq;":"\u2291","sqsup;":"\u2290","sqsupe;":"\u2292","sqsupset;":"\u2290","sqsupseteq;":"\u2292","square;":"\u25A1","Square;":"\u25A1","SquareIntersection;":"\u2293","SquareSubset;":"\u228F","SquareSubsetEqual;":"\u2291","SquareSuperset;":"\u2290","SquareSupersetEqual;":"\u2292","SquareUnion;":"\u2294","squarf;":"\u25AA","squ;":"\u25A1","squf;":"\u25AA","srarr;":"\u2192","Sscr;":"\uD835\uDCAE","sscr;":"\uD835\uDCC8","ssetmn;":"\u2216","ssmile;":"\u2323","sstarf;":"\u22C6","Star;":"\u22C6","star;":"\u2606","starf;":"\u2605","straightepsilon;":"\u03F5","straightphi;":"\u03D5","strns;":"\u00AF","Sub;":"\u22D0","subdot;":"\u2ABD","subE;":"\u2AC5","subedot;":"\u2AC3","submult;":"\u2AC1","subnE;":"\u2ACB","subne;":"\u228A","subplus;":"\u2ABF","subrarr;":"\u2979","subset;":"\u2282","Subset;":"\u22D0","subseteq;":"\u2286","subseteqq;":"\u2AC5","SubsetEqual;":"\u2286","subsetneq;":"\u228A","subsetneqq;":"\u2ACB","subsim;":"\u2AC7","subsub;":"\u2AD5","subsup;":"\u2AD3","succapprox;":"\u2AB8","succ;":"\u227B","succcurlyeq;":"\u227D","Succeeds;":"\u227B","SucceedsEqual;":"\u2AB0","SucceedsSlantEqual;":"\u227D","SucceedsTilde;":"\u227F","succeq;":"\u2AB0","succnapprox;":"\u2ABA","succneqq;":"\u2AB6","succnsim;":"\u22E9","succsim;":"\u227F","SuchThat;":"\u220B","Sum;":"\u2211","sung;":"\u266A","Sup;":"\u22D1","supdot;":"\u2ABE","supdsub;":"\u2AD8","supE;":"\u2AC6","supedot;":"\u2AC4","Superset;":"\u2283","SupersetEqual;":"\u2287","suphsol;":"\u27C9","suphsub;":"\u2AD7","suplarr;":"\u297B","supmult;":"\u2AC2","supnE;":"\u2ACC","supne;":"\u228B","supplus;":"\u2AC0","supset;":"\u2283","Supset;":"\u22D1","supseteq;":"\u2287","supseteqq;":"\u2AC6","supsetneq;":"\u228B","supsetneqq;":"\u2ACC","supsim;":"\u2AC8","supsub;":"\u2AD4","supsup;":"\u2AD6","swarhk;":"\u2926","swarr;":"\u2199","swArr;":"\u21D9","swarrow;":"\u2199","swnwar;":"\u292A","Tab;":"\u0009","target;":"\u2316","tbrk;":"\u23B4","Tcaron;":"\u0164","tcaron;":"\u0165","Tcedil;":"\u0162","tcedil;":"\u0163","Tcy;":"\u0422","tcy;":"\u0442","tdot;":"\u20DB","telrec;":"\u2315","Tfr;":"\uD835\uDD17","tfr;":"\uD835\uDD31","therefore;":"\u2234","Therefore;":"\u2234","thetav;":"\u03D1","thickapprox;":"\u2248","thicksim;":"\u223C","ThickSpace;":"\u205F\u200A","ThinSpace;":"\u2009","thkap;":"\u2248","thksim;":"\u223C","Tilde;":"\u223C","TildeEqual;":"\u2243","TildeFullEqual;":"\u2245","TildeTilde;":"\u2248","timesbar;":"\u2A31","timesb;":"\u22A0","timesd;":"\u2A30","tint;":"\u222D","toea;":"\u2928","topbot;":"\u2336","topcir;":"\u2AF1","top;":"\u22A4","Topf;":"\uD835\uDD4B","topf;":"\uD835\uDD65","topfork;":"\u2ADA","tosa;":"\u2929","tprime;":"\u2034","TRADE;":"\u2122","triangle;":"\u25B5","triangledown;":"\u25BF","triangleleft;":"\u25C3","trianglelefteq;":"\u22B4","triangleq;":"\u225C","triangleright;":"\u25B9","trianglerighteq;":"\u22B5","tridot;":"\u25EC","trie;":"\u225C","triminus;":"\u2A3A","TripleDot;":"\u20DB","triplus;":"\u2A39","trisb;":"\u29CD","tritime;":"\u2A3B","trpezium;":"\u23E2","Tscr;":"\uD835\uDCAF","tscr;":"\uD835\uDCC9","TScy;":"\u0426","tscy;":"\u0446","TSHcy;":"\u040B","tshcy;":"\u045B","Tstrok;":"\u0166","tstrok;":"\u0167","twixt;":"\u226C","twoheadleftarrow;":"\u219E","twoheadrightarrow;":"\u21A0","Uarr;":"\u219F","Uarrocir;":"\u2949","Ubrcy;":"\u040E","ubrcy;":"\u045E","Ubreve;":"\u016C","ubreve;":"\u016D","Ucy;":"\u0423","ucy;":"\u0443","udarr;":"\u21C5","Udblac;":"\u0170","udblac;":"\u0171","udhar;":"\u296E","ufisht;":"\u297E","Ufr;":"\uD835\uDD18","ufr;":"\uD835\uDD32","uHar;":"\u2963","uharl;":"\u21BF","uharr;":"\u21BE","uhblk;":"\u2580","ulcorn;":"\u231C","ulcorner;":"\u231C","ulcrop;":"\u230F","ultri;":"\u25F8","Umacr;":"\u016A","umacr;":"\u016B","UnderBar;":"\u005F","UnderBrace;":"\u23DF","UnderBracket;":"\u23B5","UnderParenthesis;":"\u23DD","Union;":"\u22C3","UnionPlus;":"\u228E","Uogon;":"\u0172","uogon;":"\u0173","Uopf;":"\uD835\uDD4C","uopf;":"\uD835\uDD66","UpArrowBar;":"\u2912","uparrow;":"\u2191","UpArrow;":"\u2191","Uparrow;":"\u21D1","UpArrowDownArrow;":"\u21C5","updownarrow;":"\u2195","UpDownArrow;":"\u2195","Updownarrow;":"\u21D5","UpEquilibrium;":"\u296E","upharpoonleft;":"\u21BF","upharpoonright;":"\u21BE","uplus;":"\u228E","UpperLeftArrow;":"\u2196","UpperRightArrow;":"\u2197","upsi;":"\u03C5","Upsi;":"\u03D2","UpTeeArrow;":"\u21A5","UpTee;":"\u22A5","upuparrows;":"\u21C8","urcorn;":"\u231D","urcorner;":"\u231D","urcrop;":"\u230E","Uring;":"\u016E","uring;":"\u016F","urtri;":"\u25F9","Uscr;":"\uD835\uDCB0","uscr;":"\uD835\uDCCA","utdot;":"\u22F0","Utilde;":"\u0168","utilde;":"\u0169","utri;":"\u25B5","utrif;":"\u25B4","uuarr;":"\u21C8","uwangle;":"\u29A7","vangrt;":"\u299C","varepsilon;":"\u03F5","varkappa;":"\u03F0","varnothing;":"\u2205","varphi;":"\u03D5","varpi;":"\u03D6","varpropto;":"\u221D","varr;":"\u2195","vArr;":"\u21D5","varrho;":"\u03F1","varsigma;":"\u03C2","varsubsetneq;":"\u228A\uFE00","varsubsetneqq;":"\u2ACB\uFE00","varsupsetneq;":"\u228B\uFE00","varsupsetneqq;":"\u2ACC\uFE00","vartheta;":"\u03D1","vartriangleleft;":"\u22B2","vartriangleright;":"\u22B3","vBar;":"\u2AE8","Vbar;":"\u2AEB","vBarv;":"\u2AE9","Vcy;":"\u0412","vcy;":"\u0432","vdash;":"\u22A2","vDash;":"\u22A8","Vdash;":"\u22A9","VDash;":"\u22AB","Vdashl;":"\u2AE6","veebar;":"\u22BB","vee;":"\u2228","Vee;":"\u22C1","veeeq;":"\u225A","vellip;":"\u22EE","verbar;":"\u007C","Verbar;":"\u2016","vert;":"\u007C","Vert;":"\u2016","VerticalBar;":"\u2223","VerticalLine;":"\u007C","VerticalSeparator;":"\u2758","VerticalTilde;":"\u2240","VeryThinSpace;":"\u200A","Vfr;":"\uD835\uDD19","vfr;":"\uD835\uDD33","vltri;":"\u22B2","vnsub;":"\u2282\u20D2","vnsup;":"\u2283\u20D2","Vopf;":"\uD835\uDD4D","vopf;":"\uD835\uDD67","vprop;":"\u221D","vrtri;":"\u22B3","Vscr;":"\uD835\uDCB1","vscr;":"\uD835\uDCCB","vsubnE;":"\u2ACB\uFE00","vsubne;":"\u228A\uFE00","vsupnE;":"\u2ACC\uFE00","vsupne;":"\u228B\uFE00","Vvdash;":"\u22AA","vzigzag;":"\u299A","Wcirc;":"\u0174","wcirc;":"\u0175","wedbar;":"\u2A5F","wedge;":"\u2227","Wedge;":"\u22C0","wedgeq;":"\u2259","Wfr;":"\uD835\uDD1A","wfr;":"\uD835\uDD34","Wopf;":"\uD835\uDD4E","wopf;":"\uD835\uDD68","wp;":"\u2118","wr;":"\u2240","wreath;":"\u2240","Wscr;":"\uD835\uDCB2","wscr;":"\uD835\uDCCC","xcap;":"\u22C2","xcirc;":"\u25EF","xcup;":"\u22C3","xdtri;":"\u25BD","Xfr;":"\uD835\uDD1B","xfr;":"\uD835\uDD35","xharr;":"\u27F7","xhArr;":"\u27FA","xlarr;":"\u27F5","xlArr;":"\u27F8","xmap;":"\u27FC","xnis;":"\u22FB","xodot;":"\u2A00","Xopf;":"\uD835\uDD4F","xopf;":"\uD835\uDD69","xoplus;":"\u2A01","xotime;":"\u2A02","xrarr;":"\u27F6","xrArr;":"\u27F9","Xscr;":"\uD835\uDCB3","xscr;":"\uD835\uDCCD","xsqcup;":"\u2A06","xuplus;":"\u2A04","xutri;":"\u25B3","xvee;":"\u22C1","xwedge;":"\u22C0","YAcy;":"\u042F","yacy;":"\u044F","Ycirc;":"\u0176","ycirc;":"\u0177","Ycy;":"\u042B","ycy;":"\u044B","Yfr;":"\uD835\uDD1C","yfr;":"\uD835\uDD36","YIcy;":"\u0407","yicy;":"\u0457","Yopf;":"\uD835\uDD50","yopf;":"\uD835\uDD6A","Yscr;":"\uD835\uDCB4","yscr;":"\uD835\uDCCE","YUcy;":"\u042E","yucy;":"\u044E","Zacute;":"\u0179","zacute;":"\u017A","Zcaron;":"\u017D","zcaron;":"\u017E","Zcy;":"\u0417","zcy;":"\u0437","Zdot;":"\u017B","zdot;":"\u017C","zeetrf;":"\u2128","ZeroWidthSpace;":"\u200B","zfr;":"\uD835\uDD37","Zfr;":"\u2128","ZHcy;":"\u0416","zhcy;":"\u0436","zigrarr;":"\u21DD","zopf;":"\uD835\uDD6B","Zopf;":"\u2124","Zscr;":"\uD835\uDCB5","zscr;":"\uD835\uDCCF"} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/entities/entities/xml.json b/node_modules/cheerio/node_modules/entities/entities/xml.json new file mode 100644 index 0000000..b6e781c --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/entities/xml.json @@ -0,0 +1 @@ +{"amp;":"\u0026","apos;":"\u0027","gt;":"\u003e","lt;":"\u003c","quot;":"\u0022"} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/entities/index.js b/node_modules/cheerio/node_modules/entities/index.js new file mode 100644 index 0000000..b536538 --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/index.js @@ -0,0 +1,117 @@ +var modes = ["XML", "HTML4", "HTML5"]; + +module.exports = { + decode: function(data, level){ + if(!modes[level]) level = 0; + return module.exports["decode" + modes[level]](data); + }, + decodeStrict: function(data, level){ + if(!modes[level]) level = 0; + return module.exports["decode" + modes[level] + "Strict"](data); + }, + encode: function(data, level){ + if(!modes[level]) level = 0; + return module.exports["encode" + modes[level]](data); + } +}; + +modes.reduce(function(prev, name){ + var obj = require("./entities/" + name.toLowerCase() + ".json"); + + if(prev){ + Object.keys(prev).forEach(function(name){ + obj[name] = prev[name]; + }); + } + + module.exports["decode" + name + "Strict"] = getStrictReplacer(obj); + + if(name === "XML"){ + //there is no non-strict mode for XML + module.exports.decodeXML = module.exports.decodeXMLStrict; + } else { + module.exports["decode" + name] = getReplacer(obj); + } + + module.exports["encode" + name] = getReverse(obj); + + return obj; +}, null); + +function getReplacer(obj){ + var keys = Object.keys(obj).sort(); + var re = keys.join("|").replace(/(\w+)\|\1;/g, "$1;?"); + + // also match hex and char codes + re += "|#[xX][\\da-fA-F]+;?|#\\d+;?"; + + return genReplaceFunc( + new RegExp("&(?:" + re + ")", "g"), + function func(name){ + if(name.charAt(1) === "#"){ + if(name.charAt(2).toLowerCase() === "x"){ + return String.fromCharCode(parseInt(name.substr(3), 16)); + } + return String.fromCharCode(parseInt(name.substr(2), 10)); + } + return obj[name.substr(1)]; + } + ); +} + +function getStrictReplacer(obj){ + var keys = Object.keys(obj).sort().filter(RegExp.prototype.test, /;$/); + var re = keys.map(function(name){ + return name.slice(0, -1); //remove trailing semicolon + }).join("|"); + + // also match hex and char codes + re += "|#[xX][\\da-fA-F]+|#\\d+"; + + var expr = new RegExp("&(?:" + re + ");", "g"); + + return genReplaceFunc(expr, func); + + function func(name){ + if(name.charAt(1) === "#"){ + if(name.charAt(2).toLowerCase() === "x"){ + return String.fromCharCode(parseInt(name.substr(3), 16)); + } + return String.fromCharCode(parseInt(name.substr(2), 10)); + } + return obj[name.substr(1)]; + } +} + +var re_nonUTF8 = /[\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]/g; + +function nonUTF8Replacer(c){ + return "&#" + c.charCodeAt(0) + ";"; +} + +function getReverse(obj){ + var reverse = Object.keys(obj).filter(function(name){ + //prefer identifiers with a semicolon + return name.substr(-1) === ";" || obj[name + ";"] !== obj[name]; + }).reduce(function(reverse, name){ + reverse[obj[name]] = name; + return reverse; + }, {}); + + var regex = new RegExp("\\" + Object.keys(reverse).sort().join("|\\"), "g"); + function func(name){ + return "&" + reverse[name]; + } + + return function(data){ + return data + .replace(regex, func) + .replace(re_nonUTF8, nonUTF8Replacer); + }; +} + +function genReplaceFunc(regex, func){ + return function(data){ + return data.replace(regex, func); + }; +} diff --git a/node_modules/cheerio/node_modules/entities/package.json b/node_modules/cheerio/node_modules/entities/package.json new file mode 100644 index 0000000..9dfc544 --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/package.json @@ -0,0 +1,44 @@ +{ + "name": "entities", + "version": "0.3.0", + "description": "Encode & decode XML/HTML entities with ease", + "author": { + "name": "Felix Boehm", + "email": "me@feedic.com" + }, + "keywords": [ + "html", + "xml", + "entity", + "encoding" + ], + "main": "./index.js", + "directories": { + "test": "test" + }, + "devDependencies": { + "mocha": "~1.9.0" + }, + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git://github.com/fb55/node-entities.git" + }, + "license": "BSD-like", + "_id": "entities@0.3.0", + "dependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "_engineSupported": true, + "_npmVersion": "1.1.4", + "_nodeVersion": "v0.6.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "36ed6e98dbb0db6fecd89d036ef8ab244e2b733e" + }, + "_from": "entities@0.x" +} diff --git a/node_modules/cheerio/node_modules/entities/readme.md b/node_modules/cheerio/node_modules/entities/readme.md new file mode 100644 index 0000000..ebd87df --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/readme.md @@ -0,0 +1,27 @@ +#entities + +En- & decoder for XML/HTML entities. + +####Features: +* Focussed on ___speed___ +* Supports three levels of entities: __XML__, __HTML4__ & __HTML5__ + * Supports _char code_ entities (eg. `U`) + +##How to… + +###…install `entities` + + npm i entities + +###…use `entities` + +```javascript +//encoding +require("entities").encode( data[, level]); +//decoding +require("entities").decode( data[, level]); +``` + +The `level` attribute indicates what level of entities should be decoded (0 = XML, 1 = HTML4 and 2 = HTML5). The default is 0 (read: XML). + +There are also methods to access the level directly. Just append the name of the level to the action and you're ready to go (e.g. `encodeHTML4(data)`, `decodeXML(data)`). diff --git a/node_modules/cheerio/node_modules/entities/test/mocha.opts b/node_modules/cheerio/node_modules/entities/test/mocha.opts new file mode 100644 index 0000000..af53e24 --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/test/mocha.opts @@ -0,0 +1,2 @@ +--check-leaks +--reporter spec diff --git a/node_modules/cheerio/node_modules/entities/test/test.js b/node_modules/cheerio/node_modules/entities/test/test.js new file mode 100644 index 0000000..fa6c00d --- /dev/null +++ b/node_modules/cheerio/node_modules/entities/test/test.js @@ -0,0 +1,68 @@ +var assert = require("assert"); +var entities = require('../'); + +describe("Encode->decode test", function() { + var testcases = [ + { + input: "asdf & ÿ ü '", + xml: "asdf & ÿ ü '", + html4: "asdf & ÿ ü '", + html5: "asdf & ÿ ü '" + }, { + input: "&", + xml: "&#38;", + html4: "&#38;", + html5: "&#38;" + }, + ]; + testcases.forEach(function(tc) { + var encodedXML = entities.encodeXML(tc.input); + it("should XML encode " + tc.input, function() { + assert.equal(encodedXML, tc.xml); + }); + it("should XML decode " + encodedXML, function() { + assert.equal(entities.decodeXML(encodedXML), tc.input); + }); + var encodedHTML4 = entities.encodeHTML4(tc.input); + it("should HTML4 encode " + tc.input, function() { + assert.equal(encodedHTML4, tc.html4); + }); + it("should HTML4 decode " + encodedHTML4, function() { + assert.equal(entities.decodeHTML4(encodedHTML4), tc.input); + }); + var encodedHTML5 = entities.encodeHTML5(tc.input); + it("should HTML5 encode " + tc.input, function() { + assert.equal(encodedHTML5, tc.html5); + }); + it("should HTML5 decode " + encodedHTML5, function() { + assert.equal(entities.decodeHTML5(encodedHTML5), tc.input); + }); + }); +}); + +describe("Decode test", function() { + var testcases = [ + { input: "&amp;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: "&#x26;", output: "&" }, + { input: "&#X26;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: ":", output: ":" }, + { input: ":", output: ":" }, + { input: ":", output: ":" }, + { input: ":", output: ":" } + ]; + testcases.forEach(function(tc) { + it("should XML decode " + tc.input, function() { + assert.equal(entities.decodeXML(tc.input), tc.output); + }); + it("should HTML4 decode " + tc.input, function() { + assert.equal(entities.decodeHTML4(tc.input), tc.output); + }); + it("should HTML5 decode " + tc.input, function() { + assert.equal(entities.decodeHTML5(tc.input), tc.output); + }); + }); +}); diff --git a/node_modules/cheerio/node_modules/htmlparser2/.travis.yml b/node_modules/cheerio/node_modules/htmlparser2/.travis.yml new file mode 100644 index 0000000..84fd7ca --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - 0.9 diff --git a/node_modules/cheerio/node_modules/htmlparser2/LICENSE b/node_modules/cheerio/node_modules/htmlparser2/LICENSE new file mode 100644 index 0000000..0a35e02 --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/LICENSE @@ -0,0 +1,18 @@ +Copyright 2010, 2011, Chris Winberry . All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/htmlparser2/README.md b/node_modules/cheerio/node_modules/htmlparser2/README.md new file mode 100644 index 0000000..9add2fb --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/README.md @@ -0,0 +1,72 @@ +#htmlparser2 [![Build Status](https://secure.travis-ci.org/fb55/node-htmlparser.png)](http://travis-ci.org/fb55/node-htmlparser) + +A forgiving HTML/XML/RSS parser written in JS for NodeJS. The parser can handle streams (chunked data) and supports custom handlers for writing custom DOMs/output. + +##Installing + npm install htmlparser2 + +##Usage + +```javascript +var htmlparser = require("htmlparser2"); +var parser = new htmlparser.Parser({ + onopentag: function(name, attribs){ + if(name === "script" && attribs.type === "text/javascript"){ + console.log("JS! Hooray!"); + } + }, + ontext: function(text){ + console.log("-->", text); + }, + onclosetag: function(tagname){ + if(tagname === "script"){ + console.log("That's it?!"); + } + } +}); +parser.write("Xyz ", + "expected": [ + { + "type": "script", + "name": "script", + "attribs": {}, + "children": [ + { + "data": "", + "type": "text" + } + ] + } + ] +} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/07-unescaped_in_style.json b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/07-unescaped_in_style.json new file mode 100644 index 0000000..d6bf9fb --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/07-unescaped_in_style.json @@ -0,0 +1,23 @@ +{ + "name": "Unescaped chars in style", + "options": { + "handler": {}, + "parser": {} + }, + "html": "", + "expected": [ + { + "type": "style", + "name": "style", + "attribs": { + "type": "text/css" + }, + "children": [ + { + "data": "\n body > p\n\t{ font-weight: bold; }", + "type": "text" + } + ] + } + ] +} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/08-extra_spaces_in_tag.json b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/08-extra_spaces_in_tag.json new file mode 100644 index 0000000..78b30f4 --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/08-extra_spaces_in_tag.json @@ -0,0 +1,23 @@ +{ + "name": "Extra spaces in tag", + "options": { + "handler": {}, + "parser": {} + }, + "html": "<\n font\t\n size='14' \n>the text<\n /\t\nfont\t \n>", + "expected": [ + { + "type": "tag", + "name": "font", + "attribs": { + "size": "14" + }, + "children": [ + { + "data": "the text", + "type": "text" + } + ] + } + ] +} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/09-unquoted_attrib.json b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/09-unquoted_attrib.json new file mode 100644 index 0000000..ae5f44c --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/09-unquoted_attrib.json @@ -0,0 +1,23 @@ +{ + "name": "Unquoted attributes", + "options": { + "handler": {}, + "parser": {} + }, + "html": "the text", + "expected": [ + { + "type": "tag", + "name": "font", + "attribs": { + "size": "14" + }, + "children": [ + { + "data": "the text", + "type": "text" + } + ] + } + ] +} \ No newline at end of file diff --git a/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/10-singular_attribute.json b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/10-singular_attribute.json new file mode 100644 index 0000000..6de1ef2 --- /dev/null +++ b/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/tests/10-singular_attribute.json @@ -0,0 +1,18 @@ +{ + "name": "Singular attribute", + "options": { + "handler": {}, + "parser": {} + }, + "html": "