Compare commits
516 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 16128c7e60 | |||
| 8b6a80cffb | |||
| 86f8a9d8fb | |||
| 790dfd601e | |||
| 3426428142 | |||
| 6c5c8e6eb7 | |||
| 3aefcaea73 | |||
| 04c025774d | |||
| 80aac7f581 | |||
| 266f7ca73d | |||
| d6eb8e4c60 | |||
| c87edb155a | |||
| ef0468ad5d | |||
| f03153eb0c | |||
| 3d8b6e550a | |||
| 4c3dbca5ca | |||
| a258feea37 | |||
| 3a3332d0b9 | |||
| 4259283f32 | |||
| 243d977cd6 | |||
| 94bbbecedf | |||
| f49eab42a9 | |||
| ce6b2bc47d | |||
| 3245d7e430 | |||
| 6ee17c32ae | |||
| bf7ffe6d4c | |||
| ec7bc6b347 | |||
| b425db0979 | |||
| 30c6d1c9de | |||
| cee1d90fc6 | |||
| 522342667c | |||
| d1c1277bb9 | |||
| 9a66f56c79 | |||
| 087ca28ca2 | |||
| 3d5281ff3a | |||
| f62cf340c5 | |||
| 7e12bd3588 | |||
| 4dbdb95ebe | |||
| 2c5ddbcd8f | |||
| be4fd74f90 | |||
| 57491e3a8b | |||
| f7a442d297 | |||
| cfebdc6f6b | |||
| 65319e8fd6 | |||
| 55db44a3b4 | |||
| 13b6045300 | |||
| b7ff879c31 | |||
| 57ade87fe1 | |||
| 907e9ea5a7 | |||
| 215488dc45 | |||
| a195b3eac2 | |||
| 77c6f0e967 | |||
| f0e18afec1 | |||
| b6d11d88b7 | |||
| c803270af8 | |||
| 5d51263a58 | |||
| 7e30720b2c | |||
| 771c5e8b68 | |||
| 8f53afab6b | |||
| 0ad0403d41 | |||
| 2515c1dd73 | |||
| 7dfcd102dd | |||
| a91245d575 | |||
| 5f207f5e14 | |||
| 718692de3b | |||
| 9856a51255 | |||
| 58eaaf5514 | |||
| c0ae0138f8 | |||
| b1b9dc5b0a | |||
| f85c5a6498 | |||
| 32eafefc45 | |||
| 336999a34e | |||
| 1bf5f3b984 | |||
| c76d070237 | |||
| 8c7da1351f | |||
| 34588c6092 | |||
| 9f00bf8060 | |||
| f4a17b182f | |||
| 5c3b345fa6 | |||
| 46321fffd9 | |||
| 89ba17de84 | |||
| 115fba837c | |||
| 4df51546b2 | |||
| f68aaf7ff9 | |||
| e3d1746ba3 | |||
| a0d5646034 | |||
| 2f8af5f136 | |||
| 8b7abbd6f4 | |||
| f228f646eb | |||
| 45891d80c7 | |||
| ac900aa37f | |||
| 422cbed796 | |||
| 38cbbe46aa | |||
| c1b57a387b | |||
| aaa9ae8bb7 | |||
| 6340a64cff | |||
| 96bcfa4e20 | |||
| af0f56b26b | |||
| aed5befa48 | |||
| 8e37da672d | |||
| c0f68c45e2 | |||
| 47fdd73791 | |||
| 7c0b88cf2e | |||
| bf21633b6c | |||
| ad9b1fd6f7 | |||
| d245895085 | |||
| c7439d12f7 | |||
| 8d6923ce2c | |||
| b21fb24a82 | |||
| e7be132194 | |||
| 0e1717f4bb | |||
| 276dbe29c7 | |||
| 21fd5924b8 | |||
| 443def6cfd | |||
| 75464574d7 | |||
| 86f05c68c5 | |||
| 8dd407eaa8 | |||
| ea7ad10e8a | |||
| 62ec695dc8 | |||
| ca37ac73a9 | |||
| 96edd50c8f | |||
| 3993c1e35a | |||
| 5298558925 | |||
| c6ba147917 | |||
| 7efecea3d6 | |||
| a73fed3ebd | |||
| 50ef7bcd23 | |||
| 82e422cb89 | |||
| dab46c779d | |||
| 7c65adc9b2 | |||
| 9b96ef9bae | |||
| e97d1941dc | |||
| 0b0ac46e34 | |||
| 622bbcb8ea | |||
| 58a5245d21 | |||
| 612f9a6dc7 | |||
| 90d4dff263 | |||
| 0f38385c7d | |||
| 2b50616251 | |||
| 5b7f37f0d4 | |||
| 6ca8e26741 | |||
| a3ada05598 | |||
| 42eb11aaff | |||
| b581859afd | |||
| 2e22fae52a | |||
| 603ac8b91d | |||
| 5faa4841ca | |||
| 7416b826e0 | |||
| 82afc34755 | |||
| da39631a5a | |||
| fc8685a7c1 | |||
| 5e0204a980 | |||
| 6bb0f33f39 | |||
| ed4fd565b2 | |||
| 79cff28abd | |||
| 27329239f7 | |||
| 9de86fc0e4 | |||
| 7fa7826372 | |||
| 96ecfd098b | |||
| f7fe976c7e | |||
| 756629b91d | |||
| e640d124d4 | |||
| 7f41466297 | |||
| 57dfc062d2 | |||
| 799815d85a | |||
| 2946246834 | |||
| 6d276d1e79 | |||
| 6a3a369b3e | |||
| 5d8afa2135 | |||
| ab3e6aa8ce | |||
| 822092736e | |||
| 7497acd2e3 | |||
| ae137885b8 | |||
| b964cc7009 | |||
| c2ea126c5f | |||
| b668dba479 | |||
| 2cae5a0310 | |||
| b6a0f3ff67 | |||
| fa00b52fb5 | |||
| 2999d90907 | |||
| b6696bcad2 | |||
| 728c87c525 | |||
| ace394ee2d | |||
| 076ee98f64 | |||
| 2e472654ca | |||
| d46bd14678 | |||
| b3e5b3d106 | |||
| b830ef5dca | |||
| 45326c4ad2 | |||
| 603b61e8c8 | |||
| efb066c8e3 | |||
| c30db427b1 | |||
| 23056fc85d | |||
| 5f1bfc0280 | |||
| b715901f92 | |||
| 38fea06cf9 | |||
| 4481b5f556 | |||
| 0e0d051f7c | |||
| a1b649a279 | |||
| e6bc0a0fb7 | |||
| 93e4016c09 | |||
| 20c741a248 | |||
| 54f530c7c3 | |||
| 9fdc5da22d | |||
| 99ce48b146 | |||
| 6a33ad9ef7 | |||
| ca94055adf | |||
| 36a67e4c91 | |||
| 69431e1bbb | |||
| a3fc4ee2b0 | |||
| e505fd6d54 | |||
| 93a3785e4c | |||
| a02de84812 | |||
| c0521f0ec7 | |||
| 83d8c16853 | |||
| 47e9506397 | |||
| b8a3d0e254 | |||
| 001d7ec44e | |||
| 5cb0ec447a | |||
| 67e7d77302 | |||
| 8cbd8b2b48 | |||
| 7c404dbf96 | |||
| c4a67b6f2f | |||
| 3b70347625 | |||
| bb0a7935e9 | |||
| 8f4b799d3c | |||
| 931e0c66c9 | |||
| 0212084862 | |||
| 9abbabbce3 | |||
| ac610487e8 | |||
| a9a0f89892 | |||
| 305f221077 | |||
| 53514f2602 | |||
| 00327778cb | |||
| 37fadec787 | |||
| ada11d0b59 | |||
| 4c90fdb7b2 | |||
| 98c133df3c | |||
| f86c27b090 | |||
| b5b8ed72a5 | |||
| 5beff86548 | |||
| dd395edae1 | |||
| d1c1d7b75b | |||
| 4a380e9279 | |||
| 878c105def | |||
| 74d628676b | |||
| 6fdd98ec3a | |||
| 2ed1be3533 | |||
| 0ac04e1584 | |||
| 2a38d33d8a | |||
| fb14caf5b3 | |||
| cf51772f54 | |||
| cc8516df83 | |||
| c6a624bc6b | |||
| 8be8b825ee | |||
| 56eb4a2897 | |||
| 7a461eaa61 | |||
| fd64c05809 | |||
| 6bce93d893 | |||
| c9db068227 | |||
| 8a6d36ac4d | |||
| 64622c5945 | |||
| 837813edb0 | |||
| 0d9d62f1a9 | |||
| f7e9abf984 | |||
| dd0579b60d | |||
| b5bb953e47 | |||
| ef4a8ea1b6 | |||
| 49cde96ee7 | |||
| 627be20e48 | |||
| e45bb84b02 | |||
| 4e8876c725 | |||
| 6d5be15ec9 | |||
| 1a8db646f2 | |||
| d3aba2c906 | |||
| 457a83282f | |||
| 48e94c937d | |||
| 6e613e9f71 | |||
| b698d43d7d | |||
| a36b9a6088 | |||
| 20acd89c8a | |||
| 7bed9a257d | |||
| 19c83aa5a8 | |||
| 52610d7d61 | |||
| 9e4b393b7a | |||
| a0ae34a3b7 | |||
| 413dc5d004 | |||
| c9eb27bfe7 | |||
| b78505c290 | |||
| 95f9ae83d0 | |||
| 9304289315 | |||
| 1b726ca293 | |||
| 656ca18929 | |||
| b8cacaee00 | |||
| f349012f0f | |||
| ddd49509ce | |||
| 28257e1ce7 | |||
| 24d8e15ee2 | |||
| d6d9223ea1 | |||
| 05f1eed9ce | |||
| c0ca055bf4 | |||
| f43e630528 | |||
| e4fa8aaca7 | |||
| 1b147d3e30 | |||
| 5848f5db51 | |||
| 9f1ba8483b | |||
| 6da48764e8 | |||
| 8c4cfed609 | |||
| 1ff7e88cea | |||
| c3ba975d6c | |||
| 8c02e949fc | |||
| 56e1803b34 | |||
| c511037f46 | |||
| 730fe982f5 | |||
| ca71a1c9e6 | |||
| 01bc283638 | |||
| 4ca719b108 | |||
| 889183ccc9 | |||
| 4a6ae8d4e0 | |||
| b77debae24 | |||
| 9ffa462111 | |||
| 1bbef54015 | |||
| 3c7cae6262 | |||
| 646a4513e3 | |||
| d9e34fc671 | |||
| 2242963258 | |||
| 555c0d63ee | |||
| fb05609e09 | |||
| 78cb9a56ba | |||
| 6173fb76ad | |||
| ca25511d7a | |||
| b07681a16a | |||
| f6595f5111 | |||
| ab27725b99 | |||
| 32b1be3dee | |||
| d715b5b154 | |||
| 177ca32b9b | |||
| 892ec04f52 | |||
| 8f457a752e | |||
| 435a4b8c99 | |||
| 02d8272c74 | |||
| e54b808093 | |||
| fb7653bd14 | |||
| 04774df372 | |||
| 619ded93ad | |||
| 2e85380cd8 | |||
| 241ad7cb0e | |||
| 0171c32996 | |||
| d275bd516a | |||
| 99594791e0 | |||
| 1b432288f0 | |||
| 2cc23b7e34 | |||
| 61b6848a95 | |||
| 9265b0185a | |||
| 392573a990 | |||
| 554d6a6170 | |||
| fa2f82d52f | |||
| 2182baa2e9 | |||
| 7fe189907e | |||
| 58a90886da | |||
| 80794997a4 | |||
| 9d541a0a4d | |||
| 8f3df085d8 | |||
| b7e04b5475 | |||
| ee8bf6dc4c | |||
| 9670f564d9 | |||
| b541df2b93 | |||
| cf3a641350 | |||
| ec719891a1 | |||
| 1bfa8c186c | |||
| 5887f1de28 | |||
| a9a66bc240 | |||
| 742229a989 | |||
| 9fe80b878e | |||
| 4b64c87011 | |||
| 4c36c592c1 | |||
| 9ffb1a062f | |||
| 536c480969 | |||
| d14bd7245f | |||
| 6fc8255b7f | |||
| a42f287a92 | |||
| d2f62fd109 | |||
| f24b66f2c4 | |||
| 607b45f172 | |||
| c166a9863e | |||
| 1a4b196851 | |||
| ff52a2317b | |||
| b598c9a272 | |||
| 9cd7c9ad0e | |||
| 75a8d3069d | |||
| ed41429d58 | |||
| eecb33baa8 | |||
| b8f2da734e | |||
| 3687a1701b | |||
| c8f83e2684 | |||
| aa7835e913 | |||
| 74edc4f279 | |||
| 696cbdc3b1 | |||
| 2f8543d710 | |||
| aee33d67b6 | |||
| 52ccc2b46d | |||
| 9270d7949a | |||
| 855c9b9aef | |||
| c98ba22b08 | |||
| d1e55aef8e | |||
| ef059c8737 | |||
| fde66ed849 | |||
| abce29866e | |||
| 014b2f9c69 | |||
| 65cb23feab | |||
| 2b3c67a26b | |||
| 174ce965d9 | |||
| adf20e6a16 | |||
| 53f714b7f3 | |||
| d19906d5b2 | |||
| fb26b634ce | |||
| a34dc458c9 | |||
| eeb715d5d6 | |||
| a8e026a642 | |||
| cc096d2253 | |||
| a4c1cf9334 | |||
| 9ffec175a5 | |||
| 465188cae6 | |||
| 4547ec73fd | |||
| cae6267665 | |||
| 58bee15f37 | |||
| 761cfb4a2c | |||
| 8e3339ead2 | |||
| b330277ed7 | |||
| 12b5baf433 | |||
| f38d68c355 | |||
| 865bf40e1a | |||
| 562ee2b77f | |||
| 8b0f2f6329 | |||
| 44717a3e3e | |||
| 6f7e3fda02 | |||
| 511fc7bd46 | |||
| 4987beec2b | |||
| e414cbd6d1 | |||
| 694afeccc5 | |||
| 959a2d830a | |||
| 4850c0f302 | |||
| ac258329ff | |||
| d5bd08dcd2 | |||
| 6c414ec400 | |||
| 881a0c6f6d | |||
| 0071594300 | |||
| 460799828f | |||
| 02b75288d2 | |||
| b108be0c3b | |||
| 7ab285832b | |||
| 0bc288fe96 | |||
| 9fbe240843 | |||
| 0c7e2b3557 | |||
| e34e65813c | |||
| 63f946ced9 | |||
| af9f3cf89f | |||
| 355094bbb3 | |||
| b3adedb468 | |||
| 026e4362d8 | |||
| 9cf5384fbe | |||
| 9bc0bf19da | |||
| f49a1a484e | |||
| 446d486a0f | |||
| 07101deaef | |||
| 76b3fcb41c | |||
| febda9aba1 | |||
| f952fa47b9 | |||
| 1984660930 | |||
| d475affd3b | |||
| fe3de93e06 | |||
| 5cae311edf | |||
| 26701a2a73 | |||
| 5125e04814 | |||
| 0a6194340f | |||
| e0d96b3163 | |||
| f656390783 | |||
| 88c480ba4f | |||
| 3da53d56a2 | |||
| 91359fab1e | |||
| a52a4bed1a | |||
| 9dce855113 | |||
| 57e2595a3e | |||
| b1314273bb | |||
| cb9a0b82ba | |||
| 57ecfe4a54 | |||
| 405792fd8f | |||
| fc6d911340 | |||
| 1e6307b69b | |||
| af87dc8d7c | |||
| 1699028688 | |||
| 55d9bfbf18 | |||
| c964b53137 | |||
| 510f7bacb4 | |||
| c934238f3d | |||
| ab48959968 | |||
| eb6204aa42 | |||
| a70439f375 | |||
| a3b562b4e8 | |||
| aa4e3abc33 | |||
| f24a7fbb6e | |||
| f3a49306b1 | |||
| f312472abd | |||
| ecb07468f6 | |||
| 8fc09e2e05 | |||
| ed7798237a | |||
| faf63566df | |||
| c88382aea0 | |||
| 9ee5f48aef | |||
| e1dfe5c0f6 | |||
| 3adcd77ae4 | |||
| 4bdcfd07a9 | |||
| a9967df6eb | |||
| 62a2e8f81c | |||
| 6bcc2d8cf2 | |||
| ad1867e4d8 |
@@ -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
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.11"
|
||||
- "0.10"
|
||||
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
# Release notes
|
||||
|
||||
@@ -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,23 +24,28 @@ module.exports = function (grunt) {
|
||||
optimization: 2
|
||||
},
|
||||
files: {
|
||||
"assets/static/style.css": "assets/stylesheets/main.less"
|
||||
"theme/assets/style.css": "theme/stylesheets/website.less",
|
||||
"theme/assets/print.css": "theme/stylesheets/ebook.less"
|
||||
}
|
||||
}
|
||||
},
|
||||
requirejs: {
|
||||
compile: {
|
||||
options: {
|
||||
name: "app",
|
||||
baseUrl: "assets/javascript/",
|
||||
out: "assets/static/app.js",
|
||||
name: "gitbook",
|
||||
baseUrl: "theme/javascript/",
|
||||
out: "theme/assets/app.js",
|
||||
preserveLicenseComments: false,
|
||||
optimize: "uglify",
|
||||
optimize: "uglify", //"uglify",
|
||||
include: ["requireLib"],
|
||||
paths: {
|
||||
"jQuery": 'vendors/jquery',
|
||||
"lodash": 'vendors/lodash',
|
||||
"requireLib": 'vendors/require',
|
||||
"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',
|
||||
"ace": 'vendors/ace-builds/src-noconflict/'
|
||||
},
|
||||
shim: {
|
||||
'jQuery': {
|
||||
@@ -40,6 +53,12 @@ module.exports = function (grunt) {
|
||||
},
|
||||
'lodash': {
|
||||
exports: '_'
|
||||
},
|
||||
'Mousetrap': {
|
||||
exports: 'Mousetrap'
|
||||
},
|
||||
'lunr': {
|
||||
exports: 'lunr'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,8 +66,11 @@ module.exports = function (grunt) {
|
||||
}
|
||||
});
|
||||
|
||||
grunt.registerTask("bower-install", [ "bower-install-simple" ]);
|
||||
|
||||
// Build
|
||||
grunt.registerTask('build', [
|
||||
'bower-install',
|
||||
'less',
|
||||
'requirejs'
|
||||
]);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
GitBook
|
||||
=======
|
||||
|
||||
GiBook 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/).
|
||||
[](https://travis-ci.org/GitbookIO/gitbook)
|
||||
|
||||
GitBook is a command line tool (and Node.js library) for building beautiful books and exercises using GitHub/Git and Markdown. Here is an example: [Learn Javascript](https://www.gitbook.io/book/GitBookIO/javascript). You can publish book easily online using [gitbook.io](https://www.gitbook.io) and 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/).
|
||||
|
||||

|
||||
|
||||
## How to use it:
|
||||
|
||||
@@ -26,18 +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, 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 [u’a0’, u’a1’, u’a2’, u’a3’, u’a4’, u’a5’, u’a6’, u’b0’, u’b1’, u’b2’, u’b3’, u’b4’, u’b5’, u’b6’, u’legal’, u’letter’]
|
||||
"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.
|
||||
* **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
|
||||
|
||||
@@ -57,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:
|
||||
|
||||
@@ -70,22 +178,87 @@ 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).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Define a variable `x` equal to 10.
|
||||
|
||||
|
||||
```js
|
||||
var x =
|
||||
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;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Multi-Languages
|
||||
|
||||
GitBook supports building books written in multiple languages. Each language should be a sub-directory following the normal GitBook format, and a file named `LANGS.md` should be present at the root of the repository with the following format:
|
||||
|
||||
```
|
||||
* [English](en/)
|
||||
* [French](fr/)
|
||||
* [Español](es/)
|
||||
```
|
||||
|
||||
You can see a complete example with the [Learn Git](https://github.com/GitbookIO/git) book.
|
||||
|
||||
#### 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`)
|
||||
|
||||
#### 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
|
||||
|
||||
#### Debugging
|
||||
|
||||
You can use the environment variable `DEBUG=true` to get better error messages (with stack trace). For example:
|
||||
|
||||
```
|
||||
$ export DEBUG=true
|
||||
$ gitbook build ./
|
||||
```
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
require([
|
||||
"jQuery",
|
||||
"utils/analytic",
|
||||
"core/state",
|
||||
"core/exercise",
|
||||
"core/progress",
|
||||
"core/sidebar"
|
||||
], function($, analytic, _state, exercise, progress, sidebar){
|
||||
$(document).ready(function() {
|
||||
var state = _state();
|
||||
var $book = state.$book;
|
||||
|
||||
// Tract page view
|
||||
analytic.track("View");
|
||||
|
||||
// Init sidebar
|
||||
sidebar.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();
|
||||
|
||||
// Show progress
|
||||
progress.show();
|
||||
});
|
||||
});
|
||||
@@ -1,41 +0,0 @@
|
||||
define([
|
||||
"utils/storage",
|
||||
"utils/platform",
|
||||
"core/state"
|
||||
], function(storage, platform, state) {
|
||||
|
||||
// Toggle sidebar with or withour animation
|
||||
var toggleSidebar = function(_state, animation) {
|
||||
if (animation == null) animation = true;
|
||||
|
||||
var $book = state().$book;
|
||||
$book.toggleClass("without-animation", !animation);
|
||||
$book.toggleClass("with-summary", _state);
|
||||
|
||||
storage.set("sidebar", isOpen());
|
||||
};
|
||||
|
||||
// Return true if sidebar is open
|
||||
var isOpen = function() {
|
||||
return state().$book.hasClass("with-summary");
|
||||
};
|
||||
|
||||
// Prepare sidebar: state and toggle button
|
||||
var init = function() {
|
||||
var $book = state().$book;
|
||||
|
||||
// Toggle summary
|
||||
$book.find(".book-header .toggle-summary").click(function(e) {
|
||||
e.preventDefault();
|
||||
toggleSidebar();
|
||||
});
|
||||
|
||||
// Init last state if not mobile and not homepage
|
||||
if (!isOpen()) toggleSidebar(platform.isMobile ? false : storage.get("sidebar", false), false);
|
||||
};
|
||||
|
||||
return {
|
||||
init: init,
|
||||
toggle: toggleSidebar
|
||||
}
|
||||
});
|
||||
@@ -1,14 +0,0 @@
|
||||
define([
|
||||
"jQuery"
|
||||
], function() {
|
||||
return function() {
|
||||
var $book = $(".book");
|
||||
|
||||
return {
|
||||
'$book': $book,
|
||||
|
||||
'githubId': $book.data("github"),
|
||||
'level': $book.data("level")
|
||||
};
|
||||
};
|
||||
});
|
||||
@@ -1,18 +0,0 @@
|
||||
define([], function() {
|
||||
var isAvailable = function() {
|
||||
return (typeof mixpanel !== "undefined");
|
||||
};
|
||||
|
||||
var track = function(event, data) {
|
||||
if (!isAvailable()) {
|
||||
console.log("tracking not available!");
|
||||
return;
|
||||
}
|
||||
mixpanel.track(event, data);
|
||||
};
|
||||
|
||||
return {
|
||||
isAvailable: isAvailable,
|
||||
track: track
|
||||
};
|
||||
});
|
||||
@@ -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="	" horiz-adv-x="278" />
|
||||
<glyph unicode=" " horiz-adv-x="278" />
|
||||
<glyph unicode="!" horiz-adv-x="259" d="M74 111v-111h111v111h-111zM177 494v220h-95v-220l25 -311h45z" />
|
||||
<glyph unicode=""" 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="&" 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="<" 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=">" 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="¡" horiz-adv-x="259" d="M185 406v111h-111v-111h111zM82 22v-219h95v219l-25 311h-45z" />
|
||||
<glyph unicode="¢" 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="£" 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="¤" 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="¥" d="M232 174v-174h95v174h144v60h-144v42l18 33h126v60h-93l178 345h-104l-169 -353l-174 353h-109l183 -345h-92v-60h123l18 -33v-42h-141v-60h141z" />
|
||||
<glyph unicode="¦" horiz-adv-x="222" d="M145 411v250h-68v-250h68zM77 161v-249h68v249h-68z" />
|
||||
<glyph unicode="§" 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="¨" horiz-adv-x="222" d="M-27 696v-104h89v104h-89zM160 696v-104h90v104h-90z" />
|
||||
<glyph unicode="©" 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="ª" 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="«" horiz-adv-x="463" d="M50 234l152 -120v86l-100 78l100 78v86l-152 -120v-88zM246 234l152 -120v86l-100 78l100 78v86l-152 -120v-88z" />
|
||||
<glyph unicode="¬" horiz-adv-x="600" d="M552 109v279h-504v-68h436v-211h68z" />
|
||||
<glyph unicode="­" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
|
||||
<glyph unicode="®" 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="¯" horiz-adv-x="222" d="M-58 675v-55h340v55h-340z" />
|
||||
<glyph unicode="°" 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="±" horiz-adv-x="600" d="M48 68v-68h504v68h-504zM48 339v-68h218v-167h68v167h218v68h-218v166h-68v-166h-218z" />
|
||||
<glyph unicode="²" 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="³" 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="´" horiz-adv-x="222" d="M136 731l-86 -143h64l131 143h-109z" />
|
||||
<glyph unicode="µ" 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="¶" 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="·" 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="¸" 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="¹" horiz-adv-x="333" d="M249 280v429h-50q-10 -41 -47 -56t-86 -15v-50h115v-308h68z" />
|
||||
<glyph unicode="º" 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="»" 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="¼" 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="½" 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="¾" 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="¿" 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="À" 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="Á" 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="Â" 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="Ã" 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="Ä" 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="Å" 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="Æ" horiz-adv-x="926" d="M407 634h41v-346h-209zM354 714l-360 -714h106l102 208h246v-208h447v80h-357v247h330v80h-330v227h351v80h-535z" />
|
||||
<glyph unicode="Ç" 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="È" horiz-adv-x="611" d="M172 908l131 -143h64l-86 143h-109zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
|
||||
<glyph unicode="É" horiz-adv-x="611" d="M331 908l-86 -143h64l131 143h-109zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="611" d="M259 908l-103 -143h77l70 96l69 -96h84l-104 143h-93zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
|
||||
<glyph unicode="Ë" horiz-adv-x="611" d="M167 873v-104h90v104h-90zM355 873v-104h90v104h-90zM78 714v-714h496v80h-401v247h371v80h-371v227h398v80h-493z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="259" d="M-3 908l130 -143h64l-86 143h-108zM82 714v-714h95v714h-95z" />
|
||||
<glyph unicode="Í" horiz-adv-x="259" d="M155 908l-86 -143h64l131 143h-109zM82 714v-714h95v714h-95z" />
|
||||
<glyph unicode="Î" horiz-adv-x="259" d="M83 908l-102 -143h76l70 96l69 -96h84l-104 143h-93zM82 714v-714h95v714h-95z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="259" d="M-8 873v-104h89v104h-89zM179 873v-104h90v104h-90zM82 714v-714h95v714h-95z" />
|
||||
<glyph unicode="Ð" 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="Ñ" 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="Ò" 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="Ó" 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="Ô" 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="Õ" 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="Ö" 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="×" 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="Ø" 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="Ù" 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="Ú" 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="Û" 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="Ü" 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="Ý" horiz-adv-x="648" d="M349 908l-86 -143h64l131 143h-109zM373 292l273 422h-108l-209 -340l-214 340h-113l276 -422v-292h95v292z" />
|
||||
<glyph unicode="Þ" 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="ß" 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="à" 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="á" 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="â" 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="ã" 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="ä" 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="å" 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="æ" 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="ç" 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="è" 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="é" 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="ê" 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="ë" 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="ì" horiz-adv-x="222" d="M-22 731l130 -143h64l-86 143h-108zM69 0h85v517h-85v-517z" />
|
||||
<glyph unicode="í" horiz-adv-x="222" d="M136 731l-86 -143h64l131 143h-109zM69 0h85v517h-85v-517z" />
|
||||
<glyph unicode="î" horiz-adv-x="222" d="M64 731l-102 -143h76l70 96l69 -96h84l-104 143h-93zM69 0h85v517h-85v-517z" />
|
||||
<glyph unicode="ï" horiz-adv-x="222" d="M-27 696v-104h89v104h-89zM160 696v-104h90v104h-90zM69 0h85v517h-85v-517z" />
|
||||
<glyph unicode="ð" 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="ñ" 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="ò" 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="ó" 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="ô" 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="õ" 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="ö" 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="÷" 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="ø" 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="ù" 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="ú" 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="û" 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="ü" 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="ý" 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="þ" 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="ÿ" 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="Œ" 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="œ" 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="Ÿ" horiz-adv-x="648" d="M185 873v-104h90v104h-90zM373 873v-104h90v104h-90zM373 292l273 422h-108l-209 -340l-214 340h-113l276 -422v-292h95v292z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="222" d="M64 731l-102 -143h76l70 96l69 -96h84l-104 143h-93z" />
|
||||
<glyph unicode="˜" 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=" " horiz-adv-x="476" />
|
||||
<glyph unicode=" " horiz-adv-x="952" />
|
||||
<glyph unicode=" " horiz-adv-x="476" />
|
||||
<glyph unicode=" " horiz-adv-x="952" />
|
||||
<glyph unicode=" " horiz-adv-x="317" />
|
||||
<glyph unicode=" " horiz-adv-x="238" />
|
||||
<glyph unicode=" " horiz-adv-x="158" />
|
||||
<glyph unicode=" " horiz-adv-x="158" />
|
||||
<glyph unicode=" " horiz-adv-x="119" />
|
||||
<glyph unicode=" " horiz-adv-x="190" />
|
||||
<glyph unicode=" " horiz-adv-x="52" />
|
||||
<glyph unicode="‐" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
|
||||
<glyph unicode="‑" horiz-adv-x="389" d="M50 318v-80h289v80h-289z" />
|
||||
<glyph unicode="–" horiz-adv-x="500" d="M0 318v-80h500v80h-500z" />
|
||||
<glyph unicode="—" horiz-adv-x="1000" d="M130 318v-80h740v80h-740z" />
|
||||
<glyph unicode="‘" 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="’" 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="‚" 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="“" 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="”" 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="„" 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="•" 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="…" horiz-adv-x="1000" d="M777 111v-111h111v111h-111zM444 111v-111h111v111h-111zM111 111v-111h111v111h-111z" />
|
||||
<glyph unicode=" " horiz-adv-x="190" />
|
||||
<glyph unicode="‹" horiz-adv-x="259" d="M50 234l152 -120v86l-100 78l100 78v86l-152 -120v-88z" />
|
||||
<glyph unicode="›" horiz-adv-x="259" d="M209 322l-152 120v-86l100 -78l-100 -78v-86l152 120v88z" />
|
||||
<glyph unicode=" " horiz-adv-x="238" />
|
||||
<glyph unicode="€" 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="™" 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 |
@@ -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="	" horiz-adv-x="278" />
|
||||
<glyph unicode=" " horiz-adv-x="278" />
|
||||
<glyph unicode="!" horiz-adv-x="185" d="M83 182h20v532h-20v-532zM83 0h20v98h-20v-98z" />
|
||||
<glyph unicode=""" 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="&" 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="<" 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=">" 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="¡" horiz-adv-x="185" d="M103 360h-20v-536h20v536zM103 542h-20v-98h20v98z" />
|
||||
<glyph unicode="¢" 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="£" 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="¤" 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="¥" 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="¦" horiz-adv-x="222" d="M121 661h-20v-250h20v250zM121 -88v249h-20v-249h20z" />
|
||||
<glyph unicode="§" 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="¨" horiz-adv-x="130" d="M133 590h20v81h-20v-81zM-22 590h20v81h-20v-81z" />
|
||||
<glyph unicode="©" 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="ª" 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="«" horiz-adv-x="352" d="M262 121v35l-83 112l83 112v35l-103 -139v-16zM169 121v35l-83 112l83 112v35l-103 -139v-16z" />
|
||||
<glyph unicode="¬" horiz-adv-x="600" d="M532 340v-247h20v267h-504v-20h484z" />
|
||||
<glyph unicode="­" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
|
||||
<glyph unicode="®" 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="¯" horiz-adv-x="130" d="M181 628v20h-231v-20h231z" />
|
||||
<glyph unicode="°" 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="±" horiz-adv-x="600" d="M48 20v-20h504v20h-504zM290 506v-198h-242v-20h242v-198h20v198h242v20h-242v198h-20z" />
|
||||
<glyph unicode="²" 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="³" 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="´" horiz-adv-x="130" d="M171 731h-29l-132 -144h15z" />
|
||||
<glyph unicode="µ" 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="¶" 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="·" horiz-adv-x="278" d="M107 340q0 -14 9 -23t23 -9t23 9t9 23t-9 23t-23 9t-23 -9t-9 -23z" />
|
||||
<glyph unicode="¸" 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="¹" 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="º" 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="»" horiz-adv-x="352" d="M90 415v-35l83 -112l-83 -112v-35l103 139v16zM183 415v-35l83 -112l-83 -112v-35l103 139v16z" />
|
||||
<glyph unicode="¼" 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="½" 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="¾" 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="¿" 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="À" horiz-adv-x="575" d="M185 909l139 -144h15l-125 144h-29zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
|
||||
<glyph unicode="Á" horiz-adv-x="575" d="M394 909h-29l-132 -144h15zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
|
||||
<glyph unicode="Â" 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="Ã" 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="Ä" horiz-adv-x="575" d="M356 768h20v81h-20v-81zM200 768h20v81h-20v-81zM106 235h364l94 -235h22l-282 714h-26l-289 -714h22zM462 255h-348l176 439h2z" />
|
||||
<glyph unicode="Å" 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="Æ" horiz-adv-x="852" d="M376 696h47v-402h-258zM155 274h268v-274h412v20h-392v342h360v20h-360v312h392v20h-469l-377 -714h21z" />
|
||||
<glyph unicode="Ç" 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="È" horiz-adv-x="537" d="M166 909l139 -144h15l-125 144h-29zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
|
||||
<glyph unicode="É" horiz-adv-x="537" d="M375 909h-29l-132 -144h15zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="537" d="M370 770h20l-114 139h-15l-113 -139h20l99 123zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
|
||||
<glyph unicode="Ë" horiz-adv-x="537" d="M337 768h20v81h-20v-81zM181 768h20v81h-20v-81zM74 20v342h427v20h-427v312h454v20h-474v-714h478v20h-458z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="128" d="M-38 909l138 -144h15l-124 144h-29zM54 714v-714h20v714h-20z" />
|
||||
<glyph unicode="Í" horiz-adv-x="128" d="M170 909h-29l-132 -144h15zM54 714v-714h20v714h-20z" />
|
||||
<glyph unicode="Î" horiz-adv-x="128" d="M165 770h20l-114 139h-15l-112 -139h20l98 123zM54 714v-714h20v714h-20z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="128" d="M132 768h20v81h-20v-81zM-23 768h20v81h-20v-81zM54 714v-714h20v714h-20z" />
|
||||
<glyph unicode="Ð" 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="Ñ" 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="Ò" 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="Ó" 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="Ô" 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="Õ" 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="Ö" 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="×" 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="Ø" 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="Ù" 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="Ú" 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="Û" 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="Ü" 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="Ý" horiz-adv-x="538" d="M375 931h-29l-132 -144h15zM544 714l-275 -392l-273 392h-25l288 -413v-301h20v301l289 413h-24z" />
|
||||
<glyph unicode="Þ" 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="ß" 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="à" 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="á" 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="â" 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="ã" 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="ä" 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="å" 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="æ" 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="ç" 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="è" 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="é" 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="ê" 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="ë" 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="ì" horiz-adv-x="130" d="M-37 709l138 -144h15l-124 144h-29zM55 0h20v514h-20v-514z" />
|
||||
<glyph unicode="í" horiz-adv-x="130" d="M171 709h-29l-132 -144h15zM55 0h20v514h-20v-514z" />
|
||||
<glyph unicode="î" horiz-adv-x="130" d="M166 570h20l-114 139h-15l-112 -139h20l98 123zM55 0h20v514h-20v-514z" />
|
||||
<glyph unicode="ï" horiz-adv-x="130" d="M133 568h20v81h-20v-81zM-22 568h20v81h-20v-81zM55 0h20v514h-20v-514z" />
|
||||
<glyph unicode="ð" 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="ñ" 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="ò" 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="ó" 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="ô" 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="õ" 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="ö" 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="÷" 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="ø" 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="ù" 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="ú" 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="û" 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="ü" 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="ý" 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="þ" 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="ÿ" 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="Œ" 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="œ" 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="Ÿ" horiz-adv-x="538" d="M337 768h20v81h-20v-81zM181 768h20v81h-20v-81zM544 714l-275 -392l-273 392h-25l288 -413v-301h20v301l289 413h-24z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="130" d="M166 592h20l-114 139h-15l-112 -139h20l98 123z" />
|
||||
<glyph unicode="˜" 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=" " horiz-adv-x="465" />
|
||||
<glyph unicode=" " horiz-adv-x="931" />
|
||||
<glyph unicode=" " horiz-adv-x="465" />
|
||||
<glyph unicode=" " horiz-adv-x="931" />
|
||||
<glyph unicode=" " horiz-adv-x="310" />
|
||||
<glyph unicode=" " horiz-adv-x="232" />
|
||||
<glyph unicode=" " horiz-adv-x="155" />
|
||||
<glyph unicode=" " horiz-adv-x="155" />
|
||||
<glyph unicode=" " horiz-adv-x="116" />
|
||||
<glyph unicode=" " horiz-adv-x="186" />
|
||||
<glyph unicode=" " horiz-adv-x="51" />
|
||||
<glyph unicode="‐" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
|
||||
<glyph unicode="‑" horiz-adv-x="333" d="M79 278v-20h175v20h-175z" />
|
||||
<glyph unicode="–" d="M0 278v-20h500v20h-500z" />
|
||||
<glyph unicode="—" horiz-adv-x="1000" d="M870 258v20h-740v-20h740z" />
|
||||
<glyph unicode="‘" 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="’" 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="‚" 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="“" 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="”" 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="„" 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="•" 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="…" horiz-adv-x="1000" d="M843 0v98h-20v-98h20zM510 0v98h-20v-98h20zM177 0v98h-20v-98h20z" />
|
||||
<glyph unicode=" " horiz-adv-x="186" />
|
||||
<glyph unicode="‹" horiz-adv-x="259" d="M169 121v35l-83 112l83 112v35l-103 -139v-16z" />
|
||||
<glyph unicode="›" horiz-adv-x="259" d="M90 415v-35l83 -112l-83 -112v-35l103 139v16z" />
|
||||
<glyph unicode=" " horiz-adv-x="232" />
|
||||
<glyph unicode="€" 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="™" 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 |
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1,57 +0,0 @@
|
||||
.book {
|
||||
.book-body {
|
||||
position: fixed;
|
||||
top: 40px;
|
||||
right: 0px;
|
||||
left: 0px;
|
||||
bottom: 0px;
|
||||
overflow-y: auto;
|
||||
|
||||
.transition(left 0.5s ease);
|
||||
|
||||
background: #edece4;
|
||||
|
||||
.page-wrapper {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
padding-bottom: 100px;
|
||||
|
||||
.page-inner {
|
||||
max-width: 800px;
|
||||
margin: 0px auto;
|
||||
|
||||
section {
|
||||
margin: 0px 0px;
|
||||
padding: 5px 15px;
|
||||
background: #fff;
|
||||
border-radius: 2px;
|
||||
font-size: 15px;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
|
||||
.btn {
|
||||
border-radius: 0px;
|
||||
background: #eee;
|
||||
border: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.with-summary {
|
||||
@media (min-width: 800px) {
|
||||
.book-body {
|
||||
left: 250px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.without-animation {
|
||||
.book-body {
|
||||
.transition(none) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
.book {
|
||||
.page-footer {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
|
||||
padding: 10px;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
color: #fff;
|
||||
|
||||
.navigation-link {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size: 24px;
|
||||
line-height: 60px;
|
||||
border-radius: 2px;
|
||||
|
||||
background: @brand-success;
|
||||
color: inherit;
|
||||
|
||||
text-transform: uppercase;
|
||||
|
||||
&:hover {
|
||||
background: darken(@btn-success-bg, 5%);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&.coming-soon, &.coming-soon:hover {
|
||||
background: #f0ad4e;
|
||||
}
|
||||
&.finished, &.finished:hover {
|
||||
background: darken(@btn-success-bg, 5%);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
.book {
|
||||
.book-header {
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
left: 0px;
|
||||
z-index: 2;
|
||||
|
||||
height: 40px;
|
||||
|
||||
font-size: 0.85em;
|
||||
|
||||
background: #242628;
|
||||
color: #e2edf2;
|
||||
overflow: hidden;
|
||||
|
||||
.btn {
|
||||
display: block;
|
||||
height: 40px;
|
||||
padding: 0px 15px;
|
||||
border-bottom: none;
|
||||
color: #7d878a;
|
||||
text-transform: uppercase;
|
||||
line-height: 40px;
|
||||
|
||||
&:hover {
|
||||
color: #e2edf2;
|
||||
text-decoration: none;
|
||||
position: relative;
|
||||
background: #303436;
|
||||
box-shadow: 0 -2px 2px rgba(0,0,0,0.2) inset;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0px;
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
|
||||
padding-left: 200px;
|
||||
padding-right: 200px;
|
||||
.transition(margin-left 0.5s ease);
|
||||
|
||||
a, a:hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@media (max-width: 800px) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.with-summary {
|
||||
.book-header h1 {
|
||||
margin-left: 250px;
|
||||
}
|
||||
}
|
||||
&.without-animation {
|
||||
.book-header h1 {
|
||||
.transition(none) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
/* Chrome, Safari, Opera */
|
||||
@-webkit-keyframes animate-loading
|
||||
{
|
||||
from {width: 0%;}
|
||||
to {}
|
||||
}
|
||||
|
||||
/* Standard syntax */
|
||||
@keyframes animate-loading
|
||||
{
|
||||
from {width: 0%;}
|
||||
to {}
|
||||
}
|
||||
|
||||
.book .book-body {
|
||||
@chapter-size: 16px;
|
||||
|
||||
@bar-background: #eee;
|
||||
|
||||
.book-progress {
|
||||
height: 30px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
background: #fff;
|
||||
margin-bottom: 20px;
|
||||
|
||||
.bar {
|
||||
height: 8px;
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
left: 20px;
|
||||
top: 11px;
|
||||
|
||||
background: @bar-background;
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
|
||||
.inner {
|
||||
height: 100%;
|
||||
width: 0%;
|
||||
|
||||
background: @brand-success;
|
||||
-webkit-animation: animate-loading 1s; /* Chrome, Safari, Opera */
|
||||
animation: animate-loading 1s;
|
||||
|
||||
.in-inner {
|
||||
height: 100%;
|
||||
width: 50%;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.chapters {
|
||||
position: absolute;
|
||||
right: 20px + @chapter-size;
|
||||
left: 20px;
|
||||
top: 7px;
|
||||
|
||||
.chapter {
|
||||
position: absolute;
|
||||
width: @chapter-size;
|
||||
height: @chapter-size;
|
||||
border-radius: @chapter-size;
|
||||
|
||||
background: @bar-background;
|
||||
box-shadow: 0px 0px 1px #bbb;
|
||||
|
||||
&.new-chapter {
|
||||
|
||||
}
|
||||
|
||||
&.done {
|
||||
background: @brand-success;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
.book {
|
||||
.book-summary {
|
||||
@width: 250px;
|
||||
|
||||
position: fixed;
|
||||
top: 40px;
|
||||
left: -@width;
|
||||
bottom: 0px;
|
||||
z-index: 1;
|
||||
|
||||
overflow-y: auto;
|
||||
|
||||
width: @width;
|
||||
background: #2e3133;
|
||||
color: #e2edf2;
|
||||
|
||||
.transition(all 0.5s ease);
|
||||
|
||||
ul.summary {
|
||||
list-style: none;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
|
||||
li {
|
||||
list-style: none;
|
||||
|
||||
&.divider {
|
||||
height: 1px;
|
||||
margin: 7px 0;
|
||||
overflow: hidden;
|
||||
background: #35393b;
|
||||
}
|
||||
|
||||
i.fa-check {
|
||||
display: none;
|
||||
position: absolute;
|
||||
left: 7px;
|
||||
top: 14px;
|
||||
}
|
||||
|
||||
&.done {
|
||||
> a {
|
||||
color: @brand-success;
|
||||
|
||||
i {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
a, span {
|
||||
display: block;
|
||||
height: 40px;
|
||||
padding: 11px 15px;
|
||||
border-bottom: none;
|
||||
text-transform: uppercase;
|
||||
color: #e2edf2;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
padding-left: 26px;
|
||||
}
|
||||
|
||||
span {
|
||||
cursor: not-allowed;
|
||||
.opacity(0.3);
|
||||
}
|
||||
|
||||
&.active > a, a:hover {
|
||||
background: #242628;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 35px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
width: 100%;
|
||||
bottom: 0px;
|
||||
left: -100%;
|
||||
}
|
||||
}
|
||||
|
||||
&.with-summary {
|
||||
.book-summary {
|
||||
left: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
&.without-animation {
|
||||
.book-summary {
|
||||
.transition(none) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
@font-face
|
||||
{
|
||||
font-family: 'appNormal';
|
||||
src: url('@{FontPath}/helvetica/normal.ttf'),
|
||||
url('@{FontPath}/helvetica/normal.woff'),
|
||||
url('@{FontPath}/helvetica/normal.eot'),
|
||||
url('@{FontPath}/helvetica/normal.svg');
|
||||
}
|
||||
|
||||
@font-face
|
||||
{
|
||||
font-family: 'appLight';
|
||||
src: url('@{FontPath}/helvetica/ultralight.ttf'),
|
||||
url('@{FontPath}/helvetica/ultralight.woff'),
|
||||
url('@{FontPath}/helvetica/ultralight.eot'),
|
||||
url('@{FontPath}/helvetica/ultralight.svg');
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
@import "vendors/bootstrap/bootstrap.less";
|
||||
@import "vendors/fontawesome/font-awesome.less";
|
||||
|
||||
@import "mixins.less";
|
||||
@import "variables.less";
|
||||
@import "fonts.less";
|
||||
|
||||
@import "highlight.less";
|
||||
|
||||
@import "book/header.less";
|
||||
@import "book/summary.less";
|
||||
@import "book/body.less";
|
||||
@import "book/footer.less";
|
||||
@import "book/exercise.less";
|
||||
@import "book/markdown.less";
|
||||
@import "book/progress.less";
|
||||
|
||||
* {
|
||||
-webkit-overflow-scrolling: touch;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
-webkit-text-size-adjust: none;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
.box-shadow(none);
|
||||
}
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
|
||||
font-smoothing: antialiased;
|
||||
font-family: 'appNormal';
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/* Base static */
|
||||
@staticPath: "./";
|
||||
|
||||
/* Colors */
|
||||
@codeboxMainColor: #F16956; /* red */
|
||||
@codeboxMainColorDarker: darken(@codeboxMainColor, 15%);
|
||||
|
||||
@codeboxMainColor2: #353D48;
|
||||
|
||||
// Basics of a navbar
|
||||
@navbar-height: 50px;
|
||||
@navbar-margin-bottom: @line-height-computed;
|
||||
@navbar-default-border: #d5d5d5;
|
||||
@navbar-border-radius: 0px;
|
||||
@navbar-padding-horizontal: floor(@grid-gutter-width / 2);
|
||||
@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
|
||||
|
||||
// Navbar brand label
|
||||
@navbar-default-color: #333;
|
||||
@navbar-default-link-color: #333;
|
||||
@navbar-default-brand-color: @navbar-default-link-color;
|
||||
@navbar-default-brand-hover-color: @navbar-default-link-color;
|
||||
@navbar-default-brand-hover-bg: transparent;
|
||||
|
||||
// Navbar toggle
|
||||
@navbar-default-toggle-hover-bg: #fff;
|
||||
@navbar-default-toggle-icon-bar-bg: @codeboxMainColorDarker;
|
||||
@navbar-default-toggle-border-color: @codeboxMainColorDarker;
|
||||
@navbar-default-link-active-color: @codeboxMainColor;
|
||||
@navbar-default-link-active-bg: #fff;
|
||||
|
||||
@border-radius-base: 1px;
|
||||
@border-radius-large: 3px;
|
||||
@border-radius-small: 1px;
|
||||
|
||||
/* Fonts */
|
||||
@font-family-base: 'appNormal';
|
||||
|
||||
|
||||
/* Fonts */
|
||||
@FontPath: '@{staticPath}/fonts';
|
||||
@fa-font-path: "@{FontPath}/fontawesome";
|
||||
@@ -0,0 +1,63 @@
|
||||
var path = require('path');
|
||||
var Q = require('q');
|
||||
var _ = require('lodash');
|
||||
var fs = require('fs');
|
||||
|
||||
var utils = require('./utils');
|
||||
var generate = require("../lib/generate");
|
||||
var parse = require("../lib/parse");
|
||||
var generators = require("../lib/generate").generators;
|
||||
|
||||
var buildCommand = function(command) {
|
||||
return command
|
||||
.option('-v, --verbose', 'Activate verbose mode, useful for debugging errors')
|
||||
.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 buildEbookCommand = function(command) {
|
||||
return buildCommand(command)
|
||||
.option('-c, --cover <path>', 'Cover image, default is cover.jpg if exists');
|
||||
};
|
||||
|
||||
var makeBuildFunc = function(converter) {
|
||||
return function(dir, options) {
|
||||
dir = dir || process.cwd();
|
||||
outputDir = options.output;
|
||||
|
||||
// Set debugging
|
||||
if(options.verbose) {
|
||||
process.env.DEBUG = "true";
|
||||
}
|
||||
|
||||
console.log('Starting build ...');
|
||||
return converter(
|
||||
_.extend({}, options || {}, {
|
||||
input: dir,
|
||||
output: outputDir,
|
||||
generator: options.format,
|
||||
configFile: options.config
|
||||
})
|
||||
)
|
||||
.then(function(output) {
|
||||
console.log("Successfully built!");
|
||||
return output;
|
||||
})
|
||||
.fail(function(err) {
|
||||
// Log error
|
||||
utils.logError(err);
|
||||
|
||||
// Exit process with failure code
|
||||
process.exit(-1);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
folder: makeBuildFunc(generate.folder),
|
||||
file: makeBuildFunc(generate.file),
|
||||
command: buildCommand,
|
||||
commandEbook: buildEbookCommand
|
||||
};
|
||||
@@ -1,102 +1,120 @@
|
||||
#! /usr/bin/env node
|
||||
|
||||
// Requires
|
||||
var Q = require('q');
|
||||
var _ = require('lodash');
|
||||
var path = require('path');
|
||||
var prog = require('commander');
|
||||
|
||||
var fs = require('fs');
|
||||
var tinylr = require('tiny-lr-fork');
|
||||
|
||||
var pkg = require('../package.json');
|
||||
var generate = require("../lib/generate");
|
||||
var parse = require("../lib/parse");
|
||||
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)
|
||||
.option('-d, --dir <source_directory>', 'Source directory of book, containing Markdown files');
|
||||
.version(pkg.version);
|
||||
|
||||
|
||||
var buildFunc;
|
||||
prog
|
||||
.command('build [source_dir]')
|
||||
build.command(prog.command('build [source_dir]'))
|
||||
.description('Build a gitbook from a directory')
|
||||
.option('-o, --output <directory>', 'Path to output directory, defaults to ./_book')
|
||||
.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')
|
||||
.action(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);
|
||||
})
|
||||
.then(function(repoID) {
|
||||
var parts = repoID.split('/', 2);
|
||||
var user = parts[0], repo = parts[1];
|
||||
.action(build.folder);
|
||||
|
||||
return generate.folder(
|
||||
dir,
|
||||
outputDir,
|
||||
{
|
||||
title: options.title || utils.titleCase(repo),
|
||||
description: options.intro,
|
||||
github: options.github || repoID
|
||||
}
|
||||
);
|
||||
})
|
||||
.then(function(output) {
|
||||
console.log("Successfuly built !");
|
||||
}, function(err) {
|
||||
console.log(err.stack || err);
|
||||
throw err;
|
||||
})
|
||||
.then(_.constant(outputDir));
|
||||
});
|
||||
|
||||
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)
|
||||
.option('-o, --output <directory>', 'Path to output directory, defaults to ./_book')
|
||||
.option('-t, --title <name>', 'Name of the book to generate, defaults to repo name')
|
||||
.option('-g, --github <repo_path>', 'ID of github repo like : username/repo')
|
||||
.option('--no-watch', 'Disable restart with file watching')
|
||||
.action(function(dir, options) {
|
||||
buildFunc(dir, options)
|
||||
.then(function(outputDir) {
|
||||
console.log();
|
||||
console.log('Starting server ...');
|
||||
return utils.serveDir(outputDir, options.port);
|
||||
})
|
||||
.then(function() {
|
||||
console.log('Serving book on http://localhost:'+options.port);
|
||||
console.log();
|
||||
console.log('Press CTRL+C to quit ...');
|
||||
})
|
||||
.fail(function(err) {
|
||||
console.error(err);
|
||||
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);
|
||||
};
|
||||
|
||||
console.log('Press CTRL+C to quit ...');
|
||||
console.log('')
|
||||
generate();
|
||||
});
|
||||
|
||||
build.commandEbook(prog.command('pdf [source_dir]'))
|
||||
.description('Build a gitbook as a PDF')
|
||||
.action(function(dir, options) {
|
||||
build.file(dir, _.extend(options, {
|
||||
extension: "pdf",
|
||||
format: "ebook"
|
||||
}));
|
||||
});
|
||||
|
||||
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('lex <page_file>')
|
||||
.description('Parse a page file into sections, display JSON dump')
|
||||
.action(function(page_file) {
|
||||
var parsed = parse.page(fs.readFileSync(page_file, 'utf-8'));
|
||||
|
||||
console.log(JSON.stringify(parsed, null, 4));
|
||||
.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
|
||||
if(_.isEmpty(prog.parse(process.argv).args) && process.argv.length === 2) {
|
||||
prog.help();
|
||||
|
||||
@@ -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;
|
||||
@@ -4,89 +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) {
|
||||
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
|
||||
};
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"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",
|
||||
"ace-builds": "1.1.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
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");
|
||||
var stringUtils = require("../../utils/string");
|
||||
|
||||
/*
|
||||
* This generator inherits from the single page generator
|
||||
* and convert the page output to ebook
|
||||
*/
|
||||
var Generator = function() {
|
||||
BaseGenerator.apply(this, arguments);
|
||||
};
|
||||
util.inherits(Generator, BaseGenerator);
|
||||
|
||||
Generator.prototype.finish = function() {
|
||||
var that = this;
|
||||
|
||||
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,
|
||||
"--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),
|
||||
"--pdf-mono-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."+format),
|
||||
stringUtils.optionsToShellArgs(_options)
|
||||
].join(" ");
|
||||
|
||||
exec(command, function (error, stdout, stderr) {
|
||||
if (error) {
|
||||
if (error.code == 127) {
|
||||
error.message = "Need to install ebook-convert from Calibre";
|
||||
} else {
|
||||
error.message = error.message + " "+stdout;
|
||||
}
|
||||
return d.reject(error);
|
||||
}
|
||||
d.resolve();
|
||||
});
|
||||
|
||||
return d.promise;
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = Generator;
|
||||
@@ -11,12 +11,25 @@ var getFiles = function(path) {
|
||||
|
||||
var ig = Ignore({
|
||||
path: path,
|
||||
ignoreFiles: ['.ignore', '.gitignore']
|
||||
ignoreFiles: ['.ignore', '.gitignore', '.bookignore']
|
||||
});
|
||||
|
||||
// Add extra rules to ignore common folders
|
||||
ig.addIgnoreRules([
|
||||
'.git/'
|
||||
// Skip Git stuff
|
||||
'.git/',
|
||||
'.gitignore',
|
||||
|
||||
// Skip OS X meta data
|
||||
'.DS_Store',
|
||||
|
||||
// Skip stuff installed by plugins
|
||||
'node_modules',
|
||||
|
||||
// Skip book outputs
|
||||
'*.pdf',
|
||||
'*.epub',
|
||||
'*.mobi',
|
||||
], '__custom_stuff');
|
||||
|
||||
// Push each file to our list
|
||||
@@ -27,13 +40,21 @@ var getFiles = function(path) {
|
||||
});
|
||||
|
||||
ig.on('end', function() {
|
||||
d.resolve(files);
|
||||
// Normalize paths on Windows
|
||||
if(process.platform === 'win32') {
|
||||
return d.resolve(files.map(function(file) {
|
||||
return file.replace(/\\/g, '/');
|
||||
}));
|
||||
}
|
||||
|
||||
// Simply return paths otherwise
|
||||
return d.resolve(files);
|
||||
});
|
||||
|
||||
ig.on('error', d.reject);
|
||||
|
||||
return d.promise;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
list: getFiles,
|
||||
@@ -43,4 +64,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;
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
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) {
|
||||
return Q.reject(new Error("Could not convert "+input));
|
||||
};
|
||||
|
||||
BaseGenerator.prototype.transferFile = function(input) {
|
||||
return fs.copy(
|
||||
path.join(this.options.input, input),
|
||||
path.join(this.options.output, input)
|
||||
);
|
||||
};
|
||||
|
||||
BaseGenerator.prototype.transferFolder = function(input) {
|
||||
return fs.mkdirp(
|
||||
path.join(this.options.output, input)
|
||||
);
|
||||
};
|
||||
|
||||
BaseGenerator.prototype.copyCover = function() {
|
||||
var that = this;
|
||||
|
||||
return Q.all([
|
||||
fs.copy(path.join(this.options.input, "cover.jpg"), path.join(this.options.output, "cover.jpg")),
|
||||
fs.copy(path.join(this.options.input, "cover_small.jpg"), path.join(this.options.output, "cover_small.jpg"))
|
||||
])
|
||||
.fail(function() {
|
||||
// If orignally from multi-lang, try copy from originalInput
|
||||
if (!that.options.originalInput) return;
|
||||
|
||||
return Q.all([
|
||||
fs.copy(path.join(that.options.originalInput, "cover.jpg"), path.join(that.options.output, "cover.jpg")),
|
||||
fs.copy(path.join(that.options.originalInput, "cover_small.jpg"), path.join(that.options.output, "cover_small.jpg"))
|
||||
]);
|
||||
})
|
||||
.fail(function(err) {
|
||||
return Q();
|
||||
});
|
||||
};
|
||||
|
||||
BaseGenerator.prototype.langsIndex = function(langs) {
|
||||
return Q.reject(new Error("Langs index is not supported in this generator"));
|
||||
};
|
||||
|
||||
BaseGenerator.prototype.finish = function() {
|
||||
return Q.reject(new Error("Could not finish generation"));
|
||||
};
|
||||
|
||||
|
||||
|
||||
module.exports = BaseGenerator;
|
||||
@@ -1,126 +1,393 @@
|
||||
var Q = require("q");
|
||||
var _ = require("lodash");
|
||||
|
||||
var path = require("path");
|
||||
var tmp = require('tmp');
|
||||
|
||||
var swig = require('./template');
|
||||
var fs = require("./fs");
|
||||
var parse = require("../parse");
|
||||
var template = require("./template");
|
||||
var Plugin = require("./plugin");
|
||||
|
||||
var generate = function(root, output, options) {
|
||||
var files, summary, navigation, tpl;
|
||||
var generators = {
|
||||
"site": require("./site"),
|
||||
"page": require("./page"),
|
||||
"ebook": require("./ebook"),
|
||||
"json": require("./json")
|
||||
};
|
||||
|
||||
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,
|
||||
|
||||
// Config file (relative to input)
|
||||
"configFile": "book",
|
||||
|
||||
// Output generator
|
||||
"generator": "site",
|
||||
|
||||
// Book title, keyword, description
|
||||
title: null,
|
||||
description: "Book generated using GitBook",
|
||||
"title": null,
|
||||
"description": null,
|
||||
|
||||
// Origin github repository id
|
||||
github: null
|
||||
"github": null,
|
||||
"githubHost": 'https://github.com/',
|
||||
|
||||
// Theming
|
||||
"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) return Q.reject(new Error("Need options.github and optiosn.title"));
|
||||
// Validate options
|
||||
if (!options.input) {
|
||||
return Q.reject(new Error("Need option input (book input directory)"));
|
||||
}
|
||||
|
||||
// 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(output)
|
||||
|
||||
.then(function(_langsSummary) {
|
||||
langsSummary = _langsSummary;
|
||||
return fs.remove(options.output);
|
||||
})
|
||||
.then(function() {
|
||||
return fs.mkdirp(output);
|
||||
return fs.mkdirp(options.output);
|
||||
})
|
||||
|
||||
// List all files in the repository
|
||||
// Generate sub-books
|
||||
.then(function() {
|
||||
return fs.list(root);
|
||||
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),
|
||||
originalInput: options.input,
|
||||
originalOutput: options.output
|
||||
}));
|
||||
})
|
||||
}, Q());
|
||||
})
|
||||
|
||||
// Check repository is valid
|
||||
.then(function(_files) {
|
||||
files = _files;
|
||||
.then(function() {
|
||||
return loadGenerator(options);
|
||||
})
|
||||
|
||||
if (!_.contains(files, "SUMMARY.md") || !_.contains(files, "README.md")) {
|
||||
// Generate languages index
|
||||
.then(function(generator) {
|
||||
return generator.langsIndex(options.langsSummary);
|
||||
})
|
||||
|
||||
// Copy cover file
|
||||
.then(function() {
|
||||
return Q.all([
|
||||
fs.copy(path.join(options.input, "cover.jpg"), path.join(options.output, "cover.jpg")),
|
||||
fs.copy(path.join(options.input, "cover_small.jpg"), path.join(options.output, "cover_small.jpg"))
|
||||
])
|
||||
.fail(function() {
|
||||
return Q();
|
||||
})
|
||||
})
|
||||
|
||||
// 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"));
|
||||
}
|
||||
})
|
||||
|
||||
// Get summary
|
||||
// Clean output folder
|
||||
.then(function() {
|
||||
return fs.readFile(path.join(root, "SUMMARY.md"), "utf-8")
|
||||
.then(function(_summary) {
|
||||
summary = parse.summary(_summary);
|
||||
return fs.remove(options.output);
|
||||
})
|
||||
|
||||
// Parse navigation
|
||||
navigation = parse.navigation(summary);
|
||||
// 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
|
||||
options.github = (
|
||||
// Support URLs in "github" entry of book.json
|
||||
parse.git.githubID(options.github) ||
|
||||
|
||||
// Fallback
|
||||
options.github
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// 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;
|
||||
});
|
||||
})
|
||||
|
||||
// Create template
|
||||
.then(function() {
|
||||
tpl = template({
|
||||
root: root,
|
||||
output: output,
|
||||
locals: {
|
||||
title: options.title,
|
||||
description: options.description,
|
||||
return fs.mkdirp(options.output);
|
||||
})
|
||||
|
||||
githubAuthor: options.github.split("/")[0],
|
||||
githubId: options.github,
|
||||
|
||||
summary: summary,
|
||||
allNavigation: navigation
|
||||
}
|
||||
// List all files in the repository
|
||||
.then(function() {
|
||||
return fs.list(options.input)
|
||||
.then(function(_files) {
|
||||
files = _files;
|
||||
});
|
||||
})
|
||||
|
||||
// Copy file and replace markdown file
|
||||
.then(function() {
|
||||
return Q.all(
|
||||
_.chain(files)
|
||||
.map(function(file) {
|
||||
if (!file) return;
|
||||
var _html = file.replace(".md", ".html");
|
||||
return loadGenerator(options);
|
||||
})
|
||||
|
||||
// Folder
|
||||
if (file[file.length -1] == "/") {
|
||||
return fs.mkdirp(
|
||||
path.join(output, file)
|
||||
);
|
||||
// Convert files
|
||||
.then(function(generator) {
|
||||
// Generate the book
|
||||
return Q()
|
||||
|
||||
// Get summary
|
||||
.then(function() {
|
||||
return fs.readFile(path.join(options.input, "SUMMARY.md"), "utf-8")
|
||||
.then(function(_summary) {
|
||||
options.summary = parse.summary(_summary);
|
||||
|
||||
// Parse navigation
|
||||
options.navigation = parse.navigation(options.summary);
|
||||
});
|
||||
})
|
||||
|
||||
// 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
|
||||
.then(function() {
|
||||
return 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);
|
||||
}
|
||||
|
||||
// Markdown file (only from the summary)
|
||||
else if (path.extname(file) == ".md" && navigation[_html] != null) {
|
||||
return tpl(file, file.replace(".md", ".html"));
|
||||
}
|
||||
return fs.copy(
|
||||
path.join(_tmpDir, "index."+ext),
|
||||
_outputFile
|
||||
);
|
||||
};
|
||||
|
||||
// Copy file
|
||||
else {
|
||||
return fs.copy(
|
||||
path.join(root, file),
|
||||
path.join(output, file)
|
||||
// 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();
|
||||
}
|
||||
})
|
||||
.value()
|
||||
);
|
||||
})
|
||||
|
||||
// Symlink index.html to README.html
|
||||
.then(function() {
|
||||
return fs.symlink(
|
||||
path.join(output, 'README.html'),
|
||||
path.join(output, 'index.html')
|
||||
);
|
||||
})
|
||||
|
||||
// Copy assets
|
||||
.then(function() {
|
||||
return fs.copy(
|
||||
path.join(__dirname, "../../assets/static"),
|
||||
path.join(output, "gitbook")
|
||||
);
|
||||
.then(function() {
|
||||
return fs.remove(tmpDir);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
folder: generate
|
||||
generators: generators,
|
||||
folder: generate,
|
||||
file: generateFile,
|
||||
book: generateBook,
|
||||
Plugin: Plugin,
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
@@ -0,0 +1,77 @@
|
||||
var util = require("util");
|
||||
var path = require("path");
|
||||
var Q = require("q");
|
||||
var _ = require("lodash");
|
||||
|
||||
var fs = require("../fs");
|
||||
var parse = require("../../parse");
|
||||
var BaseGenerator = require("../generator");
|
||||
|
||||
|
||||
var Generator = function() {
|
||||
BaseGenerator.apply(this, arguments);
|
||||
};
|
||||
util.inherits(Generator, BaseGenerator);
|
||||
|
||||
Generator.prototype.transferFile = function(input) {
|
||||
// ignore
|
||||
};
|
||||
|
||||
Generator.prototype.convertFile = function(content, input) {
|
||||
var that = this;
|
||||
var json = {
|
||||
progress: parse.progress(this.options.navigation, input)
|
||||
};
|
||||
|
||||
return Q()
|
||||
.then(function() {
|
||||
return parse.page(content, {
|
||||
repo: that.options.githubId,
|
||||
dir: path.dirname(input) || '/'
|
||||
});
|
||||
})
|
||||
.then(function(sections) {
|
||||
json.sections = sections;
|
||||
})
|
||||
.then(function() {
|
||||
return fs.writeFile(
|
||||
path.join(that.options.output, input.replace(".md", ".json")),
|
||||
JSON.stringify(json, null, 4)
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
// 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
|
||||
};
|
||||
|
||||
module.exports = Generator;
|
||||
@@ -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;
|
||||
@@ -0,0 +1,92 @@
|
||||
var _ = require("lodash");
|
||||
var util = require("util");
|
||||
var path = require("path");
|
||||
var Q = require("q");
|
||||
var swig = require("../template");
|
||||
|
||||
var fs = require("../fs");
|
||||
var parse = require("../../parse");
|
||||
var BaseGenerator = require("../site");
|
||||
|
||||
|
||||
/*
|
||||
* This generator will generate a simple index.html which can be converted as a PDF
|
||||
*/
|
||||
var Generator = function() {
|
||||
BaseGenerator.apply(this, arguments);
|
||||
|
||||
// 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 = {
|
||||
path: input,
|
||||
progress: parse.progress(this.options.navigation, input)
|
||||
};
|
||||
|
||||
return Q()
|
||||
.then(function() {
|
||||
return parse.page(content, {
|
||||
repo: that.options.githubId,
|
||||
dir: path.dirname(input) || '/',
|
||||
outdir: './',
|
||||
singleFile: true
|
||||
});
|
||||
})
|
||||
.then(function(sections) {
|
||||
json.content = sections;
|
||||
})
|
||||
.then(function() {
|
||||
that.pages[input] = json;
|
||||
});
|
||||
};
|
||||
|
||||
// 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"),
|
||||
}, output);
|
||||
})
|
||||
|
||||
// Copy cover
|
||||
.then(function() {
|
||||
return that.copyCover();
|
||||
})
|
||||
|
||||
// Copy assets
|
||||
.then(function() {
|
||||
return fs.copy(
|
||||
path.join(that.options.theme, "assets"),
|
||||
path.join(that.options.output, "gitbook")
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = Generator;
|
||||
@@ -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;
|
||||
@@ -0,0 +1,241 @@
|
||||
var util = require("util");
|
||||
var path = require("path");
|
||||
var Q = require("q");
|
||||
var _ = require("lodash");
|
||||
var swig = require("../template");
|
||||
|
||||
var fs = require("../fs");
|
||||
var parse = require("../../parse");
|
||||
var BaseGenerator = require("../generator");
|
||||
var links = require("../../utils/links");
|
||||
var indexer = require('./search_indexer');
|
||||
var Manifest = require('../manifest');
|
||||
|
||||
|
||||
|
||||
var Generator = function() {
|
||||
BaseGenerator.apply(this, arguments);
|
||||
|
||||
// Attach methods to instance
|
||||
_.bindAll(this);
|
||||
|
||||
this.revision = Date.now();
|
||||
this.indexer = indexer();
|
||||
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, interpolate) {
|
||||
var that = this;
|
||||
|
||||
interpolate = interpolate || _.identity;
|
||||
return Q()
|
||||
.then(function(sections) {
|
||||
return tpl(_.extend({
|
||||
revision: that.revision,
|
||||
|
||||
title: that.options.title,
|
||||
description: that.options.description,
|
||||
|
||||
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,
|
||||
|
||||
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,
|
||||
html
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
Generator.prototype.indexPage = function(lexed, pagePath) {
|
||||
this.indexer.add(lexed, pagePath);
|
||||
return Q();
|
||||
};
|
||||
|
||||
// Convert a markdown file to html
|
||||
Generator.prototype.convertFile = function(content, _input) {
|
||||
var that = this;
|
||||
|
||||
_output = _input.replace(".md", ".html");
|
||||
if (_output == "README.html") _output = "index.html";
|
||||
|
||||
var input = path.join(this.options.input, _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(page.content);
|
||||
})
|
||||
.then(function(lexed) {
|
||||
// Index page in search
|
||||
return that.indexPage(lexed, _output)
|
||||
.then(_.constant(lexed));
|
||||
})
|
||||
.then(function(lexed) {
|
||||
// Get HTML generated sections
|
||||
return parse.page(lexed, {
|
||||
repo: that.options.githubId,
|
||||
dir: path.dirname(_input) || '/',
|
||||
outdir: path.dirname(_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: page.progress,
|
||||
|
||||
_input: _input,
|
||||
content: page.sections,
|
||||
|
||||
basePath: basePath,
|
||||
staticBase: links.join(basePath, "gitbook"),
|
||||
}, output, function(html) {
|
||||
page.content = html;
|
||||
|
||||
return _callHook("page:after").get("content")
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Generate languages index
|
||||
Generator.prototype.langsIndex = function(langs) {
|
||||
var that = this;
|
||||
var basePath = ".";
|
||||
|
||||
return this._writeTemplate(this.langsTemplate, {
|
||||
langs: langs.list,
|
||||
|
||||
basePath: basePath,
|
||||
staticBase: path.join(basePath, "gitbook"),
|
||||
}, path.join(this.options.output, "index.html"))
|
||||
.then(function() {
|
||||
// Copy assets
|
||||
return that.copyAssets();
|
||||
});
|
||||
};
|
||||
|
||||
// Copy assets
|
||||
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 cache 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
|
||||
Generator.prototype.writeSearchIndex = function() {
|
||||
return fs.writeFile(
|
||||
path.join(this.options.output, 'search_index.json'),
|
||||
this.indexer.dump()
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
// Add cache manifest
|
||||
Generator.prototype.writeCacheManifest = function() {
|
||||
return fs.writeFile(
|
||||
path.join(this.options.output, 'manifest.appcache'),
|
||||
this.manifest.dump()
|
||||
);
|
||||
};
|
||||
|
||||
Generator.prototype.finish = function() {
|
||||
var deferred = this.copyAssets()
|
||||
.then(this.copyCover)
|
||||
.then(this.writeSearchIndex);
|
||||
|
||||
if (this.options.cache !== false) {
|
||||
deferred = deferred.then(this.writeCacheManifest);
|
||||
}
|
||||
|
||||
return deferred;
|
||||
};
|
||||
|
||||
module.exports = Generator;
|
||||
@@ -0,0 +1,71 @@
|
||||
var Q = require("q");
|
||||
var _ = require("lodash");
|
||||
|
||||
var lunr = require('lunr');
|
||||
var marked = require('marked');
|
||||
var textRenderer = require('marked-text-renderer');
|
||||
|
||||
|
||||
function Indexer() {
|
||||
if(!(this instanceof Indexer)) {
|
||||
return new Indexer();
|
||||
}
|
||||
|
||||
_.bindAll(this);
|
||||
|
||||
// Setup lunr index
|
||||
this.idx = lunr(function () {
|
||||
this.ref('url');
|
||||
|
||||
this.field('title', { boost: 10 });
|
||||
this.field('body');
|
||||
});
|
||||
|
||||
this.renderer = textRenderer();
|
||||
}
|
||||
|
||||
Indexer.prototype.text = function(nodes) {
|
||||
// Copy section
|
||||
var section = _.toArray(nodes);
|
||||
|
||||
// marked's Render expects this, we don't use it yet
|
||||
section.links = {};
|
||||
|
||||
var options = _.extend({}, marked.defaults, {
|
||||
renderer: this.renderer
|
||||
});
|
||||
|
||||
return marked.parser(section, options);
|
||||
};
|
||||
|
||||
Indexer.prototype.addSection = function(path, section) {
|
||||
var url = [path, section.id].join('#');
|
||||
|
||||
var title = this.text(
|
||||
_.filter(section, {'type': 'heading'})
|
||||
);
|
||||
|
||||
var body = this.text(
|
||||
_.omit(section, {'type': 'heading'})
|
||||
);
|
||||
|
||||
// Add to lunr index
|
||||
this.idx.add({
|
||||
url: url,
|
||||
title: title,
|
||||
body: body,
|
||||
});
|
||||
};
|
||||
|
||||
Indexer.prototype.add = function(lexedPage, url) {
|
||||
var sections = lexedPage;
|
||||
|
||||
_.map(sections, _.partial(this.addSection, url));
|
||||
};
|
||||
|
||||
Indexer.prototype.dump = function() {
|
||||
return JSON.stringify(this.idx);
|
||||
};
|
||||
|
||||
// Exports
|
||||
module.exports = Indexer;
|
||||
@@ -1,65 +1,52 @@
|
||||
var path = require("path");
|
||||
var swig = require('swig');
|
||||
var path = require('path');
|
||||
var _ = require("lodash");
|
||||
var hljs = require('highlight.js');
|
||||
|
||||
var parse = require("../parse");
|
||||
var links = require('../utils/').links;
|
||||
var pkg = require('../../package.json');
|
||||
|
||||
var fs = require('./fs');
|
||||
swig.setDefaults({
|
||||
locals: {
|
||||
gitbook: {
|
||||
version: pkg.version
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Swig filter for returning the count of lines in a code section
|
||||
swig.setFilter('lines', function(content) {
|
||||
return content.split('\n').length;
|
||||
});
|
||||
|
||||
// return a templeter for page
|
||||
var initTemplate = function(options) {
|
||||
var tpl = swig.compileFile(path.resolve(__dirname, '../../templates/page.html'));
|
||||
var nExercise = 1;
|
||||
// Swig filter for returning a link to the associated html file of a markdown file
|
||||
swig.setFilter('mdLink', function(link) {
|
||||
var link = link.replace(".md", ".html");
|
||||
if (link == "README.html") link = "index.html";
|
||||
return link;
|
||||
});
|
||||
|
||||
options = _.defaults(options || {}, {
|
||||
// Base folder for input
|
||||
root: "./",
|
||||
|
||||
// Base folder for output
|
||||
output: "./",
|
||||
|
||||
// Locals for templates
|
||||
locals: {}
|
||||
});
|
||||
|
||||
return function(input, output, local) {
|
||||
var _input = input, _output = output;
|
||||
input = path.join(options.root, input);
|
||||
output = path.join(options.output, output);
|
||||
|
||||
var basePath = path.relative(path.dirname(output), options.output) || ".";
|
||||
|
||||
// Read markdown file
|
||||
return fs.readFile(input, "utf-8")
|
||||
|
||||
// Parse sections
|
||||
.then(function(markdown) {
|
||||
return parse.page(markdown);
|
||||
})
|
||||
|
||||
//Calcul template
|
||||
.then(function(sections) {
|
||||
return tpl(
|
||||
_.extend(local || {}, options.locals, {
|
||||
_input: _input,
|
||||
content: sections,
|
||||
basePath: basePath,
|
||||
staticBase: path.join(basePath, "gitbook"),
|
||||
navigation: options.locals.allNavigation[_output],
|
||||
progress: parse.progress(options.locals.allNavigation, _output)
|
||||
})
|
||||
);
|
||||
})
|
||||
|
||||
// Write html
|
||||
.then(function(html) {
|
||||
return fs.writeFile(output, html);
|
||||
})
|
||||
// Swig filter: highlight coloration
|
||||
swig.setFilter('code', function(code, lang) {
|
||||
try {
|
||||
return hljs.highlight(lang, code).value;
|
||||
} catch(e) {
|
||||
return hljs.highlightAuto(code).value;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
module.exports = initTemplate;
|
||||
// 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);
|
||||
});
|
||||
|
||||
// Is a link an absolute link
|
||||
swig.setFilter('isExternalLink', function(link) {
|
||||
return links.isExternal(link);
|
||||
});
|
||||
|
||||
module.exports = swig;
|
||||
|
||||
@@ -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 : undefined;
|
||||
|
||||
// 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
|
||||
};
|
||||
@@ -1,6 +1,10 @@
|
||||
module.exports = {
|
||||
summary: require('./summary'),
|
||||
langs: require('./langs'),
|
||||
page: require('./page'),
|
||||
lex: require('./lex'),
|
||||
progress: require('./progress'),
|
||||
navigation: require('./navigation'),
|
||||
readme: require('./readme'),
|
||||
git: require('./git')
|
||||
};
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
var _ = require("lodash");
|
||||
var parseEntries = require("./summary").entries;
|
||||
|
||||
|
||||
var parseLangs = function(content) {
|
||||
var entries = parseEntries(content);
|
||||
|
||||
return {
|
||||
list: _.chain(entries)
|
||||
.filter(function(entry) {
|
||||
return Boolean(entry.path);
|
||||
})
|
||||
.map(function(entry) {
|
||||
return {
|
||||
title: entry.title,
|
||||
path: entry.path,
|
||||
lang: entry.path.replace("/", "")
|
||||
};
|
||||
})
|
||||
.value()
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
module.exports = parseLangs;
|
||||
@@ -0,0 +1,125 @@
|
||||
var _ = require('lodash');
|
||||
var marked = require('marked');
|
||||
|
||||
// Split a page up into sections (lesson, exercises, ...)
|
||||
function splitSections(nodes) {
|
||||
var section = [];
|
||||
|
||||
return _.reduce(nodes, function(sections, el) {
|
||||
if(el.type === 'hr') {
|
||||
sections.push(section);
|
||||
section = [];
|
||||
} else {
|
||||
section.push(el);
|
||||
}
|
||||
|
||||
return sections;
|
||||
}, []).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) {
|
||||
if(isExercise(nodes)) {
|
||||
return 'exercise';
|
||||
} else if(isQuiz(nodes)) {
|
||||
return 'quiz';
|
||||
}
|
||||
|
||||
return 'normal';
|
||||
}
|
||||
|
||||
// Generate a uniqueId to identify this section in our code
|
||||
function sectionId(section, idx) {
|
||||
return _.uniqueId('gitbook_');
|
||||
}
|
||||
|
||||
function lexPage(src) {
|
||||
// Lex file
|
||||
var nodes = marked.lexer(src);
|
||||
|
||||
return _.chain(splitSections(nodes))
|
||||
.map(function(section, idx) {
|
||||
// Detect section type
|
||||
section.type = sectionType(section, idx);
|
||||
return section;
|
||||
})
|
||||
.map(function(section, idx) {
|
||||
// Give each section an ID
|
||||
section.id = sectionId(section, idx);
|
||||
return section;
|
||||
|
||||
})
|
||||
.filter(function(section) {
|
||||
return !_.isEmpty(section);
|
||||
})
|
||||
.reduce(function(sections, section) {
|
||||
var last = _.last(sections);
|
||||
|
||||
// Merge normal sections together
|
||||
if(last && last.type === section.type && last.type === 'normal') {
|
||||
last.push.apply(last, [{'type': 'hr'}].concat(section));
|
||||
} else {
|
||||
// Add to list of sections
|
||||
sections.push(section);
|
||||
}
|
||||
|
||||
return sections;
|
||||
}, [])
|
||||
.value();
|
||||
}
|
||||
|
||||
// Exports
|
||||
module.exports = lexPage;
|
||||
@@ -1,15 +1,21 @@
|
||||
var _ = require('lodash');
|
||||
|
||||
// Cleans up an article/chapter object
|
||||
// remove 'articles' and '_path' attributes
|
||||
// remove 'articles' attributes
|
||||
function clean(obj) {
|
||||
return obj && _.omit(obj, ['articles', '_path']);
|
||||
return obj && _.omit(obj, ['articles']);
|
||||
}
|
||||
|
||||
// Returns a map of
|
||||
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
|
||||
/*
|
||||
{
|
||||
"file/path.html": {
|
||||
"file/path.md": {
|
||||
prev: ...,
|
||||
next: ...,
|
||||
},
|
||||
@@ -20,58 +26,30 @@ function navigation(summary, files) {
|
||||
// Support single files as well as list
|
||||
files = _.isArray(files) ? files : (_.isString(files) ? [files] : null);
|
||||
|
||||
// List of all navNodes
|
||||
// Flatten chapters, then add in default README node if ndeeded etc ...
|
||||
var navNodes = 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 = {};
|
||||
var mapping = _.chain(_.zip(navNodes, prevNodes, nextNodes))
|
||||
.map(function(nodes) {
|
||||
var current = nodes[0], prev = nodes[1], next = nodes[2];
|
||||
|
||||
// Special README nav
|
||||
var README_NAV = {
|
||||
path: 'README.html',
|
||||
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;
|
||||
if(!current.path) return null;
|
||||
|
||||
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] = {
|
||||
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] = {
|
||||
prev: clean(prev),
|
||||
next: clean(next),
|
||||
level: [idx+1, _idx+1].join('.'),
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// Hack for README.html
|
||||
mapping['README.html'] = {
|
||||
prev: null,
|
||||
next: clean(summary.chapters[0]),
|
||||
level: '0',
|
||||
};
|
||||
return [current.path, {
|
||||
title: current.title,
|
||||
prev: prev,
|
||||
next: next,
|
||||
level: current.level,
|
||||
}];
|
||||
})
|
||||
.filter()
|
||||
.object()
|
||||
.value();
|
||||
|
||||
// Filter for only files we want
|
||||
if(files) {
|
||||
|
||||
@@ -2,78 +2,57 @@ var _ = require('lodash');
|
||||
var marked = require('marked');
|
||||
var hljs = require('highlight.js');
|
||||
|
||||
var lex = require('./lex');
|
||||
var renderer = require('./renderer');
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
});
|
||||
var lnormalize = require('../utils/lang').normalize;
|
||||
|
||||
|
||||
// Split a page up into sections (lesson, exercises, ...)
|
||||
function splitSections(nodes) {
|
||||
var section = [];
|
||||
|
||||
return _.reduce(nodes, function(sections, el) {
|
||||
if(el.type === 'hr') {
|
||||
sections.push(section);
|
||||
section = [];
|
||||
} else {
|
||||
section.push(el);
|
||||
}
|
||||
|
||||
return sections;
|
||||
}, []).concat([section]); // Add remaining nodes
|
||||
}
|
||||
|
||||
// What is the type of this section
|
||||
function sectionType(nodes, idx) {
|
||||
var codeNodes = _.filter(nodes, {
|
||||
type: 'code'
|
||||
}).length;
|
||||
|
||||
if(codeNodes === 3 && (idx % 2) == 1) {
|
||||
return 'exercise';
|
||||
}
|
||||
|
||||
return 'normal';
|
||||
}
|
||||
|
||||
// Render a section using our custom renderer
|
||||
function render(section) {
|
||||
function render(section, _options) {
|
||||
// Copy section
|
||||
section = _.toArray(section);
|
||||
|
||||
// marked's Render expects this, we don't use it yet
|
||||
section.links = {};
|
||||
|
||||
// Build options using defaults and our custom renderer
|
||||
var options = _.extend({}, marked.defaults, {
|
||||
renderer: renderer()
|
||||
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 parsePage(src) {
|
||||
var nodes = marked.lexer(src);
|
||||
function quizQuestion(node) {
|
||||
if (node.text) {
|
||||
node.text = node.text.replace(/^([\[(])x([\])])/, "$1 $2");
|
||||
} else {
|
||||
return node.replace(/^([\[(])x([\])])/, "$1 $2");
|
||||
}
|
||||
}
|
||||
|
||||
return _.chain(splitSections(nodes))
|
||||
.map(function(section, idx) {
|
||||
// Detect section type
|
||||
section.type = sectionType(section, idx);
|
||||
return section;
|
||||
})
|
||||
.filter(function(section) {
|
||||
return !_.isEmpty(section);
|
||||
})
|
||||
function parsePage(src, options) {
|
||||
options = options || {};
|
||||
|
||||
// Lex if not already lexed
|
||||
return (_.isArray(src) ? src : lex(src))
|
||||
.map(function(section) {
|
||||
// Generate a uniqueId to identify this section in our code
|
||||
var id = _.uniqueId('gitbook_');
|
||||
|
||||
// Transform given type
|
||||
if(section.type === 'exercise') {
|
||||
var nonCodeNodes = _.reject(section, {
|
||||
@@ -84,26 +63,93 @@ function parsePage(src) {
|
||||
'type': 'code'
|
||||
});
|
||||
|
||||
// Languages in code blocks
|
||||
var langs = _.pluck(codeNodes, 'lang').map(lnormalize);
|
||||
|
||||
// Check that they are all the same
|
||||
var validLangs = _.all(_.map(langs, function(lang) {
|
||||
return lang && lang === langs[0];
|
||||
}));
|
||||
|
||||
// Main language
|
||||
var lang = validLangs ? langs[0] : null;
|
||||
|
||||
return {
|
||||
id: id,
|
||||
id: section.id,
|
||||
type: section.type,
|
||||
content: render(nonCodeNodes),
|
||||
lang: lang,
|
||||
code: {
|
||||
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
|
||||
return {
|
||||
id: id,
|
||||
id: section.id,
|
||||
type: section.type,
|
||||
content: render(section)
|
||||
content: render(section, options)
|
||||
};
|
||||
})
|
||||
.value();
|
||||
});
|
||||
}
|
||||
|
||||
// Exports
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
var _ = require("lodash");
|
||||
|
||||
// Returns from a navigation and a current file, a snapshot of current detailed state
|
||||
var calculProgress = function(navigation, current) {
|
||||
var n = _.size(navigation);
|
||||
var percent = 0, prevPercent = 0;
|
||||
var percent = 0, prevPercent = 0, currentChapter = null;
|
||||
var done = true;
|
||||
|
||||
var chapters = _.chain(navigation)
|
||||
@@ -10,9 +11,6 @@ var calculProgress = function(navigation, current) {
|
||||
nav.path = path;
|
||||
return nav;
|
||||
})
|
||||
.sortBy(function(nav) {
|
||||
return nav.level;
|
||||
})
|
||||
.map(function(nav, i) {
|
||||
// Calcul percent
|
||||
nav.percent = (i * 100) / Math.max((n - 1), 1);
|
||||
@@ -20,21 +18,29 @@ var calculProgress = function(navigation, current) {
|
||||
// Is it done
|
||||
nav.done = done;
|
||||
if (nav.path == current) {
|
||||
currentChapter = nav;
|
||||
percent = nav.percent;
|
||||
done = false;
|
||||
} else if (done) {
|
||||
prevPercent = nav.percent;
|
||||
}
|
||||
|
||||
|
||||
return nav;
|
||||
})
|
||||
.value();
|
||||
|
||||
|
||||
return {
|
||||
// Previous percent
|
||||
prevPercent: prevPercent,
|
||||
|
||||
// Current percent
|
||||
percent: percent,
|
||||
chapters: chapters
|
||||
|
||||
// List of chapter with progress
|
||||
chapters: chapters,
|
||||
|
||||
// Current chapter
|
||||
current: currentChapter
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -1,14 +1,24 @@
|
||||
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) {
|
||||
function GitBookRenderer(options, extra_options) {
|
||||
if(!(this instanceof GitBookRenderer)) {
|
||||
return new GitBookRenderer(options);
|
||||
return new 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);
|
||||
|
||||
@@ -31,17 +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(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 + '"';
|
||||
@@ -54,5 +85,55 @@ GitBookRenderer.prototype.link = function(href, title, text) {
|
||||
return out;
|
||||
};
|
||||
|
||||
GitBookRenderer.prototype.image = function(href, title, text) {
|
||||
// Our "fixed" href
|
||||
var _href = href;
|
||||
|
||||
// Parsed version of the url
|
||||
var parsed = url.parse(href);
|
||||
|
||||
// Options
|
||||
var o = this._extra_options;
|
||||
|
||||
// Relative image, rewrite it depending output
|
||||
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;
|
||||
|
||||
@@ -82,39 +82,63 @@ function parseTitle(src, nums) {
|
||||
level: level,
|
||||
|
||||
// Replace .md references with .html
|
||||
path: matches[2].replace(/\.md$/, '.html'),
|
||||
|
||||
// Original, non normalized path
|
||||
_path: matches[2],
|
||||
path: matches[2].replace(/\\/g, '/'),
|
||||
};
|
||||
}
|
||||
|
||||
function parseArticle(chapterNum, nodes, idx) {
|
||||
return parseTitle(_.first(nodes).text, [chapterNum, idx+1]);
|
||||
}
|
||||
function parseChapter(nodes, nums) {
|
||||
// Convert single number to an array
|
||||
nums = _.isArray(nums) ? nums : [nums];
|
||||
|
||||
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))
|
||||
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));
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function parseSummary(src) {
|
||||
function defaultChapterList(chapterList) {
|
||||
var first = _.first(chapterList);
|
||||
|
||||
if (first) {
|
||||
var chapter = parseChapter(first, [0]);
|
||||
|
||||
// Already have README node, we're good to go
|
||||
if(chapter.path === 'README.md') {
|
||||
return chapterList;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
[ { type: 'text', text: '[Introduction](README.md)' } ]
|
||||
].concat(chapterList);
|
||||
}
|
||||
|
||||
function listGroups(src) {
|
||||
var nodes = marked.lexer(src);
|
||||
|
||||
// Get out list of chapters
|
||||
var chapterList = filterList(nodes);
|
||||
// Get out groups of lists
|
||||
return listSplit(
|
||||
filterList(nodes),
|
||||
'list_item_start', 'list_item_end'
|
||||
);
|
||||
}
|
||||
|
||||
function parseSummary(src) {
|
||||
// Split out chapter sections
|
||||
var chapters = _.chain(listSplit(chapterList, 'list_item_start', 'list_item_end'))
|
||||
.map(parseChapter)
|
||||
.value();
|
||||
var chapters = defaultChapterList(listGroups(src))
|
||||
.map(parseChapter);
|
||||
|
||||
return {
|
||||
chapters: chapters
|
||||
};
|
||||
}
|
||||
|
||||
function parseEntries (src) {
|
||||
return listGroups(src).map(parseChapter);
|
||||
}
|
||||
|
||||
|
||||
// Exports
|
||||
module.exports = parseSummary;
|
||||
module.exports.entries = parseEntries;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
lang: require('./lang'),
|
||||
links: require('./links')
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
var MAP = {
|
||||
'py': 'python',
|
||||
'js': 'javascript',
|
||||
'rb': 'ruby',
|
||||
'csharp': 'cs',
|
||||
};
|
||||
|
||||
function normalize(lang) {
|
||||
if(!lang) { return null; }
|
||||
|
||||
var lower = lang.toLowerCase();
|
||||
return MAP[lower] || lower;
|
||||
}
|
||||
|
||||
// Exports
|
||||
module.exports = {
|
||||
normalize: normalize,
|
||||
MAP: MAP
|
||||
};
|
||||
@@ -0,0 +1,60 @@
|
||||
var url = require('url');
|
||||
var path = require('path');
|
||||
|
||||
// Is the link an external link
|
||||
var isExternal = function(href) {
|
||||
try {
|
||||
return Boolean(url.parse(href).protocol);
|
||||
} catch(err) { }
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
// Return true if the link is relative
|
||||
var isRelative = function(href) {
|
||||
try {
|
||||
var parsed = url.parse(href);
|
||||
|
||||
return !parsed.protocol && parsed.path && parsed.path[0] != '/';
|
||||
} catch(err) {}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
// 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;
|
||||
};
|
||||
|
||||
// Join links
|
||||
|
||||
var join = function() {
|
||||
var _href = path.join.apply(path, arguments);
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
_href = _href.replace(/\\/g, '/');
|
||||
}
|
||||
|
||||
return _href;
|
||||
};
|
||||
|
||||
|
||||
module.exports = {
|
||||
isRelative: isRelative,
|
||||
isExternal: isExternal,
|
||||
toAbsolute: toAbsolute,
|
||||
join: join
|
||||
};
|
||||
@@ -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
|
||||
};
|
||||
@@ -1,25 +1,37 @@
|
||||
{
|
||||
"name": "gitbook",
|
||||
"version": "0.0.3",
|
||||
"version": "0.5.6",
|
||||
"homepage": "http://www.gitbook.io/",
|
||||
"description": "Library and cmd utility to generate GitBooks",
|
||||
"main": "lib/index.js",
|
||||
"dependencies": {
|
||||
"q": "1.0.1",
|
||||
"lodash": "2.4.1",
|
||||
"marked": "0.3.2",
|
||||
"marked-text-renderer": "0.0.1",
|
||||
"lunr": "0.5.2",
|
||||
"swig": "1.3.2",
|
||||
"send": "0.2.0",
|
||||
"fstream-ignore": "0.0.7",
|
||||
"commander": "2.2.0",
|
||||
"fs-extra": "0.8.1",
|
||||
"highlight.js": "8.0.0"
|
||||
"highlight.js": "8.0.0",
|
||||
"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"
|
||||
@@ -36,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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 164 KiB |
@@ -1,13 +0,0 @@
|
||||
<div class="book-header">
|
||||
<!-- Actions Left -->
|
||||
<a href="https://github.com/{{ githubId }}" target="_blank" class="btn pull-left"><i class="fa fa-github-alt"></i></a>
|
||||
<a href="#" class="btn pull-left toggle-summary"><i class="fa fa-align-justify"></i> Summary</a>
|
||||
|
||||
<!-- Actions Right -->
|
||||
<a href="https://github.com/{{ githubId }}/stargazers" target="_blank" class="btn pull-right count-star"><i class="fa fa-star-o"></i> Star (<span>-</span>)</a>
|
||||
<a href="https://github.com/{{ githubId }}/watchers" target="_blank" class="btn pull-right count-watch"><i class="fa fa-eye"></i> Watch (<span>-</span>)</a>
|
||||
|
||||
|
||||
<!-- Title -->
|
||||
<h1><a href="{{ basePath }}/README.html" >{{ title }}</a></h1>
|
||||
</div>
|
||||
@@ -1,40 +0,0 @@
|
||||
<div class="book-summary">
|
||||
<ul class="summary">
|
||||
<li>
|
||||
<a href="https://github.com/{{ githubAuthor }}" target="blank">About the author</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/{{ githubId }}/issues" target="blank">Questions and Issues</a>
|
||||
</li>
|
||||
<li class="divider"></li>
|
||||
<li data-level="0">
|
||||
<a href="{{ basePath }}/README.html"><i class="fa fa-check"></i> Introduction</a>
|
||||
</li>
|
||||
{% for item in summary.chapters %}
|
||||
<li {% if item._path == _input %}class="active"{% endif %} data-level="{{ item.level }}">
|
||||
{% if item.path %}
|
||||
<a href="{{ basePath }}/{{ item.path }}">
|
||||
<i class="fa fa-check"></i> <b>{{ item.level }})</b> {{ item.title }}
|
||||
</a>
|
||||
{% else %}
|
||||
<span><b>{{ item.level }})</b> {{ item.title }}</span>
|
||||
{% endif %}
|
||||
{% if item.articles.length > 0 %}
|
||||
<ul class="articles">
|
||||
{% for article in item.articles %}
|
||||
<li {% if article._path == _input %}class="active"{% endif %} data-level="{{ article.level }}">
|
||||
{% if article.path %}
|
||||
<a href="{{ basePath }}/{{ article.path }}">
|
||||
<i class="fa fa-check"></i> <b>{{ article.level }})</b> {{ article.title }}
|
||||
</a>
|
||||
{% else %}
|
||||
<span><b>{{ article.level }})</b> {{ article.title }}</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
@@ -1,30 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en-US">
|
||||
<head>
|
||||
{% block head %}
|
||||
<meta charset="UTF-8">
|
||||
<title>{% block title %} | GitBook{% endblock %}</title>
|
||||
<meta name="robots" content="{% block robots %}noindex, nofollow{% endblock %}">
|
||||
<link rel="shortcut icon" href="{{ staticBase }}/images/favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="{{ staticBase }}/style.css">
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
||||
<meta name="description" content="{{ description }}">
|
||||
<meta name="keywords" content="gitbook,github" >
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<script type="text/javascript">
|
||||
(function(e,b){if(!b.__SV){var a,f,i,g;window.mixpanel=b;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.set_once people.increment people.append people.track_charge people.clear_charges people.delete_user".split(" ");
|
||||
for(g=0;g<i.length;g++)f(c,i[g]);b._i.push([a,e,d])};b.__SV=1.2;a=e.createElement("script");a.type="text/javascript";a.src=("https:"===e.location.protocol?"https:":"http:")+'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';f=e.getElementsByTagName("script")[0];f.parentNode.insertBefore(a,f)}})(document,window.mixpanel||[]);
|
||||
mixpanel.init("01eb2b950ae09a5fdb15a98dcc5ff20e");
|
||||
</script>
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
{% block content %}{% endblock %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.3/ace.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.3/mode-javascript.js"></script>
|
||||
<script src="{{ staticBase }}/jsrepl/jsrepl.js" id="jsrepl-script"></script>
|
||||
<script src="{{ staticBase }}/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,53 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
|
||||
{% block title %}{{ _input }} {{ title }}{% parent %}{% endblock %}
|
||||
{% block description %}{% endblock %}
|
||||
{% block robots %}index, follow{% endblock %}
|
||||
{% block content %}
|
||||
<div class="book {% if _input == "README.md" %}with-summary{% endif %}" data-github="{{ githubId }}" data-level="{{ navigation.level }}">
|
||||
{% include "includes/book/header.html" %}
|
||||
{% include "includes/book/summary.html" %}
|
||||
<div class="book-body">
|
||||
<div class="page-wrapper">
|
||||
<div class="book-progress">
|
||||
<div class="bar">
|
||||
<div class="inner" style="width: {{ progress.percent }}%;min-width: {{ progress.prevPercent }}%;"></div>
|
||||
</div>
|
||||
<div class="chapters">
|
||||
{% for p in progress.chapters %}
|
||||
<a href="{{ basePath }}/{{ p.path }}" title="{{ p.title }}" class="chapter {% if p.done %}done{% endif %} {% if p.level.length == 1 %}new-chapter{% endif %}" data-progress="{{ p.level }}" style="left: {{ p.percent }}%;"></a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="page-inner">
|
||||
{% for section in content %}
|
||||
<section class="{{ section.type }}" id="section-{{ section.id }}">
|
||||
{% if section.type == "normal" %}
|
||||
{% autoescape false %}{{ section.content }}{% endautoescape %}
|
||||
{% elif section.type == "exercise" %}
|
||||
{% include "./includes/book/exercise.html" with {section: section} %}
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="page-footer">
|
||||
{% if _input == "README.md" %}
|
||||
<a href="{{ basePath }}/{{ navigation.next.path }}" class="navigation-link">Start</a>
|
||||
{% else %}
|
||||
{% if navigation.next %}
|
||||
{% if navigation.next.path %}
|
||||
<a href="{{ basePath }}/{{ navigation.next.path }}" class="navigation-link next">Next</a>
|
||||
{% else %}
|
||||
<div class="navigation-link coming-soon">Coming soon</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="navigation-link finished">Finished!</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,13 @@
|
||||
# Summary
|
||||
|
||||
* [Custom name for Introduction](README.md)
|
||||
* [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)
|
||||
* Unfinished article
|
||||
* Unfinished Chapter
|
||||
@@ -0,0 +1,3 @@
|
||||
# Nice course
|
||||
|
||||
Check out this source file [in C++](../src/something.cpp)
|
||||
@@ -0,0 +1,11 @@
|
||||
## Wow such book
|
||||
|
||||
Some nice content here
|
||||
|
||||
---
|
||||
|
||||
A beautiful separator, but non an exercise or a quiz !
|
||||
|
||||
---
|
||||
|
||||
Some more beautiful text, because `this` book is awesome ...
|
||||
@@ -0,0 +1,12 @@
|
||||
# Images Test
|
||||
|
||||
This is a test for images path calculation. It supposed this fiel is in a syntax/ folder
|
||||
|
||||
### #
|
||||
|
||||
[](./preview.png)
|
||||
|
||||
### 2
|
||||
|
||||
[](./preview2.png)
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
# Nice course
|
||||
|
||||
Check out this other chapter [Test](test.md)
|
||||
|
||||
Check out this other chapter [Test](../before.md)
|
||||
@@ -1,32 +0,0 @@
|
||||
# Python basics
|
||||
|
||||
Python is a nice language, you can add stuff. Bla bla bla.
|
||||
|
||||
Lets jump into an exercise :
|
||||
|
||||
---
|
||||
|
||||
It's dead simple, `c` must be the sum of `a` and `b`
|
||||
|
||||
```py
|
||||
a = 1
|
||||
b = 2
|
||||
```
|
||||
|
||||
```py
|
||||
a = 1
|
||||
b = 2
|
||||
c = a + b
|
||||
```
|
||||
|
||||
```py
|
||||
assert(c, 3)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Some more nice content ....
|
||||
|
||||
[Cool stuff](http://gitbook.io)
|
||||
|
||||
[Link to another Markdown file](./xyz/file.md)
|
||||
@@ -0,0 +1,68 @@
|
||||
# Python basics
|
||||
|
||||
Python is a nice language, you can add stuff. Bla bla bla.
|
||||
|
||||
Lets jump into an exercise :
|
||||
|
||||
---
|
||||
|
||||
It's dead simple, `c` must be the sum of `a` and `b`
|
||||
|
||||
```py
|
||||
a = 1
|
||||
b = 2
|
||||
```
|
||||
|
||||
```py
|
||||
a = 1
|
||||
b = 2
|
||||
c = a + b
|
||||
```
|
||||
|
||||
```py
|
||||
assert(c, 3)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Some more nice content ....
|
||||
|
||||
[Cool stuff](http://gitbook.io)
|
||||
|
||||
[Link to another Markdown file](./xyz/file.md)
|
||||
|
||||
And look at this pretty picture:
|
||||

|
||||
|
||||
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
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -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.
|
||||
|
||||
---
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# This is the title
|
||||
|
||||
This is the book description.
|
||||
|
||||
other content
|
||||
...
|
||||
|
||||
@@ -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);
|
||||
```
|
||||
@@ -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)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# This is a test
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
# Summary
|
||||
|
||||
* [test](test.md)
|
||||
@@ -0,0 +1 @@
|
||||
# Test
|
||||
@@ -0,0 +1 @@
|
||||
# This should fail
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -7,63 +7,90 @@ var navigation = require('../').parse.navigation;
|
||||
|
||||
|
||||
var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/SUMMARY.md'), 'utf8');
|
||||
var ALT_CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/ALTERNATIVE_SUMMARY.md'), 'utf8');
|
||||
var LEXED = summary(CONTENT);
|
||||
var ALT_LEXED = summary(ALT_CONTENT);
|
||||
|
||||
|
||||
describe('Summary navigation', function() {
|
||||
it('should provide next & prev entries for a file', function() {
|
||||
var nav = navigation(LEXED, [
|
||||
'README.html',
|
||||
'chapter-1/README.html',
|
||||
'chapter-1/ARTICLE1.html',
|
||||
'chapter-1/ARTICLE2.html',
|
||||
'chapter-2/README.html',
|
||||
'README.md',
|
||||
'chapter-1/README.md',
|
||||
'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
|
||||
assert(nav['README.html']);
|
||||
assert(nav['chapter-1/README.html']);
|
||||
assert(nav['chapter-1/ARTICLE1.html']);
|
||||
assert(nav['chapter-1/ARTICLE2.html']);
|
||||
assert(nav['chapter-2/README.html']);
|
||||
assert(nav['README.md']);
|
||||
assert(nav['chapter-1/README.md']);
|
||||
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.html'].prev, null);
|
||||
assert.equal(nav['README.html'].next.path, 'chapter-1/README.html');
|
||||
assert.equal(nav['README.md'].prev, null);
|
||||
assert.equal(nav['README.md'].next.path, 'chapter-1/README.md');
|
||||
|
||||
assert.equal(nav['chapter-1/README.html'].prev.path, 'README.html');
|
||||
assert.equal(nav['chapter-1/README.html'].next.path, 'chapter-1/ARTICLE1.html');
|
||||
assert.equal(nav['chapter-1/README.md'].prev.path, 'README.md');
|
||||
assert.equal(nav['chapter-1/README.md'].next.path, 'chapter-1/ARTICLE1.md');
|
||||
|
||||
assert.equal(nav['chapter-1/ARTICLE1.html'].prev.path, 'chapter-1/README.html');
|
||||
assert.equal(nav['chapter-1/ARTICLE1.html'].next.path, 'chapter-1/ARTICLE2.html');
|
||||
assert.equal(nav['chapter-1/ARTICLE1.md'].prev.path, 'chapter-1/README.md');
|
||||
assert.equal(nav['chapter-1/ARTICLE1.md'].next.path, 'chapter-1/ARTICLE2.md');
|
||||
|
||||
assert.equal(nav['chapter-1/ARTICLE2.html'].prev.path, 'chapter-1/ARTICLE1.html');
|
||||
assert.equal(nav['chapter-1/ARTICLE2.html'].next.path, 'chapter-2/README.html');
|
||||
assert.equal(nav['chapter-1/ARTICLE2.md'].prev.path, 'chapter-1/ARTICLE1.md');
|
||||
assert.equal(nav['chapter-1/ARTICLE2.md'].next.path, 'chapter-1/ARTICLE-1-2-1.md');
|
||||
|
||||
assert.equal(nav['chapter-2/README.html'].prev.path, 'chapter-1/ARTICLE2.html');
|
||||
assert.equal(nav['chapter-2/README.html'].next.path, 'chapter-3/README.html');
|
||||
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');
|
||||
});
|
||||
|
||||
it('should give full tree, when not limited', function() {
|
||||
var nav = navigation(LEXED);
|
||||
|
||||
assert(nav['README.html']);
|
||||
assert(nav['chapter-1/README.html']);
|
||||
assert(nav['chapter-1/ARTICLE1.html']);
|
||||
assert(nav['chapter-1/ARTICLE2.html']);
|
||||
assert(nav['chapter-2/README.html']);
|
||||
assert(nav['chapter-3/README.html']);
|
||||
assert(nav['README.md']);
|
||||
assert(nav['chapter-1/README.md']);
|
||||
assert(nav['chapter-1/ARTICLE1.md']);
|
||||
assert(nav['chapter-1/ARTICLE2.md']);
|
||||
assert(nav['chapter-2/README.md']);
|
||||
assert(nav['chapter-3/README.md']);
|
||||
});
|
||||
|
||||
it('should detect levels correctly', function() {
|
||||
var nav = navigation(LEXED);
|
||||
|
||||
assert.equal(nav['README.html'].level, '0');
|
||||
assert.equal(nav['chapter-1/README.html'].level, '1');
|
||||
assert.equal(nav['chapter-1/ARTICLE1.html'].level, '1.1');
|
||||
assert.equal(nav['chapter-1/ARTICLE2.html'].level, '1.2');
|
||||
assert.equal(nav['chapter-2/README.html'].level, '2');
|
||||
assert.equal(nav['chapter-3/README.html'].level, '3');
|
||||
assert.equal(nav['README.md'].level, '0');
|
||||
assert.equal(nav['chapter-1/README.md'].level, '1');
|
||||
assert.equal(nav['chapter-1/ARTICLE1.md'].level, '1.1');
|
||||
assert.equal(nav['chapter-1/ARTICLE2.md'].level, '1.2');
|
||||
assert.equal(nav['chapter-2/README.md'].level, '2');
|
||||
assert.equal(nav['chapter-3/README.md'].level, '3');
|
||||
});
|
||||
|
||||
it('should have a default README node', function() {
|
||||
var nav = navigation(LEXED);
|
||||
|
||||
assert.equal(nav['README.md'].level, '0');
|
||||
assert.equal(nav['README.md'].title, 'Introduction');
|
||||
});
|
||||
|
||||
it('Should allow README node to be customized', function() {
|
||||
var nav = navigation(ALT_LEXED);
|
||||
|
||||
assert(nav['README.md']);
|
||||
assert.equal(nav['README.md'].level, '0');
|
||||
assert.notEqual(nav['README.md'].title, 'Introduction');
|
||||
});
|
||||
|
||||
it('should not accept null paths', function() {
|
||||
|
||||
@@ -4,19 +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 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() {
|
||||
@@ -30,5 +42,111 @@ 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() {
|
||||
// One big section
|
||||
assert.equal(HR_LEXED.length, 1);
|
||||
|
||||
// HRs inserted correctly
|
||||
assert.equal(HR_LEXED[0].content.match(/<hr>/g).length, 2);
|
||||
});
|
||||
|
||||
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 = 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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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.");
|
||||
});
|
||||
});
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
@@ -10,16 +10,15 @@ var LEXED = summary(CONTENT);
|
||||
|
||||
|
||||
describe('Summary parsing', function () {
|
||||
console.log(LEXED);
|
||||
|
||||
it('should detect chapters', function() {
|
||||
assert.equal(LEXED.chapters.length, 5);
|
||||
assert.equal(LEXED.chapters.length, 6);
|
||||
});
|
||||
|
||||
it('should support articles', function() {
|
||||
assert.equal(LEXED.chapters[0].articles.length, 2);
|
||||
assert.equal(LEXED.chapters[1].articles.length, 0);
|
||||
assert.equal(LEXED.chapters[1].articles.length, 2);
|
||||
assert.equal(LEXED.chapters[2].articles.length, 0);
|
||||
assert.equal(LEXED.chapters[3].articles.length, 0);
|
||||
});
|
||||
|
||||
it('should detect paths and titles', function() {
|
||||
@@ -27,32 +26,34 @@ describe('Summary parsing', function () {
|
||||
assert(LEXED.chapters[1].path);
|
||||
assert(LEXED.chapters[2].path);
|
||||
assert(LEXED.chapters[3].path);
|
||||
assert.equal(LEXED.chapters[4].path, null);
|
||||
assert(LEXED.chapters[4].path);
|
||||
assert.equal(LEXED.chapters[5].path, null);
|
||||
|
||||
assert(LEXED.chapters[0].title);
|
||||
assert(LEXED.chapters[1].title);
|
||||
assert(LEXED.chapters[2].title);
|
||||
assert(LEXED.chapters[3].title);
|
||||
assert(LEXED.chapters[4].title);
|
||||
assert(LEXED.chapters[5].title);
|
||||
});
|
||||
|
||||
it('should normalize paths from .md to .html', function() {
|
||||
assert.equal(LEXED.chapters[0].path,'chapter-1/README.html');
|
||||
assert.equal(LEXED.chapters[0]._path,'chapter-1/README.md');
|
||||
assert.equal(LEXED.chapters[1].path,'chapter-2/README.html');
|
||||
assert.equal(LEXED.chapters[1]._path,'chapter-2/README.md');
|
||||
assert.equal(LEXED.chapters[2].path,'chapter-3/README.html');
|
||||
assert.equal(LEXED.chapters[2]._path,'chapter-3/README.md');
|
||||
assert.equal(LEXED.chapters[0].path,'README.md');
|
||||
assert.equal(LEXED.chapters[1].path,'chapter-1/README.md');
|
||||
assert.equal(LEXED.chapters[2].path,'chapter-2/README.md');
|
||||
assert.equal(LEXED.chapters[3].path,'chapter-3/README.md');
|
||||
});
|
||||
|
||||
it('should detect levels correctly', function() {
|
||||
var c = LEXED.chapters;
|
||||
|
||||
assert.equal(c[0].level, '1');
|
||||
assert.equal(c[1].level, '2');
|
||||
assert.equal(c[2].level, '3');
|
||||
assert.equal(c[0].level, '0');
|
||||
assert.equal(c[1].level, '1');
|
||||
assert.equal(c[2].level, '2');
|
||||
assert.equal(c[3].level, '3');
|
||||
|
||||
assert.equal(c[0].articles[0].level, '1.1');
|
||||
assert.equal(c[0].articles[1].level, '1.2');
|
||||
assert.equal(c[1].articles[0].level, '1.1');
|
||||
assert.equal(c[1].articles[1].level, '1.2');
|
||||
assert.equal(c[1].articles[1].articles[0].level, '1.2.1');
|
||||
});
|
||||
});
|
||||
|
||||
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |