Compare commits

..

318 Commits

Author SHA1 Message Date
Samy Pessé 65319e8fd6 Bump version to 0.5.0 2014-06-03 22:30:42 +02:00
Samy Pessé 55db44a3b4 Fix #289: center images on ebook 2014-06-03 22:20:51 +02:00
Samy Pessé 13b6045300 Font Merriweather 600 doesn't exists 2014-06-03 20:45:55 +02:00
Samy Pessé b7ff879c31 Remove fonts Anonymous Pro and EB Garamond 2014-06-03 20:43:47 +02:00
Samy Pessé 57ade87fe1 Fix #275: fix emphasized font path 2014-06-03 20:30:04 +02:00
Samy Pessé 907e9ea5a7 Improve font on title
Set sans-serif as default
2014-06-03 20:14:44 +02:00
Samy Pessé 215488dc45 Improve design (more flat) 2014-06-03 18:43:13 +02:00
Samy Pessé a195b3eac2 Improve less files organisation 2014-06-03 18:11:03 +02:00
Samy Pessé 77c6f0e967 Merge pull request #291 from bebraw/book.js
Allow book.js to be used in addition to book.json
2014-06-03 17:20:26 +02:00
Juho Vepsalainen f0e18afec1 In case there's no config file, do not fail 2014-06-03 17:59:26 +03:00
Juho Vepsalainen b6d11d88b7 Allow book.js to be used in addition to book.json
Now it's possible to comment configuration properly and do some dynamic
things if needed.

Closes #287.
2014-06-03 17:42:30 +03:00
Samy Pessé c803270af8 Add option pdf.pageNumber
Fix GitbookIO/editor#38
2014-06-03 16:24:35 +02:00
Samy Pessé 5d51263a58 Remove mixpanel as a default addon 2014-06-03 15:29:15 +02:00
Samy Pessé 7e30720b2c Merge pull request #292 from bebraw/typofix
Fix build success message typo
2014-06-03 15:07:29 +02:00
Juho Vepsalainen 771c5e8b68 Fix build success message typo 2014-06-03 15:58:22 +03:00
Samy Pessé 8f53afab6b Fix #286: fix doc about formats 2014-06-02 20:12:56 +02:00
Samy Pessé 0ad0403d41 Merge pull request #283 from GitbookIO/feature/pdfoptions
Add more options for PDF
2014-06-02 18:22:07 +02:00
Samy Pessé 2515c1dd73 Remove useless command "gitbook ebook" 2014-06-02 18:17:02 +02:00
Samy Pessé 7dfcd102dd Fix calcul of output format for ebook 2014-06-02 18:16:44 +02:00
Samy Pessé a91245d575 Add options paperSize and margin for pdf 2014-06-02 17:57:47 +02:00
Samy Pessé 5f207f5e14 Add options pdf.toc and pdf.fontSize 2014-06-02 17:49:05 +02:00
Samy Pessé 718692de3b Langs index page now use direct link to html file 2014-06-02 14:49:40 +02:00
Samy Pessé 9856a51255 Fix #282: stop generation of langs index for page format 2014-06-02 14:13:52 +02:00
Samy Pessé 58eaaf5514 Fix error when plugin don't extend book 2014-06-02 12:51:22 +02:00
Samy Pessé c0ae0138f8 Improve documentation about book.json 2014-06-02 11:41:16 +02:00
Samy Pessé b1b9dc5b0a Fix error during generation 2014-06-02 11:37:25 +02:00
Samy Pessé f85c5a6498 Add error message when generator is invalid
Fixes #276, #277
2014-06-02 11:32:09 +02:00
Aaron O'Mullan 32eafefc45 Bump version to 0.4.8 2014-05-29 16:36:56 -07:00
Aaron O'Mullan 336999a34e Set default pdf font size to 12 2014-05-29 15:57:56 -07:00
Samy Pessé 1bf5f3b984 Force paper format to A4 fro pdf 2014-05-30 00:33:35 +02:00
Samy Pessé c76d070237 Merge pull request #274 from emmanuel-keller/patch-1
Adding a new plugin (Piwik Open Analytics plugin)
2014-05-30 00:11:38 +02:00
Emmanuel Keller 8c7da1351f Adding a new plugin.
I Just published a first version of the Piwik Open Analytics plugin, on both GIT and NPM.
2014-05-29 23:31:38 +02:00
Samy Pessé 34588c6092 Add margin on pdf output 2014-05-29 18:53:08 +02:00
Samy Pessé 9f00bf8060 Add toc at the end of pdf 2014-05-29 18:33:05 +02:00
Samy Pessé f4a17b182f Improve ebook generation (toc, ...) 2014-05-29 18:28:09 +02:00
Samy Pessé 5c3b345fa6 Generate valid first level table of content for ebook 2014-05-29 17:28:18 +02:00
Samy Pessé 46321fffd9 Use ebook-convert for pdf generation 2014-05-29 17:07:03 +02:00
Aaron O'Mullan 89ba17de84 Bump version to 0.4.7 2014-05-26 12:14:32 -07:00
Aaron O'Mullan 115fba837c Merge pull request #265 from GitbookIO/feature/levels
More than two section level in summary
2014-05-26 11:27:27 -07:00
Samy Pessé 4df51546b2 Remove command log in ebook convert 2014-05-26 18:02:32 +02:00
Samy Pessé f68aaf7ff9 Fix cover option for ebook 2014-05-26 18:02:09 +02:00
Samy Pessé e3d1746ba3 Fix use of cover.jpg in ebook 2014-05-26 17:58:08 +02:00
Samy Pessé a0d5646034 Adapt navigation parsing to third and more levels in summary 2014-05-26 17:42:05 +02:00
Samy Pessé 2f8af5f136 Improve design of summary for deep articles 2014-05-26 17:33:10 +02:00
Samy Pessé 8b7abbd6f4 Render articles of level > 2 in summary 2014-05-26 17:31:35 +02:00
Samy Pessé f228f646eb Remove useless method parseArticle 2014-05-26 17:23:19 +02:00
Samy Pessé 45891d80c7 Parse more than two level in summary 2014-05-26 17:21:23 +02:00
Samy Pessé ac900aa37f Merge pull request #263 from jpoesen/patch-1
Minor typo, grammar and style corrections.
2014-05-26 10:44:25 +02:00
Joeri Poesen 422cbed796 Minor typo, grammar and style corrections. 2014-05-26 08:13:35 +02:00
Samy Pessé 38cbbe46aa Fix cache manifest generation 2014-05-25 20:47:57 +02:00
Aaron O'Mullan c1b57a387b Bump version to 0.4.6 2014-05-23 16:35:44 -07:00
Samy Pessé aaa9ae8bb7 Fix loading button display on navigation 2014-05-24 01:32:39 +02:00
Samy Pessé 6340a64cff Fix #235: search after navigation to another page 2014-05-23 22:28:36 +02:00
Samy Pessé 96bcfa4e20 Fix #218: keep state of font settings 2014-05-23 22:20:36 +02:00
Samy Pessé af0f56b26b Change position of menu action in header 2014-05-23 21:49:11 +02:00
Samy Pessé aed5befa48 Fix display of divider in lateral menu 2014-05-23 21:48:04 +02:00
Samy Pessé 8e37da672d Minor css improvements 2014-05-23 21:43:47 +02:00
Samy Pessé c0f68c45e2 Fix #249: fix links.toAbsolute on windows 2014-05-23 21:10:58 +02:00
Samy Pessé 47fdd73791 Fix cache manifest in the html tag
Serve command disable cache
2014-05-23 17:45:46 +02:00
Samy Pessé 7c0b88cf2e Plugins can extend html 2014-05-23 17:00:37 +02:00
Samy Pessé bf21633b6c Support multi-languages book in json format 2014-05-23 16:35:34 +02:00
Samy Pessé ad9b1fd6f7 Fix order of progress for level superior to x.9
Related to GitbookIO/gitbook.io#23
2014-05-21 23:31:57 +02:00
Samy Pessé d245895085 Add link to documentation 2014-05-21 20:22:28 +02:00
Samy Pessé c7439d12f7 Add livereload as default plugins only for serve 2014-05-21 17:34:36 +02:00
Samy Pessé 8d6923ce2c Merge pull request #234 from davidagraf/livereload
Livereload
2014-05-21 17:17:08 +02:00
David Graf b21fb24a82 gitbook-plugin-livereload dependency to npm 2014-05-21 16:35:55 +02:00
David Graf e7be132194 Merge branch 'master' into livereload 2014-05-21 16:24:07 +02:00
Samy Pessé 0e1717f4bb Improve grammar (thanks to @theoutlander ) 2014-05-21 10:46:26 +02:00
Aaron O'Mullan 276dbe29c7 Bump version to 0.4.5 2014-05-20 23:29:39 -07:00
Aaron O'Mullan 21fd5924b8 Fix generate failing on README parsing
Failed if no title or description could be extracted
2014-05-20 23:29:06 -07:00
Aaron O'Mullan 443def6cfd Bump version to 0.4.4 2014-05-20 22:59:26 -07:00
Samy Pessé 75464574d7 For multi-langs, run build one by one 2014-05-21 00:09:40 +02:00
Samy Pessé 86f05c68c5 Improve parsing of readme (extraction of title and description as plain text and not markdown) 2014-05-20 23:45:35 +02:00
Samy Pessé 8dd407eaa8 Fix merge of output for multi-languages books 2014-05-20 23:31:22 +02:00
Samy Pessé ea7ad10e8a Add support for multi-languages books in JSON format 2014-05-20 23:21:12 +02:00
Samy Pessé 62ec695dc8 Extract title and description from readme before switching to multi-languages handling 2014-05-20 23:07:41 +02:00
Samy Pessé ca37ac73a9 Add more infos about gitbook.io 2014-05-20 14:40:22 +02:00
Samy Pessé 96edd50c8f Add norm for small cover 2014-05-20 01:23:49 +02:00
Samy Pessé 3993c1e35a Change advised ratio for cover 2014-05-19 21:47:41 +02:00
Aaron O'Mullan 5298558925 Bump version to 0.4.3 2014-05-18 02:25:53 -07:00
Samy Pessé c6ba147917 Print stack only when env DEBUG is set 2014-05-17 20:35:41 +02:00
Samy Pessé 7efecea3d6 Exit process with -1 when error occurs 2014-05-17 20:35:13 +02:00
Aaron O'Mullan a73fed3ebd Merge pull request #240 from ajschumacher/patch-1
typo: "blockin" to "block in"
2014-05-16 09:06:15 -07:00
Aaron Schumacher 50ef7bcd23 typo: "blockin" to "block in" 2014-05-16 12:02:06 -04:00
Aaron O'Mullan 82e422cb89 Fix issue of disabling issues and contribute
Improve robustness of template display conditions
2014-05-15 21:35:09 -07:00
Aaron O'Mullan dab46c779d Allow github support to be disabled in book.json
Fixes #238
2014-05-15 21:24:28 -07:00
David Graf 7c65adc9b2 disable cache manifest import if cache is disabled 2014-05-15 12:07:51 +02:00
David Graf 9b96ef9bae added livereload dependency 2014-05-15 11:41:59 +02:00
David Graf e97d1941dc Introducing livereload server 2014-05-15 08:09:02 +02:00
David Graf 0b0ac46e34 Introducing option to disable cache manifest generation 2014-05-15 08:07:24 +02:00
David Graf 622bbcb8ea ignore vim swap files 2014-05-15 07:43:59 +02:00
Samy Pessé 58a5245d21 Merge pull request #233 from embreinhardt/master
Add LESS variable for sidebar full-width breakpoint
2014-05-14 20:10:02 +02:00
Erika Reinhardt 612f9a6dc7 Add LESS variable for sidebar full-width breakpoint 2014-05-14 11:01:57 -07:00
Samy Pessé 90d4dff263 Merge pull request #232 from embreinhardt/master
Make font-settings.html indentation consistent
2014-05-14 10:35:32 +02:00
Erika Reinhardt 0f38385c7d Make font-settings.html indentation consistent
[Minor] Was mix of tabs and spaces, which messed with text edit display
2014-05-14 01:25:18 -07:00
Samy Pessé 2b50616251 Merge pull request #231 from embreinhardt/master
Add HTML classes to make plugins easier to write
2014-05-14 10:20:42 +02:00
Erika Reinhardt 5b7f37f0d4 Add HTML classes to make plugins easier to write 2014-05-14 01:14:21 -07:00
Aaron O'Mullan 6ca8e26741 Merge pull request #229 from weitzman/patch-1
Fix recent typo in README.MD
2014-05-12 14:04:52 -07:00
Moshe Weitzman a3ada05598 Fix recent typo in README.MD 2014-05-12 16:18:50 -04:00
Samy Pessé 42eb11aaff Add infos about cover 2014-05-11 16:47:30 +02:00
Samy Pessé b581859afd Merge pull request #223 from cef62/fix-windows-paths
Force forward slashes on SUMMARY.md path for articles
2014-05-08 22:54:40 +02:00
Matteo Ronchi 2e22fae52a Force forward slashes on SUMMARY.md paths
this prevent windows user to generate invalid path on unix OS
Reference to issue #39 on gitbook-editor
2014-05-08 22:46:53 +02:00
Aaron O'Mullan 603ac8b91d Merge pull request #221 from frodsan/patch-1
Don't show divider even if githubId is present.
2014-05-08 09:58:06 -07:00
Francesco Rodríguez 5faa4841ca Don't show divider even if githubId is present. 2014-05-08 13:40:15 -03:00
Samy Pessé 7416b826e0 Fix #218: Add settings for client theme (font family, size, theme) 2014-05-08 13:16:30 +02:00
Aaron O'Mullan 82afc34755 Merge pull request #219 from BjoernSchotte/feature/doc-theme
added documentation for theme option
2014-05-07 23:08:53 -07:00
Björn Schotte da39631a5a added documentation for theme option 2014-05-08 07:57:33 +02:00
Aaron O'Mullan fc8685a7c1 Merge pull request #216 from ianmcburnie/accessibility
Accessibility: added aria-labels to header
2014-05-06 12:34:43 -07:00
Ian McBurnie 5e0204a980 Accessibility: added aria-labels to header
Feel free to change any of the label text that I have chosen :-)
2014-05-06 11:27:54 -07:00
Samy Pessé 6bb0f33f39 Fix #211: read config file before cleaning output folder 2014-05-06 12:08:27 +02:00
Aaron O'Mullan ed4fd565b2 Merge pull request #213 from ianmcburnie/accessibility
Accessibility: aria-label added to navigation links
2014-05-05 22:37:21 -07:00
Ian McBurnie 79cff28abd Accessibility: aria-label added to navigation links
Current behavior: Screenreader just reads ‘link’ when landing on the
previous and next navigation links, giving the user no indication of
what the link does or where it goes. New Behaviour: Screenreader reads
“Previous page: {page title}” and “Next page: {page title}”
respectively.
2014-05-05 22:29:22 -07:00
Samy Pessé 27329239f7 Fix #208: correct name for edit/contribute link in doc 2014-05-05 17:55:19 +02:00
Samy Pessé 9de86fc0e4 Add tests for book generation 2014-05-05 15:25:15 +02:00
Samy Pessé 7fa7826372 Merge pull request #203 from GitbookIO/improve/generate
Improve generate's reliability, fixes #202
2014-05-04 22:37:42 +02:00
Aaron O'Mullan 96ecfd098b Improve generate's reliability, fixes #202
This also improves speed on multi language books
2014-05-04 12:53:24 -07:00
Samy Pessé f7fe976c7e Fix #197: use URI.js for calculation of relative url
Use bower for client dependencies
2014-05-04 15:15:18 +02:00
Samy Pessé 756629b91d Add bower dependencies 2014-05-04 15:03:47 +02:00
Samy Pessé e640d124d4 Add bower vendors to gitignore 2014-05-04 14:58:45 +02:00
Samy Pessé 7f41466297 Remove vendors directory 2014-05-04 14:58:01 +02:00
Samy Pessé 57dfc062d2 Create CHANGES.md 2014-05-04 13:09:27 +02:00
Aaron O'Mullan 799815d85a Bump version to 0.4.2 2014-05-01 16:17:05 -07:00
Samy Pessé 2946246834 Fix #191: remove log for changes in files 2014-05-01 18:55:45 +02:00
Samy Pessé 6d276d1e79 Add option to remove home link 2014-05-01 18:53:49 +02:00
Samy Pessé 6a3a369b3e Add options to remove sharing links 2014-05-01 18:37:30 +02:00
Samy Pessé 5d8afa2135 Merge pull request #196 from mrpotes/new-plugins
New plugins
2014-05-01 18:33:30 +02:00
Samy Pessé ab3e6aa8ce Fix font-size for titles in markdown content 2014-05-01 18:29:42 +02:00
James Phillpotts 822092736e New plugins 2014-05-01 17:00:38 +01:00
Samy Pessé 7497acd2e3 Center navigation button on mobile on start page 2014-05-01 17:37:38 +02:00
Samy Pessé ae137885b8 Fix book content padding on mobile 2014-05-01 17:27:03 +02:00
Samy Pessé b964cc7009 Fix #162: hide watch/star buttons on mobile 2014-05-01 17:16:09 +02:00
Samy Pessé c2ea126c5f Fix #182: Replace all book body when page changes 2014-05-01 14:05:14 +02:00
Samy Pessé b668dba479 Update gaze version to 0.5.1 2014-05-01 13:26:50 +02:00
Samy Pessé 2cae5a0310 Secure .book position 2014-05-01 13:26:19 +02:00
Samy Pessé b6a0f3ff67 Fix #164: use position absolute instead of fixed 2014-04-30 17:01:25 +02:00
Samy Pessé fa00b52fb5 Fix #127: add configuration for changing links in sidebar 2014-04-30 16:46:24 +02:00
Samy Pessé 2999d90907 Merge pull request #188 from snipe/feature/json-doc
Added quotes for JSON example, per #127
2014-04-30 12:48:28 +02:00
snipe b6696bcad2 Added quotes for JSON example, per #127 2014-04-30 06:46:28 -04:00
Samy Pessé 728c87c525 Merge pull request #187 from snipe/feature/typo-fixes
Fixed typos
2014-04-30 12:05:12 +02:00
snipe ace394ee2d Fixed typos 2014-04-30 05:28:18 -04:00
Samy Pessé 076ee98f64 Fix #186: Plugins that don't have assets should be skipped 2014-04-30 11:15:01 +02:00
Samy Pessé 2e472654ca Fix error when calling hooks in site generation 2014-04-30 10:54:45 +02:00
Aaron O'Mullan d46bd14678 0.4.1 2014-04-29 10:23:54 -07:00
Samy Pessé b3e5b3d106 Fix #183: normalize hooks and transformation of page (content, progress, ..° 2014-04-29 17:45:54 +02:00
Samy Pessé b830ef5dca Merge pull request #179 from erixtekila/master
Update README.md
2014-04-29 08:23:33 +02:00
Eric Priou 45326c4ad2 Update README.md 2014-04-29 03:45:03 +02:00
Aaron O'Mullan 603b61e8c8 Bump version to 0.4.0 2014-04-28 13:26:40 -07:00
Samy Pessé efb066c8e3 Update doc about how to configure gitbook 2014-04-28 20:45:10 +02:00
Samy Pessé c30db427b1 Remove some options from command line (moved to book.json) 2014-04-28 20:33:25 +02:00
Samy Pessé 23056fc85d Use a global configuration file for a book (default to book.json) 2014-04-28 20:29:36 +02:00
Samy Pessé 5f1bfc0280 Fix #163: Move logic of git infos extraction to lib 2014-04-28 20:16:30 +02:00
Samy Pessé b715901f92 Add hooks "page:before" and "page:after" 2014-04-28 19:56:40 +02:00
Samy Pessé 38fea06cf9 Use hook to allow plugins to edit page content during generation (Fixes #176) 2014-04-28 17:21:06 +02:00
Aaron O'Mullan 4481b5f556 Bump version to 0.3.2 2014-04-27 13:46:20 -07:00
Samy Pessé 0e0d051f7c Merge pull request #173 from erixtekila/master
Update README.md
2014-04-27 22:26:56 +02:00
Eric Priou a1b649a279 Update README.md 2014-04-27 22:24:37 +02:00
Eric Priou e6bc0a0fb7 Update README.md
3rd party plugins done in the weekend
2014-04-27 22:18:09 +02:00
Samy Pessé 93e4016c09 Add link to disqus plugin 2014-04-27 21:55:50 +02:00
Samy Pessé 20c741a248 Fix stupid typo thanks to @erixtekila 2014-04-27 21:21:48 +02:00
Samy Pessé 54f530c7c3 Merge pull request #171 from GitbookIO/feature/offlineCache
Improve pages loading
2014-04-27 18:05:13 +02:00
Samy Pessé 9fdc5da22d Update page when new version of application cache 2014-04-27 17:57:34 +02:00
Samy Pessé 99ce48b146 Add base loading indicator for navigation
#161
2014-04-27 17:36:12 +02:00
Samy Pessé 6a33ad9ef7 Add base cache manifest 2014-04-27 17:14:57 +02:00
Samy Pessé ca94055adf Adapt tests for plugins 2014-04-27 15:45:16 +02:00
Samy Pessé 36a67e4c91 Fix #169: fix resolve of external plugins 2014-04-27 15:41:02 +02:00
Samy Pessé 69431e1bbb Fix #165: replace separator from ":" to "," 2014-04-27 09:14:39 +02:00
Samy Pessé a3fc4ee2b0 Fix display of code element in sepia/night 2014-04-25 18:14:41 +02:00
Samy Pessé e505fd6d54 Improve summary divider for theme sepia and night 2014-04-25 18:12:39 +02:00
Samy Pessé 93a3785e4c Improve highlight theme for sepia and night themes 2014-04-25 18:05:09 +02:00
Samy Pessé a02de84812 Change highlight theme to tomorrow 2014-04-25 17:56:48 +02:00
Samy Pessé c0521f0ec7 Improve display of pre in markdown content 2014-04-25 17:48:31 +02:00
Samy Pessé 83d8c16853 Add file watcher in "gitbook serve" command (Fix #47, #89, #140) 2014-04-25 16:23:13 +02:00
Samy Pessé 47e9506397 Fix #153 and Improve pushState navigation 2014-04-25 15:12:19 +02:00
Samy Pessé b8a3d0e254 Merge pull request #144 from attomos/master
Make quiz easier to click by surround it with label.
2014-04-25 14:29:04 +02:00
Samy Pessé 001d7ec44e Merge pull request #155 from pborreli/patch-1
Fixed typo
2014-04-24 22:44:36 +02:00
Pascal Borreli 5cb0ec447a Fixed typo 2014-04-24 21:43:32 +01:00
Aaron O'Mullan 67e7d77302 Bump version to 0.3.1 2014-04-24 10:45:55 -07:00
Aaron O'Mullan 8cbd8b2b48 Reorder plugin names
Improves #149 and improves GitBookIO/editor#12
2014-04-24 01:38:42 -07:00
Aaron O'Mullan 7c404dbf96 Fix plugin tests 2014-04-24 01:34:35 -07:00
Aaron O'Mullan c4a67b6f2f Require plugin names to contain gitbook-*
Fixes #149, fixes GitBookIO/editor#12
2014-04-24 01:28:04 -07:00
Samy Pessé 3b70347625 Fix #146: complete license 2014-04-24 09:00:15 +02:00
Aaron O'Mullan bb0a7935e9 Merge pull request #141 from frodsan/niceties
Niceties
2014-04-23 11:34:08 -07:00
Nattaphoom Ch 8f4b799d3c Make quiz easier to click by surround it with label. 2014-04-24 01:19:13 +07:00
Francesco Rodriguez 931e0c66c9 Update color themes for highlight.js link. 2014-04-23 12:30:05 -03:00
Francesco Rodriguez 0212084862 Fix typo. 2014-04-23 12:28:44 -03:00
Samy Pessé 9abbabbce3 Merge pull request #138 from Hermanya/patch-1
Add @Hermanya as a contributor
2014-04-22 23:47:13 +02:00
Hermanya ac610487e8 Add @Hermanya as a contributor 2014-04-22 17:45:41 -04:00
Aaron O'Mullan a9a0f89892 Bump version to 0.3.0 2014-04-22 14:05:52 -07:00
Samy Pessé 305f221077 Fix #136: replace links to .md by links to .html
Add more tests for links in page
2014-04-22 17:45:12 +02:00
Samy Pessé 53514f2602 Improve sepia theme sidebar 2014-04-22 14:27:48 +02:00
Samy Pessé 00327778cb Improve font-settings dropdown design 2014-04-22 14:12:53 +02:00
Samy Pessé 37fadec787 Merge branch 'master' of https://github.com/Hermanya/gitbook into Hermanya-master 2014-04-22 14:02:19 +02:00
Samy Pessé ada11d0b59 Add section in readme about plugins 2014-04-22 12:51:10 +02:00
Aaron O'Mullan 4c90fdb7b2 Merge pull request #123 from GitbookIO/feature/plugins
Fix #65: Plugins Architecture
2014-04-21 14:26:09 -07:00
Samy Pessé 98c133df3c Change plugins separator to "," 2014-04-21 23:23:53 +02:00
Samy Pessé f86c27b090 Add option --pluginsConfig 2014-04-21 22:58:51 +02:00
Samy Pessé b5b8ed72a5 Update default addons 2014-04-21 22:39:23 +02:00
Samy Pessé 5beff86548 Change js interface for plugins and add configuration 2014-04-21 22:20:41 +02:00
Samy Pessé dd395edae1 Use mathjax plugin version 0.0.2 2014-04-21 16:30:02 +02:00
Aaron O'Mullan d1c1d7b75b Bump version to 0.2.4 2014-04-20 16:41:09 -07:00
Samy Pessé 4a380e9279 Fix #36: add mathjax plugin as default 2014-04-20 15:20:21 +02:00
Samy Pessé 878c105def Use complete assets folder for plugins 2014-04-20 02:04:15 +02:00
Samy Pessé 74d628676b Add option to change templates from plugin 2014-04-20 00:10:46 +02:00
Samy Pessé 6fdd98ec3a Trigger event on document when ready 2014-04-19 20:39:58 +02:00
Samy Pessé 2ed1be3533 Add global js interface for plugins and remove mixpanel 2014-04-19 20:10:03 +02:00
Samy Pessé 0ac04e1584 Add call for hooks "init" and "finish" 2014-04-19 19:50:32 +02:00
Herman Starikov 2a38d33d8a Font settings, closes #102 2014-04-19 13:46:14 -04:00
Samy Pessé fb14caf5b3 Add resources to site build 2014-04-19 19:31:02 +02:00
Samy Pessé cf51772f54 Add command line option "plugins" 2014-04-19 18:00:24 +02:00
Samy Pessé cc8516df83 Load plugins during generation 2014-04-19 17:57:40 +02:00
Samy Pessé c6a624bc6b Add method to load a list of plugins from generator options 2014-04-19 17:54:15 +02:00
Samy Pessé 8be8b825ee Add base loading of default addons
Add mixpanel as default addon
2014-04-19 17:28:44 +02:00
Samy Pessé 56eb4a2897 Add base plugin object and test validation of plugin 2014-04-19 15:41:29 +02:00
Samy Pessé 7a461eaa61 Remove theme readme
Add semver dependency
2014-04-19 14:40:46 +02:00
Samy Pessé fd64c05809 Fix #118: fix single page generation when file from summary doesn't exists 2014-04-18 23:42:02 +02:00
Aaron O'Mullan 6bce93d893 Bump version to 0.2.3 2014-04-18 11:53:18 -07:00
Aaron O'Mullan c9db068227 Refactor navigation generation to be functional
This makes it a lot less error prone and far more robust. As well as a
lot easier to understand
2014-04-18 11:49:55 -07:00
Samy Pessé 8a6d36ac4d Improve stability of mixpanel tracking 2014-04-18 20:42:18 +02:00
Samy Pessé 64622c5945 Load css before content 2014-04-18 20:19:45 +02:00
Samy Pessé 837813edb0 Add warning about theme 2014-04-18 20:16:21 +02:00
Aaron O'Mullan 0d9d62f1a9 Merge pull request #117 from GitbookIO/fix/99
Fix #99
2014-04-18 10:17:20 -07:00
Samy Pessé f7e9abf984 Fix quiz interractivity 2014-04-18 19:10:13 +02:00
Samy Pessé dd0579b60d Update tests for relative images 2014-04-18 17:23:33 +02:00
Samy Pessé b5bb953e47 Fix image path calcul 2014-04-18 17:15:03 +02:00
Samy Pessé ef4a8ea1b6 Fix #116: update url before updating html content 2014-04-18 15:49:53 +02:00
Samy Pessé 49cde96ee7 Add contributors to package.json and change homepage 2014-04-18 15:00:40 +02:00
Samy Pessé 627be20e48 Add editor and twitter links in the readme 2014-04-18 14:48:03 +02:00
Samy Pessé e45bb84b02 Fix navigation on chrome for iOS: disable pushState 2014-04-18 13:09:16 +02:00
Aaron O'Mullan 4e8876c725 Update README.md 2014-04-17 16:39:06 -07:00
Aaron O'Mullan 6d5be15ec9 Bump version to 0.2.2 2014-04-17 15:31:57 -07:00
Samy Pessé 1a8db646f2 Improve styling for pdf and ebook 2014-04-17 12:15:28 +02:00
Samy Pessé d3aba2c906 Fix state update after navigation 2014-04-17 11:48:04 +02:00
Samy Pessé 457a83282f Improve style for pdf and ebook 2014-04-17 11:27:21 +02:00
Samy Pessé 48e94c937d Remove useless caracter from page format 2014-04-17 11:17:40 +02:00
Samy Pessé 6e613e9f71 Fix #107: Render all the page in single page format 2014-04-17 11:16:18 +02:00
Aaron O'Mullan b698d43d7d Bump version to 0.2.1 2014-04-17 01:10:11 -07:00
Aaron O'Mullan a36b9a6088 Normalize code language before highlighting 2014-04-17 01:09:26 -07:00
Samy Pessé 20acd89c8a Merge pull request #104 from GitbookIO/fix/auto_highlighting
Disable automatic highlighting
2014-04-17 09:24:56 +02:00
Aaron O'Mullan 7bed9a257d Merge pull request #105 from ptagell/master
Removed duplicate line of readme
2014-04-16 14:38:49 -07:00
Paul Tagell 19c83aa5a8 Removed duplicate line of readme 2014-04-17 07:35:28 +10:00
Aaron O'Mullan 52610d7d61 Disable automatic highlighting
Fallback to no highlighting rather that potentially funky highlighting
2014-04-16 13:15:35 -07:00
Aaron O'Mullan 9e4b393b7a In parse/page remove global marked settings
Highlighter settings were global, moved them to the render function
(where they should have been)
2014-04-16 13:07:35 -07:00
Samy Pessé a0ae34a3b7 Fix #100: fix section test isQuiz 2014-04-16 17:16:18 +02:00
Samy Pessé 413dc5d004 Add more test for quiz (related to #100) 2014-04-16 17:15:45 +02:00
Aaron O'Mullan c9eb27bfe7 Do not pass SUMMARY.md to generator, fixes #93
We want to parse SUMMARY.md but not generate a file from it, thus it
should be removed from the list of files to be processed by the
generator
2014-04-16 00:18:35 -07:00
Aaron O'Mullan b78505c290 Ignore .gitignore file by default in fs.list
Partial fix of #93
2014-04-16 00:11:54 -07:00
Samy Pessé 95f9ae83d0 Fix #97: keep scroll position during page changement 2014-04-15 17:42:46 +02:00
Samy Pessé 9304289315 Fix progress display when page change 2014-04-14 23:00:40 +02:00
Samy Pessé 1b726ca293 Update preview 2014-04-14 22:35:10 +02:00
Samy Pessé 656ca18929 Improve languages list design 2014-04-14 21:29:26 +02:00
Aaron O'Mullan b8cacaee00 Bump to version 0.2.0 2014-04-14 11:48:29 -07:00
Samy Pessé f349012f0f Add analytics on page changement 2014-04-14 20:33:45 +02:00
Samy Pessé ddd49509ce Improve design of header buttons 2014-04-14 20:21:57 +02:00
Samy Pessé 28257e1ce7 Fix search with pusState navigation 2014-04-14 20:15:04 +02:00
Samy Pessé 24d8e15ee2 Fix scrolling on new design 2014-04-14 20:08:55 +02:00
Samy Pessé d6d9223ea1 Revert "Fix ebook and pdf generator"
This reverts commit f43e630528.
2014-04-14 20:00:15 +02:00
Samy Pessé 05f1eed9ce Fix #91: Extract defaults title and description from README.md 2014-04-14 19:48:12 +02:00
Samy Pessé c0ca055bf4 Add readme parsing for extracting title and description 2014-04-14 19:21:43 +02:00
Samy Pessé f43e630528 Fix ebook and pdf generator 2014-04-14 19:05:23 +02:00
Samy Pessé e4fa8aaca7 Fix generate.file method 2014-04-14 18:56:20 +02:00
Samy Pessé 1b147d3e30 Merge branch 'master' of https://github.com/tcorral/gitbook into tcorral-master
Conflicts:
	theme/javascript/app.js
2014-04-14 16:44:11 +02:00
Samy Pessé 5848f5db51 Merge pull request #88 from GitbookIO/feature/clarity
Feature/clarity
2014-04-14 16:36:12 +02:00
Samy Pessé 9f1ba8483b Merge head styles so that ace stays stable 2014-04-14 16:34:19 +02:00
Samy Pessé 6da48764e8 Fix header interractive actions: buttons and github 2014-04-14 16:29:02 +02:00
Samy Pessé 8c4cfed609 Add complete refresh of head and body on page navigation 2014-04-14 16:16:34 +02:00
Samy Pessé 1ff7e88cea Focs and reset scroll on page body 2014-04-14 15:43:11 +02:00
Samy Pessé c3ba975d6c Improve quiz sections design 2014-04-14 15:37:13 +02:00
Samy Pessé 8c02e949fc Fix exercises binding when page changed
Add base binding for quiz
2014-04-14 12:43:45 +02:00
Samy Pessé 56e1803b34 Fix title update with pushState navigation 2014-04-14 12:32:22 +02:00
Samy Pessé c511037f46 New languages page 2014-04-14 01:04:58 +02:00
Samy Pessé 730fe982f5 Add @Nijikokun as a contributor 2014-04-14 00:49:25 +02:00
Samy Pessé ca71a1c9e6 Fix regression on github as an option 2014-04-14 00:49:09 +02:00
Samy Pessé 01bc283638 Add fonts locally 2014-04-14 00:40:02 +02:00
Samy Pessé 4ca719b108 Fix fonts path 2014-04-14 00:23:38 +02:00
Samy Pessé 889183ccc9 Improve search input design 2014-04-14 00:17:16 +02:00
Samy Pessé 4a6ae8d4e0 Switch to 4spaces indentations for less files 2014-04-14 00:15:35 +02:00
Samy Pessé b77debae24 Made progress bar static 2014-04-14 00:11:51 +02:00
Samy Pessé 9ffa462111 Add base from clarity theme from @Nijikokun 2014-04-14 00:06:58 +02:00
Samy Pessé 1bbef54015 Remove logs from core module 2014-04-13 23:55:13 +02:00
Samy Pessé 3c7cae6262 Move more build logic to the core generation module 2014-04-13 23:53:34 +02:00
tcorral 646a4513e3 Allow scroll in computers that put the navigation over scroll control. When the document is ready it will check the difference between the body-inner and the page-wrapper width to move the layer only this width allowing the user to scroll. 2014-04-13 04:24:07 +02:00
tcorral d9e34fc671 Allow scroll in computers that put the navigation over scroll control. When the document is ready it will check the difference between the body-inner and the page-wrapper width to move the layer only this width allowing the user to scroll. 2014-04-13 03:09:50 +02:00
tcorral 2242963258 Allow scroll in computers that put the navigation over scroll control. When the document is ready it will check the difference between the body-inner and the page-wrapper width to move the layer only this width allowing the user to scroll. 2014-04-13 03:07:44 +02:00
Aaron O'Mullan 555c0d63ee Add gitbook init command, fixes #67 2014-04-12 12:27:13 -07:00
Aaron O'Mullan fb05609e09 Refactor binary's buildCommand
Be more “commander-like”
2014-04-12 11:58:55 -07:00
Aaron O'Mullan 78cb9a56ba Merge pull request #85 from GitbookIO/pr/63
Pr/63
2014-04-12 01:51:06 -07:00
Aaron O'Mullan 6173fb76ad Refactor, document, improve section type detection
Especially for quiz types
2014-04-12 01:50:48 -07:00
Aaron O'Mullan ca25511d7a Fixup page lexing in test/page 2014-04-12 01:34:36 -07:00
James Phillpotts b07681a16a Quiz with GFM checkbox lists 2014-04-12 01:26:03 -07:00
James Phillpotts f6595f5111 Tabular quiz 2014-04-12 01:25:07 -07:00
Samy Pessé ab27725b99 Update AUTHORS.md 2014-04-11 23:31:39 +02:00
Samy Pessé 32b1be3dee Create AUTHORS.md 2014-04-11 23:30:40 +02:00
Samy Pessé d715b5b154 Merge pull request #84 from Tim-Zhang/master
Fix title problem when repo url doesn't have .git suffix
2014-04-11 23:15:30 +02:00
TimZhang 177ca32b9b Fix title problem when repo url doesn't have .git suffix 2014-04-11 18:04:01 +08:00
Aaron O'Mullan 892ec04f52 Merge pull request #78 from mrpotes/mocha-windows
Fix URL creation on windows
2014-04-10 11:44:33 -07:00
James Phillpotts 8f457a752e Use OS-agnostic path generation for images too 2014-04-10 11:00:52 +01:00
James Phillpotts 435a4b8c99 Use API from node 0.8 2014-04-10 10:45:54 +01:00
Samy Pessé 02d8272c74 Merge pull request #77 from GitbookIO/improve/sections_lexing
Improve/sections lexing
2014-04-10 11:34:56 +02:00
Aaron O'Mullan e54b808093 Improve section detection, fixes #68 2014-04-10 02:32:37 -07:00
James Phillpotts fb7653bd14 Fix URL creation on windows 2014-04-10 10:31:32 +01:00
Aaron O'Mullan 04774df372 Add better tests for ambiguous section detection 2014-04-10 02:27:42 -07:00
Aaron O'Mullan 619ded93ad Improve language normalization
Check for null before converting to lower case
2014-04-10 02:21:54 -07:00
Samy Pessé 2e85380cd8 Merge pull request #62 from oliverh855/master
Changes the default font from Helvetica to Open Sans
2014-04-09 11:13:56 +02:00
Oliver Hoffmann 241ad7cb0e Removes unused font-family appLight 2014-04-09 11:09:31 +02:00
Oliver Hoffmann 0171c32996 Removes helvetica font from repository 2014-04-09 11:08:39 +02:00
Oliver Hoffmann d275bd516a Changes the default font from Helvetica to Open Sans. See #14 2014-04-09 10:55:52 +02:00
Samy Pessé 99594791e0 Merge Optional github 2014-04-09 08:23:11 +02:00
Samy Pessé 1b432288f0 Merge branch 'optional-github' of https://github.com/mrpotes/gitbook into mrpotes-optional-github 2014-04-09 08:17:37 +02:00
Aaron O'Mullan 2cc23b7e34 Bump version to 0.1.3 2014-04-08 17:03:13 -07:00
Aaron O'Mullan 61b6848a95 Uglify output JS theme/assets/app.js 2014-04-08 17:01:43 -07:00
Aaron O'Mullan 9265b0185a Add context code support to exercises (optional)
Partial #52, fixes #49, fixes #46
2014-04-08 16:58:04 -07:00
Aaron O'Mullan 392573a990 Add lexing support for content code in exercises
#52, #49, #46
2014-04-08 15:01:12 -07:00
Aaron O'Mullan 554d6a6170 Fix URL rewriting error on empty URLs
Fixes #54, fixes #59
2014-04-08 14:47:36 -07:00
James Phillpotts fa2f82d52f Tidy up use of github, and make error more descriptive 2014-04-08 10:00:10 +01:00
Samy Pessé 2182baa2e9 Merge pull request #51 from calmdev/fix/gh-enterprise
Fixes --githubHost option for use with Github Enterprise.
2014-04-07 10:42:55 -07:00
Levi Lewis 7fe189907e Fixes --githubHost option for use with Github Enterprise. 2014-04-07 13:11:44 -04:00
James Phillpotts 58a90886da Whoops, missed a couple of extra uses of githubId 2014-04-07 10:51:41 +01:00
James Phillpotts 80794997a4 Make use of github optional 2014-04-07 10:38:06 +01:00
167 changed files with 4461 additions and 42189 deletions
+5
View File
@@ -23,3 +23,8 @@ build/Release
# Deployed apps should consider commenting this line out:
# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git
node_modules
theme/javascript/vendors
# vim swapfile
*.swp
+18
View File
@@ -0,0 +1,18 @@
Authors
=======
Also see https://github.com/GitbookIO/gitbook/graphs/contributors.
Names below are ordered by first contribution.
Author
------
- Samy Pessé <samypesse@gmail.com>
- Aaron O'Mullan <aaron.omullan@gmail.com>
Contributors
------------
- Nijiko Yonskai
- Herman Starikov
+2
View File
@@ -0,0 +1,2 @@
# Release notes
+21 -13
View File
@@ -4,10 +4,18 @@ module.exports = function (grunt) {
// Load NPM tasks
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.loadNpmTasks("grunt-bower-install-simple");
// Init GRUNT configuraton
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
'bower-install-simple': {
options: {
color: true,
production: false,
directory: "theme/javascript/vendors"
}
},
less: {
development: {
options: {
@@ -16,27 +24,27 @@ module.exports = function (grunt) {
optimization: 2
},
files: {
"theme/assets/style.css": "theme/stylesheets/main.less",
"theme/assets/print.css": "theme/stylesheets/print.less"
"theme/assets/style.css": "theme/stylesheets/website.less",
"theme/assets/print.css": "theme/stylesheets/ebook.less"
}
}
},
requirejs: {
compile: {
options: {
name: "app",
name: "gitbook",
baseUrl: "theme/javascript/",
out: "theme/assets/app.js",
preserveLicenseComments: false,
optimize: "none", //"uglify",
optimize: "uglify", //"uglify",
include: ["requireLib"],
paths: {
"jQuery": 'vendors/jquery',
"lodash": 'vendors/lodash',
"requireLib": 'vendors/require',
"Mousetrap": 'vendors/mousetrap',
"mixpanel": 'vendors/mixpanel',
"lunr": path.join(__dirname, "node_modules/lunr/lunr")
"jQuery": 'vendors/jquery/dist/jquery',
"lodash": 'vendors/lodash/dist/lodash',
"requireLib": 'vendors/requirejs/require',
"Mousetrap": 'vendors/mousetrap/mousetrap',
"lunr": 'vendors/lunr.js/lunr',
"URI": 'vendors/URIjs/src/URI'
},
shim: {
'jQuery': {
@@ -48,9 +56,6 @@ module.exports = function (grunt) {
'Mousetrap': {
exports: 'Mousetrap'
},
'mixpanel': {
exports: 'mixpanel'
},
'lunr': {
exports: 'lunr'
}
@@ -60,8 +65,11 @@ module.exports = function (grunt) {
}
});
grunt.registerTask("bower-install", [ "bower-install-simple" ]);
// Build
grunt.registerTask('build', [
'bower-install',
'less',
'requirejs'
]);
+2 -2
View File
@@ -186,7 +186,7 @@ Apache License
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Copyright 2014 FriendCode Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -198,4 +198,4 @@ Apache License
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
limitations under the License.
+148 -19
View File
@@ -3,7 +3,7 @@ GitBook
[![Build Status](https://travis-ci.org/GitbookIO/gitbook.png?branch=master)](https://travis-ci.org/GitbookIO/gitbook)
GitBook is a command line tool (and Node.js library) for building beautiful programming books and exercises using GitHub/Git and Markdown. You can see an example: [Learn Javascript](http://gitbookio.github.io/javascript/).
GitBook is a command line tool (and Node.js library) for building beautiful books and exercises using GitHub/Git and Markdown. You can see an example: [Learn Javascript](https://www.gitbook.io/book/GitBookIO/javascript). An [editor](https://github.com/GitbookIO/editor) is available for Windows, Mac and Linux. You can follow [@GitBookIO](https://twitter.com/GitBookIO) on Twitter. Complete documentation is available at [help.gitbook.io](http://help.gitbook.io/).
![Image](https://raw.github.com/GitbookIO/gitbook/master/preview.png)
@@ -30,33 +30,122 @@ $ gitbook build ./repository --output=./outputFolder
Options for commands `build` and `serve` are:
```
-t, --title <name> Name of the book to generate, defaults to repo name
-i, --intro <intro> Description of the book to generate
-g, --github <repo_path> ID of github repo like : username/repo
-o, --output <directory> Path to output directory, defaults to ./_book
-f, --format <name> Change generation format, defaults to site, availables are: site, page, pdf, json
-i, --intro <intro> Description of the book to generate
-gh, --githubHost <url> The url of the github host (defaults to https://github.com/)
--theme <path> Path to theme directory
-f, --format <name> Change generation format, defaults to site, availables are: site, page, ebook, json
--config <config file> Configuration file to use, defaults to book.js or book.json
```
GitBook loads the default configuration from a `book.json` file in the repository if it exists.
Here are the options that can be stored in this file:
```js
{
// Folders to use for output
// Caution: it overrides the value from the command line
// It's not advised this option in the book.json
"output": null,
// Generator to use for building
// Caution: it overrides the value from the command line
// It's not advised this option in the book.json
"generator": "site",
// Book title and description (defaults are extracted from the README)
"title": null,
"description": null,
// For ebook format, the extension to use for generation (default is detected from output extension)
// "epub", "pdf", "mobi"
// Caution: it overrides the value from the command line
// It's not advised this option in the book.json
"extension": null,
// GitHub information (defaults are extracted using git)
"github": null,
"githubHost": "https://github.com/",
// Plugins list, can contain "-name" for removing default plugins
"plugins": [],
// Global configuration for plugins
"pluginsConfig": {
"fontSettings": {
"theme": "sepia", "night" or "white",
"family": "serif" or "sans",
"size": 1 to 4
}
},
// Set another theme with your own layout
// It's recommended to use plugins or add more options for default theme, though
// See https://github.com/GitbookIO/gitbook/issues/209
"theme": "./localtheme",
// Links in template (null: default, false: remove, string: new value)
"links": {
// Link to home in the top-left corner
"home": null,
// Links in top of sidebar
"about": null,
"issues": null,
"contribute": null,
// Sharing links
"sharing": {
"google": null,
"facebook": null,
"twitter": null
}
},
// Options for PDF generation
"pdf": {
// Add toc at the end of the file
"toc": true,
// Add page numbers to the bottom of every page
"pageNumbers": false,
// Font size for the fiel content
"fontSize": 12,
// Paper size for the pdf
// Choices are [ua0, ua1, ua2, ua3, ua4, ua5, ua6, ub0, ub1, ub2, ub3, ub4, ub5, ub6, ulegal, uletter]
"paperSize": "a4",
// Margin (in pts)
// Note: 72 pts equals 1 inch
"margin": {
"right": 62,
"left": 62,
"top": 36,
"bottom": 36
}
}
}
```
You can publish your books to our index by visiting [GitBook.io](http://www.gitbook.io)
## Output Formats
GitBook can generate your book in the following formats:
* **Static Website**: This is the default format, it generates a complete interactive static website that can be for example hosted on GitHub Pages.
* **PDF**: A complete PDF book with exercise solutions at the end of the book. Generate to this format using: ```gitbook pdf ./myrepo```, you need to have [gitbook-pdf](https://github.com/GitbookIO/gitbook-pdf) installed.
* **eBook**: A complete eBook with exercise solutions at the end of the book. Generate to this format using: ```gitbook ebook ./myrepo```, you need to have [ebook-convert](http://manual.calibre-ebook.com/cli/ebook-convert.html) installed.
* **Single Page**: The book will be stored in a single printable HTML page, this format is used for conversion to PDF or eBook. Generate to this format using: ```gitbook build ./myrepo -f page```.
* **JSON**: This format is used for debugging or extracting metadata from a book. Generate to this format using: ```gitbook build ./myrepo -f json```.
* **Static Website**: This is the default format. It generates a complete interactive static website that can be, for example, hosted on GitHub Pages.
* **eBook**: A complete eBook with exercise solutions at the end of the book. Generate this format using: ```gitbook ebook ./myrepo```. You need to have [ebook-convert](http://manual.calibre-ebook.com/cli/ebook-convert.html) installed. The output format could be **PDF**, **ePub** or **MOBI**.
* **Single Page**: The book will be stored in a single printable HTML page. This format is used for conversion to PDF or eBook. Generate this format using: ```gitbook build ./myrepo -f page```.
* **JSON**: This format is used for debugging or extracting metadata from a book. Generate this format using: ```gitbook build ./myrepo -f json```.
## Book Format
A book is a GitHub repository containing at least 2 files: `README.md` and `SUMMARY.md`.
A book is a Git repository containing at least 2 files: `README.md` and `SUMMARY.md`.
#### README.md
As usual, it should contains an introduction for your book. It will be automatically added to the final summary.
Typically, this should be the introduction for your book. It will be automatically added to the final summary.
#### SUMMARY.md
@@ -76,11 +165,11 @@ This is the summary of my book.
* [example 1](section2/example1.md)
```
Files that are not included in the `SUMMARY.md` will not be processed by `gitbook`.
Files that are not included in `SUMMARY.md` will not be processed by `gitbook`.
#### Exercises
A book can contain interactive exercises (currently only in Javascript but Python and Ruby are coming soon ;) ). An exercise is a code challenge provided to the reader, which is given a code editor to write a solution which is checked against the book author's validation code.
A book can contain interactive exercises (currently only in Javascript but Python and Ruby are coming soon ;) ). An exercise is a code challenge provided to the reader, who is given a code editor to write a solution which is checked against the book author's validation code.
An exercise is defined by 4 simple parts:
@@ -89,7 +178,7 @@ An exercise is defined by 4 simple parts:
* **Solution** code, being a correct solution to the exercise
* **Validation** code that tests the correctness of the user's input
Exercises need to start and finish with a separation bar (```---``` or ```***```). It should contain 3 code elements (**base**, **solution** and **validation**).
Exercises need to start and finish with a separation bar (```---``` or ```***```). It should contain 3 code elements (**base**, **solution** and **validation**). It can contain a 4th element that provides **context** code (functions, imports of libraries, etc which shouldn't be displayed to the user).
---
@@ -107,6 +196,14 @@ Exercises need to start and finish with a separation bar (```---``` or ```***```
assert(x == 10);
```
```js
// This is context code available everywhere
// The user will be able to call magicFunc in his code
function magicFunc() {
return 3;
}
```
---
#### Multi-Languages
@@ -123,4 +220,36 @@ You can see a complete example with the [Learn Git](https://github.com/GitbookIO
#### Ignoring files & folders
GitBook will read the `.gitignore`, `.bookignore` and `.ignore` files to get a list of files and folders to skip. (The format inside those files, follows the same convention as `.gitignore`)
GitBook will read the `.gitignore`, `.bookignore` and `.ignore` files to get a list of files and folders to skip. (The format inside those files follows the same convention as `.gitignore`)
#### Cover
A cover image can be set by creating a file: **/cover.jpg**.
The best resolution is **1800x2360**. The generation of the cover can be done automatically using the plugin [autocover](https://github.com/GitbookIO/plugin-autocover).
A small version of the cover can also be set by creating a file: **/cover_small.jpg**.
#### Publish your book
The platform [GitBook.io](https://www.gitbook.io/) is like an "Heroku for books": you can create a book on it (public, paid, or private) and update it using **git push**.
#### Plugins
Plugins can used to extend your book's functionality. Read [GitbookIO/plugin](https://github.com/GitbookIO/plugin) for more information about how to build a plugin for GitBook.
##### Default plugins:
* [mathjax](https://github.com/GitbookIO/plugin-mathjax): displays mathematical notation in the book.
* [mixpanel](https://github.com/GitbookIO/plugin-mixpanel): Mixpanel tracking for your book
##### Other plugins:
* [Google Analytics](https://github.com/GitbookIO/plugin-ga): Google Analytics tracking for your book
* [Disqus](https://github.com/GitbookIO/plugin-disqus): Disqus comments integration in your book
* [Autocover](https://github.com/GitbookIO/plugin-autocover): Generate a cover for your book
* [Transform annoted quotes to notes](https://github.com/erixtekila/gitbook-plugin-richquotes): Allow extra markdown markup to render blockquotes as nice notes
* [Send code to console](https://github.com/erixtekila/gitbook-plugin-toconsole): Evaluate javascript block in the browser inspector's console
* [Revealable sections](https://github.com/mrpotes/gitbook-plugin-reveal): Reveal sections of the page using buttons made from the first title in each section
* [Markdown within HTML](https://github.com/mrpotes/gitbook-plugin-nestedmd): Process markdown within HTML blocks - allows custom layout options for individual pages
* [Bootstrap JavaScript plugins](https://github.com/mrpotes/gitbook-plugin-bootstrapjs): Use the [Bootstrap JavaScript plugins](http://getbootstrap.com/javascript) in your online GitBook
* [Piwik Open Analytics](https://github.com/emmanuel-keller/gitbook-plugin-piwik): Piwik Open Analytics tracking for your book
+34 -94
View File
@@ -1,113 +1,53 @@
var path = require('path');
var Q = require('q');
var _ = require('lodash');
var tmp = require('tmp');
var fs = require('fs');
var utils = require('./utils');
var generate = require("../lib/generate");
var parse = require("../lib/parse");
var fs = require('../lib/generate/fs');
var generators = require("../lib/generate").generators;
var buildFunc = function(dir, options) {
dir = dir || process.cwd();
outputDir = options.output || path.join(dir, '_book');
console.log('Starting build ...');
// Get repo's URL
return utils.gitURL(dir)
.then(function(url) {
// Get ID of repo
return utils.githubID(url);
}, function(err) {
return null;
})
.then(function(repoID) {
var githubID = options.github || repoID;
if(!githubID) {
throw new Error('Needs a githubID (username/repo). Either set repo origin to a github repo or use the -g flag');
}
var parts = githubID.split('/', 2);
var user = parts[0], repo = parts[1];
var title = options.title || utils.titleCase(repo);
return generate.folder(
_.extend(options.options || {}, {
input: dir,
output: outputDir,
title: title,
description: options.intro,
github: githubID,
generator: options.format,
theme: options.theme
})
);
})
.then(function(output) {
console.log("Successfuly built !");
return output;
}, utils.logError);
var buildCommand = function(command) {
return command
.option('-o, --output <directory>', 'Path to output directory, defaults to ./_book')
.option('-f, --format <name>', 'Change generation format, defaults to site, availables are: '+_.keys(generators).join(", "))
.option('--config <config file>', 'Configuration file to use, defaults to book.js or book.json')
};
var buildFiles = function(dir, outputFile, options, masterOptions) {
var ext = masterOptions.extension;
outputFile = outputFile || path.resolve(dir, "book."+ext);
var buildEbookCommand = function(command) {
return buildCommand(command)
.option('-c, --cover <path>', 'Cover image, default is cover.jpg if exists');
};
Q.nfcall(tmp.dir)
.then(function(tmpDir) {
return buildFunc(
dir,
_.extend(options, {
output: tmpDir,
format: masterOptions.format,
options: masterOptions.options
var makeBuildFunc = function(converter) {
return function(dir, options) {
dir = dir || process.cwd();
outputDir = options.output;
console.log('Starting build ...');
return converter(
_.extend({}, options || {}, {
input: dir,
output: outputDir,
generator: options.format,
configFile: options.config
})
)
.then(function(_options) {
var copyPDF = function(lang) {
var _outputFile = outputFile;
var _tmpDir = tmpDir;
if (lang) {
_outputFile = _outputFile.slice(0, -path.extname(_outputFile).length)+"_"+lang+path.extname(_outputFile);
_tmpDir = path.join(_tmpDir, lang);
}
console.log("Generating in", _outputFile);
return fs.copy(
path.join(_tmpDir, "index."+ext),
_outputFile
);
};
// Multi-langs book
return Q()
.then(function() {
if (_options.langsSummary) {
console.log("Generating for all the languages");
return Q.all(
_.map(_options.langsSummary.list, function(lang) {
return copyPDF(lang.lang);
})
);
} else {
return copyPDF();
}
})
.then(function() {
return fs.remove(tmpDir);
})
.fail(utils.logError);
.then(function(output) {
console.log("Successfully built!");
return output;
}, utils.logError)
.fail(function() {
process.exit(-1);
});
})
};
};
module.exports = {
folder: buildFunc,
files: buildFiles
};
folder: makeBuildFunc(generate.folder),
file: makeBuildFunc(generate.file),
command: buildCommand,
commandEbook: buildEbookCommand
};
+88 -55
View File
@@ -4,82 +4,115 @@ var Q = require('q');
var _ = require('lodash');
var path = require('path');
var prog = require('commander');
var tinylr = require('tiny-lr-fork');
var pkg = require('../package.json');
var generators = require("../lib/generate").generators;
var initDir = require("../lib/generate/init");
var fs = require('../lib/generate/fs');
var utils = require('./utils');
var build = require('./build');
var Server = require('./server');
// General options
prog
.version(pkg.version);
var buildCommand = function(command, action) {
return command
.option('-o, --output <directory>', 'Path to output directory, defaults to ./_book')
.option('-f, --format <name>', 'Change generation format, defaults to site, availables are: '+_.keys(generators).join(", "))
.option('-t, --title <name>', 'Name of the book to generate, defaults to repo name')
.option('-i, --intro <intro>', 'Description of the book to generate')
.option('-g, --github <repo_path>', 'ID of github repo like : username/repo')
.option('-gh, --githubHost <url>', 'The url of the github host (defaults to https://github.com/')
.option('--theme <path>', 'Path to theme directory')
.action(action);
}
build.command(prog.command('build [source_dir]'))
.description('Build a gitbook from a directory')
.action(build.folder);
buildCommand(prog
.command('build [source_dir]')
.description('Build a gitbook from a directory'), build.folder);
buildCommand(prog
.command('serve [source_dir]')
build.command(prog.command('serve [source_dir]'))
.description('Build then serve a gitbook from a directory')
.option('-p, --port <port>', 'Port for server to listen on', 4000),
function(dir, options) {
build.folder(dir, options)
.then(function(_options) {
console.log();
console.log('Starting server ...');
return utils.serveDir(_options.output, options.port)
.option('-p, --port <port>', 'Port for server to listen on', 4000)
.option('--no-watch', 'Disable restart with file watching')
.action(function(dir, options) {
var server = new Server();
// init livereload server
var lrOptions = {port: 35729};
var lrServer = tinylr(lrOptions);
var lrPath = undefined;
lrServer.listen(lrOptions.port, function(err) {
if (err) { return console.log(err); }
console.log('Live reload server started on port: ' + lrOptions.port);
});
var generate = function() {
if (server.isRunning()) console.log("Stopping server");
server.stop()
.then(function() {
return build.folder(dir, _.extend(options || {}, {
cache: false,
defaultsPlugins: ["livereload"]
}));
})
.then(function(_options) {
console.log();
console.log('Starting server ...');
return server.start(_options.output, options.port)
.then(function() {
console.log('Serving book on http://localhost:'+options.port);
if (lrPath) {
// trigger livereload
lrServer.changed({body:{files:[lrPath]}})
}
if (!options.watch) return;
return utils.watch(_options.input)
.then(function(filepath) {
// set livereload path
lrPath = filepath;
console.log("Restart after change in files");
console.log('');
return generate();
})
})
})
.fail(utils.logError);
})
.then(function() {
console.log('Serving book on http://localhost:'+options.port);
console.log();
console.log('Press CTRL+C to quit ...');
});
};
console.log('Press CTRL+C to quit ...');
console.log('')
generate();
});
buildCommand(prog
.command('pdf [source_dir] [output_file]')
build.commandEbook(prog.command('pdf [source_dir]'))
.description('Build a gitbook as a PDF')
.option('-pf, --paperformat <format>', 'PDF paper format (default is A4): "5in*7.5in", "10cm*20cm", "A4", "Letter"'),
function(dir, output, options) {
build.files(dir, output, options, {
.action(function(dir, options) {
build.file(dir, _.extend(options, {
extension: "pdf",
format: "pdf",
options: {
paperformat: options.paperformat
}
});
format: "ebook"
}));
});
buildCommand(prog
.command('ebook [source_dir] [output_file]')
.description('Build a gitbook as a eBook')
.option('-c, --cover <path>', 'Cover image, default is cover.png if exists'),
function(dir, output, options) {
var ext = output ? path.extname(output) : "epub";
build.files(dir, output, options, {
extension: ext,
format: "ebook",
options: {
extension: ext,
cover: options.cover
}
});
build.commandEbook(prog.command('epub [source_dir]'))
.description('Build a gitbook as a ePub book')
.action(function(dir, options) {
build.file(dir, _.extend(options, {
extension: "epub",
format: "ebook"
}));
});
build.commandEbook(prog.command('mobi [source_dir]'))
.description('Build a gitbook as a Mobi book')
.action(function(dir, options) {
build.file(dir, _.extend(options, {
extension: "mobi",
format: "ebook"
}));
});
prog
.command('init [source_dir]')
.description('Create files and folders based on contents of SUMMARY.md')
.action(function(dir) {
dir = dir || process.cwd();
return initDir(dir);
});
// Parse and fallback to help if no args
+96
View File
@@ -0,0 +1,96 @@
var Q = require('q');
var _ = require('lodash');
var events = require('events');
var http = require('http');
var send = require('send');
var util = require('util');
var url = require('url');
var Server = function() {
this.running = null;
this.dir = null;
this.port = 0;
this.sockets = [];
};
util.inherits(Server, events.EventEmitter);
// Return true if the server is running
Server.prototype.isRunning = function() {
return this.running != null;
};
// Stop the server
Server.prototype.stop = function() {
var that = this;
if (!this.isRunning()) return Q();
var d = Q.defer();
this.running.close(function(err) {
that.running = null;
that.emit("state", false);
if (err) d.reject(err);
else d.resolve();
});
for (var i = 0; i < this.sockets.length; i++) {
this.sockets[i].destroy();
}
return d.promise;
};
Server.prototype.start = function(dir, port) {
var that = this, pre = Q();
port = port || 8004;
if (that.isRunning()) pre = this.stop();
return pre
.then(function() {
var d = Q.defer();
that.running = http.createServer(function(req, res){
// Render error
function error(err) {
res.statusCode = err.status || 500;
res.end(err.message);
}
// Redirect to directory's index.html
function redirect() {
res.statusCode = 301;
res.setHeader('Location', req.url + '/');
res.end('Redirecting to ' + req.url + '/');
}
// Send file
send(req, url.parse(req.url).pathname)
.root(dir)
.on('error', error)
.on('directory', redirect)
.pipe(res);
});
that.running.on('connection', function (socket) {
that.sockets.push(socket);
socket.setTimeout(4000);
socket.on('close', function () {
that.sockets.splice(that.sockets.indexOf(socket), 1);
});
});
that.running.listen(port, function(err) {
if (err) return d.reject(err);
that.port = port;
that.dir = dir;
that.emit("state", true);
d.resolve();
});
return d.promise;
});
}
module.exports = Server;
+18 -72
View File
@@ -4,95 +4,41 @@ var _ = require('lodash');
var http = require('http');
var send = require('send');
var url = require('url');
var cp = require('child_process');
var path = require('path');
var Gaze = require('gaze').Gaze;
// Get the remote of a given repo
function gitURL(path) {
function watch(dir) {
var d = Q.defer();
dir = path.resolve(dir);
cp.exec("git config --get remote.origin.url", {
cwd: path,
env: process.env,
}, function(err, stdout, stderr) {
if(err) {
return d.reject(err);
}
return d.resolve(stdout);
var gaze = new Gaze("**/*.md", {
cwd: dir
});
return d.promise
.then(function(output) {
return output.replace(/(\r\n|\n|\r)/gm, "");
gaze.once("all", function(e, filepath) {
gaze.close();
d.resolve(filepath);
});
}
gaze.once("error", function(err) {
gaze.close();
// Poorman's parsing
// Parse a git URL to a github ID : username/reponame
function githubID(_url) {
// Detect HTTPS repos
var parsed = url.parse(_url);
if(parsed.protocol === 'https:' && parsed.host === 'github.com') {
return parsed.path.slice(1, -4);
}
// Detect SSH repos
if(_url.indexOf('git@') === 0) {
return _url.split(':', 2)[1].slice(0, -4);
}
// None found
return null;
}
function titleCase(str)
{
return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
function serveDir(dir, port) {
var d = Q.defer();
var server = http.createServer(function(req, res){
// Render error
function error(err) {
res.statusCode = err.status || 500;
res.end(err.message);
}
// Redirect to directory's index.html
function redirect() {
res.statusCode = 301;
res.setHeader('Location', req.url + '/');
res.end('Redirecting to ' + req.url + '/');
}
// Send file
send(req, url.parse(req.url).pathname)
.root(dir)
.on('error', error)
.on('directory', redirect)
.pipe(res);
}).listen(port);
d.resolve(server);
d.reject(err);
});
return d.promise;
}
function logError(err) {
console.log(err.stack || err.message || err);
var message = err.message || err;
if (process.env.DEBUG != null) message = err.stack || message;
console.log(message);
return Q.reject(err);
};
// Exports
module.exports = {
gitURL: gitURL,
githubID: githubID,
titleCase: titleCase,
serveDir: serveDir,
watch: watch,
logError: logError
};
+12
View File
@@ -0,0 +1,12 @@
{
"name": "GitBook",
"version": "1.0.0",
"dependencies": {
"jquery": "2.1.1",
"lodash": "2.4.1",
"requirejs": "2.1.11",
"URIjs": "1.13.1",
"mousetrap": "1.4.6",
"lunr.js": "0.5.2"
}
}
+41 -19
View File
@@ -7,6 +7,7 @@ var exec = require('child_process').exec;
var fs = require("fs");
var parse = require("../../parse");
var BaseGenerator = require("../page");
var stringUtils = require("../../utils/string");
/*
* This generator inherits from the single page generator
@@ -14,15 +15,6 @@ var BaseGenerator = require("../page");
*/
var Generator = function() {
BaseGenerator.apply(this, arguments);
// Options for eBook generation
this.options = _.defaults(this.options, {
extension: "epub"
});
if (!this.options.cover && fs.existsSync(path.join(this.options.input, "cover.png"))) {
this.options.cover = path.join(this.options.input, "cover.png")
}
};
util.inherits(Generator, BaseGenerator);
@@ -32,23 +24,53 @@ Generator.prototype.finish = function() {
return BaseGenerator.prototype.finish.apply(this)
.then(function() {
var d = Q.defer();
var format = that.options.extension || path.extname(that.options.output).replace("\.", "") || "pdf";
if (!that.options.cover && fs.existsSync(path.join(that.options.output, "cover.jpg"))) {
that.options.cover = path.join(that.options.output, "cover.jpg");
}
var _options = {
"--cover": that.options.cover
"--cover": that.options.cover,
"--title": that.options.title,
"--comments": that.options.description,
"--authors": that.options.author,
"--level1-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-1 ')]",
"--level2-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-2 ')]",
"--level3-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-3 ')]"
};
if (format == "pdf") {
var pdfOptions = _.defaults(that.options.pdf || {}, {
"fontSize": 12,
"toc": true,
"pageNumbers": false,
"paperSize": "a4",
"margin": {
"right": 62,
"left": 62,
"top": 36,
"bottom": 36
}
});
_.extend(_options, {
"--margin-left": String(pdfOptions.margin.left),
"--margin-right": String(pdfOptions.margin.right),
"--margin-top": String(pdfOptions.margin.top),
"--margin-bottom": String(pdfOptions.margin.bottom),
"--pdf-add-toc": Boolean(pdfOptions.toc),
"--pdf-default-font-size": String(pdfOptions.fontSize),
"--paper-size": String(pdfOptions.paperSize),
"--pdf-page-numbers": Boolean(pdfOptions.pageNumbers)
});
}
var command = [
"ebook-convert",
path.join(that.options.output, "index.html"),
path.join(that.options.output, "index."+that.options.extension),
_.chain(_options)
.map(function(value, key) {
if (value == null) return null;
return key+"="+value;
})
.compact()
.value()
.join(" ")
path.join(that.options.output, "index."+format),
stringUtils.optionsToShellArgs(_options)
].join(" ");
exec(command, function (error, stdout, stderr) {
+8 -1
View File
@@ -16,7 +16,9 @@ var getFiles = function(path) {
// Add extra rules to ignore common folders
ig.addIgnoreRules([
'.git/'
'.git/',
'.gitignore',
'.DS_Store'
], '__custom_stuff');
// Push each file to our list
@@ -51,4 +53,9 @@ module.exports = {
copy: Q.denodeify(fsExtra.copy),
remove: Q.denodeify(fsExtra.remove),
symlink: Q.denodeify(fsExtra.symlink),
exists: function(path) {
var d = Q.defer();
fs.exists(path, d.resolve);
return d.promise;
},
};
+22
View File
@@ -1,9 +1,31 @@
var _ = require("lodash");
var path = require("path");
var Q = require("q");
var fs = require("./fs");
var Plugin = require("./plugin");
var BaseGenerator = function(options) {
this.options = options;
this.options.plugins = Plugin.normalizeNames(this.options.plugins);
this.options.plugins = _.union(this.options.plugins, this.options.defaultsPlugins);
this.plugins = [];
};
BaseGenerator.prototype.callHook = function(name, data) {
return this.plugins.hook(name, this, data);
};
BaseGenerator.prototype.loadPlugins = function() {
var that = this;
return Plugin.fromList(this.options.plugins, this.options.input)
.then(function(_plugins) {
that.plugins = _plugins;
return that.callHook("init");
});
};
BaseGenerator.prototype.convertFile = function(content, input) {
+307 -82
View File
@@ -1,54 +1,232 @@
var Q = require("q");
var _ = require("lodash");
var path = require("path");
var swig = require('swig');
var tmp = require('tmp');
var fs = require("./fs");
var parse = require("../parse");
var Plugin = require("./plugin");
var generators = {
"site": require("./site"),
"page": require("./page"),
"pdf": require("./pdf"),
"ebook": require("./ebook"),
"json": require("./json")
};
var generate = function(options) {
var generator = null;
var files;
var defaultDescription = "Book generated using GitBook";
var containsFiles = function(dir, files) {
return Q.all(_.map(files, function(file) {
return fs.exists(path.join(dir, file));
}))
.then(_.all);
};
// TEst if generator exists
var checkGenerator = function(options) {
if (!generators[options.generator]) {
return Q.reject(new Error("Invalid generator (availables are: "+_.keys(generators).join(", ")+")"));
}
return Q();
};
// Create the generator and load plugins
var loadGenerator = function(options) {
return checkGenerator(options)
.then(function() {
var generator = new generators[options.generator](options);
return generator.loadPlugins()
.then(_.constant(generator));
});
};
var generate = function(options) {
// Set defaults to options
options = _.defaults(options || {}, {
// Folders to use
input: null,
output: null,
"input": null,
"output": null,
// Config file (relative to input)
"configFile": "book",
// Output generator
generator: "site",
"generator": "site",
// Book title, keyword, description
title: null,
description: "Book generated using GitBook",
"title": null,
"description": null,
// Origin github repository id
github: null,
githubHost: 'https://github.com/',
"github": null,
"githubHost": 'https://github.com/',
// Theming
theme: path.resolve(__dirname, '../../theme')
"theme": path.resolve(__dirname, '../../theme'),
// Plugins
"plugins": [],
"pluginsConfig": {},
"defaultsPlugins": [], // Default plugins that can't be set in book.json
// Links
"links": {
"about": null,
"issues": null,
"contribue": null,
}
});
if (!options.github || !options.title || !options.input || !options.output) {
return Q.reject(new Error("Need options: github, title, input, output"));
// Validate options
if (!options.input) {
return Q.reject(new Error("Need option input (book input directory)"));
}
if (!generators[options.generator]) {
return Q.reject(new Error("Invalid generator (availables are: "+_.keys(generators).join(", ")));
}
// Check files to get folder type (book, multilanguage book or neither)
return checkGenerator(options)
// Read config file
.then(function() {
try {
var _config = require(path.resolve(options.input, options.configFile));
_.extend(options, _.omit(_config, 'input', 'configFile', 'defaultsPlugins'));
}
catch(err) {
// No config file: not a big deal
return Q();
}
})
// Read readme
.then(function() {
return fs.readFile(path.join(options.input, "README.md"), "utf-8")
.then(function(_readme) {
_readme = parse.readme(_readme);
options.title = options.title || _readme.title;
options.description = options.description || _readme.description || defaultDescription;
});
})
// Detect multi-languages book
.then(function() {
return containsFiles(options.input, ['LANGS.md'])
})
.then(function(isMultiLang) {
// Multi language book
if(isMultiLang) {
return generateMultiLang(options);
}
// Book
return generateBook(options);
});
};
var generateMultiLang = function(options) {
var langsSummary;
options.output = options.output || path.join(options.input, "_book");
return checkGenerator(options)
// Multi-languages book
.then(function() {
return fs.readFile(path.join(options.input, "LANGS.md"), "utf-8")
})
// Clean output folder
return fs.remove(options.output)
.then(function(_langsSummary) {
langsSummary = _langsSummary;
return fs.remove(options.output);
})
.then(function() {
return fs.mkdirp(options.output);
})
// Generate sub-books
.then(function() {
options.langsSummary = parse.langs(langsSummary);
// Generated a book for each valid entry
return _.reduce(options.langsSummary.list, function(prev, entry) {
return prev.then(function() {
return generate(_.extend({}, options, {
input: path.join(options.input, entry.path),
output: path.join(options.output, entry.path)
}));
})
}, Q());
})
.then(function() {
return loadGenerator(options);
})
// Generate languages index
.then(function(generator) {
return generator.langsIndex(options.langsSummary);
})
// Return options to caller
.then(_.constant(options));
};
/*
* Use a specific generator to convert a gitbook to a site/pdf/ebook/
* output is always a folder
*/
var generateBook = function(options) {
var files;
options.output = options.output || path.join(options.input, "_book");
// Check if it's a book
return containsFiles(options.input, ['SUMMARY.md', 'README.md'])
// Fail if not a book
.then(function(isBook) {
if(!isBook) {
return Q.reject(new Error("Invalid gitbook repository, need SUMMARY.md and README.md"));
}
})
// Clean output folder
.then(function() {
return fs.remove(options.output);
})
// Get repo's URL
.then(function() {
// Git deactivated
if(options.github === false) {
options.github = null;
return null;
} else if(options.github) {
// Git already specified in options
return options.github;
}
// Try auto detecting
return parse.git.url(options.input)
.then(function(_url) {
// Get ID of repo
return parse.git.githubID(_url);
}, function(err) {
return null;
})
.then(function(repoId) {
options.github = repoId;
});
})
.then(function() {
return fs.mkdirp(options.output);
@@ -59,81 +237,67 @@ var generate = function(options) {
return fs.list(options.input)
.then(function(_files) {
files = _files;
})
});
})
// Create the generator
.then(function() {
generator = new generators[options.generator](options);
return loadGenerator(options);
})
// Detect multi-languages book
.then(function() {
if (_.contains(files, "LANGS.md")) {
// Multi-languages book
return fs.readFile(path.join(options.input, "LANGS.md"), "utf-8")
// Convert files
.then(function(generator) {
// Generate the book
return Q()
// Generate sub-books
.then(function(_langsSummary) {
options.langsSummary = parse.langs(_langsSummary);
// Generated a book for each valid entry
return Q.all(
_.map(options.langsSummary.list, function(entry) {
return generate(_.extend({}, options, {
input: path.join(options.input, entry.path),
output: path.join(options.output, entry.path)
}));
})
);
})
// Generate languages index
.then(function() {
return generator.langsIndex(options.langsSummary);
});
} else if (!_.contains(files, "SUMMARY.md") || !_.contains(files, "README.md")) {
// Invalid book
return Q.reject(new Error("Invalid gitbook repository, need SUMMARY.md and README.md"));
} else {
// Generate the book
// Get summary
.then(function() {
return fs.readFile(path.join(options.input, "SUMMARY.md"), "utf-8")
// Get summary
.then(function(_summary) {
options.summary = parse.summary(_summary);
// Parse navigation
options.navigation = parse.navigation(options.summary);
})
// Copy file and replace markdown file
.then(function() {
return Q.all(
_.chain(files)
.map(function(file) {
if (!file) return;
if (file[file.length -1] == "/") {
return Q(generator.transferFolder(file));
} else if (path.extname(file) == ".md" && options.navigation[file] != null) {
return fs.readFile(path.join(options.input, file), "utf-8")
.then(function(content) {
return Q(generator.convertFile(content, file));
});
} else {
return Q(generator.transferFile(file));
}
})
.value()
);
})
// Finish gneration
.then(function() {
return generator.finish();
});
}
})
// Skip processing some files
.then(function() {
files = _.filter(files, function (file) {
return !(
file === 'SUMMARY.md'
);
});
})
// Copy file and replace markdown file
.then(function() {
return Q.all(
_.chain(files)
.map(function(file) {
if (!file) return;
if (file[file.length -1] == "/") {
return Q(generator.transferFolder(file));
} else if (path.extname(file) == ".md" && options.navigation[file] != null) {
return fs.readFile(path.join(options.input, file), "utf-8")
.then(function(content) {
return Q(generator.convertFile(content, file));
});
} else {
return Q(generator.transferFile(file));
}
})
.value()
);
})
// Finish generation
.then(function() {
return generator.finish();
})
.then(function() {
return generator.callHook("finish");
});
})
// Return all options
@@ -142,7 +306,68 @@ var generate = function(options) {
});
};
/*
* Extract files from generate output in a temporary folder
*/
var generateFile = function(options) {
options = _.defaults(options || {}, {
input: null,
output: null,
extension: null
});
return Q.nfcall(tmp.dir)
.then(function(tmpDir) {
return generate(
_.extend({},
options,
{
output: tmpDir
})
)
.then(function(_options) {
var ext = options.extension;
var outputFile = options.output || path.resolve(options.input, "book."+ext);
var copyFile = function(lang) {
var _outputFile = outputFile;
var _tmpDir = tmpDir;
if (lang) {
_outputFile = _outputFile.slice(0, -path.extname(_outputFile).length)+"_"+lang+path.extname(_outputFile);
_tmpDir = path.join(_tmpDir, lang);
}
return fs.copy(
path.join(_tmpDir, "index."+ext),
_outputFile
);
};
// Multi-langs book
return Q()
.then(function() {
if (_options.langsSummary) {
return Q.all(
_.map(_options.langsSummary.list, function(lang) {
return copyFile(lang.lang);
})
);
} else {
return copyFile();
}
})
.then(function() {
return fs.remove(tmpDir);
});
});
});
};
module.exports = {
generators: generators,
folder: generate
folder: generate,
file: generateFile,
book: generateBook,
Plugin: Plugin,
};
+69
View File
@@ -0,0 +1,69 @@
var Q = require('q');
var _ = require('lodash');
var path = require('path');
var fs = require('./fs');
var parse = require('../parse');
// Extract paths out of a summary
function paths(summary) {
return _.reduce(summary.chapters, function(accu, chapter) {
return accu.concat(
_.filter([chapter.path].concat(_.pluck(chapter.articles, 'path')))
);
}, []);
}
// Get the parent folders out of a group of files
function folders(files) {
return _.chain(files)
.map(function(file) {
return path.dirname(file);
})
.uniq()
.value();
}
function initDir(dir) {
return fs.readFile(path.join(dir, 'SUMMARY.md'), 'utf8')
.then(function(src) {
// Parse summary
return parse.summary(src);
})
.then(function(summary) {
// Extract paths from summary
return paths(summary);
})
.then(function(paths) {
// Convert to absolute paths
return _.map(paths, function(file) {
return path.resolve(file);
});
})
.then(function(files) {
// Create folders
return Q.all(_.map(folders(files), function(folder) {
return fs.mkdirp(folder);
}))
.then(_.constant(files));
})
.then(function(files) {
// Create files that don't exist
return Q.all(_.map(files, function(file) {
return fs.exists(file)
.then(function(exists) {
if(exists) return;
return fs.writeFile(file, '');
});
}));
})
.fail(function(err) {
console.error(err.stack);
});
}
// Exports
module.exports = initDir;
+30
View File
@@ -1,6 +1,7 @@
var util = require("util");
var path = require("path");
var Q = require("q");
var _ = require("lodash");
var fs = require("../fs");
var parse = require("../../parse");
@@ -40,6 +41,35 @@ Generator.prototype.convertFile = function(content, input) {
});
};
// Generate languages index
// Contains the first languages readme and langs infos
Generator.prototype.langsIndex = function(langs) {
var that = this;
if (langs.list.length == 0) return Q.reject("Need at least one language");
var mainLang = _.first(langs.list).lang;
console.log("Main language is", mainLang);
return Q()
.then(function() {
return fs.readFile(
path.join(that.options.output, mainLang, "README.json")
);
})
.then(function(content) {
var json = JSON.parse(content);
_.extend(json, {
langs: langs.list
});
return fs.writeFile(
path.join(that.options.output, "README.json"),
JSON.stringify(json, null, 4)
);
});
};
Generator.prototype.finish = function() {
// ignore
};
+72
View File
@@ -0,0 +1,72 @@
var _ = require('lodash');
var path = require('path');
var Q = require('q');
var fs = require("./fs");
var extsToIgnore = [".gz"]
var Manifest = function() {
this.revision = 0;
this.clear(Date.now());
};
// Regenerate manifest
Manifest.prototype.clear = function(revision) {
if (revision) this.revision = revision;
this.sections = {
'CACHE': {},
'NETWORK': {},
'FALLBACK': {}
};
return Q(this);
};
// Add a resource
Manifest.prototype.add = function(category, resource, value) {
if (_.isArray(resource)) {
_.each(resource, function(subres) {
this.add(category, subres, value);
}, this);
return;
}
this.sections[category][resource] = value;
};
// Add a directory in cache
Manifest.prototype.addFolder = function(folder, root, except) {
var that = this;
root = root || "/";
return fs.list(folder)
.then(function(files) {
_.each(
// Ignore diretcories
_.filter(files, function(file) {
return file.substr(-1) != "/" && !_.contains(except, path.join(root, file)) && !_.contains(extsToIgnore, path.extname(file));
}),
function(file) {
that.add("CACHE", path.join(root, file));
}
);
})
};
// Get manifest content
Manifest.prototype.dump = function() {
var lines = [
"CACHE MANIFEST",
"# Revision "+this.revision
];
_.each(this.sections, function(content, section) {
if (_.size(content) == 0) return;
lines.push("");
lines.push(section+":");
lines = lines.concat(_.keys(content));
}, this);
return Q(lines.join("\n"));
};
module.exports = Manifest;
+26 -3
View File
@@ -18,6 +18,16 @@ swig.setFilter('code', function(code, lang) {
}
});
// Convert a level into a deep level
swig.setFilter('lvl', function(lvl) {
return lvl.split(".").length;
});
// Join path
swig.setFilter('pathJoin', function(base, _path) {
return path.join(base, _path);
});
/*
* This generator will generate a simple index.html which can be converted as a PDF
@@ -25,14 +35,18 @@ swig.setFilter('code', function(code, lang) {
var Generator = function() {
BaseGenerator.apply(this, arguments);
// Load base template
this.template = swig.compileFile(path.resolve(this.options.theme, 'templates/page.html'));
// List of pages content
this.pages = {};
};
util.inherits(Generator, BaseGenerator);
// Load all templates
Generator.prototype.loadTemplates = function() {
this.template = swig.compileFile(
this.plugins.template("page") || path.resolve(this.options.theme, 'templates/page.html')
);
};
Generator.prototype.convertFile = function(content, input) {
var that = this;
var json = {
@@ -46,6 +60,7 @@ Generator.prototype.convertFile = function(content, input) {
repo: that.options.githubId,
dir: path.dirname(input) || '/',
outdir: './',
singleFile: true
});
})
.then(function(sections) {
@@ -56,16 +71,24 @@ Generator.prototype.convertFile = function(content, input) {
});
};
// Generate languages index
Generator.prototype.langsIndex = function(langs) {
return Q();
};
Generator.prototype.finish = function() {
var that = this;
var basePath = ".";
var output = path.join(this.options.output, "index.html");
var progress = parse.progress(this.options.navigation, "README.md");
return Q()
// Generate html
.then(function(pages) {
return that._writeTemplate(that.template, {
pages: that.pages,
progress: progress,
basePath: basePath,
staticBase: path.join(basePath, "gitbook"),
-56
View File
@@ -1,56 +0,0 @@
var util = require("util");
var path = require("path");
var Q = require("q");
var _ = require("lodash");
var exec = require('child_process').exec;
var fs = require("../fs");
var parse = require("../../parse");
var BaseGenerator = require("../page");
/*
* This generator inherits from the single page generator
* and convert the page output to pdf using gitbook-pdf
*/
var Generator = function() {
BaseGenerator.apply(this, arguments);
// Options for PDF generation
this.options = _.defaults(this.options, {
paperformat: "A4"
});
};
util.inherits(Generator, BaseGenerator);
Generator.prototype.finish = function() {
var that = this;
return BaseGenerator.prototype.finish.apply(this)
.then(function() {
var d = Q.defer();
var command = [
"gitbook-pdf",
"generate",
path.join(that.options.output, "index.html"),
path.join(that.options.output, "index.pdf"),
"--format="+that.options.paperformat
].join(" ");
exec(command, function (error, stdout, stderr) {
if (error) {
if (error.code == 127) {
error.message = "Need to install gitbook-pdf using: npm install gitbook-pdf -g";
} else {
error.message = error.message + " "+stdout;
}
return d.reject(error);
}
d.resolve();
});
return d.promise;
});
};
module.exports = Generator;
+207
View File
@@ -0,0 +1,207 @@
var _ = require("lodash");
var Q = require("q");
var semver = require("semver");
var path = require("path");
var url = require("url");
var fs = require("./fs");
var resolve = require('resolve');
var pkg = require("../../package.json");
var RESOURCES = ["js", "css"];
var Plugin = function(name, root) {
this.name = name;
this.root = root;
this.packageInfos = {};
this.infos = {};
_.each([
"gitbook-plugin-"+name,
"gitbook-theme-"+name,
"gitbook-"+name,
name,
], function(_name) {
if (this.load(_name, __dirname)) return false;
if (this.load(_name, path.resolve(root))) return false;
}, this);
};
// Load from a name
Plugin.prototype.load = function(name, baseDir) {
try {
var res = resolve.sync(name+"/package.json", { basedir: baseDir });
this.baseDir = path.dirname(res);
this.packageInfos = require(res);
this.infos = require(resolve.sync(name, { basedir: baseDir }));
this.name = name;
return true;
} catch (e) {
return false;
}
};
// Return resources
Plugin.prototype.getResources = function(resource) {
if (!this.infos.book || !this.infos.book[resource]) {
return [];
}
return _.chain(this.infos.book[resource])
.map(function(resource) {
var parsed = url.parse(resource);
if (parsed.protocol) return {"url": resource}
else return { "path": this.name+"/"+resource };
}.bind(this))
.value();
};
// Test if it's a valid plugin
Plugin.prototype.isValid = function() {
return (
this.packageInfos
&& this.packageInfos.name
&& this.packageInfos.engines
&& this.packageInfos.engines.gitbook
&& semver.satisfies(pkg.version, this.packageInfos.engines.gitbook)
);
};
// Resolve file path
Plugin.prototype.resolveFile = function(filename) {
return path.resolve(this.baseDir, filename);
};
// Resolve file path
Plugin.prototype.callHook = function(name, context, data) {
var hookFunc = this.infos.hooks? this.infos.hooks[name] : null;
data = data || {};
if (!hookFunc) return Q(data);
return Q()
.then(function() {
return hookFunc.apply(context, [data]);
});
};
// Has assets
Plugin.prototype.hasAssets = function(out) {
return (this.infos.book && this.infos.book.assets);
};
// Copy plugin assets fodler
Plugin.prototype.copyAssets = function(out) {
if (!this.hasAssets()) return Q();
return fs.copy(
this.resolveFile(this.infos.book.assets),
out
);
};
// Normalize a list of plugin name to use
Plugin.normalizeNames = function(names) {
// Normalize list to an array
names = _.isString(names) ? names.split(",") : (names || []);
// List plugins to remove
var toremove = _.chain(names)
.filter(function(name) {
return name.length > 0 && name[0] == "-";
})
.map(function(name) {
return name.slice(1)
})
.value();
// Merge with defaults
names = _.chain(names)
.concat(Plugin.defaults)
.uniq()
.value();
// Remove plugins starting with
names = _.filter(names, function(name) {
return !_.contains(toremove, name) && !(name.length > 0 && name[0] == "-");
});
return names;
};
// Extract data from a list of plugin
Plugin.fromList = function(names, root) {
var failed = [];
// Load plugins
var plugins = _.map(names, function(name) {
var plugin = new Plugin(name, root);
if (!plugin.isValid()) failed.push(name);
return plugin;
});
if (_.size(failed) > 0) return Q.reject(new Error("Error loading plugins: "+failed.join(",")));
// Get all resources
var resources = _.chain(RESOURCES)
.map(function(resource) {
return [
resource,
_.chain(plugins)
.map(function(plugin) {
return plugin.getResources(resource);
})
.flatten()
.value()
];
})
.object()
.value();
resources.html = {}
_.each(plugins, function(plugin) {
if (!plugin.infos.book || !plugin.infos.book.html) return;
var html = plugin.infos.book.html || {};
_.each(html, function(code, key) {
if (!_.isFunction(code)) code = _.constant(code);
if (!resources.html[key]) resources.html[key] = [];
resources.html[key].push(code);
})
});
return Q({
'list': plugins,
'resources': resources,
'hook': function(name, context, data) {
return _.reduce(plugins, function(prev, plugin) {
return prev.then(function(ret) {
return plugin.callHook(name, context, ret);
})
}, Q(data));
},
'template': function(name) {
var withTpl = _.find(plugins, function(plugin) {
return (plugin.infos.templates
&& plugin.infos.templates[name]);
});
if (!withTpl) return null;
return withTpl.resolveFile(withTpl.infos.templates[name]);
},
'html': function(tag, context, options) {
return _.map(resources.html[tag] || [], function(code) {
return code.call(context, options);
}).join("\n");
}
});
};
// Default plugins
Plugin.defaults = [
"mathjax"
];
module.exports = Plugin;
+110 -17
View File
@@ -9,6 +9,7 @@ var parse = require("../../parse");
var BaseGenerator = require("../generator");
var indexer = require('./search_indexer');
var Manifest = require('../manifest');
// Swig filter for returning the count of lines in a code section
swig.setFilter('lines', function(content) {
@@ -30,17 +31,38 @@ var Generator = function() {
this.revision = Date.now();
this.indexer = indexer();
// Load base template
this.template = swig.compileFile(path.resolve(this.options.theme, 'templates/site.html'));
this.langsTemplate = swig.compileFile(path.resolve(this.options.theme, 'templates/langs.html'));
this.manifest = new Manifest(Date.now());
this.manifest.add("NETWORK", [
'*'
]);
};
util.inherits(Generator, BaseGenerator);
// Load all templates
Generator.prototype.loadTemplates = function() {
this.template = swig.compileFile(
this.plugins.template("site") || path.resolve(this.options.theme, 'templates/site.html')
);
this.langsTemplate = swig.compileFile(
this.plugins.template("langs") || path.resolve(this.options.theme, 'templates/langs.html')
);
};
// Load plugins
Generator.prototype.loadPlugins = function() {
var that = this;
return BaseGenerator.prototype.loadPlugins.apply(this)
.then(function() {
return that.loadTemplates();
});
};
// Generate a template
Generator.prototype._writeTemplate = function(tpl, options, output) {
Generator.prototype._writeTemplate = function(tpl, options, output, interpolate) {
var that = this;
interpolate = interpolate || _.identity;
return Q()
.then(function(sections) {
return tpl(_.extend({
@@ -49,14 +71,21 @@ Generator.prototype._writeTemplate = function(tpl, options, output) {
title: that.options.title,
description: that.options.description,
githubAuthor: that.options.github.split("/")[0],
githubAuthor: that.options.github ? that.options.github.split("/")[0] : "",
githubId: that.options.github,
githubHost: that.options.githubHost,
summary: that.options.summary,
allNavigation: that.options.navigation
allNavigation: that.options.navigation,
plugins: that.plugins,
pluginsConfig: JSON.stringify(that.options.pluginsConfig),
htmlSnippet: _.partialRight(that.plugins.html, that, options),
options: that.options
}, options));
})
.then(interpolate)
.then(function(html) {
return fs.writeFile(
output,
@@ -73,7 +102,6 @@ Generator.prototype.indexPage = function(lexed, pagePath) {
// Convert a markdown file to html
Generator.prototype.convertFile = function(content, _input) {
var that = this;
var progress = parse.progress(this.options.navigation, _input);
_output = _input.replace(".md", ".html");
if (_output == "README.html") _output = "index.html";
@@ -82,10 +110,28 @@ Generator.prototype.convertFile = function(content, _input) {
var output = path.join(this.options.output, _output);
var basePath = path.relative(path.dirname(output), this.options.output) || ".";
var page = {
path: _input,
content: content,
progress: parse.progress(this.options.navigation, _input)
};
var _callHook = function(name) {
return that.callHook(name, page)
.then(function(_page) {
page = _page;
return page;
});
};
return Q()
.then(function() {
// Send content to plugins
return _callHook("page:before");
})
.then(function() {
// Lex page
return parse.lex(content);
return parse.lex(page.content);
})
.then(function(lexed) {
// Index page in search
@@ -101,15 +147,27 @@ Generator.prototype.convertFile = function(content, _input) {
});
})
.then(function(sections) {
page.sections = sections;
// Use plugin hook
return _callHook("page");
})
.then(function() {
that.manifest.add("CACHE", _output);
return that._writeTemplate(that.template, {
progress: progress,
progress: page.progress,
_input: _input,
content: sections,
content: page.sections,
basePath: basePath,
staticBase: path.join(basePath, "gitbook"),
}, output);
}, output, function(html) {
page.content = html;
return _callHook("page:after").get("content")
});
});
};
@@ -134,10 +192,31 @@ Generator.prototype.langsIndex = function(langs) {
Generator.prototype.copyAssets = function() {
var that = this;
// Copy gitbook assets
return fs.copy(
path.join(that.options.theme, "assets"),
path.join(that.options.output, "gitbook")
);
)
// Add to cach manifest
.then(function() {
return that.manifest.addFolder(path.join(that.options.output, "gitbook"), "gitbook");
})
// Copy plugins assets
.then(function() {
return Q.all(
_.map(that.plugins.list, function(plugin) {
if (!plugin.hasAssets()) return Q();
var pluginAssets = path.join(that.options.output, "gitbook/plugins/", plugin.name);
return plugin.copyAssets(pluginAssets)
.then(function() {
return that.manifest.addFolder(pluginAssets, "gitbook/plugins/"+plugin.name);
});
})
);
})
};
// Dump search index to disk
@@ -148,9 +227,23 @@ Generator.prototype.writeSearchIndex = function() {
);
};
Generator.prototype.finish = function() {
return this.copyAssets()
.then(this.writeSearchIndex);
// Add cache manifest
Generator.prototype.writeCacheManifest = function() {
return fs.writeFile(
path.join(this.options.output, 'manifest.appcache'),
this.manifest.dump()
);
};
module.exports = Generator;
Generator.prototype.finish = function() {
var deferred = this.copyAssets().then(this.writeSearchIndex);
if (this.options.cache !== false) {
deferred = deferred.then(this.writeCacheManifest);
}
return deferred;
};
module.exports = Generator;
+56
View File
@@ -0,0 +1,56 @@
var Q = require('q');
var _ = require('lodash');
var cp = require('child_process');
var url = require('url');
// Get the remote of a given repo
function gitURL(path) {
var d = Q.defer();
cp.exec("git config --get remote.origin.url", {
cwd: path,
env: process.env,
}, function(err, stdout, stderr) {
if(err) {
return d.reject(err);
}
return d.resolve(stdout);
});
return d.promise
.then(function(output) {
return output.replace(/(\r\n|\n|\r)/gm, "");
});
}
// Poorman's parsing
// Parse a git URL to a github ID : username/reponame
function githubID(_url) {
// Remove .git if it's in _url
var sliceEnd = _url.slice(-4) === '.git' ? -4 : _url.length;
// Detect HTTPS repos
var parsed = url.parse(_url);
if(parsed.protocol === 'https:' && parsed.host === 'github.com') {
return parsed.path.slice(1, sliceEnd);
}
// Detect SSH repos
if(_url.indexOf('git@') === 0) {
return _url.split(':', 2)[1].slice(0, sliceEnd);
}
// None found
return null;
}
function titleCase(str) {
return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
module.exports = {
url: gitURL,
githubID: githubID,
titleCase: titleCase
};
+2
View File
@@ -5,4 +5,6 @@ module.exports = {
lex: require('./lex'),
progress: require('./progress'),
navigation: require('./navigation'),
readme: require('./readme'),
git: require('./git')
};
+56 -5
View File
@@ -17,14 +17,65 @@ function splitSections(nodes) {
}, []).concat([section]); // Add remaining nodes
}
function isQuizNode(node) {
return (/^[(\[][ x][)\]]/).test(node.text || node);
}
function isExercise(nodes) {
var codeType = { type: 'code' };
// Number of code nodes in section
var len = _.filter(nodes, codeType).length;
return (
// Got 3 or 4 code blocks
(len === 3 || len === 4) &&
// Ensure all nodes are at the end
_.all(_.last(nodes, len), codeType)
);
}
function isQuiz(nodes) {
if (nodes.length < 3) {
return false;
}
// Support having a first paragraph block
// before our series of questions
var quizNodes = nodes.slice(nodes[0].type === 'paragraph' ? 1 : 0);
// No questions
if (!_.some(quizNodes, { type: 'blockquote_start' })) {
return false;
}
// Check if section has list of questions
// or table of questions
var listIdx = _.findIndex(quizNodes, { type: 'list_item_start' });
var tableIdx = _.findIndex(quizNodes, { type: 'table' });
if(
// List of questions
listIdx !== -1 && isQuizNode(quizNodes[listIdx + 1]) ||
// Table of questions
(
tableIdx !== -1 &&
_.every(quizNodes[tableIdx].cells[0].slice(1), isQuizNode)
)
) {
return true;
}
return false;
}
// What is the type of this section
function sectionType(nodes, idx) {
var codeNodes = _.filter(nodes, {
type: 'code'
}).length;
if(codeNodes === 3 && (idx % 2) == 1) {
if(isExercise(nodes)) {
return 'exercise';
} else if(isQuiz(nodes)) {
return 'quiz';
}
return 'normal';
+30 -49
View File
@@ -6,6 +6,12 @@ function clean(obj) {
return obj && _.omit(obj, ['articles']);
}
function flattenChapters(chapters) {
return _.reduce(chapters, function(accu, chapter) {
return accu.concat([clean(chapter)].concat(flattenChapters(chapter.articles)));
}, []);
}
// Returns from a summary a map of
/*
{
@@ -20,62 +26,37 @@ function navigation(summary, files) {
// Support single files as well as list
files = _.isArray(files) ? files : (_.isString(files) ? [files] : null);
// Mapping of prev/next for a give path
var mapping = {};
// Special README nav
var README_NAV = {
path: 'README.md',
title: 'Introduction',
};
// Walk the chapter/article tree and create navigation entires
_.each(summary.chapters, function(chapter, idx, chapters) {
// Skip if no path
if(!chapter.path) return;
var currentChapter = clean(chapter);
var prevChapter = (idx-1 < 0) ? README_NAV : chapters[idx-1];
var nextChapter = (idx+1 >= chapters.length) ? null : chapters[idx+1];
var prev = (!prevChapter || _.isEmpty(prevChapter.articles)) ?
prevChapter : _.last(prevChapter.articles);
var next = (!chapter || _.isEmpty(chapter.articles)) ?
nextChapter : _.first(chapter.articles);
// Add chapter mapping
mapping[chapter.path] = {
title: chapter.title,
prev: clean(prev),
next: clean(next),
level: (idx+1).toString(),
};
// Check a chapter's articles
_.each(chapter.articles, function(article, _idx, articles) {
// Skip if no path
if(!article.path) return;
var prev = (_idx-1 < 0) ? currentChapter : clean(articles[_idx-1]);
var next = (_idx+1 >= articles.length) ? nextChapter : clean(articles[_idx+1]);
mapping[article.path] = {
title: article.title,
prev: clean(prev),
next: clean(next),
level: [idx+1, _idx+1].join('.'),
};
});
});
// Hack for README.html
mapping['README.md'] = {
title: README_NAV.title,
prev: null,
next: clean(summary.chapters[0]),
level: '0',
};
// List of all navNodes
var navNodes = [README_NAV].concat(flattenChapters(summary.chapters));
var prevNodes = [null].concat(navNodes.slice(0, -1));
var nextNodes = navNodes.slice(1).concat([null]);
// Mapping of prev/next for a give path
var mapping = _.chain(_.zip(navNodes, prevNodes, nextNodes))
.map(function(nodes) {
var current = nodes[0], prev = nodes[1], next = nodes[2];
// Skip if no path
if(!current.path) return null;
return [current.path, {
title: current.title,
prev: prev,
next: next,
level: current.level,
}];
})
.filter()
.object()
.value();
// Filter for only files we want
if(files) {
return _.pick(mapping, files);
+79 -12
View File
@@ -8,17 +8,6 @@ var renderer = require('./renderer');
var lnormalize = require('../utils/lang').normalize;
// Synchronous highlighting with highlight.js
marked.setOptions({
highlight: function (code, lang) {
try {
return hljs.highlight(lang, code).value;
} catch(e) {
return hljs.highlightAuto(code).value;
}
}
});
// Render a section using our custom renderer
function render(section, _options) {
@@ -30,12 +19,34 @@ function render(section, _options) {
// Build options using defaults and our custom renderer
var options = _.extend({}, marked.defaults, {
renderer: renderer(null, _options)
renderer: renderer(null, _options),
// Synchronous highlighting with highlight.js
highlight: function (code, lang) {
if(!lang) return code;
// Normalize lang
lang = lnormalize(lang);
try {
return hljs.highlight(lang, code).value;
} catch(e) { }
return code;
}
});
return marked.parser(section, options);
}
function quizQuestion(node) {
if (node.text) {
node.text = node.text.replace(/^([\[(])x([\])])/, "$1 $2");
} else {
return node.replace(/^([\[(])x([\])])/, "$1 $2");
}
}
function parsePage(src, options) {
options = options || {};
@@ -72,8 +83,64 @@ function parsePage(src, options) {
base: codeNodes[0].text,
solution: codeNodes[1].text,
validation: codeNodes[2].text,
// Context is optional
context: codeNodes[3] ? codeNodes[3].text : null,
}
};
} else if (section.type === 'quiz') {
var quiz = [], question, foundFeedback = false;
var nonQuizNodes = section[0].type === 'paragraph' && section[1].type !== 'list_start' ? [section[0]] : [];
var quizNodes = section.slice(0);
quizNodes.splice(0, nonQuizNodes.length);
for (var i = 0; i < quizNodes.length; i++) {
var node = quizNodes[i];
if (question && (((node.type === 'list_end' || node.type === 'blockquote_end') && i === quizNodes.length - 1)
|| node.type === 'table' || (node.type === 'paragraph' && !foundFeedback))) {
quiz.push({
base: render(question.questionNodes),
solution: render(question.solutionNodes),
feedback: render(question.feedbackNodes)
});
}
if (node.type === 'table' || (node.type === 'paragraph' && !foundFeedback)) {
question = { questionNodes: [], solutionNodes: [], feedbackNodes: [] };
}
if (node.type === 'blockquote_start') {
foundFeedback = true;
} else if (node.type === 'blockquote_end') {
foundFeedback = false;
}
if (node.type === 'table') {
question.solutionNodes.push(_.cloneDeep(node));
node.cells = node.cells.map(function(row) {
return row.map(quizQuestion);
});
question.questionNodes.push(node);
} else if (!/blockquote/.test(node.type)) {
if (foundFeedback) {
question.feedbackNodes.push(node);
} else if (node.type === 'paragraph' || node.type === 'text'){
question.solutionNodes.push(_.cloneDeep(node));
quizQuestion(node);
question.questionNodes.push(node);
} else {
question.solutionNodes.push(node);
question.questionNodes.push(node);
}
}
}
return {
id: section.id,
type: section.type,
content: render(nonQuizNodes),
quiz: quiz
};
}
// Render normal pages
+2 -2
View File
@@ -12,7 +12,7 @@ var calculProgress = function(navigation, current) {
return nav;
})
.sortBy(function(nav) {
return nav.level;
return parseFloat(nav.level);
})
.map(function(nav, i) {
// Calcul percent
@@ -27,7 +27,7 @@ var calculProgress = function(navigation, current) {
} else if (done) {
prevPercent = nav.percent;
}
return nav;
})
.value();
+45
View File
@@ -0,0 +1,45 @@
var _ = require('lodash');
var marked = require('marked');
var textRenderer = require('marked-text-renderer');
function extractFirstNode(nodes, nType) {
return _.chain(nodes)
.filter(function(node) {
return node.type == nType;
})
.pluck("text")
.first()
.value();
}
function parseReadme(src) {
var nodes, title, description;
var renderer = textRenderer();
// Parse content
nodes = marked.lexer(src);
title = extractFirstNode(nodes, "heading") || '';
description = extractFirstNode(nodes, "paragraph") || '';
var convert = _.compose(
function(text) {
return _.unescape(text.replace(/(\r\n|\n|\r)/gm, ""));
},
function(text) {
return marked.parse(text, _.extend({}, marked.defaults, {
renderer: renderer
}));
}
);
return {
title: convert(title),
description: convert(description)
};
}
// Exports
module.exports = parseReadme;
+59 -14
View File
@@ -1,10 +1,13 @@
var url = require('url');
var inherits = require('util').inherits;
var links = require('../utils').links;
var path = require('path');
var marked = require('marked');
var rendererId = 0;
function GitBookRenderer(options, extra_options) {
if(!(this instanceof GitBookRenderer)) {
@@ -13,6 +16,9 @@ function GitBookRenderer(options, extra_options) {
GitBookRenderer.super_.call(this, options);
this._extra_options = extra_options;
this.quizRowId = 0;
this.id = rendererId++;
this.quizIndex = 0;
}
inherits(GitBookRenderer, marked.Renderer);
@@ -35,27 +41,38 @@ GitBookRenderer.prototype._unsanitized = function(href) {
};
GitBookRenderer.prototype.link = function(href, title, text) {
// Our "fixed" href
var _href = href;
// Don't build if it looks malicious
if (this.options.sanitize && this._unsanitized(href)) {
return '';
return text;
}
// Parsed version of the url
var parsed = url.parse(href);
var o = this._extra_options;
// Relative link, rewrite it to point to github repo
if(!parsed.protocol && parsed.path[0] != '/' && o && o.repo && o.dir) {
href = 'https://github.com/' + o.repo + '/blob' + path.normalize(path.join(
'/',
o.dir,
href
));
parsed = url.parse(href);
if(links.isRelative(_href)) {
if (path.extname(_href) == ".md") {
_href = links.toAbsolute(_href, o.dir || "./", o.outdir || "./");
if (o.singleFile) {
_href = "#"+_href;
} else {
_href = _href.replace(".md", ".html");
}
} else if (o && o.repo && o.dir) {
href = url.resolve('https://github.com/' + o.repo + '/blob/', [o.dir, _href].join("/"));
parsed = url.parse(href);
_href = parsed.href;
}
}
// Generate HTML for link
var out = '<a href="' + href + '"';
var out = '<a href="' + _href + '"';
// Title if no null
if (title) {
out += ' title="' + title + '"';
@@ -79,16 +96,44 @@ GitBookRenderer.prototype.image = function(href, title, text) {
var o = this._extra_options;
// Relative image, rewrite it depending output
if(!parsed.protocol && parsed.path[0] != '/' && o && o.dir && o.outdir) {
_href = path.relative(o.outdir, path.normalize(path.join(
o.dir,
href
)));
if(links.isRelative(href) && o && o.dir && o.outdir) {
// o.dir: directory parent of the file currently in rendering process
// o.outdir: directory parent from the html output
_href = links.toAbsolute(_href, o.dir, o.outdir);
}
return GitBookRenderer.super_.prototype.image.call(this, _href, title, text);
};
GitBookRenderer.prototype.tablerow = function(content) {
this.quizRowId += 1;
return GitBookRenderer.super_.prototype.tablerow(content);
};
var fieldRegex = /^([(\[])([ x])[\])]/;
GitBookRenderer.prototype._createCheckboxAndRadios = function(text) {
var match = fieldRegex.exec(text);
if (!match) {
return text;
}
var quizIdentifier = 'quiz-row-' + this.id + '-' + this.quizRowId + '-' + this.quizIndex++;
var field = "<input name='" + quizIdentifier + "' id='" + quizIdentifier + "' type='";
field += match[1] === '(' ? "radio" : "checkbox";
field += match[2] === 'x' ? "' checked/>" : "'/>";
var splittedText = text.split(fieldRegex);
var length = splittedText.length;
var label = '<label class="quiz-label" for="' + quizIdentifier + '">' + splittedText[length - 1] + '</label>';
return text.replace(fieldRegex, field).replace(splittedText[length - 1], label);
}
GitBookRenderer.prototype.tablecell = function(content, flags) {
return GitBookRenderer.super_.prototype.tablecell(this._createCheckboxAndRadios(content), flags);
};
GitBookRenderer.prototype.listitem = function(text) {
return GitBookRenderer.super_.prototype.listitem(this._createCheckboxAndRadios(text));
};
// Exports
module.exports = GitBookRenderer;
+9 -9
View File
@@ -82,17 +82,15 @@ function parseTitle(src, nums) {
level: level,
// Replace .md references with .html
path: matches[2],
path: matches[2].replace(/\\/g, '/'),
};
}
function parseArticle(chapterNum, nodes, idx) {
return parseTitle(_.first(nodes).text, [chapterNum, idx+1]);
}
function parseChapter(nodes, idx) {
return _.extend(parseTitle(_.first(nodes).text, [idx+1]), {
articles: _.map(listSplit(filterList(nodes), 'list_item_start', 'list_item_end'), parseArticle.bind(null, idx+1))
function parseChapter(nodes, nums) {
return _.extend(parseTitle(_.first(nodes).text, nums), {
articles: _.map(listSplit(filterList(nodes), 'list_item_start', 'list_item_end'), function(nodes, i) {
return parseChapter(nodes, nums.concat(i + 1));
})
});
}
@@ -104,7 +102,9 @@ function parseSummary(src) {
// Split out chapter sections
var chapters = _.chain(listSplit(chapterList, 'list_item_start', 'list_item_end'))
.map(parseChapter)
.map(function(nodes, i) {
return parseChapter(nodes, [i + 1]);
})
.value();
return {
+1
View File
@@ -1,3 +1,4 @@
module.exports = {
lang: require('./lang'),
links: require('./links')
};
+2
View File
@@ -5,6 +5,8 @@ var MAP = {
};
function normalize(lang) {
if(!lang) { return null; }
var lower = lang.toLowerCase();
return MAP[lower] || lower;
}
+33
View File
@@ -0,0 +1,33 @@
var url = require('url');
var path = require('path');
// Return true if the link is relative
var isRelative = function(href) {
var parsed = url.parse(href);
return !parsed.protocol && parsed.path && parsed.path[0] != '/';
};
// Relative to absolute path
// dir: directory parent of the file currently in rendering process
// outdir: directory parent from the html output
var toAbsolute = function(_href, dir, outdir) {
// Absolute file in source
_href = path.join(dir, _href);
// make it relative to output
_href = path.relative(outdir, _href);
if (process.platform === 'win32') {
_href = _href.replace(/\\/g, '/');
}
return _href;
};
module.exports = {
isRelative: isRelative,
toAbsolute: toAbsolute
};
+26
View File
@@ -0,0 +1,26 @@
var _ = require("lodash");
function escapeShellArg(arg) {
var ret = '';
ret = arg.replace(/"/g, '\\"');
return "\"" + ret + "\"";
}
function optionsToShellArgs(options) {
return _.chain(options)
.map(function(value, key) {
if (value == null || value == false) return null;
if (value == true) return key;
return key+"="+escapeShellArg(value);
})
.compact()
.value()
.join(" ");
}
module.exports = {
escapeShellArg: escapeShellArg,
optionsToShellArgs: optionsToShellArgs
};
+24 -5
View File
@@ -1,6 +1,7 @@
{
"name": "gitbook",
"version": "0.1.2",
"version": "0.5.0",
"homepage": "http://www.gitbook.io/",
"description": "Library and cmd utility to generate GitBooks",
"main": "lib/index.js",
"dependencies": {
@@ -15,14 +16,22 @@
"commander": "2.2.0",
"fs-extra": "0.8.1",
"highlight.js": "8.0.0",
"tmp": "0.0.23"
"tmp": "0.0.23",
"semver": "2.2.1",
"gaze": "~0.5.1",
"resolve": "0.6.3",
"tiny-lr-fork": "0.0.5",
"gitbook-plugin": "0.0.2",
"gitbook-plugin-mathjax": "0.0.3",
"gitbook-plugin-livereload": "0.0.1"
},
"devDependencies": {
"mocha": "1.18.2",
"grunt": "~0.4.2",
"grunt-cli": "0.1.11",
"grunt-contrib-less": "~0.5.0",
"grunt-contrib-requirejs": "0.4.1"
"grunt-contrib-requirejs": "0.4.1",
"grunt-bower-install-simple": "0.9.2"
},
"scripts": {
"test": "export TESTING=true; mocha --reporter list"
@@ -39,9 +48,19 @@
"book",
"gitbook"
],
"author": "Aaron O'Mullan <aaron.omullan@friendco.de>",
"author": "FriendCode <contact@friendco.de>",
"license": "Apache 2",
"bugs": {
"url": "https://github.com/GitbookIO/gitbook/issues"
}
},
"contributors": [
{
"name": "Aaron O'Mullan",
"email": "aaron.omullan@gmail.com"
},
{
"name": "Samy Pessé",
"email": "samypesse@gmail.com"
}
]
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 164 KiB

+1 -1
View File
@@ -4,7 +4,7 @@ Some nice content here
---
A beautiful separator, but non an exercise !
A beautiful separator, but non an exercise or a quiz !
---
+12
View File
@@ -0,0 +1,12 @@
# Images Test
This is a test for images path calculation. It supposed this fiel is in a syntax/ folder
### #
[![Screen](./preview.png)](./preview.png)
### 2
[![Screen](../preview2.png)](./preview2.png)
+5
View File
@@ -0,0 +1,5 @@
# Nice course
Check out this other chapter [Test](test.md)
Check out this other chapter [Test](../before.md)
+36
View File
@@ -30,3 +30,39 @@ Some more nice content ....
[Cool stuff](http://gitbook.io)
[Link to another Markdown file](./xyz/file.md)
And look at this pretty picture:
![Pretty](../assets/my-pretty-picture.png "Pretty")
Lets go for another exercise but this time with some context :
---
Exercise with some context code :
Using the `double` function provided, build a `quadruple` function
```py
```
```py
def quadruple(x):
return double(double(x))
```
```py
assert(quadruple(8), 32)
```
```py
def double(x):
return x * 2
```
---
+48
View File
@@ -0,0 +1,48 @@
# Gitbook quiz
Gitbook lets you write a quiz using GFM tables:
---
Here's a quiz about Gitbook
| | Good | Bad |
| ---------------- | ---- | --- |
| What is Gitbook? | (x) | ( ) |
> Gitbook is good
What does Gitbook support?
- [x] Table-based questions with radio buttons
- [x] Table-based questions with checkboxes
- [ ] Telepathy
- [x] List-based questions with checkboxes
- [x] List-based questions with radio buttons
- [ ] Moon-on-a-stick
> Gitbook supports table and list based quiz questions using either radio buttons or checkboxes.
>
> Gitbook is not telepathic and does not give you the moon on a stick.
---
Some more nice content ....
[Cool stuff](http://gitbook.io)
[Link to another Markdown file](./xyz/file.md)
---
Quiz test 2: What does Gitbook support?
- [x] Table-based questions with radio buttons
- [x] Table-based questions with checkboxes
- [ ] Telepathy
- [x] List-based questions with checkboxes
- [x] List-based questions with radio buttons
- [ ] Moon-on-a-stick
> Gitbook supports table and list based quiz questions using either radio buttons or checkboxes.
---
+7
View File
@@ -0,0 +1,7 @@
# This is the title
This is the book description.
other content
...
+68
View File
@@ -0,0 +1,68 @@
# Title
Some text
---
## NOT Exercise
Simple subsection NOT exercise
```
x = 1
```
What is this
```
y = [1, 2, 3]
```
```
z = {a: 1, b: 2}
```
---
## Exercise
Define a variable `x` equal to 10.
```js
var x =
```
```js
var x = 10;
```
```js
assert(x == 10);
```
```js
// This is context code available everywhere
// The user will be able to call magicFunc in his code
function magicFunc() {
return 3;
}
```
---
## Another exercise
Bla bla bla ... This time with no `context` code.
```js
var x =
```
```js
var x = 10;
```
```js
assert(x == 10);
```
+2
View File
@@ -3,6 +3,8 @@
* [Chapter 1](chapter-1/README.md)
* [Article 1](chapter-1/ARTICLE1.md)
* [Article 2](chapter-1/ARTICLE2.md)
* [article 1.2.1](chapter-1/ARTICLE-1-2-1.md)
* [article 1.2.2](chapter-1/ARTICLE-1-2-2.md)
* [Chapter 2](chapter-2/README.md)
* [Chapter 3](chapter-3/README.md)
* [Chapter 4](chapter-4/README.md)
+2
View File
@@ -0,0 +1,2 @@
# This is a test
+3
View File
@@ -0,0 +1,3 @@
# Summary
* [test](test.md)
+1
View File
@@ -0,0 +1 @@
# Test
+1
View File
@@ -0,0 +1 @@
# This should fail
+46
View File
@@ -0,0 +1,46 @@
var _ = require('lodash');
var Q = require('q');
var path = require('path');
var tmp = require('tmp');
var assert = require('assert');
var generate = require("../lib/generate");
var generateTmpBook = function(path) {
return ;
};
var BOOKS = {
"book1": true,
"book2": false
};
describe('Site Generation', function () {
var ret = {};
beforeEach(function(done){
Q.all(_.map(BOOKS, function(state, bookName) {
return Q.nfcall(tmp.dir)
.then(function(_dir) {
return generate.folder({
input: path.join(__dirname, "fixtures", bookName),
output: _dir
});
})
.then(function(_book) {
ret[bookName] = _book;
}, function(err) {
// ignore errors here
});
}))
.fin(done);
});
it('should generate the valid sites', function() {
_.each(BOOKS, function(state, bookName) {
assert((ret[bookName] != null) == state);
});
});
});
+12 -2
View File
@@ -18,6 +18,8 @@ describe('Summary navigation', function() {
'chapter-1/ARTICLE1.md',
'chapter-1/ARTICLE2.md',
'chapter-2/README.md',
'chapter-1/ARTICLE-1-2-1.md',
'chapter-1/ARTICLE-1-2-2.md'
]);
// Make sure it found the files we gave it
@@ -26,6 +28,8 @@ describe('Summary navigation', function() {
assert(nav['chapter-1/ARTICLE1.md']);
assert(nav['chapter-1/ARTICLE2.md']);
assert(nav['chapter-2/README.md']);
assert(nav['chapter-1/ARTICLE-1-2-1.md']);
assert(nav['chapter-1/ARTICLE-1-2-2.md']);
assert.equal(nav['README.md'].prev, null);
@@ -38,9 +42,15 @@ describe('Summary navigation', function() {
assert.equal(nav['chapter-1/ARTICLE1.md'].next.path, 'chapter-1/ARTICLE2.md');
assert.equal(nav['chapter-1/ARTICLE2.md'].prev.path, 'chapter-1/ARTICLE1.md');
assert.equal(nav['chapter-1/ARTICLE2.md'].next.path, 'chapter-2/README.md');
assert.equal(nav['chapter-1/ARTICLE2.md'].next.path, 'chapter-1/ARTICLE-1-2-1.md');
assert.equal(nav['chapter-2/README.md'].prev.path, 'chapter-1/ARTICLE2.md');
assert.equal(nav['chapter-1/ARTICLE-1-2-1.md'].prev.path, 'chapter-1/ARTICLE2.md');
assert.equal(nav['chapter-1/ARTICLE-1-2-1.md'].next.path, 'chapter-1/ARTICLE-1-2-2.md');
assert.equal(nav['chapter-1/ARTICLE-1-2-2.md'].prev.path, 'chapter-1/ARTICLE-1-2-1.md');
assert.equal(nav['chapter-1/ARTICLE-1-2-2.md'].next.path, 'chapter-2/README.md');
assert.equal(nav['chapter-2/README.md'].prev.path, 'chapter-1/ARTICLE-1-2-2.md');
assert.equal(nav['chapter-2/README.md'].next.path, 'chapter-3/README.md');
});
+97 -12
View File
@@ -4,25 +4,31 @@ var assert = require('assert');
var page = require('../').parse.page;
function loadPage (name, options) {
var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/' + name + '.md'), 'utf8');
return page(CONTENT, options);
}
var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/PAGE.md'), 'utf8');
var LEXED = page(CONTENT);
var HR_CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/HR_PAGE.md'), 'utf8');
var HR_LEXED = page(HR_CONTENT);
var LINKS_CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/GITHUB_LINKS.md'), 'utf8');
var LEXED = loadPage('PAGE', {
dir: 'course',
outdir: '_book'
});
var QUIZ_LEXED = loadPage('QUIZ_PAGE');
var HR_LEXED = loadPage('HR_PAGE');
describe('Page parsing', function() {
it('should detection sections', function() {
assert.equal(LEXED.length, 3);
it('should detect sections', function() {
assert.equal(LEXED.length, 4);
});
it('should detection section types', function() {
it('should detect section types', function() {
assert.equal(LEXED[0].type, 'normal');
assert.equal(LEXED[1].type, 'exercise');
assert.equal(LEXED[2].type, 'normal');
assert.equal(QUIZ_LEXED[0].type, 'normal');
assert.equal(QUIZ_LEXED[1].type, 'quiz');
assert.equal(QUIZ_LEXED[2].type, 'normal');
assert.equal(QUIZ_LEXED[3].type, 'quiz');
});
it('should gen content for normal sections', function() {
@@ -36,6 +42,14 @@ describe('Page parsing', function() {
assert(LEXED[1].code.base);
assert(LEXED[1].code.solution);
assert(LEXED[1].code.validation);
assert(LEXED[1].code.context === null);
assert(LEXED[3].content);
assert(LEXED[3].code);
assert(LEXED[3].code.base);
assert(LEXED[3].code.solution);
assert(LEXED[3].code.validation);
assert(LEXED[3].code.context);
});
it('should merge sections correctly', function() {
@@ -49,19 +63,90 @@ describe('Page parsing', function() {
it('should detect an exercise\'s language', function() {
assert.equal(LEXED[1].lang, 'python');
});
it('should render a quiz', function() {
assert(QUIZ_LEXED[1].content);
assert(QUIZ_LEXED[1].quiz);
assert(QUIZ_LEXED[1].quiz[0].base);
assert(QUIZ_LEXED[1].quiz[0].solution);
assert(QUIZ_LEXED[1].quiz[0].feedback);
assert(QUIZ_LEXED[1].quiz[1].base);
assert(QUIZ_LEXED[1].quiz[1].solution);
assert(QUIZ_LEXED[1].quiz[1].feedback);
});
});
describe('Relative links', function() {
it('should be resolved to their GitHub counterparts', function() {
var LEXED = page(LINKS_CONTENT, {
var LEXED = loadPage('GITHUB_LINKS', {
// GitHub repo ID
repo: 'GitBookIO/javascript',
// Imaginary folder of markdown file
dir: 'course',
outdir: './'
});
assert(LEXED[0].content.indexOf('https://github.com/GitBookIO/javascript/blob/src/something.cpp') !== -1);
});
it('should replace link to .md by link to .html', function() {
var LEXED = loadPage('MARKDOWN_LINKS', {
// GitHub repo ID
repo: 'GitBookIO/javascript',
// Imaginary folder of markdown file
dir: 'course',
outdir: 'course'
});
assert(LEXED[0].content.indexOf('test.html') !== -1);
assert(LEXED[0].content.indexOf('../before.html') !== -1);
});
it('should replace link to .md by link to page in format single page', function() {
var LEXED = loadPage('MARKDOWN_LINKS', {
// GitHub repo ID
repo: 'GitBookIO/javascript',
// Imaginary folder of markdown file
dir: 'course',
outdir: './',
singleFile: true
});
assert(LEXED[0].content.indexOf('#course/test.md') !== -1);
assert(LEXED[0].content.indexOf('#before.md') !== -1);
});
});
describe('Relative images', function() {
it('should keep image relative with considering output directory in site format', function() {
var LEXED = loadPage('IMAGES', {
// GitHub repo ID
repo: 'GitBookIO/javascript',
// Imaginary folder of markdown file
dir: 'syntax',
outdir: 'syntax'
});
assert(LEXED[0].content.indexOf('"preview.png"') !== -1);
assert(LEXED[0].content.indexOf('"../preview2.png"') !== -1);
});
it('should keep image relative with considering output directory in page format', function() {
var LEXED = loadPage('IMAGES', {
// GitHub repo ID
repo: 'GitBookIO/javascript',
// Imaginary folder of markdown file
dir: 'syntax',
outdir: './'
});
assert(LEXED[0].content.indexOf('"syntax/preview.png"') !== -1);
assert(LEXED[0].content.indexOf('"preview2.png"') !== -1);
});
});
+49
View File
@@ -0,0 +1,49 @@
var _ = require('lodash');
var path = require('path');
var assert = require('assert');
var Plugin = require('../').generate.Plugin;
describe('Plugin validation', function () {
var plugin = new Plugin("plugin", __dirname);
it('should be valid', function() {
assert(plugin.isValid());
});
});
describe('Plugin list of names', function () {
var firstDefault = _.first(Plugin.defaults);
it('should convert string to array', function() {
var _name = "test";
assert(_.contains(Plugin.normalizeNames(_name), _name));
});
it('should contains default plugins', function() {
assert(_.contains(Plugin.normalizeNames([]), firstDefault));
});
it('should remove name starting with -', function() {
assert(!_.contains(Plugin.normalizeNames(["-"+firstDefault]), firstDefault));
});
});
describe('Plugin defaults loading', function () {
var ret = true;
beforeEach(function(done){
Plugin.fromList(Plugin.defaults, __dirname)
.then(function(_r) {
ret = _r;
}, function(err) {
ret = null;
})
.fin(done);
});
it('should load defaults addons', function() {
assert(ret != null);
});
});
+28
View File
@@ -0,0 +1,28 @@
var fs = require('fs');
var path = require('path');
var assert = require('assert');
var readme = require('../').parse.readme;
var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/README.md'), 'utf8');
var LEXED = readme(CONTENT);
describe('Readme parsing', function () {
it('should contain a title', function() {
assert(LEXED.title);
});
it('should contain a description', function() {
assert(LEXED.description);
});
it('should extract the right title', function() {
assert.equal(LEXED.title, "This is the title");
});
it('should extract the right description', function() {
assert.equal(LEXED.description, "This is the book description.");
});
});
+22
View File
@@ -0,0 +1,22 @@
var fs = require('fs');
var path = require('path');
var assert = require('assert');
var lex = require('../').parse.lex;
var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/SECTIONS.md'), 'utf8');
var LEXED = lex(CONTENT);
describe('Section parsing', function() {
it('should correctly split sections', function() {
assert.equal(LEXED.length, 3);
});
it('should robustly detect exercises', function() {
assert.equal(LEXED[0].type, 'normal');
assert.equal(LEXED[1].type, 'exercise');
assert.equal(LEXED[2].type, 'exercise');
});
});
+1
View File
@@ -50,5 +50,6 @@ describe('Summary parsing', function () {
assert.equal(c[0].articles[0].level, '1.1');
assert.equal(c[0].articles[1].level, '1.2');
assert.equal(c[0].articles[1].articles[0].level, '1.2.1');
});
});
-5
View File
@@ -1,5 +0,0 @@
# GitBook Theme
For creating a theme for GitBook, just copy this folder. The theme folder should at least contains two folders: `assets` and `templates`.
The theme can be changed using the option ```--theme=<path>```
+1 -21406
View File
File diff suppressed because one or more lines are too long
View File
Binary file not shown.
-240
View File
@@ -1,240 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
This is a custom SVG webfont generated by Font Squirrel.
Designer : Linotype Design Studio
Foundry URL : http://www.Linotype.com/
</metadata>
<defs>
<font id="webfont33RR7Kfq" horiz-adv-x="556" >
<font-face units-per-em="1000" ascent="800" descent="-200" />
<missing-glyph horiz-adv-x="278" />
<glyph unicode=" " horiz-adv-x="278" />
<glyph unicode="&#x09;" horiz-adv-x="278" />
<glyph unicode="&#xa0;" horiz-adv-x="278" />
<glyph unicode="!" horiz-adv-x="259" d="M74 111v-111h111v111h-111zM177 494v220h-95v-220l25 -311h45z" />
<glyph unicode="&#x22;" horiz-adv-x="426" d="M249 714v-258h68v258h-68zM109 714v-258h68v258h-68z" />
<glyph unicode="#" d="M231 424h124l-21 -150h-124zM131 206l-29 -206h69l29 206h124l-29 -206h69l29 206h101v68h-91l21 150h98v68h-89l29 205h-69l-29 -205h-124l29 205h-69l-29 -205h-111v-68h102l-21 -150h-107v-68h97z" />
<glyph unicode="$" d="M110 218h-85q8 -105 67 -164.5t159 -69.5v-82h55v82q48 4 88 20t69 43.5t45.5 65.5t16.5 87q0 46 -17.5 79t-42.5 55t-52 34.5t-47 17.5l-60 16v246q92 -17 112 -116h85q-20 88 -68 138t-129 60v67h-55v-66q-43 -3 -80.5 -19t-65 -43.5t-43.5 -65t-16 -82.5q0 -44 12 -75 t37.5 -52.5t64 -37t91.5 -28.5v-265q-60 10 -99.5 49t-41.5 106zM306 63v251q27 -8 51 -17.5t41 -23.5t27 -33.5t10 -48.5q0 -32 -9.5 -55.5t-27 -39t-41 -23.5t-51.5 -10zM251 651v-234q-25 7 -46 16t-36.5 21.5t-24 31t-8.5 44.5q0 57 33.5 86.5t81.5 34.5z" />
<glyph unicode="%" horiz-adv-x="1000" d="M167 508q0 23 3 48.5t12.5 47t26.5 36t45 14.5q29 0 45.5 -14.5t25.5 -36t11.5 -47t2.5 -47.5q0 -23 -3 -49t-12.5 -47.5t-26.5 -35.5t-46 -14q-28 0 -44.5 14.5t-25.5 36t-11.5 47t-2.5 47.5zM92 506q0 -41 8.5 -77t27.5 -63t50 -42.5t76 -15.5q44 0 74 17t49.5 44.5 t28 64t8.5 75.5q0 41 -7.5 77.5t-26 63.5t-49 43t-77.5 16q-46 0 -77 -16.5t-50 -44.5t-27 -64.5t-8 -77.5zM661 188q0 23 3 48.5t12.5 47t26.5 36t45 14.5q29 0 45.5 -14.5t25.5 -36t11.5 -47t2.5 -47.5q0 -23 -3 -49t-12.5 -47.5t-26.5 -35.5t-46 -14q-28 0 -44.5 14.5 t-25.5 36t-11.5 47t-2.5 47.5zM586 186q0 -41 8.5 -77t27.5 -62.5t50 -42t76 -15.5q44 0 74 16.5t49.5 44t28 64t8.5 75.5q0 41 -7.5 77.5t-26 63.5t-49 43t-77.5 16q-46 0 -77 -16.5t-50 -44.5t-27 -64.5t-8 -77.5zM726 722l-538 -743h86l537 743h-85z" />
<glyph unicode="&#x26;" horiz-adv-x="630" d="M275 439l-24 30q-12 15 -22 30.5t-16.5 31.5t-6.5 32q0 39 26 57.5t56 18.5q38 0 60 -22.5t22 -53.5q0 -23 -9 -41.5t-23 -33.5t-31 -27zM458 89l76 -89h111l-139 161l19 43q8 18 13.5 37t9 41.5t6.5 54.5h-81q-3 -55 -23 -111l-129 157q26 15 50 33.5t43 41.5t30 50.5 t11 59.5q0 36 -14.5 63.5t-38.5 46t-55.5 27.5t-64.5 9q-39 0 -69 -12t-50.5 -32.5t-31 -47t-10.5 -55.5q0 -27 6.5 -48.5t18 -41t25.5 -38.5l29 -40q-34 -18 -64.5 -38.5t-53 -46t-36 -57.5t-13.5 -74q0 -22 7.5 -55t31.5 -64t68 -53t116 -22q59 0 114.5 25t87.5 75z M247 345l164 -197q-26 -39 -64.5 -62t-87.5 -23q-26 0 -50.5 9t-43.5 24.5t-30.5 38t-11.5 49.5q0 32 10 55.5t27 42.5t39.5 34t47.5 29z" />
<glyph unicode="'" horiz-adv-x="278" d="M105 714v-258h68v258h-68z" />
<glyph unicode="(" horiz-adv-x="259" d="M204 -197h65q-71 115 -101.5 228t-30.5 239q0 123 30 235t102 226h-65q-78 -103 -117.5 -223t-39.5 -238q0 -66 11 -126t31.5 -117t49.5 -112.5t65 -111.5z" />
<glyph unicode=")" horiz-adv-x="259" d="M-9 -197h64q78 103 117.5 222.5t39.5 237.5q0 66 -11 126t-31.5 117.5t-49.5 113t-65 111.5h-64q70 -115 100.5 -228.5t30.5 -239.5q0 -122 -30 -234.5t-101 -225.5z" />
<glyph unicode="*" horiz-adv-x="352" d="M201 601v113h-53v-113l-106 40l-18 -48l106 -38l-65 -91l45 -31l65 96l69 -96l41 31l-66 91l109 38l-20 48z" />
<glyph unicode="+" horiz-adv-x="600" d="M334 287v219h-68v-219h-218v-68h218v-219h68v219h218v68h-218z" />
<glyph unicode="," horiz-adv-x="278" d="M83 111v-111h59q1 -12 -1.5 -26t-9.5 -27.5t-18.5 -25t-28.5 -17.5v-50q58 17 84 58t26 98v101h-111z" />
<glyph unicode="-" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
<glyph unicode="." horiz-adv-x="278" d="M83 111v-111h111v111h-111z" />
<glyph unicode="/" horiz-adv-x="333" d="M278 731l-295 -747h72l296 747h-73z" />
<glyph unicode="0" d="M132 349q0 26 0.5 57.5t5 63t13 61.5t25 52.5t41.5 36.5t61 14t61 -14t41.5 -36.5t25 -52.5t13 -61.5t5 -63t0.5 -57.5q0 -40 -2.5 -89.5t-16 -93t-43.5 -73.5t-84 -30t-84 30t-43.5 73.5t-16 93t-2.5 89.5zM42 348q0 -39 2 -81t10 -82t23 -75.5t41 -62.5t65.5 -42.5 t94.5 -15.5q56 0 95 15.5t65 42.5t41 62.5t23 75.5t10 82t2 81t-2 81t-10 82t-23 76t-41 63t-65.5 43t-94.5 16t-94.5 -16t-65.5 -43t-41 -63t-23 -76t-10 -82t-2 -81z" />
<glyph unicode="1" d="M356 0v709h-65q-7 -40 -26 -66t-46.5 -41t-61.5 -20.5t-70 -5.5v-68h184v-508h85z" />
<glyph unicode="2" d="M44 458h85v8q0 28 7 56q7 31 24 56t43.5 40.5t63.5 15.5q28 0 53 -9t43.5 -26t29.5 -40.5t11 -52.5q0 -37 -11.5 -65t-34 -52t-56.5 -47.5t-79 -51.5q-37 -22 -71 -47t-61 -58t-44.5 -77.5t-22.5 -107.5h463v75h-364q6 33 25.5 58.5t47 47.5t60.5 41l66 40q33 21 64 44 t55 51.5t38.5 64.5t14.5 83q0 50 -17.5 88t-47.5 63.5t-70.5 39t-86.5 13.5q-56 0 -100 -19t-73.5 -52.5t-43.5 -79.5q-12 -38 -12 -81q0 -9 1 -19z" />
<glyph unicode="3" d="M218 405v-72q24 3 51 3q32 0 59.5 -8.5t47.5 -26t32 -43t12 -58.5q0 -32 -12.5 -57.5t-33.5 -43t-49 -27t-59 -9.5q-73 0 -111 43.5t-40 112.5h-85v-6q0 -51 16 -92q16 -43 47 -72.5t75 -44.5t98 -15q50 0 94.5 13.5t77.5 40.5t52.5 67.5t19.5 93.5q0 64 -31.5 111 t-96.5 61v2q42 19 70 56t28 85q0 49 -16.5 85t-45.5 59t-68.5 34.5t-85.5 11.5q-53 0 -93.5 -17t-67.5 -47t-41.5 -72t-16.5 -93h85q0 31 8 59t24.5 49t42 33.5t59.5 12.5q54 0 90 -28.5t36 -85.5q0 -28 -11 -50t-29.5 -36.5t-43 -22t-51.5 -7.5h-18h-10q-4 0 -9 1z" />
<glyph unicode="4" d="M339 241h-238l236 347h2v-347zM419 241v468h-68l-323 -461v-82h311v-166h80v166h96v75h-96z" />
<glyph unicode="5" d="M470 622v75h-350l-66 -368l73 -4q25 30 57.5 48.5t74.5 18.5q36 0 65.5 -12t50.5 -33.5t32.5 -51t11.5 -64.5q0 -42 -12 -73.5t-32.5 -52.5t-48 -31.5t-57.5 -10.5q-32 0 -58.5 9.5t-46 27t-31 41t-13.5 50.5h-85q1 -48 19 -86t49 -63.5t71.5 -39t86.5 -13.5 q62 0 108.5 19.5t77.5 52.5t46.5 75.5t15.5 87.5q0 61 -18 106.5t-49 76t-73 45.5t-89 15q-36 0 -72.5 -12.5t-59.5 -38.5l-2 2l38 204h286z" />
<glyph unicode="6" d="M414 528h85q-8 88 -60 134.5t-140 46.5q-76 0 -126 -32t-80 -85t-42.5 -121.5t-12.5 -141.5q0 -56 8.5 -116t34.5 -110t74 -82t127 -32q67 0 112.5 22.5t73 57t39.5 76.5t12 81q0 49 -15 91t-42.5 73t-68 48.5t-91.5 17.5q-58 0 -102.5 -22t-74.5 -71l-2 2q1 41 8 88 t25.5 87.5t51.5 67t87 26.5q51 0 82 -29t37 -77zM286 381q36 0 63 -13t45 -34.5t26.5 -51t8.5 -62.5q0 -31 -9.5 -59.5t-27.5 -50.5t-44.5 -34.5t-61.5 -12.5t-62.5 12.5t-46 33.5t-28.5 50t-10 62t9.5 62.5t28.5 51t46 34t63 12.5z" />
<glyph unicode="7" d="M509 624v73h-459v-80h372q-56 -59 -104.5 -129t-85.5 -148.5t-60.5 -164t-29.5 -175.5h95q5 83 28 171t59.5 171t83.5 156t101 126z" />
<glyph unicode="8" d="M155 525q0 27 10 47t26.5 34t39.5 21t48 7q52 0 85.5 -27.5t33.5 -81.5t-33 -84t-84 -30q-26 0 -49 7t-40 21t-27 35.5t-10 50.5zM65 528q0 -48 27 -88.5t72 -58.5q-60 -21 -92 -67.5t-32 -109.5q0 -54 18.5 -94.5t51 -67.5t76.5 -40t95 -13q49 0 92 14t74.5 41.5 t50 67.5t18.5 92q0 66 -31 111.5t-95 65.5q45 20 71.5 59.5t26.5 87.5q0 34 -12 66.5t-37.5 58t-66.5 41t-99 15.5q-41 0 -78.5 -12t-66.5 -35t-46 -56.5t-17 -77.5zM130 200q0 31 11.5 56t32 43t48 27.5t58.5 9.5q30 0 56.5 -10.5t46.5 -28.5t31.5 -42.5t11.5 -53.5 q0 -30 -10.5 -55t-30 -43.5t-46 -29t-58.5 -10.5q-66 0 -108.5 36.5t-42.5 100.5z" />
<glyph unicode="9" d="M134 171h-85q8 -92 67 -137t148 -45q129 0 187.5 98.5t58.5 282.5q0 101 -19.5 166.5t-52.5 103.5t-77 53.5t-94 15.5q-51 0 -94 -17t-74 -47.5t-48 -73t-17 -93.5q0 -52 14.5 -96t43 -75t70.5 -48.5t96 -17.5q52 0 96 26.5t68 71.5l2 -2q-4 -139 -43 -206.5t-117 -67.5 q-51 0 -88 28t-42 80zM409 472q0 -31 -10 -59.5t-29 -50t-46 -34t-60 -12.5q-31 0 -56.5 12.5t-44 33.5t-29 48t-10.5 56q0 33 7.5 63t24 53.5t43 37.5t64.5 14q36 0 63 -13t45.5 -35.5t28 -51.5t9.5 -62z" />
<glyph unicode=":" horiz-adv-x="278" d="M194 406v111h-111v-111h111zM83 111v-111h111v111h-111z" />
<glyph unicode=";" horiz-adv-x="278" d="M194 406v111h-111v-111h111zM83 111v-111h59q1 -12 -1.5 -26t-9.5 -27.5t-18.5 -25t-28.5 -17.5v-50q58 17 84.5 58t25.5 98v101h-111z" />
<glyph unicode="&#x3c;" horiz-adv-x="600" d="M554 446v68l-508 -230v-62l508 -229v67l-425 193z" />
<glyph unicode="=" horiz-adv-x="600" d="M48 186v-68h504v68h-504zM552 320v68h-504v-68h504z" />
<glyph unicode="&#x3e;" horiz-adv-x="600" d="M46 60v-67l508 229v62l-508 230v-68l425 -193z" />
<glyph unicode="?" d="M218 111v-111h111v111h-111zM55 491h85q0 35 8 65t25.5 52t43.5 35t62 13q54 0 85.5 -31t35.5 -86v-11q0 -30 -9 -52q-11 -26 -29.5 -47.5t-40 -41t-41 -42.5t-33 -52.5t-15.5 -71.5v-47h85v39q0 26 7.5 46.5t20 38t27.5 32.5l32 31l32 33q15 17 27 37t19.5 44.5 t7.5 55.5q0 48 -15.5 85t-43.5 62.5t-66.5 39t-85.5 13.5q-52 0 -94 -18t-71 -50.5t-44 -76.5q-15 -41 -15 -89v-6z" />
<glyph unicode="@" horiz-adv-x="800" d="M534 270l84 284h-63l-23 -63q-17 45 -47 63.5t-65 18.5q-53 0 -96.5 -25t-74 -65t-47.5 -91t-17 -103q0 -33 10.5 -62t29 -50t45 -33.5t58.5 -12.5q37 0 69 20.5t55 46.5h3q2 -33 20 -49t44 -16q35 0 76 21t76 59t58.5 91.5t23.5 118.5q0 68 -27 124.5t-73.5 97 t-108.5 63.5t-131 23q-76 0 -143.5 -29t-118 -79.5t-80 -118t-29.5 -144.5q0 -80 29 -148.5t79.5 -119t119 -79.5t147.5 -29q48 0 94 11.5t86.5 34t74.5 55t58 74.5h-63q-43 -55 -109.5 -88t-138.5 -33q-63 0 -119 24.5t-98.5 67t-67 100.5t-24.5 125q0 66 23.5 124 t64.5 102t96.5 69.5t119.5 25.5q53 0 101.5 -18t86.5 -51.5t60.5 -81.5t22.5 -107q0 -40 -13 -81t-33 -74t-44.5 -54t-47.5 -21q-24 0 -24 31q0 11 3.5 24.5t7.5 26.5zM420 505q16 0 30.5 -8t26 -20.5t18 -29.5t6.5 -35q0 -31 -12 -68t-33 -69.5t-49 -54t-61 -21.5 q-38 0 -62 27.5t-24 69.5q0 33 12 69.5t33 67.5t50.5 51.5t64.5 20.5z" />
<glyph unicode="A" horiz-adv-x="648" d="M201 295l121 333h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="B" horiz-adv-x="685" d="M173 407v227h190q31 0 58.5 -3.5t48.5 -15.5t33 -34t12 -60q0 -57 -35.5 -85.5t-116.5 -28.5h-190zM78 714v-714h345q53 0 93.5 17.5t68 46t41.5 65.5t14 76q0 66 -35 112t-101 60v2q51 20 78.5 61.5t27.5 98.5q0 54 -24.5 91t-59.5 58q-16 10 -38.5 15t-48.5 7.5 t-52.5 3t-49.5 0.5h-259zM173 80v247h217q30 0 58 -5.5t49.5 -19t34.5 -36.5t13 -58q0 -60 -35.5 -94t-98.5 -34h-238z" />
<glyph unicode="C" horiz-adv-x="722" d="M580 499h95q-8 57 -34 100.5t-65 72.5t-89 44t-106 15q-82 0 -145.5 -29.5t-106 -80.5t-64.5 -119.5t-22 -146.5t20.5 -146t61.5 -118t103 -78.5t145 -28.5q137 0 216 75t93 210h-95q-3 -44 -18 -82t-41.5 -65.5t-63 -43t-83.5 -15.5q-64 0 -110 24t-75.5 64.5t-43.5 95 t-14 115.5q0 56 14 108t43.5 92.5t75 64.5t109.5 24q75 0 129.5 -38t70.5 -114z" />
<glyph unicode="D" horiz-adv-x="704" d="M173 80v554h160q66 0 111 -18.5t73.5 -54t41 -86t12.5 -114.5q0 -66 -13.5 -112.5t-34.5 -77.5t-47.5 -49t-53.5 -27.5t-51 -12t-40 -2.5h-158zM78 714v-714h245q89 0 154 25t107 72.5t62 117t20 159.5q0 172 -89 256t-254 84h-245z" />
<glyph unicode="E" horiz-adv-x="611" d="M78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
<glyph unicode="F" horiz-adv-x="574" d="M78 714v-714h95v327h328v80h-328v227h374v80h-469z" />
<glyph unicode="G" horiz-adv-x="759" d="M612 89l25 -89h60v376h-313v-80h228v-11q0 -43 -13 -81q-15 -42 -44.5 -73.5t-72.5 -49.5t-99 -18q-60 0 -105.5 23.5t-76.5 63t-47 91t-16 107.5q0 57 14 111.5t43.5 97t76 68.5t111.5 26q40 0 75.5 -9.5t63.5 -28.5t47 -48.5t26 -70.5h95q-10 63 -37.5 107.5t-68 73.5 t-92 42.5t-109.5 13.5q-85 0 -148.5 -31.5t-106 -84.5t-64 -123.5t-21.5 -148.5q0 -70 23 -135t67 -115t107 -79.5t143 -29.5q63 0 125 24.5t104 80.5z" />
<glyph unicode="H" horiz-adv-x="722" d="M78 714v-714h95v327h376v-327h95v714h-95v-307h-376v307h-95z" />
<glyph unicode="I" horiz-adv-x="259" d="M82 714v-714h95v714h-95z" />
<glyph unicode="J" horiz-adv-x="519" d="M441 178v536h-95v-522q0 -59 -24.5 -94t-89.5 -35q-35 0 -57.5 10.5t-35 29.5t-17.5 45t-5 57v30h-95v-44q0 -102 54 -154.5t154 -52.5q60 0 100.5 16.5t65 44t35 62.5t10.5 71z" />
<glyph unicode="K" horiz-adv-x="667" d="M78 714v-714h95v250l119 111l258 -361h120l-313 426l301 288h-123l-362 -356v356h-95z" />
<glyph unicode="L" d="M78 714v-714h473v80h-378v634h-95z" />
<glyph unicode="M" horiz-adv-x="871" d="M80 714v-714h90v594h2l223 -594h81l223 594h2v-594h90v714h-130l-226 -600l-225 600h-130z" />
<glyph unicode="N" horiz-adv-x="722" d="M77 714v-714h90v573h2l373 -573h104v714h-90v-579h-2l-376 579h-101z" />
<glyph unicode="O" horiz-adv-x="760" d="M133 357q0 54 14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5t-14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5t-112 25.5t-77 67.5t-44 94.5t-14 106.5zM38 357q0 -73 21.5 -140.5t64.5 -119.5t107 -82.5t149 -30.5t149 30.5t107 82.5 t64.5 119.5t21.5 140.5t-21.5 140.5t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5z" />
<glyph unicode="P" horiz-adv-x="648" d="M173 372v262h186q81 0 118.5 -33.5t37.5 -97.5t-37 -98q-37 -33 -114 -33h-5h-186zM78 714v-714h95v292h218h4q105 0 159 55q56 56 56 156t-55.5 155.5t-163.5 55.5h-313z" />
<glyph unicode="Q" horiz-adv-x="760" d="M450 204l-50 -58l79 -63q-48 -20 -99 -20q-65 0 -112 25.5t-77 67.5t-44 94.5t-14 106.5t14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5q0 -66 -20 -126.5t-62 -102.5zM660 -61l48 60l-94 74q54 54 81 128t27 156q0 73 -21.5 140.5 t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5t21.5 -140.5t64.5 -119.5t107 -82.5t149 -30.5q99 0 171 42z" />
<glyph unicode="R" horiz-adv-x="685" d="M78 714v-714h95v305h232q35 0 56 -10.5t34 -28t19 -41t10 -49.5q5 -26 6 -53t2 -50.5t4.5 -42.5t13.5 -30h106q-15 18 -22.5 41.5t-11.5 49.5t-5 53t-3 53q-3 26 -8.5 50t-17 43.5t-31 33.5t-50.5 20v2q65 18 94.5 67t29.5 114q0 87 -57.5 137t-159.5 50h-336zM371 385 h-198v249h236q67 0 97 -34t30 -88q0 -39 -13.5 -63.5t-36 -39t-52.5 -19.5t-63 -5z" />
<glyph unicode="S" horiz-adv-x="648" d="M491 505h90q-2 59 -22.5 101.5t-56 70.5t-82.5 41t-102 13q-49 0 -95.5 -12.5t-83 -38t-58.5 -65t-22 -93.5q0 -49 19.5 -81.5t52 -53t73.5 -33t84 -22.5l83 -18q41 -9 73.5 -23.5t52 -37.5t19.5 -60q0 -39 -16 -64t-42 -39.5t-58.5 -20.5t-64.5 -6q-40 0 -78 10 t-66.5 31t-46 53.5t-17.5 77.5h-90q0 -65 23.5 -112.5t64 -78t94 -45.5t113.5 -15q49 0 98.5 11.5t89.5 37t65.5 66t25.5 97.5q0 53 -19.5 88t-52 58t-73.5 36.5t-83.5 23.5t-83.5 18.5t-73.5 21.5t-52 33.5t-19.5 53.5q0 35 13.5 58.5t36 37.5t51.5 20t59 6 q74 0 121.5 -34.5t55.5 -111.5z" />
<glyph unicode="T" horiz-adv-x="574" d="M240 634v-634h95v634h238v80h-571v-80h238z" />
<glyph unicode="U" horiz-adv-x="722" d="M648 258v456h-95v-456q0 -96 -47.5 -145.5t-138.5 -49.5q-96 0 -147 49.5t-51 145.5v456h-95v-456q0 -143 77.5 -208.5t215.5 -65.5q135 0 208 68.5t73 205.5z" />
<glyph unicode="V" horiz-adv-x="611" d="M359 0l254 714h-99l-206 -619h-2l-204 619h-102l251 -714h108z" />
<glyph unicode="W" horiz-adv-x="926" d="M723 0l191 714h-95l-145 -594h-2l-158 594h-103l-160 -594h-2l-140 594h-97l183 -714h99l165 600h2l163 -600h99z" />
<glyph unicode="X" horiz-adv-x="611" d="M248 367l-248 -367h106l198 295l192 -295h116l-251 367l236 347h-106l-186 -279l-178 279h-114z" />
<glyph unicode="Y" horiz-adv-x="648" d="M373 292l273 422h-108l-209 -340l-214 340h-113l276 -422v-292h95v292z" />
<glyph unicode="Z" horiz-adv-x="611" d="M22 80v-80h568v80h-455l443 554v80h-522v-80h410z" />
<glyph unicode="[" horiz-adv-x="259" d="M259 663v68h-187v-928h187v68h-107v792h107z" />
<glyph unicode="\" horiz-adv-x="333" d="M351 -16l-296 747h-72l295 -747h73z" />
<glyph unicode="]" horiz-adv-x="259" d="M0 -129v-68h187v928h-187v-68h107v-792h-107z" />
<glyph unicode="^" horiz-adv-x="600" d="M268 697l-218 -433h71l178 360l181 -360h70l-218 433h-64z" />
<glyph unicode="_" horiz-adv-x="500" d="M0 -74v-50h500v50h-500z" />
<glyph unicode="`" horiz-adv-x="222" d="M-22 731l130 -143h64l-86 143h-108z" />
<glyph unicode="a" horiz-adv-x="537" d="M522 2v66q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45q0 -24 -14 -36.5t-38 -19t-55.5 -10t-66.5 -10.5 q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5q-19 0 -37.5 4t-32 13t-22 23.5t-8.5 35.5 q0 32 14.5 50.5t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="b" horiz-adv-x="593" d="M67 714v-714h85v69h2q14 -23 34.5 -38.5t43.5 -24.5t46.5 -13t42.5 -4q59 0 103.5 21t74 57.5t44 85.5t14.5 104t-15 104t-44.5 86.5t-74 59.5t-104.5 22q-54 0 -99 -19.5t-66 -62.5h-2v267h-85zM467 263q0 -38 -8 -74t-26 -64t-47.5 -45t-73.5 -17t-75 16.5t-50.5 43.5 t-28.5 62.5t-9 73.5q0 36 8.5 71t27.5 62.5t49 44.5t73 17q41 0 71.5 -16t50 -43t29 -61.5t9.5 -70.5z" />
<glyph unicode="c" horiz-adv-x="537" d="M415 351h88q-5 46 -24 79.5t-48.5 55.5t-68 32.5t-82.5 10.5q-61 0 -107 -21.5t-76.5 -59t-45.5 -88t-15 -108.5t15.5 -106.5t46 -83.5t76 -54t104.5 -19q99 0 156.5 52t71.5 148h-87q-8 -60 -43.5 -93t-98.5 -33q-40 0 -69 16t-47 42.5t-26.5 60.5t-8.5 70q0 39 8 75.5 t26.5 64.5t49.5 45t77 17q54 0 86 -27t42 -76z" />
<glyph unicode="d" horiz-adv-x="593" d="M126 254q0 38 8 74t26 64t48 45t73 17q44 0 75 -16.5t50.5 -43.5t28.5 -62.5t9 -73.5q0 -36 -8.5 -71t-27.5 -62.5t-49 -44.5t-73 -17q-41 0 -71.5 16t-50 43t-29 61.5t-9.5 70.5zM526 0v714h-85v-266h-2q-14 23 -34.5 38.5t-43.5 25t-46 13.5t-43 4q-59 0 -103.5 -21.5 t-74 -58t-44 -85.5t-14.5 -104t15 -104t44.5 -86t74 -59t104.5 -22q54 0 99 19t66 62h2v-70h85z" />
<glyph unicode="e" horiz-adv-x="537" d="M423 308h-297q2 30 13 56.5t30 46.5t45.5 31.5t59.5 11.5q32 0 58.5 -11.5t46 -31t31 -46.5t13.5 -57zM505 164h-84q-11 -51 -45.5 -76t-88.5 -25q-42 0 -73 14t-51 37.5t-29 53.5q-8 28 -8 58v7h387v15q0 40 -9 84q-10 52 -37.5 96t-73 72.5t-114.5 28.5 q-53 0 -97.5 -20t-77 -56t-50.5 -85t-18 -108q2 -59 17.5 -109t46.5 -86t76.5 -56t107.5 -20q88 0 146 44t75 131z" />
<glyph unicode="f" horiz-adv-x="296" d="M99 442v-442h85v442h100v75h-100v72q0 34 17 46t48 12q11 0 24 -1.5t24 -5.5v74q-12 4 -27.5 6t-27.5 2q-70 0 -106.5 -32.5t-36.5 -95.5v-77h-87v-75h87z" />
<glyph unicode="g" horiz-adv-x="574" d="M510 44v473h-80v-74h-1q-23 43 -64 64.5t-90 21.5q-67 0 -113 -25.5t-74 -65t-40 -88t-12 -94.5q0 -53 14.5 -100.5t43.5 -83t72 -56.5t101 -21q50 0 94.5 22.5t66.5 70.5h2v-34q0 -43 -8.5 -79t-27.5 -61.5t-48 -40t-71 -14.5q-21 0 -44 4.5t-42.5 14.5t-33 26t-14.5 39 h-85q2 -42 22 -71t50.5 -47t68 -26t73.5 -8q124 0 182 63t58 190zM272 69q-42 0 -70 17.5t-45 46t-24 63.5t-7 70q0 37 8.5 71t27 60t47.5 41.5t70 15.5q40 0 68 -16t45.5 -42.5t25.5 -59.5t8 -67q0 -36 -8.5 -72t-26.5 -64.5t-47.5 -46t-71.5 -17.5z" />
<glyph unicode="h" d="M64 714v-714h85v292q0 35 9.5 64.5t28.5 51.5t47.5 34t67.5 12q49 0 77 -28t28 -76v-350h85v340q0 42 -8.5 76.5t-29.5 59.5t-55 39t-85 14q-23 0 -47.5 -5t-47 -15.5t-40.5 -27t-28 -40.5h-2v273h-85z" />
<glyph unicode="i" horiz-adv-x="222" d="M154 610v104h-85v-104h85zM69 517v-517h85v517h-85z" />
<glyph unicode="j" horiz-adv-x="222" d="M154 610v104h-85v-104h85zM154 -65v582h-85v-568q0 -40 -10 -55.5t-38 -15.5h-18q-4 0 -7.5 0.5t-8.5 1.5v-73q20 -4 43 -4q57 0 90.5 31.5t33.5 100.5z" />
<glyph unicode="k" horiz-adv-x="519" d="M69 714v-714h85v196l80 74l177 -270h108l-220 329l205 188h-114l-236 -226v423h-85z" />
<glyph unicode="l" horiz-adv-x="222" d="M69 714v-714h85v714h-85z" />
<glyph unicode="m" horiz-adv-x="853" d="M64 517v-517h85v322q0 15 7.5 37.5t24 43.5t43 36t63.5 15q29 0 47.5 -8.5t29.5 -24t15.5 -36.5t4.5 -46v-339h85v322q0 60 36 96t99 36q31 0 50.5 -9t30.5 -24.5t15 -36.5t4 -45v-339h85v379q0 40 -12.5 68.5t-35 46.5t-54 26.5t-70.5 8.5q-51 0 -93.5 -23t-68.5 -65 q-16 48 -55 68t-87 20q-109 0 -167 -88h-2v76h-80z" />
<glyph unicode="n" d="M64 517v-517h85v292q0 35 9.5 64.5t28.5 51.5t47.5 34t67.5 12q49 0 77 -28t28 -76v-350h85v340q0 42 -8.5 76.5t-29.5 59.5t-55 39t-85 14q-115 0 -168 -94h-2v82h-80z" />
<glyph unicode="o" horiz-adv-x="574" d="M126 258q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13t62.5 -13t51.5 -38t34.5 -61.5t12.5 -83.5t-12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5zM36 258q0 -57 16 -106t48 -85.5t79 -57t108 -20.5q62 0 108.5 20.5t78.5 57 t48 85.5t16 106t-16 106.5t-48 86t-78.5 57.5t-108.5 21q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5z" />
<glyph unicode="p" horiz-adv-x="593" d="M67 517v-714h85v266h2q14 -23 34.5 -38.5t43.5 -24.5t46.5 -13t42.5 -4q59 0 103.5 21t74 57.5t44 85.5t14.5 104t-15 104t-44.5 86.5t-74 59.5t-104.5 22q-54 0 -99 -19.5t-66 -62.5h-2v70h-85zM467 263q0 -38 -8 -74t-26 -64t-47.5 -45t-73.5 -17t-75 16.5t-50.5 43.5 t-28.5 62.5t-9 73.5q0 36 8.5 71t27.5 62.5t49 44.5t73 17q41 0 71.5 -16t50 -43t29 -61.5t9.5 -70.5z" />
<glyph unicode="hr/promise" horiz-adv-x="593" d="M126 254q0 38 8 74t26 64t48 45t73 17q44 0 75 -16.5t50.5 -43.5t28.5 -62.5t9 -73.5q0 -36 -8.5 -71t-27.5 -62.5t-49 -44.5t-73 -17q-41 0 -71.5 16t-50 43t-29 61.5t-9.5 70.5zM526 -197v714h-85v-69h-2q-14 23 -34.5 38.5t-43.5 25t-46 13.5t-43 4 q-59 0 -103.5 -21.5t-74 -58t-44 -85.5t-14.5 -104t15 -104t44.5 -86t74 -59t104.5 -22q54 0 99 19t66 62h2v-267h85z" />
<glyph unicode="r" horiz-adv-x="333" d="M61 517v-517h85v230q0 50 10 88.5t32 65.5t58 41t87 14v90h-9q-63 0 -105 -28q-45 -30 -76 -93h-2v109h-80z" />
<glyph unicode="s" horiz-adv-x="500" d="M116 163h-85q2 -48 20 -81.5t48 -54t69 -29.5t82 -9q39 0 78.5 7.5t71 26.5t51 50t19.5 78q0 37 -14.5 62t-38 41.5t-54 26.5t-62.5 17l-60 14q-30 6 -54 15.5t-39.5 24t-15.5 36.5q0 20 10 32.5t26 20t35.5 10.5t38.5 3q21 0 41.5 -4.5t37.5 -14.5t28 -26.5t13 -41.5h85 q-3 47 -20 78.5t-45.5 50t-65.5 26t-81 7.5q-34 0 -68.5 -8.5t-62 -26t-45 -45.5t-17.5 -67q0 -50 25 -78t62.5 -43.5t81.5 -24t81.5 -19t62.5 -27.5t25 -50q0 -24 -12 -39.5t-30.5 -23.5t-40.5 -11t-42 -3q-26 0 -50.5 5t-44 16.5t-31.5 31t-13 47.5z" />
<glyph unicode="t" horiz-adv-x="315" d="M182 517v155h-85v-155h-88v-75h88v-329q0 -36 7 -58t21.5 -34t38 -16.5t56.5 -4.5h65v75h-39q-20 0 -32.5 1.5t-19.5 6.5t-9.5 14t-2.5 24v321h103v75h-103z" />
<glyph unicode="u" d="M492 0v517h-85v-292q0 -35 -9.5 -64.5t-28.5 -51.5t-47.5 -34t-67.5 -12q-49 0 -77 28t-28 76v350h-85v-340q0 -42 8.5 -76.5t29.5 -59.5t55 -38.5t85 -13.5q57 0 99 22.5t69 70.5h2v-82h80z" />
<glyph unicode="v" horiz-adv-x="500" d="M297 0l189 517h-89l-141 -431h-2l-145 431h-95l192 -517h91z" />
<glyph unicode="w" horiz-adv-x="758" d="M576 0l165 517h-88l-116 -423h-2l-108 423h-93l-104 -423h-2l-117 423h-94l166 -517h92l104 411h2l105 -411h90z" />
<glyph unicode="x" horiz-adv-x="518" d="M203 272l-194 -272h103l144 214l144 -214h109l-200 279l178 238h-102l-129 -181l-124 181h-109z" />
<glyph unicode="y" horiz-adv-x="500" d="M267 -68l225 585h-90l-145 -423h-2l-151 423h-96l205 -514l-35 -87q-12 -23 -28 -35t-42 -12q-13 0 -26 4l-24 8v-78q14 -5 29 -7t30 -2q29 0 50 7.5t38.5 24t32 42.5t29.5 64z" />
<glyph unicode="z" horiz-adv-x="480" d="M22 65v-65h436v75h-330l316 384v58h-402v-75h292z" />
<glyph unicode="{" horiz-adv-x="333" d="M309 671v60h-70q-19 0 -38 -8.5t-34.5 -25t-25.5 -41t-10 -56.5v-182q0 -26 -7 -48t-18.5 -37.5t-26.5 -24t-31 -8.5v-68q16 0 31 -8t26.5 -23t18.5 -37t7 -49v-181q0 -32 10 -56.5t25.5 -41t34.5 -25t38 -8.5h70v60h-50q-15 0 -24 7.5t-14.5 20t-7.5 28t-2 30.5v182 q0 38 -10.5 63t-24.5 40.5t-28.5 22.5t-23.5 8v3q9 2 23.5 10t28.5 24t24.5 40.5t10.5 59.5v183q0 16 2 31.5t7.5 27.5t14.5 19.5t24 7.5h50z" />
<glyph unicode="|" horiz-adv-x="222" d="M77 786v-999h68v999h-68z" />
<glyph unicode="}" horiz-adv-x="333" d="M24 -137v-60h70q19 0 38 8.5t34.5 25t25.5 41t10 56.5v181q0 26 7 47.5t18.5 37t26.5 24t31 8.5v68q-16 0 -31 8t-26.5 23.5t-18.5 37.5t-7 49v182q0 32 -10 56.5t-25.5 41t-34.5 25t-38 8.5h-70v-60h50q15 0 24 -7.5t14.5 -20t7.5 -28t2 -32.5v-181q0 -38 10.5 -63 t24.5 -40.5t28.5 -22.5t23.5 -8v-3q-9 -2 -23.5 -10t-28.5 -24t-24.5 -40.5t-10.5 -59.5v-182q0 -16 -2 -31.5t-7.5 -27.5t-14.5 -19.5t-24 -7.5h-50z" />
<glyph unicode="~" horiz-adv-x="600" d="M531 269l-36 50l-18 -27q-9 -13 -19.5 -24t-23 -18t-27.5 -7q-20 0 -47 14t-55 26q-29 13 -57 22.5t-54 9.5q-25 0 -44.5 -7.5t-35 -19.5t-26.5 -27.5t-19 -31.5l36 -50q6 13 13.5 26.5t18 24.5t23.5 18t29 7q35 0 63 -12.5t52 -26.5q25 -14 49.5 -23.5t52.5 -9.5 q23 0 41.5 7.5t33.5 19.5t27 27.5t23 31.5z" />
<glyph unicode="&#xa1;" horiz-adv-x="259" d="M185 406v111h-111v-111h111zM82 22v-219h95v219l-25 311h-45z" />
<glyph unicode="&#xa2;" d="M272 -11v-104h39v104q47 0 83.5 17t62.5 45.5t41 64.5t19 73h-85q-8 -51 -37.5 -86t-83.5 -40v391q48 -2 77 -29.5t39 -73.5h87q-6 45 -23 78.5t-43.5 55t-61 32.5t-75.5 12v95h-39v-95q-56 -4 -98.5 -27.5t-71 -61t-42.5 -86t-14 -102.5q0 -55 15 -102.5t43.5 -82.5 t70.5 -55.5t97 -22.5zM272 454v-391q-36 3 -62 20t-42.5 43t-24 59t-7.5 67q0 37 7 71.5t22.5 62t41.5 45.5t65 23z" />
<glyph unicode="&#xa3;" d="M47 372v-45h85q9 -20 17 -45t8 -48q0 -29 -9 -55t-24.5 -49t-35.5 -42t-41 -33l47 -65q23 15 47 24.5t53 9.5t54.5 -6.5t50.5 -14.5l50 -13q24 -6 49 -6q39 0 77.5 9.5t68.5 35.5l-43 66q-18 -14 -41.5 -25.5t-47.5 -11.5q-23 0 -44 6l-40 12q-20 5 -43 10t-52 5 q-30 0 -54.5 -9t-50.5 -20l-2 2q22 18 43 37t37 41.5t26 49t10 60.5q0 21 -6 40t-14 35h137v45h-159l-18 35q-9 17 -16.5 35t-12.5 38.5t-5 44.5q0 28 11 52t30.5 41.5t45.5 27.5t56 10q72 0 108 -47.5t38 -135.5h85v8q0 123 -62 185q-63 65 -174 65q-46 0 -87 -14 t-72.5 -40t-50 -63.5t-18.5 -85.5t13.5 -85t33.5 -71h-58z" />
<glyph unicode="&#xa4;" d="M281 524q35 0 64.5 -14t51 -37.5t34 -55t12.5 -66.5q0 -36 -12.5 -68t-34 -55.5t-51.5 -37.5t-65 -14t-65.5 13.5t-53 36.5t-35.5 55t-13 68q0 37 13 69t35.5 55.5t53 37t66.5 13.5zM74 604l-49 -49l57 -58q-28 -28 -41 -67t-13 -81t13.5 -79t38.5 -67l-55 -58l48 -48 l55 58q30 -27 68.5 -40.5t83.5 -13.5q42 0 80.5 14t67.5 41l56 -58l47 47l-55 56q26 31 39 69.5t13 80.5t-13 81t-39 67l55 55l-50 51l-57 -56q-27 23 -65 36.5t-78 13.5q-42 0 -82 -13.5t-69 -37.5z" />
<glyph unicode="&#xa5;" d="M232 174v-174h95v174h144v60h-144v42l18 33h126v60h-93l178 345h-104l-169 -353l-174 353h-109l183 -345h-92v-60h123l18 -33v-42h-141v-60h141z" />
<glyph unicode="&#xa6;" horiz-adv-x="222" d="M145 411v250h-68v-250h68zM77 161v-249h68v249h-68z" />
<glyph unicode="&#xa7;" d="M380 546h85q-2 94 -52 139.5t-132 45.5q-34 0 -67.5 -10.5t-59.5 -31.5t-42 -51t-16 -69q0 -32 12 -57.5t34 -48.5q-22 -6 -41.5 -19.5t-34 -32t-23 -41t-8.5 -45.5q0 -41 15 -72t39.5 -56t56 -44.5t63.5 -36.5l64 -35q31 -17 55.5 -35t39.5 -39t15 -46q0 -21 -9 -36.5 t-23 -26t-32.5 -15.5t-36.5 -5q-51 0 -82 31.5t-32 82.5h-85q6 -88 58.5 -138.5t142.5 -50.5q41 0 75 11.5t59 32.5t39 50.5t14 65.5q0 75 -59 119q45 18 74.5 57.5t29.5 89.5q0 37 -14.5 65.5t-37.5 51.5t-53 41.5t-61 35.5l-61 33q-30 16 -53.5 33.5t-37.5 37t-14 43.5 q0 45 27.5 65.5t67.5 20.5q48 0 74 -32t27 -78zM190 420l68 -44l70 -41l34 -21q19 -12 35 -26.5t26.5 -32t10.5 -38.5q0 -34 -21.5 -57.5t-50.5 -35.5q-34 23 -69 43.5t-71 39.5l-37 23q-19 11 -34 25t-24.5 32t-9.5 42q0 32 22 56.5t51 34.5z" />
<glyph unicode="&#xa8;" horiz-adv-x="222" d="M-27 696v-104h89v104h-89zM160 696v-104h90v104h-90z" />
<glyph unicode="&#xa9;" horiz-adv-x="800" d="M599 285h-64q-7 -45 -39 -73.5t-83 -28.5q-36 0 -64.5 14.5t-48.5 38.5t-30.5 56t-10.5 67q0 36 10 67t29 54.5t47.5 36.5t65.5 13q51 0 83.5 -27.5t40.5 -69.5h63q-12 75 -64 113.5t-124 38.5q-51 0 -92 -17t-69 -47t-43 -72t-15 -92q0 -49 15.5 -91t44.5 -72.5t70 -48 t92 -17.5q69 0 119.5 42t66.5 115zM92 359q0 67 23.5 125t65 100.5t98 67t122.5 24.5q65 0 121 -24.5t97.5 -67t65 -100.5t23.5 -125q0 -69 -23.5 -127.5t-65 -101.5t-97.5 -67.5t-121 -24.5q-66 0 -122.5 24.5t-98 67.5t-65 101.5t-23.5 127.5zM24 359q0 -81 30 -149.5 t81.5 -119t120 -78.5t145.5 -28t145 28t119 78.5t81 119t30 149.5q0 79 -30 147t-81 118t-119 78.5t-145 28.5t-145.5 -28.5t-120 -78.5t-81.5 -118t-30 -147z" />
<glyph unicode="&#xaa;" horiz-adv-x="378" d="M155 430q-25 0 -43.5 7.5t-18.5 33.5t18.5 36.5t45.5 15.5q28 5 56 9t44 14v-47q0 -11 -5.5 -23.5t-17.5 -22.5t-31.5 -16.5t-47.5 -6.5zM317 462v160q0 27 -12 44t-30.5 26.5t-41.5 13t-46 3.5q-28 0 -54.5 -5.5t-46.5 -18.5t-32.5 -33t-13.5 -49h60q2 32 24.5 44 t58.5 12q14 0 28 -1.5t25 -6.5t17.5 -14.5t6.5 -26.5q0 -10 -5 -16.5t-17.5 -11t-35 -7.5t-57.5 -7q-22 -2 -43.5 -8t-38.5 -17.5t-27.5 -29.5t-10.5 -44q0 -23 9.5 -40t25.5 -28t37 -16t45 -5q74 0 117 46q3 -46 51 -46q13 0 23 2t20 6v44q-6 -2 -11 -2h-11q-8 0 -11 7 t-3 25z" />
<glyph unicode="&#xab;" horiz-adv-x="463" d="M50 234l152 -120v86l-100 78l100 78v86l-152 -120v-88zM246 234l152 -120v86l-100 78l100 78v86l-152 -120v-88z" />
<glyph unicode="&#xac;" horiz-adv-x="600" d="M552 109v279h-504v-68h436v-211h68z" />
<glyph unicode="&#xad;" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
<glyph unicode="&#xae;" horiz-adv-x="800" d="M323 382v139h90q17 0 34.5 -2.5t31 -9.5t22 -20t8.5 -35q0 -26 -9.5 -40.5t-25.5 -21.5t-36.5 -8.5t-43.5 -1.5h-71zM255 576v-437h68v188h72l119 -188h73l-125 193q49 5 82 32.5t33 86.5q0 63 -37.5 94t-115.5 31h-169zM92 359q0 67 23.5 125t65 100.5t98 67t122.5 24.5 q65 0 121 -24.5t97.5 -67t65 -100.5t23.5 -125q0 -69 -23.5 -127.5t-65 -101.5t-97.5 -67.5t-121 -24.5q-66 0 -122.5 24.5t-98 67.5t-65 101.5t-23.5 127.5zM24 359q0 -81 30 -149.5t81.5 -119t120 -78.5t145.5 -28t145 28t119 78.5t81 119t30 149.5q0 79 -30 147t-81 118 t-119 78.5t-145 28.5t-145.5 -28.5t-120 -78.5t-81.5 -118t-30 -147z" />
<glyph unicode="&#xaf;" horiz-adv-x="222" d="M-58 675v-55h340v55h-340z" />
<glyph unicode="&#xb0;" horiz-adv-x="400" d="M106 565q0 18 6.5 34.5t18.5 30t29.5 21.5t39.5 8t39.5 -8t29.5 -21.5t18.5 -30t6.5 -34.5t-6.5 -34.5t-18.5 -30t-29.5 -21.5t-39.5 -8t-39.5 8t-29.5 21.5t-18.5 30t-6.5 34.5zM56 565q0 -30 11 -56.5t30.5 -46t46 -30.5t56.5 -11t56 11t45.5 30.5t31 46t11.5 56.5 t-11.5 56t-31 45.5t-45.5 31t-56 11.5t-56.5 -11.5t-46 -31t-30.5 -45.5t-11 -56z" />
<glyph unicode="&#xb1;" horiz-adv-x="600" d="M48 68v-68h504v68h-504zM48 339v-68h218v-167h68v167h218v68h-218v166h-68v-166h-218z" />
<glyph unicode="&#xb2;" horiz-adv-x="333" d="M22 555h68q0 39 18.5 69t63.5 30q35 0 59 -19t24 -51q0 -22 -7 -39t-21.5 -31.5t-36.5 -28.5l-51 -31q-24 -14 -46 -29t-39 -34.5t-27.5 -46t-12.5 -64.5h303v55h-235q4 16 16.5 29t30 25t39 24t42.5 25q21 12 41.5 26t36 31t25.5 38.5t10 49.5q0 30 -11.5 53.5t-32 39.5 t-47.5 24.5t-57 8.5q-70 0 -111.5 -42.5t-41.5 -111.5z" />
<glyph unicode="&#xb3;" horiz-adv-x="333" d="M132 527v-50h33q18 0 34.5 -4t29.5 -13.5t21 -24t8 -35.5q0 -34 -28 -53t-66 -19q-90 0 -92 86h-68q0 -35 12.5 -61.5t34 -44t51 -26.5t62.5 -9q32 0 61 8t51.5 24t36 40.5t13.5 57.5q0 38 -21 66t-66 36v2q28 11 48 33.5t20 51.5t-11 51t-30.5 36.5t-46 22t-57.5 7.5 q-67 0 -105.5 -37.5t-42.5 -103.5h68q0 37 19 61.5t61 24.5q33 0 55 -16t22 -46q0 -35 -25 -50t-58 -15h-24z" />
<glyph unicode="&#xb4;" horiz-adv-x="222" d="M136 731l-86 -143h64l131 143h-109z" />
<glyph unicode="&#xb5;" d="M492 0v517h-85v-292q0 -35 -9.5 -64.5t-28.5 -51.5t-47.5 -34t-67.5 -12q-49 0 -77 28t-28 76v350h-85v-714h85v223h2q13 -20 36 -28.5t55 -8.5q57 0 99 22.5t69 70.5h2v-82h80z" />
<glyph unicode="&#xb6;" horiz-adv-x="600" d="M515 -154v868h-239q-106 0 -167 -53.5t-61 -152.5q0 -39 15.5 -73t43 -59t66 -39.5t84.5 -14.5v-476h68v813h122v-813h68z" />
<glyph unicode="&#xb7;" horiz-adv-x="278" d="M75 311q0 -26 19.5 -45t45.5 -19q25 0 44 20t19 44q0 26 -19 45t-45 19t-45 -19t-19 -45z" />
<glyph unicode="&#xb8;" horiz-adv-x="222" d="M23 -146l-18 -44q23 -8 45.5 -13.5t46.5 -5.5q21 0 43 4.5t40 15t29.5 27.5t11.5 42q0 37 -26 55t-58 18q-23 0 -33 -7l-2 2l42 52h-42l-61 -77l17 -28q11 4 20 6t21 2q20 0 33.5 -8.5t13.5 -22.5q0 -9 -6 -14.5t-15 -9.5t-20 -5.5t-21 -1.5q-16 0 -32.5 4t-28.5 9z" />
<glyph unicode="&#xb9;" horiz-adv-x="333" d="M249 280v429h-50q-10 -41 -47 -56t-86 -15v-50h115v-308h68z" />
<glyph unicode="&#xba;" horiz-adv-x="384" d="M192 659q16 0 33.5 -4.5t32 -17.5t24 -36t9.5 -59q0 -22 -5.5 -42.5t-17 -36t-30 -24.5t-45.5 -9t-46 9t-31 25t-17.5 36.5t-5.5 42.5q0 60 28.5 88t70.5 28zM192 709q-40 0 -71.5 -13t-52.5 -35.5t-32 -52.5t-11 -65q0 -36 11.5 -65.5t33 -51.5t52.5 -34t71 -12 q82 0 124 45.5t42 117.5q0 35 -11 65.5t-32 53t-52 35t-72 12.5z" />
<glyph unicode="&#xbb;" horiz-adv-x="463" d="M413 322l-152 120v-86l100 -78l-100 -78v-86l152 120v88zM217 322l-152 120v-86l100 -78l-100 -78v-86l152 120v88z" />
<glyph unicode="&#xbc;" horiz-adv-x="834" d="M219 280v429h-50q-10 -42 -47 -56.5t-86 -14.5v-50h115v-308h68zM585 725l-435 -752h64l435 752h-64zM511 151l148 193h2v-193h-150zM723 151v278h-51l-210 -275v-58h199v-96h62v96h60v55h-60z" />
<glyph unicode="&#xbd;" horiz-adv-x="834" d="M502 275h68q0 39 18.5 69t63.5 30q35 0 59 -19t24 -51q0 -22 -7 -39t-21.5 -31.5t-36.5 -28.5l-51 -31q-24 -14 -46 -29t-39 -34.5t-27.5 -46t-12.5 -64.5h303v55h-235q4 16 16.5 29t30 25t39 24t42.5 25q21 12 41.5 26t36 31t25.5 38.5t10 49.5q0 30 -11.5 53.5 t-32 39.5t-47.5 24.5t-57 8.5q-70 0 -111.5 -42.5t-41.5 -111.5zM219 280v429h-50q-10 -42 -47 -56.5t-86 -14.5v-50h115v-308h68zM570 725l-435 -752h64l435 752h-64z" />
<glyph unicode="&#xbe;" horiz-adv-x="834" d="M177 527v-50h33q18 0 34.5 -4t29.5 -13.5t21 -24t8 -35.5q0 -34 -28 -53t-66 -19q-90 0 -92 86h-68q0 -35 12.5 -61.5t34 -44t51 -26.5t62.5 -9q32 0 61 8t51.5 24t36 40.5t13.5 57.5q0 38 -21 66t-66 36v2q28 11 48 33.5t20 51.5t-11 51t-30.5 36.5t-46 22t-57.5 7.5 q-67 0 -105.5 -37.5t-42.5 -103.5h68q0 37 19 61.5t61 24.5q33 0 55 -16t22 -46q0 -35 -25 -50t-58 -15h-24zM650 725l-435 -752h64l435 752h-64zM529 147l148 193h2v-193h-150zM740 151v278h-51l-210 -275v-58h199v-96h62v96h60v55h-60z" />
<glyph unicode="&#xbf;" d="M337 406v111h-111v-111h111zM503 30h-85q0 -34 -8 -64t-25.5 -52t-43.5 -35t-62 -13q-54 0 -85.5 31t-35.5 86v11q0 29 9 51q11 26 29.5 47.5t40 41t41 42.5t33 53t15.5 71v39h-85v-31q0 -25 -7.5 -46t-20 -38.5t-27.5 -33.5l-32 -30q-17 -16 -32.5 -33t-27.5 -37 t-19 -44.5t-7 -54.5q0 -48 15.5 -85t43.5 -62.5t67 -39t85 -13.5q52 0 94 18.5t71.5 50.5t44.5 76q14 40 14 88v6z" />
<glyph unicode="&#xc0;" horiz-adv-x="648" d="M190 908l131 -143h64l-86 143h-109zM201 295l121 333h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="&#xc1;" horiz-adv-x="648" d="M349 908l-86 -143h64l131 143h-109zM201 295l121 333h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="&#xc2;" horiz-adv-x="648" d="M277 908l-103 -143h77l70 96l69 -96h84l-104 143h-93zM201 295l121 333h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="&#xc3;" horiz-adv-x="648" d="M498 888h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-24 0 -41 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 15 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80zM201 295l121 333 h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="&#xc4;" horiz-adv-x="648" d="M185 873v-104h90v104h-90zM373 873v-104h90v104h-90zM201 295l121 333h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="&#xc5;" horiz-adv-x="648" d="M211 839q0 -23 9 -43.5t24.5 -36t36 -24.5t43.5 -9t43.5 9t36 24.5t24.5 36t9 43.5t-9 43.5t-24.5 36t-36 24.5t-43.5 9t-43.5 -9t-36 -24.5t-24.5 -36t-9 -43.5zM256 839q0 29 19.5 48.5t48.5 19.5t48.5 -19.5t19.5 -48.5t-19.5 -48.5t-48.5 -19.5t-48.5 19.5 t-19.5 48.5zM201 295l121 333h2l119 -333h-242zM272 714l-278 -714h97l80 215h302l78 -215h105l-279 714h-105z" />
<glyph unicode="&#xc6;" horiz-adv-x="926" d="M407 634h41v-346h-209zM354 714l-360 -714h106l102 208h246v-208h447v80h-357v247h330v80h-330v227h351v80h-535z" />
<glyph unicode="&#xc7;" horiz-adv-x="722" d="M580 499h95q-8 57 -34 100.5t-65 72.5t-89 44t-106 15q-82 0 -145.5 -29.5t-106 -80.5t-64.5 -119.5t-22 -146.5q0 -75 18.5 -139.5t55 -113.5t92.5 -79.5t131 -36.5l-49 -63l17 -28q11 4 20 6t21 2q20 0 33.5 -8.5t13.5 -22.5q0 -9 -6 -14.5t-15 -9.5t-20 -5.5t-21 -1.5 q-16 0 -32.5 4t-28.5 9l-18 -44q23 -8 45.5 -13.5t46.5 -5.5q21 0 43 4.5t40 15t29.5 27.5t11.5 42q0 37 -26 55t-58 18q-23 0 -33 -7l-2 2l29 37q132 2 209.5 77t91.5 207h-95q-3 -44 -18 -82t-41.5 -65.5t-63 -43t-83.5 -15.5q-64 0 -110 24t-75.5 64.5t-43.5 95 t-14 115.5q0 56 14 108t43.5 92.5t75 64.5t109.5 24q75 0 129.5 -38t70.5 -114z" />
<glyph unicode="&#xc8;" horiz-adv-x="611" d="M172 908l131 -143h64l-86 143h-109zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
<glyph unicode="&#xc9;" horiz-adv-x="611" d="M331 908l-86 -143h64l131 143h-109zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
<glyph unicode="&#xca;" horiz-adv-x="611" d="M259 908l-103 -143h77l70 96l69 -96h84l-104 143h-93zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
<glyph unicode="&#xcb;" horiz-adv-x="611" d="M167 873v-104h90v104h-90zM355 873v-104h90v104h-90zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
<glyph unicode="&#xcc;" horiz-adv-x="259" d="M-3 908l130 -143h64l-86 143h-108zM82 714v-714h95v714h-95z" />
<glyph unicode="&#xcd;" horiz-adv-x="259" d="M155 908l-86 -143h64l131 143h-109zM82 714v-714h95v714h-95z" />
<glyph unicode="&#xce;" horiz-adv-x="259" d="M83 908l-102 -143h76l70 96l69 -96h84l-104 143h-93zM82 714v-714h95v714h-95z" />
<glyph unicode="&#xcf;" horiz-adv-x="259" d="M-8 873v-104h89v104h-89zM179 873v-104h90v104h-90zM82 714v-714h95v714h-95z" />
<glyph unicode="&#xd0;" horiz-adv-x="704" d="M173 407v227h160q66 0 111 -18.5t73.5 -54t41 -86t12.5 -114.5q0 -66 -13.5 -112.5t-34.5 -77.5t-47.5 -49t-53.5 -27.5t-51 -12t-40 -2.5h-158v259h214v68h-214zM78 339v-339h245q89 0 154 25t107 72.5t62 117t20 159.5q0 172 -89 256t-254 84h-245v-307h-70v-68h70z " />
<glyph unicode="&#xd1;" horiz-adv-x="722" d="M535 888h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-24 0 -41 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 15 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80zM77 714v-714h90 v573h2l373 -573h104v714h-90v-579h-2l-376 579h-101z" />
<glyph unicode="&#xd2;" horiz-adv-x="760" d="M246 908l131 -143h64l-86 143h-109zM133 357q0 54 14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5t-14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5t-112 25.5t-77 67.5t-44 94.5t-14 106.5zM38 357q0 -73 21.5 -140.5t64.5 -119.5t107 -82.5 t149 -30.5t149 30.5t107 82.5t64.5 119.5t21.5 140.5t-21.5 140.5t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5z" />
<glyph unicode="&#xd3;" horiz-adv-x="760" d="M405 908l-86 -143h64l131 143h-109zM133 357q0 54 14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5t-14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5t-112 25.5t-77 67.5t-44 94.5t-14 106.5zM38 357q0 -73 21.5 -140.5t64.5 -119.5t107 -82.5 t149 -30.5t149 30.5t107 82.5t64.5 119.5t21.5 140.5t-21.5 140.5t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5z" />
<glyph unicode="&#xd4;" horiz-adv-x="760" d="M333 908l-103 -143h77l70 96l69 -96h84l-104 143h-93zM133 357q0 54 14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5t-14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5t-112 25.5t-77 67.5t-44 94.5t-14 106.5zM38 357q0 -73 21.5 -140.5 t64.5 -119.5t107 -82.5t149 -30.5t149 30.5t107 82.5t64.5 119.5t21.5 140.5t-21.5 140.5t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5z" />
<glyph unicode="&#xd5;" horiz-adv-x="760" d="M554 888h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-24 0 -41 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 15 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80zM133 357 q0 54 14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5t-14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5t-112 25.5t-77 67.5t-44 94.5t-14 106.5zM38 357q0 -73 21.5 -140.5t64.5 -119.5t107 -82.5t149 -30.5t149 30.5t107 82.5t64.5 119.5 t21.5 140.5t-21.5 140.5t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5z" />
<glyph unicode="&#xd6;" horiz-adv-x="760" d="M241 873v-104h90v104h-90zM429 873v-104h90v104h-90zM133 357q0 54 14 106.5t44 94.5t77 67.5t112 25.5t112 -25.5t77 -67.5t44 -94.5t14 -106.5t-14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5t-112 25.5t-77 67.5t-44 94.5t-14 106.5zM38 357q0 -73 21.5 -140.5 t64.5 -119.5t107 -82.5t149 -30.5t149 30.5t107 82.5t64.5 119.5t21.5 140.5t-21.5 140.5t-64.5 119.5t-107 83t-149 31t-149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5z" />
<glyph unicode="&#xd7;" horiz-adv-x="600" d="M71 72l48 -48l182 182l181 -182l48 48l-181 182l180 180l-48 48l-180 -180l-181 180l-48 -48l181 -180z" />
<glyph unicode="&#xd8;" horiz-adv-x="760" d="M723 700l-32 30l-79 -87q-42 42 -99.5 65t-132.5 23q-85 0 -149 -31t-107 -83t-64.5 -119.5t-21.5 -140.5q0 -72 20.5 -138t62.5 -117l-84 -92l33 -29l81 88q42 -40 99 -62.5t130 -22.5q85 0 149 30.5t107 82.5t64.5 119.5t21.5 140.5q0 72 -19.5 136.5t-61.5 116.5z M210 134l369 407q25 -39 36.5 -87t11.5 -97q0 -54 -14 -106.5t-44 -94.5t-77 -67.5t-112 -25.5q-57 0 -99 19t-71 52zM552 577l-369 -407q-26 40 -38 88t-12 99q0 54 14 106.5t44 94.5t77 67.5t112 25.5q57 0 100 -20t72 -54z" />
<glyph unicode="&#xd9;" horiz-adv-x="722" d="M227 908l131 -143h64l-86 143h-109zM648 258v456h-95v-456q0 -96 -47.5 -145.5t-138.5 -49.5q-96 0 -147 49.5t-51 145.5v456h-95v-456q0 -143 77.5 -208.5t215.5 -65.5q135 0 208 68.5t73 205.5z" />
<glyph unicode="&#xda;" horiz-adv-x="722" d="M386 908l-86 -143h64l131 143h-109zM648 258v456h-95v-456q0 -96 -47.5 -145.5t-138.5 -49.5q-96 0 -147 49.5t-51 145.5v456h-95v-456q0 -143 77.5 -208.5t215.5 -65.5q135 0 208 68.5t73 205.5z" />
<glyph unicode="&#xdb;" horiz-adv-x="722" d="M314 908l-103 -143h77l70 96l69 -96h84l-104 143h-93zM648 258v456h-95v-456q0 -96 -47.5 -145.5t-138.5 -49.5q-96 0 -147 49.5t-51 145.5v456h-95v-456q0 -143 77.5 -208.5t215.5 -65.5q135 0 208 68.5t73 205.5z" />
<glyph unicode="&#xdc;" horiz-adv-x="722" d="M222 873v-104h90v104h-90zM410 873v-104h90v104h-90zM648 258v456h-95v-456q0 -96 -47.5 -145.5t-138.5 -49.5q-96 0 -147 49.5t-51 145.5v456h-95v-456q0 -143 77.5 -208.5t215.5 -65.5q135 0 208 68.5t73 205.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="648" d="M349 908l-86 -143h64l131 143h-109zM373 292l273 422h-108l-209 -340l-214 340h-113l276 -422v-292h95v292z" />
<glyph unicode="&#xde;" horiz-adv-x="648" d="M173 258v262h186q81 0 118.5 -33t37.5 -99q0 -64 -37 -98q-37 -32 -114 -32h-5h-186zM78 0h95v178h218h4q105 0 159 54q56 56 56 156t-55.5 156t-163.5 56h-218v114h-95v-714z" />
<glyph unicode="&#xdf;" d="M64 531v-531h85v516q0 42 9 69t24.5 42.5t37.5 22t48 6.5q24 0 44 -9t35 -24t23.5 -35.5t8.5 -44.5q0 -34 -12.5 -57.5t-33.5 -37t-49 -18.5q-19 -4 -40 -4q-8 0 -17 1v-68q42 0 76 -5t58 -21t37 -45.5t13 -78.5q0 -66 -40.5 -106t-109.5 -40q-8 0 -17 0.5t-17 2.5v-73 q20 -4 43 -4q51 0 93.5 16.5t73 47t47.5 73t17 94.5q0 33 -8.5 63.5t-25.5 54.5t-42.5 40.5t-59.5 20.5v2q57 18 80.5 58t23.5 97q0 44 -18.5 76.5t-48 54.5t-66.5 33t-74 11q-45 0 -81.5 -14.5t-62.5 -41t-40 -63t-14 -81.5z" />
<glyph unicode="&#xe0;" horiz-adv-x="537" d="M135 731l131 -143h64l-86 143h-109zM522 2v66q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45q0 -24 -14 -36.5t-38 -19 t-55.5 -10t-66.5 -10.5q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5q-19 0 -37.5 4t-32 13 t-22 23.5t-8.5 35.5q0 32 14.5 50.5t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="&#xe1;" horiz-adv-x="537" d="M294 731l-86 -143h64l131 143h-109zM522 2v66q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45q0 -24 -14 -36.5t-38 -19 t-55.5 -10t-66.5 -10.5q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5q-19 0 -37.5 4t-32 13 t-22 23.5t-8.5 35.5q0 32 14.5 50.5t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="&#xe2;" horiz-adv-x="537" d="M222 731l-103 -143h77l70 96l69 -96h84l-104 143h-93zM522 2v66q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45 q0 -24 -14 -36.5t-38 -19t-55.5 -10t-66.5 -10.5q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5 q-19 0 -37.5 4t-32 13t-22 23.5t-8.5 35.5q0 32 14.5 50.5t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="&#xe3;" horiz-adv-x="537" d="M443 711h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-24 0 -41 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 15 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80zM522 2v66 q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45q0 -24 -14 -36.5t-38 -19t-55.5 -10t-66.5 -10.5q-33 -6 -64.5 -15 t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5q-19 0 -37.5 4t-32 13t-22 23.5t-8.5 35.5q0 32 14.5 50.5 t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="&#xe4;" horiz-adv-x="537" d="M130 696v-104h90v104h-90zM318 696v-104h90v104h-90zM522 2v66q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45 q0 -24 -14 -36.5t-38 -19t-55.5 -10t-66.5 -10.5q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5 q-19 0 -37.5 4t-32 13t-22 23.5t-8.5 35.5q0 32 14.5 50.5t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="537" d="M156 662q0 -23 9 -43.5t24.5 -36t36 -24.5t43.5 -9t43.5 9t36 24.5t24.5 36t9 43.5t-9 43.5t-24.5 36t-36 24.5t-43.5 9t-43.5 -9t-36 -24.5t-24.5 -36t-9 -43.5zM201 662q0 29 19.5 48.5t48.5 19.5t48.5 -19.5t19.5 -48.5t-19.5 -48.5t-48.5 -19.5t-48.5 19.5 t-19.5 48.5zM522 2v66q-15 -5 -26 -5q-20 0 -23.5 14t-3.5 44v266q0 45 -17 73t-45 43.5t-62.5 20.5t-69.5 5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q20 0 40.5 -3t37 -12t27 -26t10.5 -45q0 -24 -14 -36.5t-38 -19t-55.5 -10t-66.5 -10.5 q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t54.5 -25t66 -7.5q54 0 100.5 18.5t81.5 60.5q0 -42 19.5 -60.5t52.5 -18.5q39 0 61 13zM384 267v-87q0 -18 -9 -38.5t-28 -38t-49 -29t-72 -11.5q-19 0 -37.5 4t-32 13t-22 23.5t-8.5 35.5 q0 32 14.5 50.5t37.5 28.5t52 14.5t57.5 8t54.5 9t42 17.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="870" d="M467 233h379q0 60 -11 114t-38 94.5t-71.5 64t-112.5 23.5q-47 0 -93 -17.5t-72 -57.5q-12 24 -32 39t-44 23t-49 10.5t-48 2.5q-43 0 -82 -9t-69 -29.5t-48 -53.5t-20 -81h85q3 57 39 77.5t90 20.5q21 0 42 -2.5t37.5 -11t27 -24.5t10.5 -42q0 -23 -10 -35.5t-31 -20 t-54.5 -12.5t-80.5 -14q-33 -6 -64.5 -15t-56 -26.5t-39.5 -45.5t-15 -72q0 -39 13.5 -66.5t37 -45t55.5 -25t69 -7.5q72 0 130.5 23.5t87.5 76.5q13 -29 32.5 -48t44 -30.5t52.5 -16.5t58 -5q88 0 146.5 44.5t77.5 129.5h-87q-12 -51 -47.5 -75.5t-83.5 -24.5 q-39 0 -68.5 13.5t-48.5 37t-28.5 54.5t-9.5 65zM126 139q0 24 8.5 40t22.5 26.5t33 16.5t40 10q20 4 42.5 7t43.5 6.5t39.5 8.5t31.5 13v-87q0 -18 -9.5 -38.5t-29 -38t-50 -29t-72.5 -11.5q-19 0 -37.5 4t-32 13t-22 23.5t-8.5 35.5zM756 308h-289q0 32 10 58.5t29 46 t46 30.5t61 11t60.5 -11.5t44.5 -31t27.5 -46.5t10.5 -57z" />
<glyph unicode="&#xe7;" horiz-adv-x="537" d="M415 351h88q-5 46 -24 79.5t-48.5 55.5t-68 32.5t-82.5 10.5q-61 0 -107 -21.5t-76.5 -59t-45.5 -88t-15 -108.5q0 -55 14 -101t41 -80t67.5 -55t93.5 -25l-53 -68l17 -28q11 4 20 6t21 2q20 0 33.5 -8.5t13.5 -22.5q0 -9 -6 -14.5t-15 -9.5t-20 -5.5t-21 -1.5 q-16 0 -32.5 4t-28.5 9l-18 -44q23 -8 45.5 -13.5t46.5 -5.5q21 0 43 4.5t40 15t29.5 27.5t11.5 42q0 37 -26 55t-58 18q-23 0 -33 -7l-2 2l33 42q91 4 145 56t68 143h-87q-8 -60 -43.5 -93t-98.5 -33q-40 0 -69 16t-47 42.5t-26.5 60.5t-8.5 70q0 39 8 75.5t26.5 64.5 t49.5 45t77 17q54 0 86 -27t42 -76z" />
<glyph unicode="&#xe8;" horiz-adv-x="537" d="M135 731l131 -143h64l-86 143h-109zM423 308h-297q2 30 13 56.5t30 46.5t45.5 31.5t59.5 11.5q32 0 58.5 -11.5t46 -31t31 -46.5t13.5 -57zM505 164h-84q-11 -51 -45.5 -76t-88.5 -25q-42 0 -73 14t-51 37.5t-29 53.5q-8 28 -8 58v7h387v15q0 40 -9 84q-10 52 -37.5 96 t-73 72.5t-114.5 28.5q-53 0 -97.5 -20t-77 -56t-50.5 -85t-18 -108q2 -59 17.5 -109t46.5 -86t76.5 -56t107.5 -20q88 0 146 44t75 131z" />
<glyph unicode="&#xe9;" horiz-adv-x="537" d="M294 731l-86 -143h64l131 143h-109zM423 308h-297q2 30 13 56.5t30 46.5t45.5 31.5t59.5 11.5q32 0 58.5 -11.5t46 -31t31 -46.5t13.5 -57zM505 164h-84q-11 -51 -45.5 -76t-88.5 -25q-42 0 -73 14t-51 37.5t-29 53.5q-8 28 -8 58v7h387v15q0 40 -9 84q-10 52 -37.5 96 t-73 72.5t-114.5 28.5q-53 0 -97.5 -20t-77 -56t-50.5 -85t-18 -108q2 -59 17.5 -109t46.5 -86t76.5 -56t107.5 -20q88 0 146 44t75 131z" />
<glyph unicode="&#xea;" horiz-adv-x="537" d="M222 731l-103 -143h77l70 96l69 -96h84l-104 143h-93zM423 308h-297q2 30 13 56.5t30 46.5t45.5 31.5t59.5 11.5q32 0 58.5 -11.5t46 -31t31 -46.5t13.5 -57zM505 164h-84q-11 -51 -45.5 -76t-88.5 -25q-42 0 -73 14t-51 37.5t-29 53.5q-8 28 -8 58v7h387v15q0 40 -9 84 q-10 52 -37.5 96t-73 72.5t-114.5 28.5q-53 0 -97.5 -20t-77 -56t-50.5 -85t-18 -108q2 -59 17.5 -109t46.5 -86t76.5 -56t107.5 -20q88 0 146 44t75 131z" />
<glyph unicode="&#xeb;" horiz-adv-x="537" d="M130 696v-104h90v104h-90zM318 696v-104h90v104h-90zM423 308h-297q2 30 13 56.5t30 46.5t45.5 31.5t59.5 11.5q32 0 58.5 -11.5t46 -31t31 -46.5t13.5 -57zM505 164h-84q-11 -51 -45.5 -76t-88.5 -25q-42 0 -73 14t-51 37.5t-29 53.5q-8 28 -8 58v7h387v15q0 40 -9 84 q-10 52 -37.5 96t-73 72.5t-114.5 28.5q-53 0 -97.5 -20t-77 -56t-50.5 -85t-18 -108q2 -59 17.5 -109t46.5 -86t76.5 -56t107.5 -20q88 0 146 44t75 131z" />
<glyph unicode="&#xec;" horiz-adv-x="222" d="M-22 731l130 -143h64l-86 143h-108zM69 0h85v517h-85v-517z" />
<glyph unicode="&#xed;" horiz-adv-x="222" d="M136 731l-86 -143h64l131 143h-109zM69 0h85v517h-85v-517z" />
<glyph unicode="&#xee;" horiz-adv-x="222" d="M64 731l-102 -143h76l70 96l69 -96h84l-104 143h-93zM69 0h85v517h-85v-517z" />
<glyph unicode="&#xef;" horiz-adv-x="222" d="M-27 696v-104h89v104h-89zM160 696v-104h90v104h-90zM69 0h85v517h-85v-517z" />
<glyph unicode="&#xf0;" horiz-adv-x="574" d="M282 431q44 0 75.5 -14t51.5 -38t29.5 -55t9.5 -66q0 -47 -12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5q0 77 39.5 125t116.5 48zM272 506q-57 0 -101 -20.5t-74 -55t-45.5 -79t-15.5 -93.5q0 -57 16 -106t48 -85.5t79 -57 t108 -20.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106q0 115 -41.5 211.5t-132.5 171.5l115 53l-35 37l-120 -56q-20 16 -42 31l-35 25l-70 -45q14 -8 34 -21t36 -27l-109 -51l38 -40l115 54q12 -8 28 -23t33 -35t33 -43.5t28 -49.5h-2q-27 31 -63 43.5t-76 12.5z" />
<glyph unicode="&#xf1;" d="M452 711h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-24 0 -41 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 15 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80zM64 517v-517h85 v292q0 35 9.5 64.5t28.5 51.5t47.5 34t67.5 12q49 0 77 -28t28 -76v-350h85v340q0 42 -8.5 76.5t-29.5 59.5t-55 39t-85 14q-115 0 -168 -94h-2v82h-80z" />
<glyph unicode="&#xf2;" horiz-adv-x="574" d="M153 731l131 -143h64l-86 143h-109zM126 258q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13t62.5 -13t51.5 -38t34.5 -61.5t12.5 -83.5t-12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5zM36 258q0 -57 16 -106t48 -85.5t79 -57 t108 -20.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106t-16 106.5t-48 86t-78.5 57.5t-108.5 21q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5z" />
<glyph unicode="&#xf3;" horiz-adv-x="574" d="M312 731l-86 -143h64l131 143h-109zM126 258q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13t62.5 -13t51.5 -38t34.5 -61.5t12.5 -83.5t-12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5zM36 258q0 -57 16 -106t48 -85.5t79 -57 t108 -20.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106t-16 106.5t-48 86t-78.5 57.5t-108.5 21q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5z" />
<glyph unicode="&#xf4;" horiz-adv-x="574" d="M240 731l-103 -143h77l70 96l69 -96h84l-104 143h-93zM126 258q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13t62.5 -13t51.5 -38t34.5 -61.5t12.5 -83.5t-12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5zM36 258q0 -57 16 -106 t48 -85.5t79 -57t108 -20.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106t-16 106.5t-48 86t-78.5 57.5t-108.5 21q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="574" d="M461 711h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-24 0 -41 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 15 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80zM126 258 q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13t62.5 -13t51.5 -38t34.5 -61.5t12.5 -83.5t-12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5zM36 258q0 -57 16 -106t48 -85.5t79 -57t108 -20.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106 t-16 106.5t-48 86t-78.5 57.5t-108.5 21q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="574" d="M148 696v-104h90v104h-90zM336 696v-104h90v104h-90zM126 258q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13t62.5 -13t51.5 -38t34.5 -61.5t12.5 -83.5t-12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13t-62.5 13t-51.5 37.5t-34.5 61t-12.5 83.5zM36 258q0 -57 16 -106 t48 -85.5t79 -57t108 -20.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106t-16 106.5t-48 86t-78.5 57.5t-108.5 21q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5z" />
<glyph unicode="&#xf7;" horiz-adv-x="600" d="M236 47q0 -26 19.5 -44.5t45.5 -18.5q25 0 44 19.5t19 43.5q0 26 -19 45t-45 19t-45 -19t-19 -45zM236 459q0 -26 19.5 -45t45.5 -19q25 0 44 20t19 44q0 26 -19 45t-45 19t-45 -19t-19 -45zM48 287v-68h504v68h-504z" />
<glyph unicode="&#xf8;" horiz-adv-x="574" d="M480 443l60 66l-27 26l-58 -65q-32 29 -73 44t-95 15q-61 0 -108 -21t-79 -57.5t-48 -86t-16 -106.5q0 -55 15 -102.5t45 -84.5l-62 -69l28 -23l60 66q31 -27 72 -41.5t93 -14.5q62 0 108.5 20.5t78.5 57t48 85.5t16 106q0 55 -14.5 102.5t-43.5 82.5zM178 108l242 269 q13 -23 20.5 -52.5t7.5 -66.5q0 -47 -12.5 -83.5t-34.5 -61t-51.5 -37.5t-62.5 -13q-64 0 -109 45zM398 407l-242 -270q-14 25 -22 55t-8 66q0 47 12.5 83.5t34.5 61.5t51.5 38t62.5 13q67 0 111 -47z" />
<glyph unicode="&#xf9;" d="M144 731l131 -143h64l-86 143h-109zM492 0v517h-85v-292q0 -35 -9.5 -64.5t-28.5 -51.5t-47.5 -34t-67.5 -12q-49 0 -77 28t-28 76v350h-85v-340q0 -42 8.5 -76.5t29.5 -59.5t55 -38.5t85 -13.5q57 0 99 22.5t69 70.5h2v-82h80z" />
<glyph unicode="&#xfa;" d="M303 731l-86 -143h64l131 143h-109zM492 0v517h-85v-292q0 -35 -9.5 -64.5t-28.5 -51.5t-47.5 -34t-67.5 -12q-49 0 -77 28t-28 76v350h-85v-340q0 -42 8.5 -76.5t29.5 -59.5t55 -38.5t85 -13.5q57 0 99 22.5t69 70.5h2v-82h80z" />
<glyph unicode="&#xfb;" d="M231 731l-103 -143h77l70 96l69 -96h84l-104 143h-93zM492 0v517h-85v-292q0 -35 -9.5 -64.5t-28.5 -51.5t-47.5 -34t-67.5 -12q-49 0 -77 28t-28 76v350h-85v-340q0 -42 8.5 -76.5t29.5 -59.5t55 -38.5t85 -13.5q57 0 99 22.5t69 70.5h2v-82h80z" />
<glyph unicode="&#xfc;" d="M139 696v-104h90v104h-90zM327 696v-104h90v104h-90zM492 0v517h-85v-292q0 -35 -9.5 -64.5t-28.5 -51.5t-47.5 -34t-67.5 -12q-49 0 -77 28t-28 76v350h-85v-340q0 -42 8.5 -76.5t29.5 -59.5t55 -38.5t85 -13.5q57 0 99 22.5t69 70.5h2v-82h80z" />
<glyph unicode="&#xfd;" horiz-adv-x="500" d="M275 731l-86 -143h64l131 143h-109zM267 -68l225 585h-90l-145 -423h-2l-151 423h-96l205 -514l-35 -87q-12 -23 -28 -35t-42 -12q-13 0 -26 4l-24 8v-78q14 -5 29 -7t30 -2q29 0 50 7.5t38.5 24t32 42.5t29.5 64z" />
<glyph unicode="&#xfe;" horiz-adv-x="593" d="M152 447v267h-85v-911h85v266h2q14 -23 34.5 -38.5t43.5 -24.5t46.5 -13t42.5 -4q59 0 103.5 21t74 57.5t44 85.5t14.5 104t-15 104t-44.5 86.5t-74 59.5t-104.5 22q-54 0 -99 -19.5t-66 -62.5h-2zM467 263q0 -38 -8 -74t-26 -64t-47.5 -45t-73.5 -17t-75 16.5 t-50.5 43.5t-28.5 62.5t-9 73.5q0 36 8.5 71t27.5 62.5t49 44.5t73 17q41 0 71.5 -16t50 -43t29 -61.5t9.5 -70.5z" />
<glyph unicode="&#xff;" horiz-adv-x="500" d="M111 696v-104h90v104h-90zM299 696v-104h90v104h-90zM267 -68l225 585h-90l-145 -423h-2l-151 423h-96l205 -514l-35 -87q-12 -23 -28 -35t-42 -12q-13 0 -26 4l-24 8v-78q14 -5 29 -7t30 -2q29 0 50 7.5t38.5 24t32 42.5t29.5 64z" />
<glyph unicode="&#x152;" horiz-adv-x="1074" d="M551 69v-69h483v80h-388v247h350v80h-350v227h382v80h-477v-59h-2q-11 20 -30.5 34t-43.5 23.5t-50.5 14t-51.5 4.5q-79 0 -141.5 -28.5t-105.5 -79t-65.5 -119t-22.5 -149.5q0 -79 21.5 -146.5t63 -117.5t102.5 -78.5t140 -28.5q27 0 54.5 5.5t52 16t44.5 26.5t33 37h2z M372 63q-58 0 -103 22.5t-75 61.5t-45.5 91.5t-15.5 112.5t15 114.5t45 96t75 65.5t106 24q57 0 99.5 -23t62.5 -54q11 -17 13 -35t2 -34v-301q0 -31 -14 -57t-38 -44.5t-56.5 -29t-70.5 -10.5z" />
<glyph unicode="&#x153;" horiz-adv-x="891" d="M415 260q0 -35 -6.5 -70t-23 -63.5t-44 -46t-70.5 -17.5q-39 0 -67 16.5t-45 43t-25 59.5t-8 66q0 38 7.5 75t24.5 66t45 47t68 18q44 0 72 -17t44 -44.5t22 -62t6 -70.5zM774 308h-285q-1 64 38 105t106 41t104 -40t37 -106zM489 233h375q1 13 1 25q0 47 -9 90 q-12 54 -40 94t-73 63.5t-110 23.5q-55 0 -105.5 -22.5t-77.5 -68.5q-26 54 -72.5 72.5t-106.5 18.5t-104 -21t-73.5 -57.5t-43.5 -85.5t-14 -106q0 -56 14 -105t42.5 -86t73 -58t105.5 -21q58 0 106.5 22.5t72.5 78.5q24 -56 73.5 -78.5t114.5 -22.5q170 0 221 175h-81 q-15 -48 -52 -74.5t-88 -26.5q-38 0 -66.5 14t-47 37.5t-27.5 53.5q-8 28 -8 58v7z" />
<glyph unicode="&#x178;" horiz-adv-x="648" d="M185 873v-104h90v104h-90zM373 873v-104h90v104h-90zM373 292l273 422h-108l-209 -340l-214 340h-113l276 -422v-292h95v292z" />
<glyph unicode="&#x2c6;" horiz-adv-x="222" d="M64 731l-102 -143h76l70 96l69 -96h84l-104 143h-93z" />
<glyph unicode="&#x2dc;" horiz-adv-x="222" d="M285 711h-52q-5 -15 -15.5 -29.5t-30.5 -14.5q-16 0 -32.5 6.5t-33.5 14t-35.5 13.5t-38.5 6q-23 0 -40 -9t-29 -24t-20.5 -35t-14.5 -42h52q-2 19 14 30.5t33 11.5q14 0 31.5 -6t35.5 -13q18 -8 35.5 -14t30.5 -6q29 0 47.5 8.5t31.5 22.5q25 35 31 80z" />
<glyph unicode="&#x2000;" horiz-adv-x="476" />
<glyph unicode="&#x2001;" horiz-adv-x="952" />
<glyph unicode="&#x2002;" horiz-adv-x="476" />
<glyph unicode="&#x2003;" horiz-adv-x="952" />
<glyph unicode="&#x2004;" horiz-adv-x="317" />
<glyph unicode="&#x2005;" horiz-adv-x="238" />
<glyph unicode="&#x2006;" horiz-adv-x="158" />
<glyph unicode="&#x2007;" horiz-adv-x="158" />
<glyph unicode="&#x2008;" horiz-adv-x="119" />
<glyph unicode="&#x2009;" horiz-adv-x="190" />
<glyph unicode="&#x200a;" horiz-adv-x="52" />
<glyph unicode="&#x2010;" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
<glyph unicode="&#x2011;" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
<glyph unicode="&#x2013;" horiz-adv-x="500" d="M0 318v-80h500v80h-500z" />
<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M130 318v-80h740v80h-740z" />
<glyph unicode="&#x2018;" horiz-adv-x="278" d="M195 456v111h-59q0 17 2.5 34.5t9.5 31.5t18 22.5t28 8.5v50q-28 0 -49 -12t-34.5 -32t-20 -46.5t-6.5 -56.5v-111h111z" />
<glyph unicode="&#x2019;" horiz-adv-x="278" d="M83 714v-111h59q0 -17 -2.5 -34.5t-9.5 -31.5t-18 -22.5t-28 -8.5v-50q29 0 49.5 12t34 32t20 46.5t6.5 56.5v111h-111z" />
<glyph unicode="&#x201a;" horiz-adv-x="278" d="M83 111v-111h59q0 -17 -2.5 -34t-9.5 -31t-18 -22.5t-28 -8.5v-50q29 0 49.5 12t34 32t20 46.5t6.5 55.5v111h-111z" />
<glyph unicode="&#x201c;" horiz-adv-x="426" d="M177 456v111h-59q0 17 2.5 34.5t9.5 31.5t18 22.5t28 8.5v50q-28 0 -49 -12t-34.5 -32t-20 -46.5t-6.5 -56.5v-111h111zM360 456v111h-59q0 17 2.5 34.5t9.5 31.5t18 22.5t28 8.5v50q-28 0 -49 -12t-34.5 -32t-20 -46.5t-6.5 -56.5v-111h111z" />
<glyph unicode="&#x201d;" horiz-adv-x="426" d="M66 714v-111h59q0 -17 -2.5 -34.5t-9.5 -31.5t-18 -22.5t-28 -8.5v-50q29 0 49.5 12t34 32t20 46.5t6.5 56.5v111h-111zM249 714v-111h59q0 -17 -2.5 -34.5t-9.5 -31.5t-18 -22.5t-28 -8.5v-50q29 0 49.5 12t34 32t20 46.5t6.5 56.5v111h-111z" />
<glyph unicode="&#x201e;" horiz-adv-x="426" d="M249 111v-111h59q0 -17 -2.5 -34t-9.5 -31t-18 -22.5t-28 -8.5v-50q29 0 49.5 12t34 32t20 46.5t6.5 55.5v111h-111zM66 111v-111h59q0 -17 -2.5 -34t-9.5 -31t-18 -22.5t-28 -8.5v-50q29 0 49.5 12t34 32t20 46.5t6.5 55.5v111h-111z" />
<glyph unicode="&#x2022;" horiz-adv-x="500" d="M72 357q0 -37 14 -69.5t38 -57t56.5 -38.5t69.5 -14t69.5 14t57 38.5t38.5 57t14 69.5t-14 69.5t-38.5 56.5t-57 38t-69.5 14t-69.5 -14t-56.5 -38t-38 -56.5t-14 -69.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M777 111v-111h111v111h-111zM444 111v-111h111v111h-111zM111 111v-111h111v111h-111z" />
<glyph unicode="&#x202f;" horiz-adv-x="190" />
<glyph unicode="&#x2039;" horiz-adv-x="259" d="M50 234l152 -120v86l-100 78l100 78v86l-152 -120v-88z" />
<glyph unicode="&#x203a;" horiz-adv-x="259" d="M209 322l-152 120v-86l100 -78l-100 -78v-86l152 120v88z" />
<glyph unicode="&#x205f;" horiz-adv-x="238" />
<glyph unicode="&#x20ac;" d="M558 662q-90 63 -181 63q-118 0 -193 -81q-67 -71 -91 -194h-54l-26 -61h73q-1 -7 -1 -15v-17v-10q0 -5 1 -10h-46l-27 -61h77q42 -291 287 -291q87 0 154 43v105q-42 -39 -69 -53q-37 -19 -85 -19q-157 0 -190 215h218l26 61h-249q-1 5 -1 10v11v15q0 8 1 16h263l27 61 h-283q17 83 56 134q49 64 124 64q73 0 143 -69z" />
<glyph unicode="&#x2122;" horiz-adv-x="990" d="M927 302v412h-104l-121 -313l-123 313h-105v-412h68v344h2l135 -344h43l135 344h2v-344h68zM390 659v55h-326v-55h129v-357h68v357h129z" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
-239
View File
@@ -1,239 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
This is a custom SVG webfont generated by Font Squirrel.
Foundry URL : http://www.LinotypeLibrary.com/
</metadata>
<defs>
<font id="webfontFCWPcBgS" horiz-adv-x="500" >
<font-face units-per-em="1000" ascent="800" descent="-200" />
<missing-glyph horiz-adv-x="278" />
<glyph unicode=" " horiz-adv-x="278" />
<glyph unicode="&#x09;" horiz-adv-x="278" />
<glyph unicode="&#xa0;" horiz-adv-x="278" />
<glyph unicode="!" horiz-adv-x="185" d="M83 182h20v532h-20v-532zM83 0h20v98h-20v-98z" />
<glyph unicode="&#x22;" horiz-adv-x="278" d="M205 489v225h-20v-225h20zM93 489v225h-20v-225h20z" />
<glyph unicode="#" horiz-adv-x="556" d="M185 249l24 177h171l-24 -177h-171zM245 680h-20l-31 -234h-131v-20h126l-24 -177h-130v-20h125l-31 -229h20l31 229h172l-31 -229h20l31 229h121v20h-117l24 177h121v20h-116l31 234h-20l-31 -234h-171z" />
<glyph unicode="$" horiz-adv-x="556" d="M285 3v352l81 -19q41 -10 74.5 -28.5t55 -49.5t21.5 -82q0 -46 -20.5 -79t-53.5 -54t-74.5 -30.5t-83.5 -9.5zM26 237h-20v-6q0 -61 18 -105q19 -47 53.5 -78t82.5 -46t105 -17v-89h20v88q46 0 91 10.5t81 34t58 59.5t22 87q0 56 -19.5 89t-52.5 53t-77 32l-95 25l-8 2 v334q46 -1 85 -12t68 -34.5t46 -60t19 -89.5h20q-3 58 -21.5 98.5t-50 66t-74 38t-92.5 13.5v44h-20v-43q-42 0 -84.5 -9t-76.5 -30.5t-55.5 -57t-21.5 -87.5t21 -84t55 -51.5t76.5 -30.5t85.5 -21v-356q-53 2 -97 15.5t-75.5 41.5t-49 71.5t-17.5 104.5zM265 711v-330 q-42 9 -81.5 19.5t-70 28t-48.5 45.5t-18 73q0 47 20 78.5t51.5 50.5t70.5 27t76 8z" />
<glyph unicode="%" horiz-adv-x="685" d="M564 714l-476 -747h23l476 747h-23zM357 157q0 -33 9 -63.5t27.5 -54t47.5 -37t68 -13.5q38 0 66.5 13.5t48.5 36.5t30 53.5t10 65.5q0 75 -39.5 123.5t-115.5 48.5q-36 0 -64.5 -13t-48 -36t-29.5 -54.5t-10 -69.5zM41 519q0 66 31.5 109.5t100.5 43.5t102 -42t33 -111 q0 -30 -8.5 -57t-25.5 -47.5t-42.5 -32.5t-58.5 -12t-58 12t-41.5 32t-24.5 47.5t-8 57.5zM21 519q0 -33 9 -63.5t27.5 -54t47.5 -37.5t68 -14q38 0 66.5 13.5t48.5 37t30 54.5t10 65q0 75 -39.5 123.5t-115.5 48.5q-36 0 -64.5 -13t-48 -36t-29.5 -54.5t-10 -69.5zM377 157 q0 66 31.5 109.5t100.5 43.5t102 -42t33 -111q0 -30 -8.5 -57t-25.5 -47.5t-42.5 -32.5t-58.5 -12t-58 12t-41.5 32t-24.5 47.5t-8 57.5z" />
<glyph unicode="&#x26;" horiz-adv-x="574" d="M572 0l-105 133q15 34 23 67q7 28 7 67v10h-20v-16q0 -30 -6 -56q-8 -32 -18 -54l-188 238q24 18 52 37t51 41.5t38.5 50t15.5 63.5q0 32 -11.5 56.5t-31.5 41.5t-46.5 26t-56.5 9q-27 0 -53 -8t-46.5 -24t-33.5 -41t-13 -60q0 -25 11 -49.5t27.5 -48t34.5 -46t33 -43.5 l-66 -42q-34 -23 -62 -51t-46 -62.5t-18 -78.5q0 -42 18 -74.5t46.5 -55t65.5 -34.5t74 -12q76 0 127.5 37t81.5 92l89 -113h26zM248 378l196 -246q-28 -57 -76 -93t-120 -36q-34 0 -67.5 10t-59 30t-41.5 49.5t-16 67.5q0 42 17.5 74t44.5 57.5t60 46.5zM150 583 q0 26 10 46.5t27.5 35t40.5 22t49 7.5q25 0 47.5 -8t40 -22.5t27.5 -35.5t10 -47q0 -31 -15.5 -57t-38 -47.5t-48.5 -39.5l-47 -33l-47 61q-19 26 -31.5 46.5t-18.5 37.5t-6 34z" />
<glyph unicode="'" horiz-adv-x="167" d="M74 714v-225h20v225h-20z" />
<glyph unicode="(" horiz-adv-x="222" d="M204 731h-20q-57 -103 -86.5 -217t-29.5 -232q0 -65 7.5 -123.5t22 -114t36.5 -109.5t51 -111h20q-58 106 -87.5 221.5t-29.5 236.5q0 118 29.5 232t86.5 217z" />
<glyph unicode=")" horiz-adv-x="222" d="M18 -176h20q57 103 86.5 216.5t29.5 231.5q0 65 -7.5 123.5t-22 114t-36.5 110t-51 111.5h-20q58 -106 87.5 -222t29.5 -237q0 -118 -29.5 -231.5t-86.5 -216.5z" />
<glyph unicode="*" horiz-adv-x="352" d="M184 714h-20v-140l-126 43l-6 -19l130 -43l-88 -104l16 -13l84 104l83 -108l16 12l-83 109l130 43l-4 19l-132 -43v140z" />
<glyph unicode="+" horiz-adv-x="600" d="M290 506v-243h-242v-20h242v-243h20v243h242v20h-242v243h-20z" />
<glyph unicode="," horiz-adv-x="278" d="M149 98h-20v-98q0 -40 -5.5 -62.5t-18.5 -35.5v-20q25 17 34.5 45t9.5 73v98z" />
<glyph unicode="-" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
<glyph unicode="." horiz-adv-x="278" d="M149 0v98h-20v-98h20z" />
<glyph unicode="/" horiz-adv-x="333" d="M-6 -16h19l327 747h-20z" />
<glyph unicode="0" horiz-adv-x="556" d="M535 340q0 64 -12.5 127t-42.5 113t-79 81t-123 31q-73 0 -122.5 -31t-79.5 -81t-42.5 -113t-12.5 -127t12.5 -127t42.5 -113t79.5 -80.5t122.5 -30.5q74 0 123 30.5t79 80.5t42.5 113t12.5 127zM515 340q0 -57 -11 -116t-38 -107t-72.5 -78.5t-115.5 -30.5t-115.5 30.5 t-72.5 78.5t-38 107t-11 116t11 116t38 107t72.5 78.5t115.5 30.5t115.5 -30.5t72.5 -78.5t38 -107t11 -116z" />
<glyph unicode="1" horiz-adv-x="556" d="M298 654v-654h20v680h-22q-21 -24 -40.5 -43t-40.5 -34t-45 -27t-55 -22v-20q51 14 100.5 45.5t80.5 74.5h2z" />
<glyph unicode="2" horiz-adv-x="556" d="M513 20h-438q4 44 37 81.5t79.5 73t99.5 71t98.5 75.5t75.5 86t30 102q0 46 -16.5 80t-44.5 57t-66 34.5t-82 11.5q-109 0 -163.5 -61.5t-55.5 -173.5h20q0 47 11 86.5t35 68t62 44.5t91 16q41 0 75.5 -10.5t59.5 -31t39.5 -51t14.5 -70.5t-17.5 -74.5t-46.5 -65 t-66 -58.5l-76 -55l-77 -54q-38 -28 -69 -58.5t-50 -65.5t-18 -78h458v20z" />
<glyph unicode="3" horiz-adv-x="556" d="M59 469h20v7q0 46 13 82q15 38 43 63.5t67.5 38t88.5 12.5q36 0 70 -7.5t61 -25t44 -45.5t18 -69q0 -42 -16 -70.5t-42 -46t-58.5 -25t-65.5 -7.5h-49v-20h49q42 -2 77.5 -12t62 -30t41 -51t14.5 -75t-17.5 -77.5t-46.5 -56.5t-67 -34.5t-79 -11.5q-53 0 -97 14.5 t-74 42.5t-45 69q-12 33 -12 74q0 11 1 22h-20q-1 -11 -1 -22q0 -45 13 -81q17 -45 50 -75.5t80 -46.5t105 -16q47 0 88.5 13t73 38.5t50 62.5t18.5 85q0 44 -13.5 76t-36 53.5t-51 33t-58.5 14.5v2q63 6 104.5 46t41.5 112q0 45 -18 77t-48 52t-68 29t-79 9 q-53 0 -96.5 -14t-74 -42t-46.5 -70q-15 -39 -15 -90v-7z" />
<glyph unicode="4" horiz-adv-x="556" d="M34 177h345v-177h20v177h123v20h-123v483h-25l-340 -479v-24zM379 652v-455h-325l323 455h2z" />
<glyph unicode="5" horiz-adv-x="556" d="M147 660h333v20h-349l-73 -343h25q28 51 79 77.5t111 26.5q48 0 88 -16t68 -44.5t43.5 -68t15.5 -86.5q0 -49 -15 -89.5t-43 -69t-67.5 -44t-89.5 -15.5q-49 0 -90 14t-69.5 41t-43.5 66q-13 34 -13 77v12h-20v-11q0 -48 15 -87q17 -42 48.5 -71t76 -44.5t96.5 -15.5 q53 0 96 16.5t74 47.5t48 75t17 98q0 51 -17 94.5t-48 74.5t-74 48.5t-96 17.5q-60 0 -108.5 -22t-77.5 -70h-2z" />
<glyph unicode="6" horiz-adv-x="556" d="M485 520h20q-5 36 -22 67.5t-44 54.5t-63.5 36.5t-80.5 13.5q-75 0 -124 -34t-78.5 -88t-41.5 -120t-12 -129q0 -66 8 -123.5t37 -102.5q13 -20 32.5 -39t44.5 -34t55.5 -24t65.5 -9q47 0 89.5 17.5t75 48.5t51.5 74t19 94q0 53 -20 96t-53 74t-75.5 48t-86.5 17 q-40 0 -77.5 -13t-67 -36.5t-50 -54.5t-27.5 -67h-2v13q0 53 7 113q8 67 33.5 125t72.5 96t123 38q26 0 55 -6.5t56 -23.5t48.5 -46.5t31.5 -75.5zM497 223q0 -45 -17 -84t-46 -68t-68 -46t-84 -17t-84 17t-68 46t-46 68t-17 84t17 84t46 68t68 46t84 17t84 -17t68 -46 t46 -68t17 -84z" />
<glyph unicode="7" horiz-adv-x="556" d="M61 660h412q-69 -69 -125.5 -143t-97 -155.5t-62.5 -171.5q-20 -86 -20 -181v-9h20q0 102 22 190.5t62 168t97 152.5t126 142v27h-434v-20z" />
<glyph unicode="8" horiz-adv-x="556" d="M471 520q0 -36 -17.5 -62.5t-45 -43t-62 -24.5t-68.5 -8t-68.5 8t-62 24.5t-45 43t-17.5 62.5q0 44 16.5 73t43.5 46.5t61.5 25t71.5 7.5t71.5 -7.5t61.5 -25t43.5 -46.5t16.5 -73zM351 373v2q29 4 54.5 16.5t44.5 31t30 43.5t11 54q0 46 -16.5 78.5t-45.5 53.5t-68 30.5 t-83 9.5t-83 -9.5t-68 -30.5t-45.5 -53.5t-16.5 -78.5q0 -29 11 -54t30 -43.5t44.5 -31t54.5 -16.5v-2q-81 -8 -127.5 -56.5t-46.5 -126.5q0 -53 20 -91t53.5 -62.5t78.5 -36t95 -11.5t95 11.5t78.5 36t53.5 62.5t20 91q0 78 -46.5 126.5t-127.5 56.5zM505 190 q0 -49 -18.5 -83.5t-50 -56.5t-72.5 -32t-86 -10t-86 10t-72.5 32t-50 56.5t-18.5 83.5t19 82t50.5 53t72.5 28.5t85 8.5t85 -8.5t72.5 -28.5t50.5 -53t19 -82z" />
<glyph unicode="9" horiz-adv-x="556" d="M489 457q0 -45 -17 -84t-46 -68t-68 -46t-84 -17t-84 17t-68 46t-46 68t-17 84t17 84t46 68t68 46t84 17t84 -17t68 -46t46 -68t17 -84zM71 160h-20q5 -36 22 -67.5t44 -54.5t63.5 -36t80.5 -13q75 0 124.5 34t79 87.5t41.5 119t12 129.5q0 66 -8 123.5t-38 102.5 q-13 20 -32.5 39t-44.5 34t-55.5 24.5t-65.5 9.5q-47 0 -89.5 -17.5t-75 -49t-51.5 -74.5t-19 -94q0 -52 20 -95.5t53 -74.5t75.5 -48t86.5 -17q41 0 78 13t66.5 36.5t49.5 54.5t28 67h2v-20q0 -30 -2 -63q-3 -43 -12.5 -86t-26 -82t-43 -69t-64 -47.5t-88.5 -17.5 q-25 0 -54.5 6.5t-56.5 23.5t-48.5 46.5t-31.5 75.5z" />
<glyph unicode=":" horiz-adv-x="278" d="M129 416h20v98h-20v-98zM129 0h20v98h-20v-98z" />
<glyph unicode=";" horiz-adv-x="278" d="M129 416h20v98h-20v-98zM149 0v98h-20v-98q0 -40 -5.5 -62.5t-18.5 -35.5v-20q25 17 34.5 45t9.5 73z" />
<glyph unicode="&#x3c;" horiz-adv-x="600" d="M554 -7v20l-490 240l490 240v21l-508 -249v-24z" />
<glyph unicode="=" horiz-adv-x="600" d="M48 146h504v20h-504v-20zM48 340h504v20h-504v-20z" />
<glyph unicode="&#x3e;" horiz-adv-x="600" d="M536 253l-490 -240v-20l508 248v24l-508 249v-21z" />
<glyph unicode="?" d="M232 0h20v98h-20v-98zM35 493h20v14q0 40 10 75q12 40 37 68.5t63 44.5t87 16q38 0 70.5 -9.5t56 -28t37 -46t13.5 -62.5q0 -38 -13 -67.5t-30.5 -50.5t-33.5 -34t-22 -19q-28 -27 -47 -51t-30 -48.5t-16 -51.5t-5 -61h20q0 36 5.5 63t17 49.5t30.5 44t46 47.5l29 26 q17 15 32.5 36.5t26 50t10.5 66.5q0 40 -15.5 71t-42 52t-62.5 32t-77 11q-52 0 -93.5 -17.5t-69.5 -49t-42 -74.5q-12 -39 -12 -84v-13z" />
<glyph unicode="@" horiz-adv-x="800" d="M594 547l-24 -66h-2q-13 40 -51 62.5t-86 22.5q-53 0 -97 -27.5t-75 -70.5t-48 -93.5t-17 -97.5q0 -30 10.5 -56.5t28.5 -46t43 -31t54 -11.5q35 0 71.5 12.5t64.5 50.5h2q-1 -6 -1 -12q0 -20 13 -33q18 -18 47 -18q36 0 74.5 22t70 60t51.5 88.5t20 108.5 q0 69 -25.5 125t-69.5 95t-103 60t-126 21q-74 0 -140 -27t-115.5 -75t-78 -113.5t-28.5 -143.5q0 -95 31.5 -164t82.5 -113.5t116 -65.5t132 -21q46 0 91.5 12.5t86.5 35.5t76 56t59 73h-23q-23 -33 -54 -62t-68.5 -50.5t-79.5 -33.5t-88 -12q-69 0 -131 22t-109 65.5 t-74.5 108t-27.5 149.5q0 71 26 132.5t72 107.5t108.5 72.5t135.5 26.5q65 0 121 -20.5t96.5 -57.5t63.5 -89t23 -114q0 -55 -19 -102.5t-47.5 -82t-62.5 -54.5t-65 -20q-20 0 -30 8.5t-12 23.5q-1 4 -1 8q0 12 4 26q5 19 14 41l111 288h-21zM559 456l-71 -184 q-14 -36 -32.5 -59.5t-38.5 -37t-41.5 -18.5t-41.5 -5q-26 0 -48 9.5t-38 26.5t-25 39.5t-9 49.5q0 42 15.5 89t43.5 87t67.5 66.5t86.5 26.5q19 0 39.5 -4.5t39 -15t32.5 -27.5t21 -43z" />
<glyph unicode="A" horiz-adv-x="575" d="M106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
<glyph unicode="B" horiz-adv-x="611" d="M67 382v312h287q38 0 71 -9.5t57.5 -29t38.5 -49t14 -70.5q0 -38 -15 -67t-40 -48.5t-57.5 -29t-68.5 -9.5h-287zM47 714v-714h295q51 0 94.5 12.5t74.5 36.5t48.5 60.5t17.5 84.5q0 41 -14 73.5t-37.5 55t-55 35t-66.5 13.5v2q33 2 60.5 15.5t47.5 35.5t31.5 51t11.5 61 q0 45 -15.5 78t-43 55.5t-64 33.5t-78.5 11h-307zM67 20v342h287q38 0 74.5 -9t65 -29t46 -52t17.5 -79q0 -44 -16 -76.5t-43.5 -54t-65 -32t-81.5 -10.5h-284z" />
<glyph unicode="C" horiz-adv-x="685" d="M662 280h-20q-8 -59 -31 -110t-60 -88t-88 -58t-115 -21q-72 0 -128.5 29t-95.5 77t-59 111t-20 131q0 56 16.5 119t53.5 116.5t97.5 89t148.5 35.5q58 0 105.5 -18.5t82 -48.5t54.5 -67.5t23 -76.5h20q-1 33 -19 73t-53.5 75.5t-88.5 59t-124 23.5q-91 0 -155 -35 t-104 -90t-58.5 -122.5t-18.5 -132.5q0 -80 24 -147.5t66.5 -116t102 -76t130.5 -27.5q68 0 122 22t93.5 61t64.5 93.5t34 119.5z" />
<glyph unicode="D" horiz-adv-x="648" d="M74 20v674h225q54 0 105.5 -15t92.5 -53.5t66 -103.5t25 -165q0 -86 -24.5 -149.5t-67 -105t-99 -62t-119.5 -20.5h-204zM54 714v-714h219q65 0 125 20t107 62.5t75 110.5t28 164q0 105 -27.5 174t-71 109.5t-98 57t-107.5 16.5h-250z" />
<glyph unicode="E" horiz-adv-x="537" d="M74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
<glyph unicode="F" horiz-adv-x="481" d="M74 382v312h420v20h-440v-714h20v362h380v20h-380z" />
<glyph unicode="G" horiz-adv-x="722" d="M377 314h277v-37q0 -59 -22 -109.5t-60.5 -87t-90.5 -57t-111 -20.5q-79 0 -138.5 28t-99.5 76t-60 112.5t-20 137.5t21 137.5t61.5 112.5t99 76t133.5 28q56 0 102.5 -15.5t82 -44.5t59 -69.5t32.5 -90.5h20q-9 55 -33.5 99t-63 75.5t-89 48.5t-110.5 17q-79 0 -141 -29 t-105 -79.5t-66 -119t-23 -146.5q0 -77 21.5 -145t63.5 -118.5t105 -80t145 -29.5q106 0 181 51t104 142h2v-177h20v334h-297v-20z" />
<glyph unicode="H" horiz-adv-x="648" d="M74 362h500v-362h20v714h-20v-332h-500v332h-20v-714h20v362z" />
<glyph unicode="I" horiz-adv-x="128" d="M54 714v-714h20v714h-20z" />
<glyph unicode="J" horiz-adv-x="463" d="M384 714v-513q0 -56 -11.5 -94t-34 -61t-55 -33t-75.5 -10q-84 0 -127 43.5t-43 131.5v43h-20v-43q0 -42 10.5 -77.5t33.5 -61.5t59 -40.5t87 -14.5q54 0 91.5 14.5t60.5 41.5t33.5 64t10.5 82v528h-20z" />
<glyph unicode="K" horiz-adv-x="593" d="M74 253l164 145l354 -398h27l-365 410l345 304h-30l-495 -434v434h-20v-714h20v253z" />
<glyph unicode="L" horiz-adv-x="481" d="M491 20h-417v694h-20v-714h437v20z" />
<glyph unicode="M" horiz-adv-x="780" d="M693 714l-302 -688h-2l-302 688h-33v-714h20v689h2l303 -689h22l303 689h2v-689h20v714h-33z" />
<glyph unicode="N" horiz-adv-x="648" d="M54 714v-714h20v689h2l488 -689h30v714h-20v-689h-2l-488 689h-30z" />
<glyph unicode="O" horiz-adv-x="721" d="M32 357q0 -76 21.5 -144t63 -119t103 -80.5t141.5 -29.5t141.5 29.5t103 80.5t63 119t21.5 144t-21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144zM52 357q1 77 22.5 142t61 112t96.5 73.5t129 26.5t129 -26.5t96.5 -73.5t61 -112 t22.5 -142q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5t-129 -26.5t-129 26.5t-96.5 73.5t-61 112t-22.5 142z" />
<glyph unicode="P" horiz-adv-x="574" d="M74 0v325h259q50 0 91.5 12.5t71.5 37t47 61t17 83.5q0 97 -57 146t-160 49h-289v-714h20zM74 345v349h269q100 0 148.5 -45t48.5 -130q0 -42 -15 -74t-41.5 -54.5t-62.5 -34t-78 -11.5h-269z" />
<glyph unicode="Q" horiz-adv-x="721" d="M571 58l118 -79l10 14l-115 78q54 52 80 126.5t26 159.5q0 76 -21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144t21.5 -144t63 -119t103 -80.5t141.5 -29.5q66 0 118 19.5t92 54.5zM427 156l126 -86q-38 -32 -86 -49.5t-106 -17.5 q-72 0 -129 26.5t-96.5 73.5t-61 112t-22.5 142q1 77 22.5 142t61 112t96.5 73.5t129 26.5t129 -26.5t96.5 -73.5t61 -112t22.5 -142q-1 -88 -27.5 -157t-75.5 -117l-129 89z" />
<glyph unicode="R" horiz-adv-x="611" d="M74 0v335h269q62 0 99 -12.5t57 -36t26.5 -58t6.5 -78.5q0 -17 0.5 -38.5t2 -42.5t4.5 -39.5t8 -29.5h22q-5 7 -8 25t-5 40t-3 44.5t-1 37.5q0 43 -5 77t-20 59t-43 40.5t-73 21.5v2q75 17 115 65q38 45 38 112v7q-2 94 -54 138.5t-164 44.5h-292v-714h20zM74 355v339 h277q102 0 147 -42.5t46 -118.5q0 -47 -17 -80.5t-45 -55.5t-64.5 -32t-76.5 -10h-267z" />
<glyph unicode="S" horiz-adv-x="611" d="M531 514h20q-3 60 -23 101.5t-53.5 67t-78 37t-97.5 11.5q-43 0 -86.5 -9t-78.5 -30t-57 -56.5t-22 -88.5q0 -52 21 -84.5t55.5 -52t77.5 -30.5l86 -21q41 -10 85.5 -19.5t81 -28t60 -50t23.5 -85.5q0 -46 -20.5 -79t-53.5 -54t-74.5 -30.5t-83.5 -9.5q-57 0 -104.5 12.5 t-82 40.5t-53.5 72.5t-19 108.5h-20v-6q0 -64 20 -110q20 -48 57.5 -78.5t89 -44.5t112.5 -14q46 0 91 10.5t81 34t58 59.5t22 87q0 56 -19.5 89t-52.5 53t-77 32l-95 25l-90 21q-44 10 -78.5 28t-56 47t-21.5 77t21 79.5t53.5 50.5t72.5 26.5t77 7.5q48 0 90 -10 t72.5 -33.5t49 -61t20.5 -92.5z" />
<glyph unicode="T" d="M-16 694h256v-694h20v694h257v20h-533v-20z" />
<glyph unicode="U" horiz-adv-x="632" d="M558 714v-448q0 -129 -59 -196t-183 -67t-183 67t-59 196v448h-20v-448q0 -144 67 -213t195 -69t195 69t67 213v448h-20z" />
<glyph unicode="V" horiz-adv-x="538" d="M536 714l-262 -688h-2l-270 688h-19l279 -714h22l272 714h-20z" />
<glyph unicode="W" horiz-adv-x="870" d="M860 714l-199 -689h-2l-209 689h-29l-206 -689h-2l-202 689h-20l210 -714h27l206 689h2l210 -689h27l207 714h-20z" />
<glyph unicode="X" horiz-adv-x="520" d="M510 714l-249 -331l-247 331h-25l259 -347l-274 -367h25l262 351l261 -351h25l-272 367l260 347h-25z" />
<glyph unicode="Y" horiz-adv-x="538" d="M544 714l-275 -392l-273 392h-25l288 -413v-301h20v301l289 413h-24z" />
<glyph unicode="Z" d="M508 20h-507l499 667v27h-491v-20h471l-498 -667v-27h526v20z" />
<glyph unicode="[" horiz-adv-x="222" d="M209 731h-113v-907h113v20h-93v867h93v20z" />
<glyph unicode="\" horiz-adv-x="333" d="M320 -16h20l-327 747h-19z" />
<glyph unicode="]" horiz-adv-x="222" d="M13 -176h113v907h-113v-20h93v-867h-93v-20z" />
<glyph unicode="^" horiz-adv-x="600" d="M541 227l-231 453h-20l-231 -453h20l221 433l221 -433h20z" />
<glyph unicode="_" d="M0 -124h500v50h-500v-50z" />
<glyph unicode="`" horiz-adv-x="130" d="M-37 731l138 -144h15l-124 144h-29z" />
<glyph unicode="a" horiz-adv-x="481" d="M54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5t60.5 28.5t44 41t25.5 48h2v-67q0 -29 16.5 -39.5 t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5t-6 22v327q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5 q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5t31 21.5h2z" />
<glyph unicode="b" horiz-adv-x="537" d="M75 370v344h-20v-714h20v144h2q20 -69 73.5 -112t132.5 -43q51 0 91.5 20t69 55.5t43.5 84.5t15 107q0 54 -14.5 103t-42 86t-68.5 59t-94 22q-82 0 -135 -43t-71 -113h-2zM75 256q0 121 57 185.5t151 64.5q53 0 90.5 -22.5t61.5 -58t35.5 -80t11.5 -89.5 q0 -49 -12.5 -94t-37 -79.5t-62 -54.5t-87.5 -20q-49 0 -88 20t-65.5 54t-40.5 79t-14 95z" />
<glyph unicode="c" d="M469 175h-20q-3 -39 -19 -69.5t-41.5 -52.5t-58.5 -33.5t-71 -11.5q-51 0 -90 19.5t-65 52.5t-39.5 76t-13.5 90q0 45 11.5 91.5t37 84t68 61t103.5 23.5q32 0 61 -9t52 -27.5t39 -46t22 -65.5h20q-5 41 -22.5 72.5t-43.5 52.5t-59 32t-69 11q-61 0 -106.5 -23t-75 -61.5 t-44 -89t-14.5 -106.5q0 -53 15 -99.5t44 -81.5t71.5 -55.5t97.5 -20.5q44 0 80.5 13t64 37t44.5 58.5t21 77.5z" />
<glyph unicode="d" horiz-adv-x="537" d="M455 714v-344h-2q-18 70 -71 113t-135 43q-53 0 -94 -22t-68.5 -59t-42 -86t-14.5 -103q0 -58 15 -107t43.5 -84.5t69 -55.5t91.5 -20q79 0 132.5 43t73.5 112h2v-144h20v714h-20zM455 256q0 -50 -14 -95t-40.5 -79t-65 -54t-88.5 -20t-87.5 20t-62 54.5t-37 79.5 t-12.5 94q0 45 11.5 89.5t35.5 80t62 58t90 22.5q94 0 151 -64.5t57 -185.5z" />
<glyph unicode="e" d="M45 253h430v15q0 45 -11 87q-12 49 -39.5 87t-71 61t-103.5 23q-43 0 -84 -18t-72 -52.5t-50 -84.5t-19 -114q0 -57 13 -106.5t40 -86t70 -56.5q40 -19 96 -19h6q88 0 148 49.5t71 139.5h-20q-13 -85 -66.5 -127.5t-134.5 -42.5q-55 0 -93 19t-62 52t-35.5 77.5 t-12.5 96.5zM455 273h-410q3 54 20 97t44.5 73.5t64 46.5t78.5 16q50 0 88 -18.5t63.5 -50.5t38.5 -74.5t13 -89.5z" />
<glyph unicode="f" horiz-adv-x="204" d="M0 494h87v-494h20v494h111v20h-111v107q0 38 14.5 55.5t62.5 17.5q11 0 22 -1t25 -3v20q-8 1 -18.5 2.5t-24.5 1.5q-16 0 -34 -2t-33 -10.5t-24.5 -25.5t-9.5 -48v-114h-87v-20z" />
<glyph unicode="g" horiz-adv-x="519" d="M446 172v-155q0 -96 -50.5 -140.5t-144.5 -44.5q-34 0 -65.5 8t-55.5 25t-38.5 44t-15.5 65h-20q1 -44 17 -74.5t43 -50t62 -28.5t74 -9q102 0 158 49.5t56 155.5v497h-20v-137h-2q-8 32 -25.5 59t-43 47t-57.5 31.5t-69 11.5q-54 0 -95.5 -20t-69.5 -54.5t-42 -80 t-14 -97.5q0 -49 13.5 -94t40 -78.5t66.5 -53.5t94 -20q33 0 65.5 9.5t60 28t48 45.5t28.5 61h2zM445 274q0 -46 -13.5 -87.5t-39 -72t-63.5 -48.5t-88 -18q-47 0 -83 17.5t-60.5 48t-37 71.5t-12.5 89q0 47 12.5 89t38 74t63 50.5t87.5 18.5q48 0 85 -19.5t61.5 -52 t37 -74.5t12.5 -86z" />
<glyph unicode="h" d="M55 714v-714h20v291q0 43 12 82t35.5 68.5t58.5 47t81 17.5q33 0 62.5 -9.5t52 -30t35.5 -52t13 -76.5v-338h20v341q0 45 -13.5 79.5t-38 58t-58 35.5t-73.5 12q-38 0 -69 -10.5t-54.5 -29.5t-39 -44t-22.5 -55h-2v327h-20z" />
<glyph unicode="i" horiz-adv-x="130" d="M75 613v101h-20v-101h20zM75 0v514h-20v-514h20z" />
<glyph unicode="j" horiz-adv-x="130" d="M75 613v101h-20v-101h20zM75 -74v588h-20v-581q0 -32 -5.5 -50t-17.5 -26.5t-32 -10.5t-48 -2v-20q29 0 52 2.5t39 13t24 31t8 55.5z" />
<glyph unicode="k" horiz-adv-x="444" d="M75 194l133 110l241 -304h27l-253 318l236 196h-29l-355 -295v495h-20v-714h20v194z" />
<glyph unicode="l" horiz-adv-x="130" d="M55 714v-714h20v714h-20z" />
<glyph unicode="m" horiz-adv-x="778" d="M55 514v-514h20v291q0 43 11.5 82t33 68.5t52.5 47t69 17.5q43 0 70 -14t42 -38t20.5 -56t5.5 -68v-330h20v326q0 36 11 68.5t32 57.5t51 39.5t67 14.5q42 0 69.5 -12t44 -34t23 -53t6.5 -69v-338h20v338q0 42 -8 76.5t-27 59t-50 38.5t-78 14q-60 0 -104 -33t-59 -87h-2 q-13 57 -53 90q-39 30 -94 30h-7q-30 0 -56.5 -10.5t-48.5 -29.5t-37 -44t-22 -55h-2v127h-20z" />
<glyph unicode="n" d="M55 514v-514h20v291q0 43 12 82t35.5 68.5t58.5 47t81 17.5q33 0 62.5 -9.5t52 -30t35.5 -52t13 -76.5v-338h20v341q0 45 -13.5 79.5t-38 58t-58 35.5t-73.5 12q-38 0 -69 -10.5t-54.5 -29.5t-39 -44t-22.5 -55h-2v127h-20z" />
<glyph unicode="o" horiz-adv-x="519" d="M48 257q0 48 13.5 93t40.5 79.5t66.5 55.5t91.5 21q51 0 90.5 -21t66.5 -55.5t40.5 -79.5t13.5 -93q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91.5 20.5t-66.5 55t-40.5 79.5t-13.5 94zM28 257q0 -53 15 -101.5t44.5 -85.5t72.5 -59t99 -22 q57 0 100 22t72.5 59t44.5 85.5t15 101.5t-15 101.5t-44.5 85.5t-72.5 59.5t-99 22.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5z" />
<glyph unicode="p" horiz-adv-x="537" d="M75 -176v320h2q18 -70 71 -112.5t135 -42.5q53 0 94 21.5t68.5 58.5t42 86t14.5 103q0 58 -15 107t-43.5 85t-69 56t-91.5 20q-39 0 -72.5 -11.5t-59.5 -32.5t-45 -49.5t-29 -62.5h-2v144h-20v-690h20zM283 8q-94 0 -151 64.5t-57 185.5q0 50 14 95t40.5 79t65.5 54 t88 20q50 0 87.5 -20t62 -54.5t37 -79t12.5 -94.5q0 -45 -11.5 -89.5t-35.5 -80t-61.5 -58t-90.5 -22.5z" />
<glyph unicode="hr/promise" horiz-adv-x="537" d="M455 258q0 -121 -57 -185.5t-151 -64.5q-52 0 -90 22.5t-62 58t-35.5 80t-11.5 89.5q0 50 12.5 94.5t37 79t62 54.5t87.5 20t88.5 -20t65 -54t40.5 -79t14 -95zM455 514v-144h-2q-10 34 -28.5 62.5t-45 49.5t-60 32.5t-72.5 11.5q-51 0 -91.5 -20t-69 -56t-43.5 -85 t-15 -107q0 -54 14.5 -103t42 -86t68.5 -58.5t94 -21.5q82 0 135 42.5t71 112.5h2v-320h20v690h-20z" />
<glyph unicode="r" horiz-adv-x="259" d="M75 0v291q0 42 12 82t37 70.5t64 48.5q32 14 76 14h15v20h-8q-41 0 -73 -10q-34 -11 -59 -30t-40 -44.5t-22 -54.5h-2v127h-20v-514h20z" />
<glyph unicode="s" horiz-adv-x="463" d="M390 362h20q0 86 -50 125t-136 39q-48 0 -81 -12t-54 -31t-30 -42t-9 -44q0 -42 15 -67t47 -39q22 -10 50 -18t65 -17l65 -16q32 -8 56.5 -21.5t40 -34.5t15.5 -55q0 -33 -15.5 -56t-39.5 -37.5t-53.5 -21t-57.5 -6.5q-91 0 -139.5 40.5t-48.5 127.5h-20q0 -97 52.5 -142 t155.5 -45q33 0 66.5 7.5t60 24.5t43 44t16.5 66q0 37 -14.5 60t-38 38t-53.5 23l-59 17l-73 19q-32 8 -59 19q-26 11 -41.5 31.5t-15.5 58.5q0 7 4 25t19 36.5t46 33t85 14.5q37 0 67.5 -8t52.5 -25.5t34 -44.5t12 -66z" />
<glyph unicode="t" horiz-adv-x="241" d="M110 494h116v20h-116v162h-20v-162h-94v-20h94v-398q0 -55 24.5 -75.5t59.5 -20.5q23 0 32 1l17 2v20q-5 -2 -17 -2.5t-27 -0.5q-12 0 -24 1.5t-22 9.5t-16.5 24t-6.5 45v394z" />
<glyph unicode="u" d="M445 0v514h-20v-291q0 -43 -12 -82t-35.5 -68.5t-58.5 -47t-81 -17.5q-33 0 -62.5 9.5t-52 30t-35.5 52t-13 76.5v338h-20v-341q0 -45 13.5 -79.5t38 -58t58 -35t73.5 -11.5q76 0 123.5 39t61.5 99h2v-127h20z" />
<glyph unicode="v" horiz-adv-x="407" d="M397 514l-184 -494h-2l-199 494h-23l211 -514h25l194 514h-22z" />
<glyph unicode="w" horiz-adv-x="685" d="M673 514l-156 -494h-2l-158 494h-31l-159 -494h-2l-153 494h-19l159 -514h28l161 494h2l160 -494h26l164 514h-20z" />
<glyph unicode="x" horiz-adv-x="407" d="M380 514l-177 -233l-173 233h-26l187 -248l-205 -266h24l193 251l194 -251h25l-206 266l188 248h-24z" />
<glyph unicode="y" horiz-adv-x="407" d="M398 514l-184 -487l-204 487h-21l214 -509l-37 -95q-9 -23 -19.5 -36.5t-24 -20t-32 -8t-44.5 -1.5v-20q23 0 43.5 1.5t37.5 8.5t31 21.5t24 40.5l237 618h-21z" />
<glyph unicode="z" horiz-adv-x="407" d="M402 20h-376l360 469v25h-354v-20h333l-360 -469v-25h397v20z" />
<glyph unicode="{" horiz-adv-x="333" d="M230 -176h50v20h-48q-14 0 -24.5 4.5t-17 16.5t-10 33.5t-3.5 54.5v161q0 57 -19.5 102.5t-52.5 61.5q19 8 32.5 26t22.5 41t13 48t4 47v164q0 62 12.5 84.5t42.5 22.5h48v20h-50q-42 0 -57.5 -26t-15.5 -83v-165q0 -30 -5 -59t-14.5 -52t-22.5 -38t-30 -18v-20 q44 -29 58 -70.5t14 -102.5v-162q0 -57 15.5 -84t57.5 -27z" />
<glyph unicode="|" horiz-adv-x="222" d="M101 -213h20v999h-20v-999z" />
<glyph unicode="}" horiz-adv-x="333" d="M103 731h-50v-20h48q14 0 24.5 -4.5t17 -16.5t10 -33.5t3.5 -54.5v-162q0 -57 19.5 -102.5t52.5 -61.5q-19 -8 -32.5 -26t-22.5 -41t-13 -48t-4 -47v-163q0 -62 -12.5 -84.5t-42.5 -22.5h-48v-20h50q42 0 57.5 26t15.5 83v164q0 30 5 59t14.5 52t23 38t29.5 18v20 q-44 28 -58 70t-14 103v163q0 57 -15.5 84t-57.5 27z" />
<glyph unicode="~" horiz-adv-x="600" d="M523 295l-20 6l-18 -26q-9 -13 -19.5 -23t-23 -16.5t-27.5 -6.5q-20 0 -47 11l-56 24q-29 14 -60 25q-25 9 -49 9h-8q-42 0 -70.5 -26t-47.5 -61l20 -6q18 32 41 52.5t57 20.5q39 0 67 -12l55 -25l49 -21q23 -11 48 -11q20 0 35.5 7.5t28.5 19.5t24 27.5t21 31.5z" />
<glyph unicode="&#xa1;" horiz-adv-x="185" d="M103 360h-20v-536h20v536zM103 542h-20v-98h20v98z" />
<glyph unicode="&#xa2;" horiz-adv-x="556" d="M292 8v497q35 -1 65.5 -10.5t54 -27.5t39 -45.5t21.5 -63.5h20q-5 41 -22 71.5t-43.5 51.5t-61 32t-73.5 12v88h-20v-88q-53 -2 -93 -25.5t-66.5 -60.5t-40 -84t-13.5 -97q0 -52 13 -99.5t39.5 -84.5t66.5 -60t94 -25v-109h20v109q83 1 138.5 49.5t66.5 136.5h-20 q-4 -36 -19 -66.5t-38.5 -53t-54.5 -35t-68 -12.5h-5zM272 505v-497q-49 2 -85.5 24t-60.5 57t-35.5 79t-11.5 90q0 45 11.5 88.5t35.5 78t60.5 56.5t85.5 24z" />
<glyph unicode="&#xa3;" horiz-adv-x="556" d="M296 365h-158q-10 20 -22.5 42t-24 45t-19 46.5t-7.5 46.5q0 44 17.5 75.5t46.5 51.5t66 29.5t76 9.5q50 0 91 -15t69 -44.5t41 -72.5q10 -31 10 -70q0 -14 -1 -29h20q2 18 2 35q0 37 -9 69q-14 47 -44.5 79.5t-76 50t-102.5 17.5q-43 0 -84 -11t-72.5 -34t-50.5 -58 t-19 -83q0 -23 7.5 -47t18 -47t22.5 -45l22 -41h-66v-20h76q15 -26 23.5 -62t8.5 -74q0 -60 -34.5 -112t-83.5 -94l18 -19q29 22 59.5 35.5t65.5 13.5q23 0 46.5 -8.5t48.5 -16.5q25 -9 50 -16.5t50 -7.5q46 0 84 19t82 69l-13 14l-36 -33q-17 -15 -35 -26.5t-38 -17.5 t-44 -6q-23 0 -47 8t-49 18l-49 16q-25 8 -50 8q-31 0 -57 -11.5t-45 -25.5l-2 2q46 39 72.5 86.5t26.5 104.5q0 35 -6.5 70t-23.5 66h149v20z" />
<glyph unicode="&#xa4;" horiz-adv-x="556" d="M506 340q0 -47 -18 -88.5t-49 -72.5t-72.5 -49t-88.5 -18t-88.5 18t-72.5 49t-49 72.5t-18 88.5t18 88.5t49 72.5t72.5 49t88.5 18t88.5 -18t72.5 -49t49 -72.5t18 -88.5zM503 579l-57 -57q-35 33 -78.5 49.5t-89.5 16.5q-45 0 -88.5 -16.5t-79.5 -49.5l-57 57l-14 -14 l57 -57q-32 -35 -48.5 -78.5t-17.5 -89.5q0 -45 16.5 -88.5t49.5 -79.5l-57 -57l14 -14l57 57q36 -33 79.5 -49.5t88.5 -16.5q46 1 89.5 17.5t78.5 48.5l57 -57l14 14l-57 57q33 36 49.5 79.5t16.5 88.5q0 46 -16.5 89.5t-49.5 78.5l57 57z" />
<glyph unicode="&#xa5;" horiz-adv-x="556" d="M287 203v102h147v20h-136l237 389h-22l-234 -383h-2l-234 383h-22l237 -389h-138v-20h147v-102h-147v-20h147v-183h20v183h147v20h-147z" />
<glyph unicode="&#xa6;" horiz-adv-x="222" d="M121 661h-20v-250h20v250zM121 -88v249h-20v-249h20z" />
<glyph unicode="&#xa7;" horiz-adv-x="556" d="M479 205q0 -26 -12.5 -47.5t-30.5 -37t-38 -25.5t-35 -13l-40 27l-48 31l-51 33l-47 30q-35 22 -55 42.5t-30 38t-12.5 32.5t-2.5 26q0 32 12.5 55.5t30 39.5t35.5 25.5t29 12.5l27 -15l36 -20l37 -22t30 -19q51 -33 83 -58t50.5 -47t25 -43t6.5 -46zM422 546h20 q0 42 -12 76t-34 58t-54 37.5t-71 13.5q-20 0 -47 -5t-52 -19.5t-42 -40.5t-17 -68t16.5 -67t36.5 -42q-21 -8 -40.5 -21.5t-34.5 -31.5t-24.5 -40t-9.5 -46q0 -21 3.5 -40t15 -38.5t32.5 -40t57 -44.5l93 -59q49 -30 83 -54q27 -19 42.5 -34t24 -29t11 -29.5t2.5 -35.5 q0 -17 -8 -37t-25 -37t-44 -28.5t-66 -11.5q-84 1 -120 49t-35 124h-20v-8q0 -88 44 -135q46 -50 131 -50q31 0 59 8t50 24.5t36.5 41.5t17.5 60v9q0 26 -9 51q-11 30 -50 62q15 4 35.5 16t38.5 29.5t30.5 40.5t12.5 50q0 30 -7 53.5t-26.5 47.5t-53 50.5t-87.5 60.5 q-21 13 -37 22l-33 18l-31 18q-16 10 -34 23q-23 17 -39 39t-18 60v8q0 29 12 48q14 22 35 35t45.5 18.5t43.5 5.5q75 0 113 -43.5t40 -121.5z" />
<glyph unicode="&#xa8;" horiz-adv-x="130" d="M133 590h20v81h-20v-81zM-22 590h20v81h-20v-81z" />
<glyph unicode="&#xa9;" horiz-adv-x="800" d="M46 357q0 73 27.5 137.5t75.5 112.5t112.5 76t138.5 28q73 0 137.5 -28t112.5 -76t76 -112.5t28 -137.5q0 -74 -28 -138.5t-76 -112.5t-112.5 -75.5t-137.5 -27.5q-74 0 -138.5 27.5t-112.5 75.5t-75.5 112.5t-27.5 138.5zM26 357q0 -78 29.5 -146t80 -118.5t118.5 -79.5 t146 -29t146 29t118.5 79.5t80 118.5t29.5 146t-29.5 146t-80 118.5t-118.5 80t-146 29.5t-146 -29.5t-118.5 -80t-80 -118.5t-29.5 -146zM573 428h20q-5 36 -21 64.5t-41 47.5t-56.5 29t-66.5 10q-51 0 -91.5 -17t-68 -47.5t-42.5 -72t-15 -91.5q0 -49 15.5 -91t44 -73 t69.5 -49t91 -18q69 0 117.5 43.5t64.5 112.5h-20q-16 -66 -61.5 -101t-100.5 -35q-47 0 -84 16.5t-63 45.5t-39.5 67.5t-13.5 82.5t13 82t38.5 65.5t62 43.5t83.5 16q30 0 57.5 -8t50 -24.5t37.5 -41t20 -57.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="300" d="M300 374v20q-13 -2 -23.5 0t-10.5 19v190q-2 50 -35 69.5t-82 19.5q-60 0 -91.5 -27.5t-36.5 -76.5h20q5 39 31 61.5t77 22.5t74 -18t23 -63q0 -18 -10.5 -27t-28 -12.5t-39.5 -4t-45 -1.5q-23 -2 -45 -5.5t-39.5 -13.5t-28 -28t-10.5 -48q0 -22 9.5 -38t25 -26.5 t35.5 -15t42 -4.5q54 0 87.5 19.5t44.5 52.5v7h2v-41q0 -17 10.5 -24t24.5 -7h19zM246 552v-48q0 -49 -34 -83t-100 -34q-17 0 -33.5 3.5t-29.5 11t-21 19.5t-8 30q1 29 15.5 44.5t37 22.5t49.5 8l52 4q25 1 44 5.5t26 16.5h2z" />
<glyph unicode="&#xab;" horiz-adv-x="352" d="M262 121v35l-83 112l83 112v35l-103 -139v-16zM169 121v35l-83 112l83 112v35l-103 -139v-16z" />
<glyph unicode="&#xac;" horiz-adv-x="600" d="M532 340v-247h20v267h-504v-20h484z" />
<glyph unicode="&#xad;" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
<glyph unicode="&#xae;" horiz-adv-x="800" d="M46 357q0 73 27.5 137.5t75.5 112.5t112.5 76t138.5 28q73 0 137.5 -28t112.5 -76t76 -112.5t28 -137.5q0 -74 -28 -138.5t-76 -112.5t-112.5 -75.5t-137.5 -27.5q-74 0 -138.5 27.5t-112.5 75.5t-75.5 112.5t-27.5 138.5zM26 357q0 -78 29.5 -146t80 -118.5t118.5 -79.5 t146 -29t146 29t118.5 79.5t80 118.5t29.5 146t-29.5 146t-80 118.5t-118.5 80t-146 29.5t-146 -29.5t-118.5 -80t-80 -118.5t-29.5 -146zM398 354h-104v191h119q24 0 46.5 -4t39.5 -14.5t27.5 -29t10.5 -48.5q0 -32 -13.5 -51t-34 -28.5t-45 -12.5t-46.5 -3zM274 565v-430 h20v199h98h15h8q4 0 8 1l129 -200h25l-132 202q23 2 43 9.5t35.5 21t24.5 34t9 47.5q0 55 -34.5 85.5t-107.5 30.5h-141z" />
<glyph unicode="&#xaf;" horiz-adv-x="130" d="M181 628v20h-231v-20h231z" />
<glyph unicode="&#xb0;" horiz-adv-x="400" d="M343 549q0 29 -11 55t-30.5 45.5t-45.5 31t-56 11.5t-56 -11.5t-45.5 -31t-30.5 -45.5t-11 -55q0 -31 11 -57.5t30.5 -46t45.5 -30.5t56 -11t56.5 11.5t45.5 31t30 46t11 56.5zM323 549q0 -26 -9.5 -49t-26 -40t-39 -26.5t-48.5 -9.5q-25 0 -47 9.5t-39 26t-27 39.5 t-10 50q0 24 10 46t27 39.5t39 27.5t47 10q27 0 49.5 -10t39 -27t25.5 -39t9 -47z" />
<glyph unicode="&#xb1;" horiz-adv-x="600" d="M48 20v-20h504v20h-504zM290 506v-198h-242v-20h242v-198h20v198h242v20h-242v198h-20z" />
<glyph unicode="&#xb2;" horiz-adv-x="333" d="M316 297h-275q1 15 12.5 30.5t29.5 31.5t41 31l48 32q41 27 67 48.5t40.5 41t19.5 37.5t5 39q0 27 -10.5 47t-29 32.5t-43 18.5t-53.5 6q-77 0 -108.5 -36.5t-33.5 -104.5h20q-1 57 27.5 89t94.5 32q51 0 83.5 -20.5t32.5 -63.5q0 -25 -10.5 -46t-28 -39.5t-40.5 -35 t-48 -32.5l-50 -33q-25 -16 -44.5 -34t-32 -40t-12.5 -51h298v20z" />
<glyph unicode="&#xb3;" horiz-adv-x="333" d="M24 559h20q0 60 33.5 86.5t96.5 26.5q23 0 44.5 -3t38 -12t27 -24.5t10.5 -40.5q0 -24 -10 -40.5t-27 -26t-38 -14t-44 -4.5h-26v-21h24q24 0 47.5 -4.5t41.5 -15.5t29 -29.5t11 -46.5q0 -25 -11 -43.5t-29 -31t-41.5 -19t-48.5 -6.5q-66 0 -106 31q-36 28 -36 80 q0 7 1 14h-20v-11q0 -62 41 -96q44 -38 121 -38q30 0 57 8t47.5 23.5t32.5 38t12 50.5q0 26 -9 45t-24 32t-35 19.5t-42 8.5v2q45 0 73.5 26.5t28.5 68.5q0 30 -12.5 49t-32.5 30.5t-44.5 16t-49.5 4.5q-33 0 -61 -8.5t-48.5 -25.5t-31.5 -42q-10 -22 -10 -52v-5z" />
<glyph unicode="&#xb4;" horiz-adv-x="130" d="M171 731h-29l-132 -144h15z" />
<glyph unicode="&#xb5;" horiz-adv-x="556" d="M472 0v514h-20v-291q0 -43 -12 -82t-35.5 -68.5t-58.5 -47t-81 -17.5q-33 0 -62.5 9.5t-52 30t-35.5 52t-13 76.5v338h-19v-690h20v257h2q23 -51 66 -71.5t94 -20.5q76 0 123.5 39t61.5 99h2v-127h20z" />
<glyph unicode="&#xb6;" horiz-adv-x="600" d="M491 714h-202q-106 0 -164.5 -50t-58.5 -146q0 -39 16 -73.5t45.5 -60.5t70.5 -41t90 -15v-467h20v833h163v-833h20v853z" />
<glyph unicode="&#xb7;" horiz-adv-x="278" d="M107 340q0 -14 9 -23t23 -9t23 9t9 23t-9 23t-23 9t-23 -9t-9 -23z" />
<glyph unicode="&#xb8;" horiz-adv-x="130" d="M-15 -146l-9 -19q14 -5 34.5 -11t46.5 -6q20 0 37.5 3t31 11.5t21.5 22.5t8 36q0 33 -23 46.5t-52 13.5q-14 0 -20 -2.5t-13 -3.5l41 55h-20l-57 -72l15 -10q22 13 54 13q8 0 17.5 -2.5t17.5 -7t14 -12.5t6 -18q0 -15 -7 -25.5t-18 -16.5t-25 -8.5t-28 -2.5q-20 0 -38 5 t-34 11z" />
<glyph unicode="&#xb9;" horiz-adv-x="333" d="M181 662v-385h20v408h-22q-27 -29 -52 -46.5t-65 -29.5v-19q32 9 65.5 27.5t51.5 44.5h2z" />
<glyph unicode="&#xba;" horiz-adv-x="300" d="M20 531q0 26 9 51.5t25.5 45.5t41 32t55.5 12t55 -12t40.5 -32t25.5 -45.5t9 -51.5q0 -27 -9 -53t-25.5 -46t-40.5 -32.5t-55 -12.5t-55.5 12.5t-41 32.5t-25.5 46t-9 53zM0 531q0 -32 10 -61.5t29 -52.5t47 -36.5t64 -13.5q38 0 66 13.5t47 36.5t28.5 52.5t9.5 61.5 t-9.5 61t-28.5 51t-47 35.5t-65 13.5t-65 -13.5t-47 -35.5t-29 -51t-10 -61z" />
<glyph unicode="&#xbb;" horiz-adv-x="352" d="M90 415v-35l83 -112l-83 -112v-35l103 139v16zM183 415v-35l83 -112l-83 -112v-35l103 139v16z" />
<glyph unicode="&#xbc;" horiz-adv-x="834" d="M221 662v-385h20v408h-22q-27 -29 -52 -46.5t-65 -29.5v-19q32 9 65.5 27.5t51.5 44.5h2zM620 714l-476 -747h23l476 747h-23zM635 381v-259h-200l198 257zM414 102h221v-102h20v102h76v20h-76v286h-25l-216 -281v-25z" />
<glyph unicode="&#xbd;" horiz-adv-x="834" d="M770 20h-275q1 15 12.5 30.5t29.5 31.5t41 32l48 31q41 27 67 48.5t40.5 41t19.5 37.5t5 39q0 27 -10.5 47t-29 32.5t-43 18.5t-53.5 6q-77 0 -108.5 -36.5t-33.5 -104.5h20q-1 57 27.5 89t94.5 32q51 0 83.5 -20.5t32.5 -63.5q0 -25 -10.5 -46t-28 -39.5t-40.5 -35 t-48 -32.5l-50 -33q-25 -16 -44.5 -34t-32 -40t-12.5 -51h298v20zM184 662v-385h20v408h-22q-27 -29 -52 -46.5t-65 -29.5v-19q32 9 65.5 27.5t51.5 44.5h2zM573 714l-476 -747h23l476 747h-23z" />
<glyph unicode="&#xbe;" horiz-adv-x="834" d="M68 559h20q0 60 33.5 86.5t96.5 26.5q23 0 44.5 -3t38 -12t27 -24.5t10.5 -40.5q0 -24 -10 -40.5t-27 -26t-38 -14t-44 -4.5h-26v-21q4 1 12 1h12q24 0 47.5 -4.5t41.5 -16t29 -30t11 -46.5q0 -25 -11 -43.5t-29 -31t-41.5 -19t-48.5 -6.5q-66 0 -106 31q-36 28 -36 80 q0 7 1 14h-20v-11q0 -62 41 -96q44 -38 121 -38q30 0 57 8t47.5 23.5t32.5 38t12 50.5q0 26 -9 45t-24 32t-35 19.5t-42 8.5v2q45 0 73.5 26.5t28.5 68.5q0 30 -12.5 49t-32.5 30.5t-44.5 16t-49.5 4.5q-33 0 -61 -8.5t-48.5 -25.5t-31.5 -42q-10 -22 -10 -52v-5zM674 714 l-476 -747h23l476 747h-23zM683 381v-259h-200l198 257zM462 102h221v-102h20v102h76v20h-76v286h-25l-216 -281v-25z" />
<glyph unicode="&#xbf;" d="M268 542h-20v-98h20v98zM465 49h-20v-14q0 -40 -10 -74q-12 -40 -37 -68.5t-62.5 -44.5t-87.5 -16q-38 0 -70.5 9.5t-56 28t-37 46t-13.5 62.5q0 38 13 67t30 50t33 34t22 19q28 27 47 51t30 48.5t16 51.5t5 61h-20q0 -36 -5.5 -63t-17 -49.5t-30.5 -44t-46 -47.5 l-28 -26q-17 -16 -32.5 -37t-26 -49.5t-10.5 -65.5q0 -40 15.5 -71t42 -52t62.5 -32t77 -11q53 0 94 17.5t69 49t42 75.5q12 38 12 82v13z" />
<glyph unicode="&#xc0;" horiz-adv-x="575" d="M185 909l139 -144h15l-125 144h-29zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
<glyph unicode="&#xc1;" horiz-adv-x="575" d="M394 909h-29l-132 -144h15zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
<glyph unicode="&#xc2;" horiz-adv-x="575" d="M389 770h20l-114 139h-15l-113 -139h20l99 123zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
<glyph unicode="&#xc3;" horiz-adv-x="575" d="M156 780h20q0 9 3.5 19.5t10 19.5t15.5 14.5t19 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25.5 -7t-22 -18.5t-15 -25.5t-5.5 -28zM106 235h364l94 -235h22l-282 714h-26l-289 -714 h22zM462 255h-348l176 439h2z" />
<glyph unicode="&#xc4;" horiz-adv-x="575" d="M356 768h20v81h-20v-81zM200 768h20v81h-20v-81zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
<glyph unicode="&#xc5;" horiz-adv-x="575" d="M356 824q0 -28 -20 -48t-48 -20t-48 20t-20 48t20 48t48 20t48 -20t20 -48zM376 824q0 18 -7 34t-19 28t-28 19t-34 7t-34 -7t-28 -19t-19 -28t-7 -34t7 -34t19 -28t28 -19t34 -7t34 7t28 19t19 28t7 34zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255 h-348l176 439h2z" />
<glyph unicode="&#xc6;" horiz-adv-x="852" d="M376 696h47v-402h-258zM155 274h268v-274h412v20h-392v342h360v20h-360v312h392v20h-469l-377 -714h21z" />
<glyph unicode="&#xc7;" horiz-adv-x="685" d="M626 500h20q-1 33 -19 73t-53.5 75.5t-88.5 59t-124 23.5q-91 0 -155 -35t-104 -90t-58.5 -122.5t-18.5 -132.5q0 -78 22.5 -144t63 -114.5t97 -76.5t124.5 -31l-44 -57l15 -10q22 13 54 13q8 0 17.5 -2.5t17.5 -7t14 -12.5t6 -18q0 -15 -7 -25.5t-18 -16.5t-25 -8.5 t-28 -2.5q-20 0 -38 5t-35 11l-9 -19q14 -5 35 -11t47 -6q20 0 37.5 3t31 11.5t21.5 22.5t8 36q0 33 -23 46.5t-52 13.5q-14 0 -20 -2.5t-13 -3.5l29 39q66 1 119.5 23t92.5 61t63.5 93t33.5 119h-20q-8 -59 -31 -110t-60 -88t-88 -58t-115 -21q-72 0 -128.5 29t-95.5 77 t-59 111t-20 131q0 56 16.5 119t53.5 116.5t97.5 89t148.5 35.5q58 0 105.5 -18.5t82 -48.5t54.5 -67.5t23 -76.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="537" d="M166 909l139 -144h15l-125 144h-29zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
<glyph unicode="&#xc9;" horiz-adv-x="537" d="M375 909h-29l-132 -144h15zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
<glyph unicode="&#xca;" horiz-adv-x="537" d="M370 770h20l-114 139h-15l-113 -139h20l99 123zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
<glyph unicode="&#xcb;" horiz-adv-x="537" d="M337 768h20v81h-20v-81zM181 768h20v81h-20v-81zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
<glyph unicode="&#xcc;" horiz-adv-x="128" d="M-38 909l138 -144h15l-124 144h-29zM54 714v-714h20v714h-20z" />
<glyph unicode="&#xcd;" horiz-adv-x="128" d="M170 909h-29l-132 -144h15zM54 714v-714h20v714h-20z" />
<glyph unicode="&#xce;" horiz-adv-x="128" d="M165 770h20l-114 139h-15l-112 -139h20l98 123zM54 714v-714h20v714h-20z" />
<glyph unicode="&#xcf;" horiz-adv-x="128" d="M132 768h20v81h-20v-81zM-23 768h20v81h-20v-81zM54 714v-714h20v714h-20z" />
<glyph unicode="&#xd0;" horiz-adv-x="648" d="M74 362h297v20h-297v312h225q54 0 105.5 -15t92.5 -53.5t66 -103.5t25 -165q0 -86 -24.5 -149.5t-67 -105t-99 -62t-119.5 -20.5h-204v342zM-9 362h63v-362h219q65 0 125 20t107 62.5t75 110.5t28 164q0 105 -27.5 174t-71 109.5t-98 57t-107.5 16.5h-250v-332h-63v-20z " />
<glyph unicode="&#xd1;" horiz-adv-x="648" d="M192 780h20q0 9 3.5 19.5t10 19.5t15.5 14.5t19 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25.5 -7t-22 -18.5t-15 -25.5t-5.5 -28zM54 714v-714h20v689h2l488 -689h30v714h-20v-689 h-2l-488 689h-30z" />
<glyph unicode="&#xd2;" horiz-adv-x="721" d="M258 909l139 -144h15l-125 144h-29zM32 357q0 -76 21.5 -144t63 -119t103 -80.5t141.5 -29.5t141.5 29.5t103 80.5t63 119t21.5 144t-21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144zM52 357q1 77 22.5 142t61 112t96.5 73.5t129 26.5 t129 -26.5t96.5 -73.5t61 -112t22.5 -142q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5t-129 -26.5t-129 26.5t-96.5 73.5t-61 112t-22.5 142z" />
<glyph unicode="&#xd3;" horiz-adv-x="721" d="M467 909h-29l-132 -144h15zM32 357q0 -76 21.5 -144t63 -119t103 -80.5t141.5 -29.5t141.5 29.5t103 80.5t63 119t21.5 144t-21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144zM52 357q1 77 22.5 142t61 112t96.5 73.5t129 26.5t129 -26.5 t96.5 -73.5t61 -112t22.5 -142q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5t-129 -26.5t-129 26.5t-96.5 73.5t-61 112t-22.5 142z" />
<glyph unicode="&#xd4;" horiz-adv-x="721" d="M462 770h20l-114 139h-15l-113 -139h20l99 123zM32 357q0 -76 21.5 -144t63 -119t103 -80.5t141.5 -29.5t141.5 29.5t103 80.5t63 119t21.5 144t-21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144zM52 357q1 77 22.5 142t61 112t96.5 73.5 t129 26.5t129 -26.5t96.5 -73.5t61 -112t22.5 -142q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5t-129 -26.5t-129 26.5t-96.5 73.5t-61 112t-22.5 142z" />
<glyph unicode="&#xd5;" horiz-adv-x="721" d="M229 780h20q0 9 3.5 19.5t10 19.5t15.5 14.5t19 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25.5 -7t-22 -18.5t-15 -25.5t-5.5 -28zM32 357q0 -76 21.5 -144t63 -119t103 -80.5 t141.5 -29.5t141.5 29.5t103 80.5t63 119t21.5 144t-21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144zM52 357q1 77 22.5 142t61 112t96.5 73.5t129 26.5t129 -26.5t96.5 -73.5t61 -112t22.5 -142q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5 t-129 -26.5t-129 26.5t-96.5 73.5t-61 112t-22.5 142z" />
<glyph unicode="&#xd6;" horiz-adv-x="721" d="M429 768h20v81h-20v-81zM273 768h20v81h-20v-81zM32 357q0 -76 21.5 -144t63 -119t103 -80.5t141.5 -29.5t141.5 29.5t103 80.5t63 119t21.5 144t-21.5 144t-63 119t-103 81t-141.5 30t-141.5 -30t-103 -81t-63 -119t-21.5 -144zM52 357q1 77 22.5 142t61 112t96.5 73.5 t129 26.5t129 -26.5t96.5 -73.5t61 -112t22.5 -142q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5t-129 -26.5t-129 26.5t-96.5 73.5t-61 112t-22.5 142z" />
<glyph unicode="&#xd7;" horiz-adv-x="600" d="M96 443l190 -190l-190 -190l14 -14l189 191l191 -191l14 14l-191 190l191 190l-14 13l-191 -191l-189 191z" />
<glyph unicode="&#xd8;" horiz-adv-x="721" d="M113 98l-73 -81l15 -12l71 79q42 -48 100.5 -74t134.5 -26q80 0 141.5 29.5t103 80.5t63 119t21.5 144t-20 142.5t-62 117.5l61 68l-15 12l-59 -65q-42 46 -100.5 72.5t-133.5 26.5q-80 0 -141.5 -30t-103 -81t-63 -119t-21.5 -144q0 -75 20.5 -141.5t60.5 -117.5z M140 99l454 502q74 -93 76 -244q-1 -77 -22.5 -142t-61 -112t-96.5 -73.5t-129 -26.5t-127 25t-94 71zM581 617l-454 -503q-73 93 -75 243q1 77 22.5 142t61 112t96.5 73.5t129 26.5q70 0 125 -24.5t95 -69.5z" />
<glyph unicode="&#xd9;" horiz-adv-x="632" d="M213 909l139 -144h15l-125 144h-29zM558 714v-448q0 -129 -59 -196t-183 -67t-183 67t-59 196v448h-20v-448q0 -144 67 -213t195 -69t195 69t67 213v448h-20z" />
<glyph unicode="&#xda;" horiz-adv-x="632" d="M422 909h-29l-132 -144h15zM558 714v-448q0 -129 -59 -196t-183 -67t-183 67t-59 196v448h-20v-448q0 -144 67 -213t195 -69t195 69t67 213v448h-20z" />
<glyph unicode="&#xdb;" horiz-adv-x="632" d="M417 770h20l-114 139h-15l-113 -139h20l99 123zM558 714v-448q0 -129 -59 -196t-183 -67t-183 67t-59 196v448h-20v-448q0 -144 67 -213t195 -69t195 69t67 213v448h-20z" />
<glyph unicode="&#xdc;" horiz-adv-x="632" d="M384 768h20v81h-20v-81zM228 768h20v81h-20v-81zM558 714v-448q0 -129 -59 -196t-183 -67t-183 67t-59 196v448h-20v-448q0 -144 67 -213t195 -69t195 69t67 213v448h-20z" />
<glyph unicode="&#xdd;" horiz-adv-x="538" d="M375 931h-29l-132 -144h15zM544 714l-275 -392l-273 392h-25l288 -413v-301h20v301l289 413h-24z" />
<glyph unicode="&#xde;" horiz-adv-x="574" d="M343 590h-269v124h-20v-714h20v201h259q50 0 91.5 12.5t71.5 37t47 61t17 83.5q0 97 -57 146t-160 49zM74 221v349h269q100 0 148.5 -45t48.5 -130q0 -42 -15 -74t-41.5 -54.5t-62.5 -34t-78 -11.5h-269z" />
<glyph unicode="&#xdf;" horiz-adv-x="481" d="M202 407v-20q50 0 92.5 -7t73 -26.5t47.5 -54t17 -89.5q0 -57 -17 -95t-47.5 -60t-72.5 -30q-31 -6 -66 -6q-13 0 -27 1v-20h17q60 0 102 12q48 15 77 42.5t41.5 67t12.5 88.5q0 79 -38.5 129.5t-125.5 58.5v2q64 11 95.5 54.5t31.5 106.5q0 39 -15.5 69.5t-41 52 t-58.5 32.5t-69 11q-32 0 -63.5 -8.5t-56.5 -28.5t-40.5 -52.5t-15.5 -80.5v-556h20v553q0 52 17 82.5t41.5 46t51.5 20t46 4.5q34 0 64 -10t52 -28.5t35 -45.5t13 -61q0 -44 -16 -74t-42.5 -48t-61.5 -25q-31 -7 -64 -7h-9z" />
<glyph unicode="&#xe0;" horiz-adv-x="481" d="M138 709l139 -144h15l-125 144h-29zM54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5t60.5 28.5 t44 41t25.5 48h2v-67q0 -29 16.5 -39.5t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5t-6 22v327q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17 q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5t31 21.5h2z" />
<glyph unicode="&#xe1;" horiz-adv-x="481" d="M347 709h-29l-132 -144h15zM54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5t60.5 28.5t44 41 t25.5 48h2v-67q0 -29 16.5 -39.5t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5t-6 22v327q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17 q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5t31 21.5h2z" />
<glyph unicode="&#xe2;" horiz-adv-x="481" d="M342 570h20l-114 139h-15l-113 -139h20l99 123zM54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5 t60.5 28.5t44 41t25.5 48h2v-67q0 -29 16.5 -39.5t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5t-6 22v327q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17 q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5t31 21.5h2z" />
<glyph unicode="&#xe3;" horiz-adv-x="481" d="M109 580h20q0 9 3.5 19.5t10 19.5t15.5 14.5t19 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25.5 -7t-22 -18.5t-15 -25.5t-5.5 -28zM54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5 t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5t60.5 28.5t44 41t25.5 48h2v-67q0 -29 16.5 -39.5t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5 t-6 22v327q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5 t48 11.5t31 21.5h2z" />
<glyph unicode="&#xe4;" horiz-adv-x="481" d="M309 568h20v81h-20v-81zM153 568h20v81h-20v-81zM54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5 t60.5 28.5t44 41t25.5 48h2v-67q0 -29 16.5 -39.5t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5t-6 22v327q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17 q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5t31 21.5h2z" />
<glyph unicode="&#xe5;" horiz-adv-x="481" d="M309 674q0 -28 -20 -48t-48 -20t-48 20t-20 48t20 48t48 20t48 -20t20 -48zM329 674q0 18 -7 34t-19 28t-28 19t-34 7t-34 -7t-28 -19t-19 -28t-7 -34t7 -34t19 -28t28 -19t34 -7t34 7t28 19t19 28t7 34zM54 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5 t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q40 0 74 10.5t60.5 28.5t44 41t25.5 48h2v-67q0 -29 16.5 -39.5t38.5 -10.5h30v20q-10 -1 -21.5 -1.5t-21.5 2t-16 9.5t-6 22v327 q-1 42 -15 70t-37 45.5t-53.5 24.5t-64.5 7q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM400 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5 t31 21.5h2z" />
<glyph unicode="&#xe6;" horiz-adv-x="889" d="M64 355h20q5 72 50 111.5t126 39.5q51 0 81 -13.5t45.5 -34.5t19.5 -46t4 -48q0 -29 -11.5 -44.5t-36 -23t-62.5 -10t-91 -5.5q-32 -2 -64 -8.5t-57 -23t-40.5 -45.5t-15.5 -77q0 -69 47 -103.5t125 -34.5q41 0 77 11t64.5 32.5t48 52.5t27.5 70h2q20 -81 74 -124 q53 -42 134 -42h4q45 0 83.5 13.5t67 38.5t46.5 60t22 77h-20q-5 -42 -22.5 -73.5t-44 -53t-60.5 -32.5t-72 -11q-55 0 -93.5 19t-62.5 52.5t-35.5 78t-13.5 95.5h427v15q0 46 -11 88q-12 50 -39 87.5t-69 60t-101 22.5q-40 0 -73.5 -11.5t-59.5 -31.5t-44 -47.5t-28 -59.5 h-2q-1 43 -15 72t-37 46t-53.5 24.5t-64.5 7.5q-48 0 -83.5 -13t-60 -36t-37.5 -54.5t-15 -67.5zM410 302v-95q0 -38 -13.5 -74t-40 -63.5t-65.5 -44.5t-89 -17q-42 0 -70.5 10.5t-46.5 27t-25.5 38t-7.5 43.5q0 41 13 66.5t35 40t50.5 20t58.5 7.5t61.5 3t58.5 5t48 11.5 t31 21.5h2zM837 273h-407q4 53 19 96t41 73.5t63 47t84 16.5q51 0 88.5 -18.5t62 -50t37 -74t12.5 -90.5z" />
<glyph unicode="&#xe7;" d="M469 175h-20q-3 -39 -19 -69.5t-41.5 -52.5t-58.5 -33.5t-71 -11.5q-51 0 -90 19.5t-65 52.5t-39.5 76t-13.5 90q0 45 11.5 91.5t37 84t68 61t103.5 23.5q32 0 61 -9t52 -27.5t39 -46t22 -65.5h20q-5 41 -22.5 72.5t-43.5 52.5t-59 32t-69 11q-61 0 -106.5 -23t-75 -61.5 t-44 -89t-14.5 -106.5q0 -51 14 -96.5t41.5 -80t67.5 -55.5t91 -23l-49 -63l15 -10q22 13 54 13q8 0 17.5 -2.5t17.5 -7t14 -12.5t6 -18q0 -15 -7 -25.5t-18 -16.5t-25 -8.5t-28 -2.5q-20 0 -38 5t-35 11l-9 -19q14 -5 35 -11t47 -6q20 0 37.5 3t31 11.5t21.5 22.5t8 36 q0 33 -23 46.5t-52 13.5q-14 0 -20 -2.5t-13 -3.5l33 45q85 2 140.5 50t63.5 135z" />
<glyph unicode="&#xe8;" d="M147 709l139 -144h15l-125 144h-29zM45 253h430v15q0 45 -11 87q-12 49 -39.5 87t-71 61t-103.5 23q-43 0 -84 -18t-72 -52.5t-50 -84.5t-19 -114q0 -57 13 -106.5t40 -86t70 -56.5q40 -19 96 -19h6q88 0 148 49.5t71 139.5h-20q-13 -85 -66.5 -127.5t-134.5 -42.5 q-55 0 -93 19t-62 52t-35.5 77.5t-12.5 96.5zM455 273h-410q3 54 20 97t44.5 73.5t64 46.5t78.5 16q50 0 88 -18.5t63.5 -50.5t38.5 -74.5t13 -89.5z" />
<glyph unicode="&#xe9;" d="M356 709h-29l-132 -144h15zM45 253h430v15q0 45 -11 87q-12 49 -39.5 87t-71 61t-103.5 23q-43 0 -84 -18t-72 -52.5t-50 -84.5t-19 -114q0 -57 13 -106.5t40 -86t70 -56.5q40 -19 96 -19h6q88 0 148 49.5t71 139.5h-20q-13 -85 -66.5 -127.5t-134.5 -42.5q-55 0 -93 19 t-62 52t-35.5 77.5t-12.5 96.5zM455 273h-410q3 54 20 97t44.5 73.5t64 46.5t78.5 16q50 0 88 -18.5t63.5 -50.5t38.5 -74.5t13 -89.5z" />
<glyph unicode="&#xea;" d="M351 570h20l-114 139h-15l-113 -139h20l99 123zM45 253h430v15q0 45 -11 87q-12 49 -39.5 87t-71 61t-103.5 23q-43 0 -84 -18t-72 -52.5t-50 -84.5t-19 -114q0 -57 13 -106.5t40 -86t70 -56.5q40 -19 96 -19h6q88 0 148 49.5t71 139.5h-20q-13 -85 -66.5 -127.5 t-134.5 -42.5q-55 0 -93 19t-62 52t-35.5 77.5t-12.5 96.5zM455 273h-410q3 54 20 97t44.5 73.5t64 46.5t78.5 16q50 0 88 -18.5t63.5 -50.5t38.5 -74.5t13 -89.5z" />
<glyph unicode="&#xeb;" d="M318 568h20v81h-20v-81zM162 568h20v81h-20v-81zM45 253h430v15q0 45 -11 87q-12 49 -39.5 87t-71 61t-103.5 23q-43 0 -84 -18t-72 -52.5t-50 -84.5t-19 -114q0 -57 13 -106.5t40 -86t70 -56.5q40 -19 96 -19h6q88 0 148 49.5t71 139.5h-20q-13 -85 -66.5 -127.5 t-134.5 -42.5q-55 0 -93 19t-62 52t-35.5 77.5t-12.5 96.5zM455 273h-410q3 54 20 97t44.5 73.5t64 46.5t78.5 16q50 0 88 -18.5t63.5 -50.5t38.5 -74.5t13 -89.5z" />
<glyph unicode="&#xec;" horiz-adv-x="130" d="M-37 709l138 -144h15l-124 144h-29zM55 0h20v514h-20v-514z" />
<glyph unicode="&#xed;" horiz-adv-x="130" d="M171 709h-29l-132 -144h15zM55 0h20v514h-20v-514z" />
<glyph unicode="&#xee;" horiz-adv-x="130" d="M166 570h20l-114 139h-15l-112 -139h20l98 123zM55 0h20v514h-20v-514z" />
<glyph unicode="&#xef;" horiz-adv-x="130" d="M133 568h20v81h-20v-81zM-22 568h20v81h-20v-81zM55 0h20v514h-20v-514z" />
<glyph unicode="&#xf0;" horiz-adv-x="519" d="M48 248q0 46 13.5 89t40.5 76.5t66.5 53.5t91.5 20q51 0 90.5 -20t66.5 -53.5t40.5 -76.5t13.5 -89t-13.5 -89.5t-40.5 -76.5t-66.5 -53t-90.5 -20q-52 0 -91.5 20t-66.5 53t-40.5 76.5t-13.5 89.5zM249 648l-121 -67l15 -15l122 68q18 -15 39.5 -36.5t43.5 -48 t42.5 -55.5t35.5 -59h-4q-29 38 -72.5 55t-89.5 17q-57 0 -100 -21.5t-72.5 -57.5t-44.5 -82.5t-15 -97.5t15 -98t44.5 -82.5t72.5 -56.5t99 -21q57 0 100 21t72.5 56.5t44.5 82.5t15 98q0 55 -12 105t-37 98t-64 95.5t-92 96.5l120 67l-15 16l-123 -68q-18 15 -42.5 32 t-53.5 32l-16 -14q29 -15 52 -30.5t41 -29.5z" />
<glyph unicode="&#xf1;" d="M118 580h20q0 9 3.5 19.5t10 19.5t15.5 14.5t19 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25.5 -7t-22 -18.5t-15 -25.5t-5.5 -28zM55 514v-514h20v291q0 43 12 82t35.5 68.5 t58.5 47t81 17.5q33 0 62.5 -9.5t52 -30t35.5 -52t13 -76.5v-338h20v341q0 45 -13.5 79.5t-38 58t-58 35.5t-73.5 12q-38 0 -69 -10.5t-54.5 -29.5t-39 -44t-22.5 -55h-2v127h-20z" />
<glyph unicode="&#xf2;" horiz-adv-x="519" d="M157 709l139 -144h15l-125 144h-29zM48 257q0 48 13.5 93t40.5 79.5t66.5 55.5t91.5 21q51 0 90.5 -21t66.5 -55.5t40.5 -79.5t13.5 -93q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91.5 20.5t-66.5 55t-40.5 79.5t-13.5 94zM28 257q0 -53 15 -101.5 t44.5 -85.5t72.5 -59t99 -22q57 0 100 22t72.5 59t44.5 85.5t15 101.5t-15 101.5t-44.5 85.5t-72.5 59.5t-99 22.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5z" />
<glyph unicode="&#xf3;" horiz-adv-x="519" d="M366 709h-29l-132 -144h15zM48 257q0 48 13.5 93t40.5 79.5t66.5 55.5t91.5 21q51 0 90.5 -21t66.5 -55.5t40.5 -79.5t13.5 -93q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91.5 20.5t-66.5 55t-40.5 79.5t-13.5 94zM28 257q0 -53 15 -101.5t44.5 -85.5 t72.5 -59t99 -22q57 0 100 22t72.5 59t44.5 85.5t15 101.5t-15 101.5t-44.5 85.5t-72.5 59.5t-99 22.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5z" />
<glyph unicode="&#xf4;" horiz-adv-x="519" d="M361 570h20l-114 139h-15l-113 -139h20l99 123zM48 257q0 48 13.5 93t40.5 79.5t66.5 55.5t91.5 21q51 0 90.5 -21t66.5 -55.5t40.5 -79.5t13.5 -93q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91.5 20.5t-66.5 55t-40.5 79.5t-13.5 94zM28 257 q0 -53 15 -101.5t44.5 -85.5t72.5 -59t99 -22q57 0 100 22t72.5 59t44.5 85.5t15 101.5t-15 101.5t-44.5 85.5t-72.5 59.5t-99 22.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="519" d="M128 580h20q0 9 3.5 19.5t10 19.5t15.5 14.5t19 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25.5 -7t-22 -18.5t-15 -25.5t-5.5 -28zM48 257q0 48 13.5 93t40.5 79.5t66.5 55.5 t91.5 21q51 0 90.5 -21t66.5 -55.5t40.5 -79.5t13.5 -93q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91.5 20.5t-66.5 55t-40.5 79.5t-13.5 94zM28 257q0 -53 15 -101.5t44.5 -85.5t72.5 -59t99 -22q57 0 100 22t72.5 59t44.5 85.5t15 101.5t-15 101.5 t-44.5 85.5t-72.5 59.5t-99 22.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="519" d="M328 568h20v81h-20v-81zM172 568h20v81h-20v-81zM48 257q0 48 13.5 93t40.5 79.5t66.5 55.5t91.5 21q51 0 90.5 -21t66.5 -55.5t40.5 -79.5t13.5 -93q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91.5 20.5t-66.5 55t-40.5 79.5t-13.5 94zM28 257 q0 -53 15 -101.5t44.5 -85.5t72.5 -59t99 -22q57 0 100 22t72.5 59t44.5 85.5t15 101.5t-15 101.5t-44.5 85.5t-72.5 59.5t-99 22.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5z" />
<glyph unicode="&#xf7;" horiz-adv-x="600" d="M300 0q23 0 32 12t9 29t-12 29t-29 12t-29 -11.5t-12 -29.5q0 -17 9.5 -29t31.5 -12zM300 424q23 0 32 12t9 29t-12 29t-29 12t-29 -11.5t-12 -29.5q0 -17 9.5 -29t31.5 -12zM48 243h504v20h-504v-20z" />
<glyph unicode="&#xf8;" horiz-adv-x="519" d="M472 496l-45 -47q-29 36 -71 56.5t-96 20.5q-57 0 -100 -22.5t-72.5 -59.5t-44.5 -85.5t-15 -101.5q0 -48 12.5 -93t37.5 -80l-60 -62l14 -14l57 59q29 -36 71 -57t99 -21t100 22t72.5 59t44.5 85.5t15 101.5q0 51 -13 96t-39 80l47 49zM104 83l320 335q23 -34 35 -75 t12 -86q0 -49 -13.5 -94t-40.5 -79.5t-66.5 -55t-90.5 -20.5q-52 0 -91 20t-65 55zM412 434l-320 -335q-44 67 -44 158q0 48 13.5 93t40.5 79.5t66.5 55.5t91.5 21q51 0 88.5 -19.5t63.5 -52.5z" />
<glyph unicode="&#xf9;" d="M147 709l139 -144h15l-125 144h-29zM445 0v514h-20v-291q0 -43 -12 -82t-35.5 -68.5t-58.5 -47t-81 -17.5q-33 0 -62.5 9.5t-52 30t-35.5 52t-13 76.5v338h-20v-341q0 -45 13.5 -79.5t38 -58t58 -35t73.5 -11.5q76 0 123.5 39t61.5 99h2v-127h20z" />
<glyph unicode="&#xfa;" d="M356 709h-29l-132 -144h15zM445 0v514h-20v-291q0 -43 -12 -82t-35.5 -68.5t-58.5 -47t-81 -17.5q-33 0 -62.5 9.5t-52 30t-35.5 52t-13 76.5v338h-20v-341q0 -45 13.5 -79.5t38 -58t58 -35t73.5 -11.5q76 0 123.5 39t61.5 99h2v-127h20z" />
<glyph unicode="&#xfb;" d="M351 570h20l-114 139h-15l-113 -139h20l99 123zM445 0v514h-20v-291q0 -43 -12 -82t-35.5 -68.5t-58.5 -47t-81 -17.5q-33 0 -62.5 9.5t-52 30t-35.5 52t-13 76.5v338h-20v-341q0 -45 13.5 -79.5t38 -58t58 -35t73.5 -11.5q76 0 123.5 39t61.5 99h2v-127h20z" />
<glyph unicode="&#xfc;" d="M318 568h20v81h-20v-81zM162 568h20v81h-20v-81zM445 0v514h-20v-291q0 -43 -12 -82t-35.5 -68.5t-58.5 -47t-81 -17.5q-33 0 -62.5 9.5t-52 30t-35.5 52t-13 76.5v338h-20v-341q0 -45 13.5 -79.5t38 -58t58 -35t73.5 -11.5q76 0 123.5 39t61.5 99h2v-127h20z" />
<glyph unicode="&#xfd;" horiz-adv-x="407" d="M310 731h-29l-132 -144h15zM398 514l-184 -487l-204 487h-21l214 -509l-37 -95q-9 -23 -19.5 -36.5t-24 -20t-32 -8t-44.5 -1.5v-20q23 0 43.5 1.5t37.5 8.5t31 21.5t24 40.5l237 618h-21z" />
<glyph unicode="&#xfe;" horiz-adv-x="537" d="M75 -176v320h2q18 -70 72.5 -112.5t133.5 -42.5q57 0 98.5 21.5t68.5 58.5t39.5 86t12.5 103q0 58 -14 107t-41.5 85t-68.5 56t-95 20q-85 0 -135.5 -44t-70.5 -112h-2v344h-20v-890h20zM482 258q0 -45 -9.5 -89.5t-33 -80t-61.5 -58t-95 -22.5q-45 0 -83.5 16.5 t-66 48.5t-43 78.5t-15.5 106.5q0 50 13 95t38.5 79t65 54t91.5 20q53 0 90.5 -20t61.5 -54.5t35.5 -79t11.5 -94.5z" />
<glyph unicode="&#xff;" horiz-adv-x="407" d="M272 590h20v81h-20v-81zM116 590h20v81h-20v-81zM398 514l-184 -487l-204 487h-21l214 -509l-37 -95q-9 -23 -19.5 -36.5t-24 -20t-32 -8t-44.5 -1.5v-20q23 0 43.5 1.5t37.5 8.5t31 21.5t24 40.5l237 618h-21z" />
<glyph unicode="&#x152;" horiz-adv-x="1019" d="M558 623v-529q-43 -50 -96 -70.5t-100 -20.5q-72 0 -129 26.5t-97 73t-61.5 110.5t-22.5 140q1 81 23 147t62 113t97 72.5t128 25.5q32 0 58 -5t49 -15.5t44.5 -27t44.5 -40.5zM944 382h-366v312h414v20h-434v-65q-39 45 -87.5 63.5t-108.5 18.5q-82 0 -144 -31t-103 -83 t-62 -120.5t-21 -143.5t21.5 -142t63 -117.5t103 -80t142.5 -29.5q52 0 103 19t93 62v-65h434v20h-414v342h366v20z" />
<glyph unicode="&#x153;" horiz-adv-x="890" d="M454 253h402v15q0 51 -12 98t-37.5 83t-64.5 57q-38 20 -91 20h-5q-46 -1 -81 -14.5t-59.5 -37t-39.5 -55t-22 -69.5h-2q-12 78 -63.5 127t-135.5 49q-58 0 -98.5 -23.5t-65.5 -61.5t-36 -86t-11 -98q0 -51 11.5 -99t37 -85.5t65.5 -60.5t97 -23q87 0 135 45t65 123h2 q12 -81 64 -124.5t137 -43.5q88 0 138.5 49.5t64.5 134.5h-20q-6 -33 -19 -63t-34.5 -52.5t-53.5 -36t-76 -13.5q-100 0 -146 62t-46 178v5zM434 257q0 -49 -9.5 -94t-31.5 -79.5t-58.5 -55t-91.5 -20.5q-52 0 -88.5 21.5t-59 56.5t-33 80t-10.5 91q0 48 10.5 92.5t33 79.5 t59 56t88.5 21q54 0 90.5 -21t59 -55.5t32 -79.5t9.5 -93zM836 273h-382q2 50 13 92.5t33.5 73.5t58.5 49t88 18q50 0 85.5 -18.5t58 -50.5t33.5 -74.5t12 -89.5z" />
<glyph unicode="&#x178;" horiz-adv-x="538" d="M337 768h20v81h-20v-81zM181 768h20v81h-20v-81zM544 714l-275 -392l-273 392h-25l288 -413v-301h20v301l289 413h-24z" />
<glyph unicode="&#x2c6;" horiz-adv-x="130" d="M166 592h20l-114 139h-15l-112 -139h20l98 123z" />
<glyph unicode="&#x2dc;" horiz-adv-x="130" d="M-66 602h20q0 9 3.5 19.5t10 19.5t15 14.5t18.5 5.5q16 0 31 -9t30 -20t31 -20t35 -9q35 0 52 23t17 52h-20q0 -21 -13 -38t-36 -17q-15 0 -30 9t-31 20t-32.5 20t-33.5 9q-13 0 -25 -7t-21.5 -18.5t-15 -25.5t-5.5 -28z" />
<glyph unicode="&#x2000;" horiz-adv-x="465" />
<glyph unicode="&#x2001;" horiz-adv-x="931" />
<glyph unicode="&#x2002;" horiz-adv-x="465" />
<glyph unicode="&#x2003;" horiz-adv-x="931" />
<glyph unicode="&#x2004;" horiz-adv-x="310" />
<glyph unicode="&#x2005;" horiz-adv-x="232" />
<glyph unicode="&#x2006;" horiz-adv-x="155" />
<glyph unicode="&#x2007;" horiz-adv-x="155" />
<glyph unicode="&#x2008;" horiz-adv-x="116" />
<glyph unicode="&#x2009;" horiz-adv-x="186" />
<glyph unicode="&#x200a;" horiz-adv-x="51" />
<glyph unicode="&#x2010;" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
<glyph unicode="&#x2011;" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
<glyph unicode="&#x2013;" d="M0 278v-20h500v20h-500z" />
<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M870 258v20h-740v-20h740z" />
<glyph unicode="&#x2018;" horiz-adv-x="167" d="M73 489h20v118q0 38 5 57.5t20 29.5v20q-13 -7 -21.5 -14.5t-14 -19.5t-7.5 -29t-2 -44v-118z" />
<glyph unicode="&#x2019;" horiz-adv-x="167" d="M94 714h-20v-118q0 -38 -5 -57.5t-20 -29.5v-20q13 7 21.5 14.5t14 19.5t7.5 29t2 44v118z" />
<glyph unicode="&#x201a;" horiz-adv-x="167" d="M93 98h-20v-98q0 -40 -5.5 -62.5t-19.5 -35.5v-20q26 17 35.5 45t9.5 73v98z" />
<glyph unicode="&#x201c;" horiz-adv-x="278" d="M183 489h20v118q0 38 5 57.5t20 29.5v20q-13 -7 -21.5 -14.5t-14 -19.5t-7.5 -29t-2 -44v-118zM83 489h20v118q0 38 5 57.5t20 29.5v20q-13 -7 -21.5 -14.5t-14 -19.5t-7.5 -29t-2 -44v-118z" />
<glyph unicode="&#x201d;" horiz-adv-x="278" d="M95 714h-20v-118q0 -38 -5 -57.5t-20 -29.5v-20q13 7 21.5 14.5t14 19.5t7.5 29t2 44v118zM195 714h-20v-118q0 -38 -5 -57.5t-20 -29.5v-20q13 7 21.5 14.5t14 19.5t7.5 29t2 44v118z" />
<glyph unicode="&#x201e;" horiz-adv-x="278" d="M95 98h-20v-98q0 -40 -5.5 -62.5t-19.5 -35.5v-20q26 17 35.5 45t9.5 73v98zM195 98h-20v-98q0 -40 -5.5 -62.5t-19.5 -35.5v-20q26 17 35.5 45t9.5 73v98z" />
<glyph unicode="&#x2022;" d="M72 357q0 -37 14 -69.5t38 -57t56.5 -38.5t69.5 -14t69.5 14t57 38.5t38.5 57t14 69.5t-14 69.5t-38.5 56.5t-57 38t-69.5 14t-69.5 -14t-56.5 -38t-38 -56.5t-14 -69.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M843 0v98h-20v-98h20zM510 0v98h-20v-98h20zM177 0v98h-20v-98h20z" />
<glyph unicode="&#x202f;" horiz-adv-x="186" />
<glyph unicode="&#x2039;" horiz-adv-x="259" d="M169 121v35l-83 112l83 112v35l-103 -139v-16z" />
<glyph unicode="&#x203a;" horiz-adv-x="259" d="M90 415v-35l83 -112l-83 -112v-35l103 139v16z" />
<glyph unicode="&#x205f;" horiz-adv-x="232" />
<glyph unicode="&#x20ac;" horiz-adv-x="556" d="M567 73v27q-82 -97 -207 -97q-58 0 -105.5 21t-82.5 57.5t-57.5 85t-31.5 102.5h367l9 17h-378q-3 26 -3 52q0 12 0.5 24t1.5 24h400l9 17h-407q7 57 29 107t58 87t85 58.5t109 21.5q54 0 95 -16t83 -48l9 16q-42 33 -87 49.5t-99 16.5q-65 0 -117.5 -22.5t-91 -62 t-62 -92.5t-31.5 -115h-55l-7 -17h60q-1 -14 -1.5 -29t-0.5 -29v-21q0 -5 0.5 -10.5t1.5 -10.5h-53l-7 -17h61q9 -59 33 -110.5t61.5 -90t88 -60.5t113.5 -22q123 0 210 87z" />
<glyph unicode="&#x2122;" horiz-adv-x="990" d="M496 714v-412h20v392h2l164 -392h20l164 392h2v-392h20v412h-34l-162 -384l-162 384h-34zM232 694v-392h20v392h150v20h-320v-20h150z" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Regular → Executable
View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File
Regular → Executable
View File
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
+1 -1
View File
File diff suppressed because one or more lines are too long
Regular → Executable
+1 -1
View File
File diff suppressed because one or more lines are too long
-48
View File
@@ -1,48 +0,0 @@
require([
"jQuery",
"utils/storage",
"utils/analytic",
"utils/sharing",
"core/state",
"core/keyboard",
"core/exercise",
"core/progress",
"core/sidebar",
"core/search"
], function($, storage, analytic, sharing, state, keyboard, exercise, progress, sidebar, search){
$(document).ready(function() {
var $book = state.$book;
// Initialize storage
storage.setBaseKey(state.githubId);
// Init sidebar
sidebar.init();
// Load search
search.init();
// Init keyboard
keyboard.init();
// Star and watch count
$.getJSON("https://api.github.com/repos/"+state.githubId)
.done(function(repo) {
$book.find(".count-star span").text(repo.stargazers_count);
$book.find(".count-watch span").text(repo.subscribers_count);
});
// Bind exercise
exercise.init();
// Bind sharing button
sharing.init();
// Show progress
progress.show();
// Focus on content
$(".book-body").focus();
});
});
+7
View File
@@ -0,0 +1,7 @@
define([
"jQuery"
], function($) {
var events = $({});
return events;
});
+5 -4
View File
@@ -1,13 +1,14 @@
define([
"jQuery",
"utils/execute",
"utils/analytic",
"core/events",
"core/state"
], function($, execute, analytic, state){
], function($, execute, events, state){
// Bind an exercise
var prepareExercise = function($exercise) {
var codeSolution = $exercise.find(".code-solution").text();
var codeValidation = $exercise.find(".code-validation").text();
var codeContext = $exercise.find(".code-context").text();
var editor = ace.edit($exercise.find(".editor").get(0));
editor.setTheme("ace/theme/tomorrow");
@@ -18,9 +19,9 @@ define([
$exercise.find(".action-submit").click(function(e) {
e.preventDefault();
analytic.track("exercise.submit");
events.trigger("exercise.submit", {type: "code"});
execute("javascript", editor.getValue(), codeValidation, function(err, result) {
execute("javascript", editor.getValue(), codeValidation, codeContext, function(err, result) {
$exercise.toggleClass("return-error", err != null);
$exercise.toggleClass("return-success", err == null);
if (err) $exercise.find(".alert-danger").text(err.message || err);
+121
View File
@@ -0,0 +1,121 @@
define([
"jQuery",
"utils/storage"
], function($, storage) {
var fontState;
var THEMES = {
"white": 0,
"sepia": 1,
"night": 2
};
var FAMILY = {
"serif": 0,
"sans": 1
};
var togglePopover = function(e) {
var $dropdown = $("#font-settings-wrapper .dropdown-menu");
$dropdown.toggleClass("open");
e.stopPropagation();
e.preventDefault();
};
var closePopover = function(e) {
var $dropdown = $("#font-settings-wrapper .dropdown-menu");
$dropdown.removeClass("open");
};
var enlargeFontSize = function(e){
if (fontState.size < 4){
fontState.size++;
fontState.save();
}
};
var reduceFontSize = function(e){
if (fontState.size > 0){
fontState.size--;
fontState.save();
}
};
var changeFontFamily = function(){
var index = $(this).data("font");
fontState.family = index;
fontState.save();
};
var changeColorTheme = function(){
var $book = $(".book");
var index = $(this).data("theme");
if (fontState.theme !== 0)
$book.removeClass("color-theme-"+fontState.theme);
fontState.theme = index;
if (fontState.theme !== 0)
$book.addClass("color-theme-"+fontState.theme);
fontState.save();
};
var update = function() {
var $book = $(".book");
$(".font-settings .font-family-list li").removeClass("active");
$(".font-settings .font-family-list li:nth-child("+(fontState.family+1)+")").addClass("active");
$book[0].className = $book[0].className.replace(/\bfont-\S+/g, '');
$book.addClass("font-size-"+fontState.size);
$book.addClass("font-family-"+fontState.family);
if(fontState.theme !== 0) {
$book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, '');
$book.addClass("color-theme-"+fontState.theme);
}
};
var init = function(config) {
var $toggle, $bookBody, $dropdown, $book;
//Find DOM elements.
$book = $(".book");
$toggle = $(".book-header .toggle-font-settings");
$dropdown = $("#font-settings-wrapper .dropdown-menu");
$bookBody = $(".book-body");
// Instantiate font state object
fontState = storage.get("fontState", {
size: config.size || 1,
family: FAMILY[config.family || "sans"],
theme: THEMES[config.theme || "white"]
});
fontState.save = function(){
storage.set("fontState",fontState);
update();
};
update();
//Add event listeners
$(document).on('click', "#enlarge-font-size", enlargeFontSize);
$(document).on('click', "#reduce-font-size", reduceFontSize);
$(document).on('click', "#font-settings-wrapper .font-family-list li", changeFontFamily);
$(document).on('click', "#font-settings-wrapper .color-theme-list button", changeColorTheme);
$(document).on('click', ".book-header .toggle-font-settings", togglePopover);
$(document).on('click', "#font-settings-wrapper .dropdown-menu", function(e){ e.stopPropagation(); });
$(document).on("click", closePopover);
};
return {
init: init,
update: update
}
});
View File
+16
View File
@@ -0,0 +1,16 @@
define([
"jQuery"
], function($) {
var showLoading = function(p) {
$(".book").addClass("is-loading");
p.always(function() {
$(".book").removeClass("is-loading");
});
return p;
};
return {
show: showLoading
};
});
+159 -7
View File
@@ -1,16 +1,168 @@
define([
"jQuery"
], function($) {
var goNext = function() {
var url = $("link[rel='next']").attr("href");
if (url) location.href = url;
"jQuery",
"utils/url",
"core/events",
"core/state",
"core/progress",
"core/exercise",
"core/quiz",
"core/loading"
], function($, URL, events, state, progress, exercises, quiz, loading) {
var prev, next;
var githubCountStars, githubCountWatch;
var usePushState = (typeof history.pushState !== "undefined");
var handleNavigation = function(relativeUrl, push) {
var url = URL.join(window.location.pathname, relativeUrl);
console.log("navigate to ", url, "baseurl="+relativeUrl, "current="+window.location.pathname);
if (!usePushState) {
// Refresh the page to the new URL if pushState not supported
location.href = relativeUrl;
return
}
return loading.show($.get(url)
.done(function (html) {
// Push url to history
if (push) history.pushState({ path: url }, null, url);
// Replace html content
html = html.replace( /<(\/?)(html|head|body)([^>]*)>/ig, function(a,b,c,d){
return '<' + b + 'div' + ( b ? '' : ' data-element="' + c + '"' ) + d + '>';
});
var $page = $(html);
var $pageHead = $page.find("[data-element=head]");
var $pageBody = $page.find('.book');
// Merge heads
var headContent = $pageHead.html()
$("head style").each(function() {
headContent = headContent + this.outerHTML
});
$("head").html(headContent);
// Merge body
var bodyClass = $(".book").attr("class");
var scrollPosition = $('.book-summary .summary').scrollTop();
$pageBody.toggleClass("with-summary", $(".book").hasClass("with-summary"))
$(".book").replaceWith($pageBody);
$(".book").attr("class", bodyClass);
$('.book-summary .summary').scrollTop(scrollPosition);
// Update state
state.update($("html"));
preparePage();
})
.fail(function (e) {
location.href = relativeUrl;
}));
};
var updateGitHubCounts = function() {
$(".book-header .count-star span").text(githubCountStars);
$(".book-header .count-watch span").text(githubCountWatch);
};
var updateNavigationPosition = function() {
var bodyInnerWidth, pageWrapperWidth;
bodyInnerWidth = parseInt($('.body-inner').css('width'), 10);
pageWrapperWidth = parseInt($('.page-wrapper').css('width'), 10);
$('.navigation-next').css('margin-right', (bodyInnerWidth - pageWrapperWidth) + 'px');
};
var preparePage = function() {
var $pageWrapper = $(".book-body .page-wrapper");
// Bind exercises/quiz
exercises.init();
quiz.init();
// Show progress
progress.show();
// Update navigation position
updateNavigationPosition();
// Reset scroll
$pageWrapper.scrollTop(0);
// Focus on content
$pageWrapper.focus();
// Update GitHub count
if (state.githubId) {
if (githubCountStars) {
updateGitHubCounts();
} else {
$.getJSON("https://api.github.com/repos/"+state.githubId)
.done(function(repo) {
githubCountStars = repo.stargazers_count;
githubCountWatch = repo.subscribers_count;
updateGitHubCounts();
});
}
}
// Send to mixpanel
events.trigger("page.change");
};
var handlePagination = function (e) {
e.stopPropagation();
e.preventDefault();
var url = $(this).attr('href');
if (url) handleNavigation(url, true);
};
var goNext = function() {
var url = $(".navigation-next").attr("href");
if (url) handleNavigation(url, true);
};
var goPrev = function() {
var url = $("link[rel='prev']").attr("href");
if (url) location.href = url;
var url = $(".navigation-prev").attr("href");
if (url) handleNavigation(url, true);
};
var init = function() {
// Prevent cache so that using the back button works
// See: http://stackoverflow.com/a/15805399/983070
$.ajaxSetup({
cache: false
});
// Recreate first page when the page loads.
history.replaceState({ path: window.location.href }, '');
// Back Button Hijacking :(
window.onpopstate = function (event) {
if (event.state === null) {
return;
}
return handleNavigation(event.state.path, false);
};
$(document).on('click', ".navigation-prev", handlePagination);
$(document).on('click', ".navigation-next", handlePagination);
$(document).on('click', ".summary [data-path] a", handlePagination);
$(window).resize(updateNavigationPosition);
// Prepare current page
preparePage();
};
return {
init: init,
goNext: goNext,
goPrev: goPrev
};
+18 -11
View File
@@ -10,15 +10,16 @@ define([
};
// Return all levels
var getLevels = function() {
var getLevels = function () {
var levels = $(".book-summary li[data-level]");
return _.map(levels, function(level) {
return $(level).data("level").toString();
});
};
// Return a map chapter -> number (timestamp)
var getProgress = function() {
var getProgress = function () {
// Current level
var progress = storage.get("progress", {});
@@ -33,27 +34,33 @@ define([
};
// Change value of progress for a level
var markProgress = function(level, state) {
if (state == null) state = true;
var markProgress = function (level, state) {
var progress = getProgress();
progress[level] = state? Date.now() : 0;
if (state == null) {
state = true;
}
progress[level] = state
? Date.now()
: 0;
storage.set("progress", progress);
};
// Show progress
var showProgress = function() {
// Update progress
var showProgress = function () {
var progress = getProgress();
var $summary = $(".book-summary");
_.each(progress, function(value, level) {
_.each(progress, function (value, level) {
$summary.find("li[data-level='"+level+"']").toggleClass("done", value > 0);
});
// Mark current progress
markProgress(getCurrentLevel(), true);
// Mark current progress if we have not already
if (!progress[getCurrentLevel()]) {
markProgress(getCurrentLevel(), true);
}
};
return {
+56
View File
@@ -0,0 +1,56 @@
define([
"jQuery",
"utils/execute",
"core/events",
"core/state"
], function($, execute, events, state){
// Bind an exercise
var prepareQuiz = function($quiz) {
$quiz.find(".quiz-answers input").click(function(e) {
e.preventDefault();
});
// Submit: test code
$quiz.find(".action-submit").click(function(e) {
e.preventDefault();
events.trigger("exercise.submit", {type: "quiz"});
$quiz.find("tr.alert-danger,li.alert-danger").removeClass("alert-danger");
$quiz.find(".alert-success,.alert-danger").addClass("hidden");
$quiz.find(".question").each(function(q) {
var result = true;
var $questions = $(this).find(".question-content").find("input[type=radio], input[type=checkbox]");
var $answers = $(this).find(".question-answers").find("input[type=radio], input[type=checkbox]");
$questions.each(function(i) {
var correct = $(this).is(":checked") === $answers.slice(i).first().is(":checked");
result = result && correct;
if (!correct) {
$(this).closest("tr, li").addClass("alert-danger");
}
});
$(this).find(result ? "div.alert-success" : "div.alert-danger").toggleClass("hidden");
});
});
$quiz.find(".action-solution").click(function(e) {
e.preventDefault();
$quiz.find(".question-content, .question-answers").toggleClass("hidden");
});
};
// Prepare all exercise
var init = function() {
state.$book.find("section.quiz").each(function() {
prepareQuiz($(this));
});
};
return {
init: init,
prepare: prepareQuiz
};
});

Some files were not shown because too many files have changed in this diff Show More