├── .gitignore ├── LICENSE ├── README.md ├── conf.py ├── files └── admin │ ├── config.yml │ └── index.html ├── netlify.toml ├── posts └── your-first-post.md ├── requirements.in ├── requirements.txt └── runtime.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Chris Warrick 4 | Copyright (c) 2016 Roberto Alsina 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a sample Nikola blog, compatible with Netlify CMS. 2 | 3 | Hit this one button: 4 | 5 | [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/getnikola/nikola-netlify-cms&stack=cms) 6 | 7 | You will then receive an e-mail, asking you to register at your new site. Consider changing your site name in the General settings, and site URL in `files/admin/config.yml`. You should end up with a site with the Netlify CMS available in `/admin/`. Congratulations! 8 | 9 | *PS.* Netlify CMS can be used without Netlify’s CDN/hosting service, but that requires some extra configuration work. Also, *preview images* require theme support. For bootblog4, if your posts have the status of `featured`, they will be used on the index page as a background of the featured post. 10 | -------------------------------------------------------------------------------- /conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import time 4 | 5 | # !! This is the configuration of Nikola. !! # 6 | # !! You should edit it to your liking. !! # 7 | 8 | 9 | # ! Some settings can be different in different languages. 10 | # ! A comment stating (translatable) is used to denote those. 11 | # ! There are two ways to specify a translatable setting: 12 | # ! (a) BLOG_TITLE = "My Blog" 13 | # ! (b) BLOG_TITLE = {"en": "My Blog", "es": "Mi Blog"} 14 | # ! Option (a) is used when you don't want that setting translated. 15 | # ! Option (b) is used for settings that are different in different languages. 16 | 17 | 18 | # Data about this site 19 | BLOG_AUTHOR = "Your Name" # (translatable) 20 | BLOG_TITLE = "Demo Site" # (translatable) 21 | # This is the main URL for your site. It will be used 22 | # in a prominent link. Don't forget the protocol (http/https)! 23 | SITE_URL = "https://example.com/" 24 | # This is the URL where Nikola's output will be deployed. 25 | # If not set, defaults to SITE_URL 26 | # BASE_URL = "https://example.com/" 27 | BLOG_EMAIL = "joe@demo.site" 28 | BLOG_DESCRIPTION = "This is a demo site for Nikola." # (translatable) 29 | 30 | # Nikola is multilingual! 31 | # 32 | # Currently supported languages are: 33 | # 34 | # en English 35 | # af Afrikaans 36 | # ar Arabic 37 | # az Azerbaijani 38 | # bg Bulgarian 39 | # bs Bosnian 40 | # ca Catalan 41 | # cs Czech [ALTERNATIVELY cz] 42 | # da Danish 43 | # de German 44 | # el Greek [NOT gr] 45 | # eo Esperanto 46 | # es Spanish 47 | # et Estonian 48 | # eu Basque 49 | # fa Persian 50 | # fi Finnish 51 | # fr French 52 | # fur Friulian 53 | # gl Galician 54 | # he Hebrew 55 | # hi Hindi 56 | # hr Croatian 57 | # hu Hungarian 58 | # ia Interlingua 59 | # id Indonesian 60 | # it Italian 61 | # ja Japanese [NOT jp] 62 | # ko Korean 63 | # lt Lithuanian 64 | # ml Malayalam 65 | # nb Norwegian (Bokmål) 66 | # nl Dutch 67 | # pa Punjabi 68 | # pl Polish 69 | # pt Portuguese 70 | # pt_br Portuguese (Brazil) 71 | # ru Russian 72 | # sk Slovak 73 | # sl Slovene 74 | # sq Albanian 75 | # sr Serbian (Cyrillic) 76 | # sr_latin Serbian (Latin) 77 | # sv Swedish 78 | # te Telugu 79 | # th Thai 80 | # tr Turkish [NOT tr_TR] 81 | # uk Ukrainian 82 | # ur Urdu 83 | # vi Vietnamese 84 | # zh_cn Chinese (Simplified) 85 | # zh_tw Chinese (Traditional) 86 | # 87 | # If you want to use Nikola with a non-supported language you have to provide 88 | # a module containing the necessary translations 89 | # (cf. the modules at nikola/data/themes/base/messages/). 90 | # If a specific post is not translated to a language, then the version 91 | # in the default language will be shown instead. 92 | 93 | # What is the default language? 94 | DEFAULT_LANG = "en" 95 | 96 | # What other languages do you have? 97 | # The format is {"translationcode" : "path/to/translation" } 98 | # the path will be used as a prefix for the generated pages location 99 | TRANSLATIONS = { 100 | DEFAULT_LANG: "", 101 | # Example for another language: 102 | # "es": "./es", 103 | } 104 | 105 | # What will translated input files be named like? 106 | 107 | # If you have a page something.rst, then something.pl.rst will be considered 108 | # its Polish translation. 109 | # (in the above example: path == "something", ext == "rst", lang == "pl") 110 | # this pattern is also used for metadata: 111 | # something.meta -> something.pl.meta 112 | 113 | TRANSLATIONS_PATTERN = '{path}.{lang}.{ext}' 114 | 115 | # Links for the sidebar / navigation bar. (translatable) 116 | # This is a dict. The keys are languages, and values are tuples. 117 | # 118 | # For regular links: 119 | # ('https://getnikola.com/', 'Nikola Homepage') 120 | # 121 | # For submenus: 122 | # ( 123 | # ( 124 | # ('https://apple.com/', 'Apple'), 125 | # ('https://orange.com/', 'Orange'), 126 | # ), 127 | # 'Fruits' 128 | # ) 129 | # 130 | # WARNING: Support for submenus is theme-dependent. 131 | # Only one level of submenus is supported. 132 | # WARNING: Some themes, including the default Bootstrap 4 theme, 133 | # may present issues if the menu is too large. 134 | # (in Bootstrap, the navbar can grow too large and cover contents.) 135 | # WARNING: If you link to directories, make sure to follow 136 | # ``STRIP_INDEXES``. If it’s set to ``True``, end your links 137 | # with a ``/``, otherwise end them with ``/index.html`` — or 138 | # else they won’t be highlighted when active. 139 | 140 | NAVIGATION_LINKS = { 141 | DEFAULT_LANG: ( 142 | ("/archive.html", "Archive"), 143 | ("/categories/", "Tags"), 144 | ("/rss.xml", "RSS feed"), 145 | ), 146 | } 147 | 148 | # Alternative navigation links. Works the same way NAVIGATION_LINKS does, 149 | # although themes may not always support them. (translatable) 150 | # (Bootstrap 4: right-side of navbar, Bootblog 4: right side of title) 151 | NAVIGATION_ALT_LINKS = { 152 | DEFAULT_LANG: () 153 | } 154 | 155 | # Name of the theme to use. 156 | THEME = "bootblog4" 157 | 158 | # Primary color of your theme. This will be used to customize your theme. 159 | # Must be a HEX value. 160 | THEME_COLOR = '#5670d4' 161 | 162 | # Theme configuration. Fully theme-dependent. (translatable) 163 | # Examples below are for bootblog4. 164 | # bootblog4 supports: featured_large featured_small featured_on_mobile 165 | # featured_large_image_on_mobile featured_strip_html sidebar 166 | # bootstrap4 supports: navbar_light (defaults to False) 167 | THEME_CONFIG = { 168 | DEFAULT_LANG: { 169 | # Show the latest featured post in a large box, with the previewimage as its background. 170 | 'featured_large': True, 171 | # Show the first (remaining) two featured posts in small boxes. 172 | 'featured_small': False, 173 | # Show featured posts on mobile. 174 | 'featured_on_mobile': True, 175 | # Show image in `featured_large` on mobile. 176 | # `featured_small` displays them only on desktop. 177 | 'featured_large_image_on_mobile': True, 178 | # Strip HTML from featured post text. 179 | 'featured_strip_html': False, 180 | # Contents of the sidebar, If empty, the sidebar is not displayed. 181 | 'sidebar': '' 182 | } 183 | } 184 | 185 | # POSTS and PAGES contains (wildcard, destination, template) tuples. 186 | # (translatable) 187 | # 188 | # The wildcard is used to generate a list of source files 189 | # (whatever/thing.rst, for example). 190 | # 191 | # That fragment could have an associated metadata file (whatever/thing.meta), 192 | # and optionally translated files (example for Spanish, with code "es"): 193 | # whatever/thing.es.rst and whatever/thing.es.meta 194 | # 195 | # This assumes you use the default TRANSLATIONS_PATTERN. 196 | # 197 | # From those files, a set of HTML fragment files will be generated: 198 | # cache/whatever/thing.html (and maybe cache/whatever/thing.html.es) 199 | # 200 | # These files are combined with the template to produce rendered 201 | # pages, which will be placed at 202 | # output/TRANSLATIONS[lang]/destination/pagename.html 203 | # 204 | # where "pagename" is the "slug" specified in the metadata file. 205 | # The page might also be placed in /destination/pagename/index.html 206 | # if PRETTY_URLS are enabled. 207 | # 208 | # The difference between POSTS and PAGES is that POSTS are added 209 | # to feeds, indexes, tag lists and archives and are considered part 210 | # of a blog, while PAGES are just independent HTML pages. 211 | # 212 | # Finally, note that destination can be translated, i.e. you can 213 | # specify a different translation folder per language. Example: 214 | # PAGES = ( 215 | # ("pages/*.rst", {"en": "pages", "de": "seiten"}, "page.tmpl"), 216 | # ("pages/*.md", {"en": "pages", "de": "seiten"}, "page.tmpl"), 217 | # ) 218 | 219 | POSTS = ( 220 | ("posts/*.rst", "posts", "post.tmpl"), 221 | ("posts/*.md", "posts", "post.tmpl"), 222 | ("posts/*.txt", "posts", "post.tmpl"), 223 | ("posts/*.html", "posts", "post.tmpl"), 224 | ) 225 | PAGES = ( 226 | ("pages/*.rst", "pages", "page.tmpl"), 227 | ("pages/*.md", "pages", "page.tmpl"), 228 | ("pages/*.txt", "pages", "page.tmpl"), 229 | ("pages/*.html", "pages", "page.tmpl"), 230 | ) 231 | 232 | 233 | # Below this point, everything is optional 234 | 235 | # Post's dates are considered in UTC by default, if you want to use 236 | # another time zone, please set TIMEZONE to match. Check the available 237 | # list from Wikipedia: 238 | # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 239 | # (e.g. 'Europe/Zurich') 240 | # Also, if you want to use a different time zone in some of your posts, 241 | # you can use the ISO 8601/RFC 3339 format (ex. 2012-03-30T23:00:00+02:00) 242 | TIMEZONE = "UTC" 243 | 244 | # If you want to use ISO 8601 (also valid RFC 3339) throughout Nikola 245 | # (especially in new_post), set this to True. 246 | # Note that this does not affect DATE_FORMAT. 247 | # FORCE_ISO8601 = False 248 | 249 | # Date format used to display post dates. (translatable) 250 | # Used by babel.dates, CLDR style: http://cldr.unicode.org/translation/date-time 251 | # You can also use 'full', 'long', 'medium', or 'short' 252 | # DATE_FORMAT = 'yyyy-MM-dd HH:mm' 253 | 254 | # Date format used to display post dates, if local dates are used. (translatable) 255 | # Used by moment.js: https://momentjs.com/docs/#/displaying/format/ 256 | # JS_DATE_FORMAT = 'YYYY-MM-DD HH:mm' 257 | 258 | # Date fanciness. 259 | # 260 | # 0 = using DATE_FORMAT and TIMEZONE 261 | # 1 = using JS_DATE_FORMAT and local user time (via moment.js) 262 | # 2 = using a string like “2 days ago” 263 | # 264 | # Your theme must support it, Bootstrap already does. 265 | # DATE_FANCINESS = 0 266 | 267 | # Customize the locale/region used for a language. 268 | # For example, to use British instead of US English: LOCALES = {'en': 'en_GB'} 269 | # LOCALES = {} 270 | 271 | # One or more folders containing files to be copied as-is into the output. 272 | # The format is a dictionary of {source: relative destination}. 273 | # Default is: 274 | # FILES_FOLDERS = {'files': ''} 275 | # Which means copy 'files' into 'output' 276 | 277 | # One or more folders containing code listings to be processed and published on 278 | # the site. The format is a dictionary of {source: relative destination}. 279 | # Default is: 280 | # LISTINGS_FOLDERS = {'listings': 'listings'} 281 | # Which means process listings from 'listings' into 'output/listings' 282 | 283 | # A mapping of languages to file-extensions that represent that language. 284 | # Feel free to add or delete extensions to any list, but don't add any new 285 | # compilers unless you write the interface for it yourself. 286 | # 287 | # The default compiler for `new_post` is the first entry in the POSTS tuple. 288 | # 289 | # 'rest' is reStructuredText 290 | # 'markdown' is Markdown 291 | # 'html' assumes the file is HTML and just copies it 292 | COMPILERS = { 293 | "rest": ('.rst', '.txt'), 294 | "markdown": ('.md', '.mdown', '.markdown'), 295 | "textile": ('.textile',), 296 | "txt2tags": ('.t2t',), 297 | "bbcode": ('.bb',), 298 | "wiki": ('.wiki',), 299 | "ipynb": ('.ipynb',), 300 | "html": ('.html', '.htm'), 301 | # PHP files are rendered the usual way (i.e. with the full templates). 302 | # The resulting files have .php extensions, making it possible to run 303 | # them without reconfiguring your server to recognize them. 304 | "php": ('.php',), 305 | # Pandoc detects the input from the source filename 306 | # but is disabled by default as it would conflict 307 | # with many of the others. 308 | # "pandoc": ('.rst', '.md', '.txt'), 309 | } 310 | 311 | # Enable reST directives that insert the contents of external files such 312 | # as "include" and "raw." This maps directly to the docutils file_insertion_enabled 313 | # config. See: http://docutils.sourceforge.net/docs/user/config.html#file-insertion-enabled 314 | # REST_FILE_INSERTION_ENABLED = True 315 | 316 | # Create by default posts in one file format? 317 | # Set to False for two-file posts, with separate metadata. 318 | # ONE_FILE_POSTS = True 319 | 320 | # Preferred metadata format for new posts 321 | # "Nikola": reST comments, wrapped in a HTML comment if needed (default) 322 | # "YAML": YAML wrapped in "---" 323 | # "TOML": TOML wrapped in "+++" 324 | # "Pelican": Native markdown metadata or reST docinfo fields. Nikola style for other formats. 325 | METADATA_FORMAT = "YAML" 326 | 327 | # Use date-based path when creating posts? 328 | # Can be enabled on a per-post basis with `nikola new_post -d`. 329 | # The setting is ignored when creating pages. 330 | # NEW_POST_DATE_PATH = False 331 | 332 | # What format to use when creating posts with date paths? 333 | # Default is '%Y/%m/%d', other possibilities include '%Y' or '%Y/%m'. 334 | # NEW_POST_DATE_PATH_FORMAT = '%Y/%m/%d' 335 | 336 | # If this is set to True, the DEFAULT_LANG version will be displayed for 337 | # untranslated posts. 338 | # If this is set to False, then posts that are not translated to a language 339 | # LANG will not be visible at all in the pages in that language. 340 | # SHOW_UNTRANSLATED_POSTS = True 341 | 342 | # Nikola supports logo display. If you have one, you can put the URL here. 343 | # Final output is . 344 | # The URL may be relative to the site root. 345 | # LOGO_URL = '' 346 | 347 | # If you want to hide the title of your website (for example, if your logo 348 | # already contains the text), set this to False. 349 | # SHOW_BLOG_TITLE = True 350 | 351 | # Paths for different autogenerated bits. These are combined with the 352 | # translation paths. 353 | 354 | # Final locations are: 355 | # output / TRANSLATION[lang] / TAG_PATH / index.html (list of tags) 356 | # output / TRANSLATION[lang] / TAG_PATH / tag.html (list of posts for a tag) 357 | # output / TRANSLATION[lang] / TAG_PATH / tag RSS_EXTENSION (RSS feed for a tag) 358 | # (translatable) 359 | # TAG_PATH = "categories" 360 | 361 | # By default, the list of tags is stored in 362 | # output / TRANSLATION[lang] / TAG_PATH / index.html 363 | # (see explanation for TAG_PATH). This location can be changed to 364 | # output / TRANSLATION[lang] / TAGS_INDEX_PATH 365 | # with an arbitrary relative path TAGS_INDEX_PATH. 366 | # (translatable) 367 | # TAGS_INDEX_PATH = "tags.html" 368 | 369 | # If TAG_PAGES_ARE_INDEXES is set to True, each tag's page will contain 370 | # the posts themselves. If set to False, it will be just a list of links. 371 | # TAG_PAGES_ARE_INDEXES = False 372 | 373 | # Set descriptions for tag pages to make them more interesting. The 374 | # default is no description. The value is used in the meta description 375 | # and displayed underneath the tag list or index page’s title. 376 | # TAG_DESCRIPTIONS = { 377 | # DEFAULT_LANG: { 378 | # "blogging": "Meta-blog posts about blogging.", 379 | # "open source": "My contributions to my many, varied, ever-changing, and eternal libre software projects." 380 | # }, 381 | # } 382 | 383 | # Set special titles for tag pages. The default is "Posts about TAG". 384 | # TAG_TITLES = { 385 | # DEFAULT_LANG: { 386 | # "blogging": "Meta-posts about blogging", 387 | # "open source": "Posts about open source software" 388 | # }, 389 | # } 390 | 391 | # If you do not want to display a tag publicly, you can mark it as hidden. 392 | # The tag will not be displayed on the tag list page and posts. 393 | # Tag pages will still be generated. 394 | HIDDEN_TAGS = ['mathjax'] 395 | 396 | # Only include tags on the tag list/overview page if there are at least 397 | # TAGLIST_MINIMUM_POSTS number of posts or more with every tag. Every tag 398 | # page is still generated, linked from posts, and included in the sitemap. 399 | # However, more obscure tags can be hidden from the tag index page. 400 | # TAGLIST_MINIMUM_POSTS = 1 401 | 402 | # A list of dictionaries specifying tags which translate to each other. 403 | # Format: a list of dicts {language: translation, language2: translation2, …} 404 | # For example: 405 | # [ 406 | # {'en': 'private', 'de': 'Privat'}, 407 | # {'en': 'work', 'fr': 'travail', 'de': 'Arbeit'}, 408 | # ] 409 | # TAG_TRANSLATIONS = [] 410 | 411 | # If set to True, a tag in a language will be treated as a translation 412 | # of the literally same tag in all other languages. Enable this if you 413 | # do not translate tags, for example. 414 | # TAG_TRANSLATIONS_ADD_DEFAULTS = True 415 | 416 | # Final locations are: 417 | # output / TRANSLATION[lang] / CATEGORY_PATH / index.html (list of categories) 418 | # output / TRANSLATION[lang] / CATEGORY_PATH / CATEGORY_PREFIX category.html (list of posts for a category) 419 | # output / TRANSLATION[lang] / CATEGORY_PATH / CATEGORY_PREFIX category RSS_EXTENSION (RSS feed for a category) 420 | # (translatable) 421 | # CATEGORY_PATH = "categories" 422 | # CATEGORY_PREFIX = "cat_" 423 | 424 | # By default, the list of categories is stored in 425 | # output / TRANSLATION[lang] / CATEGORY_PATH / index.html 426 | # (see explanation for CATEGORY_PATH). This location can be changed to 427 | # output / TRANSLATION[lang] / CATEGORIES_INDEX_PATH 428 | # with an arbitrary relative path CATEGORIES_INDEX_PATH. 429 | # (translatable) 430 | # CATEGORIES_INDEX_PATH = "categories.html" 431 | 432 | # If CATEGORY_ALLOW_HIERARCHIES is set to True, categories can be organized in 433 | # hierarchies. For a post, the whole path in the hierarchy must be specified, 434 | # using a forward slash ('/') to separate paths. Use a backslash ('\') to escape 435 | # a forward slash or a backslash (i.e. '\//\\' is a path specifying the 436 | # subcategory called '\' of the top-level category called '/'). 437 | CATEGORY_ALLOW_HIERARCHIES = False 438 | # If CATEGORY_OUTPUT_FLAT_HIERARCHY is set to True, the output written to output 439 | # contains only the name of the leaf category and not the whole path. 440 | CATEGORY_OUTPUT_FLAT_HIERARCHY = False 441 | 442 | # If CATEGORY_PAGES_ARE_INDEXES is set to True, each category's page will contain 443 | # the posts themselves. If set to False, it will be just a list of links. 444 | # CATEGORY_PAGES_ARE_INDEXES = False 445 | 446 | # Set descriptions for category pages to make them more interesting. The 447 | # default is no description. The value is used in the meta description 448 | # and displayed underneath the category list or index page’s title. 449 | # CATEGORY_DESCRIPTIONS = { 450 | # DEFAULT_LANG: { 451 | # "blogging": "Meta-blog posts about blogging.", 452 | # "open source": "My contributions to my many, varied, ever-changing, and eternal libre software projects." 453 | # }, 454 | # } 455 | 456 | # Set special titles for category pages. The default is "Posts about CATEGORY". 457 | # CATEGORY_TITLES = { 458 | # DEFAULT_LANG: { 459 | # "blogging": "Meta-posts about blogging", 460 | # "open source": "Posts about open source software" 461 | # }, 462 | # } 463 | 464 | # If you do not want to display a category publicly, you can mark it as hidden. 465 | # The category will not be displayed on the category list page. 466 | # Category pages will still be generated. 467 | HIDDEN_CATEGORIES = [] 468 | 469 | # A list of dictionaries specifying categories which translate to each other. 470 | # Format: a list of dicts {language: translation, language2: translation2, …} 471 | # See TAG_TRANSLATIONS example above. 472 | # CATEGORY_TRANSLATIONS = [] 473 | 474 | # If set to True, a category in a language will be treated as a translation 475 | # of the literally same category in all other languages. Enable this if you 476 | # do not translate categories, for example. 477 | # CATEGORY_TRANSLATIONS_ADD_DEFAULTS = True 478 | 479 | # If no category is specified in a post, the destination path of the post 480 | # can be used in its place. This replaces the sections feature. Using 481 | # category hierarchies is recommended. 482 | # CATEGORY_DESTPATH_AS_DEFAULT = False 483 | 484 | # If True, the prefix will be trimmed from the category name, eg. if the 485 | # POSTS destination is "foo/bar", and the path is "foo/bar/baz/quux", 486 | # the category will be "baz/quux" (or "baz" if only the first directory is considered). 487 | # Note that prefixes coming from translations are always ignored. 488 | # CATEGORY_DESTPATH_TRIM_PREFIX = False 489 | 490 | # If True, only the first directory of a path will be used. 491 | # CATEGORY_DESTPATH_FIRST_DIRECTORY_ONLY = True 492 | 493 | # Map paths to prettier category names. (translatable) 494 | # CATEGORY_DESTPATH_NAMES = { 495 | # DEFAULT_LANG: { 496 | # 'webdev': 'Web Development', 497 | # 'webdev/django': 'Web Development/Django', 498 | # 'random': 'Odds and Ends', 499 | # }, 500 | # } 501 | 502 | # By default, category indexes will appear in CATEGORY_PATH and use 503 | # CATEGORY_PREFIX. If this is enabled, those settings will be ignored (except 504 | # for the index) and instead, they will follow destination paths (eg. category 505 | # 'foo' might appear in 'posts/foo'). If the category does not come from a 506 | # destpath, first entry in POSTS followed by the category name will be used. 507 | # For this setting, category hierarchies are required and cannot be flattened. 508 | # CATEGORY_PAGES_FOLLOW_DESTPATH = False 509 | 510 | # If ENABLE_AUTHOR_PAGES is set to True and there is more than one 511 | # author, author pages are generated. 512 | # ENABLE_AUTHOR_PAGES = True 513 | 514 | # Path to author pages. Final locations are: 515 | # output / TRANSLATION[lang] / AUTHOR_PATH / index.html (list of authors) 516 | # output / TRANSLATION[lang] / AUTHOR_PATH / author.html (list of posts by an author) 517 | # output / TRANSLATION[lang] / AUTHOR_PATH / author RSS_EXTENSION (RSS feed for an author) 518 | # (translatable) 519 | # AUTHOR_PATH = "authors" 520 | 521 | # If AUTHOR_PAGES_ARE_INDEXES is set to True, each author's page will contain 522 | # the posts themselves. If set to False, it will be just a list of links. 523 | # AUTHOR_PAGES_ARE_INDEXES = False 524 | 525 | # Set descriptions for author pages to make them more interesting. The 526 | # default is no description. The value is used in the meta description 527 | # and displayed underneath the author list or index page’s title. 528 | # AUTHOR_PAGES_DESCRIPTIONS = { 529 | # DEFAULT_LANG: { 530 | # "Juanjo Conti": "Python coder and writer.", 531 | # "Roberto Alsina": "Nikola father." 532 | # }, 533 | # } 534 | 535 | 536 | # If you do not want to display an author publicly, you can mark it as hidden. 537 | # The author will not be displayed on the author list page and posts. 538 | # Tag pages will still be generated. 539 | HIDDEN_AUTHORS = ['Guest'] 540 | 541 | # Final location for the main blog page and sibling paginated pages is 542 | # output / TRANSLATION[lang] / INDEX_PATH / index-*.html 543 | # (translatable) 544 | # INDEX_PATH = "" 545 | 546 | # Optional HTML that displayed on “main” blog index.html files. 547 | # May be used for a greeting. (translatable) 548 | FRONT_INDEX_HEADER = { 549 | DEFAULT_LANG: '' 550 | } 551 | 552 | # Create per-month archives instead of per-year 553 | # CREATE_MONTHLY_ARCHIVE = False 554 | # Create one large archive instead of per-year 555 | # CREATE_SINGLE_ARCHIVE = False 556 | # Create year, month, and day archives each with a (long) list of posts 557 | # (overrides both CREATE_MONTHLY_ARCHIVE and CREATE_SINGLE_ARCHIVE) 558 | # CREATE_FULL_ARCHIVES = False 559 | # If monthly archives or full archives are created, adds also one archive per day 560 | # CREATE_DAILY_ARCHIVE = False 561 | # Create previous, up, next navigation links for archives 562 | # CREATE_ARCHIVE_NAVIGATION = False 563 | # Final locations for the archives are: 564 | # output / TRANSLATION[lang] / ARCHIVE_PATH / ARCHIVE_FILENAME 565 | # output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / index.html 566 | # output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / index.html 567 | # output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / DAY / index.html 568 | # (translatable) 569 | # ARCHIVE_PATH = "" 570 | # ARCHIVE_FILENAME = "archive.html" 571 | 572 | # If ARCHIVES_ARE_INDEXES is set to True, each archive page which contains a list 573 | # of posts will contain the posts themselves. If set to False, it will be just a 574 | # list of links. 575 | # ARCHIVES_ARE_INDEXES = False 576 | 577 | # URLs to other posts/pages can take 3 forms: 578 | # rel_path: a relative URL to the current page/post (default) 579 | # full_path: a URL with the full path from the root 580 | # absolute: a complete URL (that includes the SITE_URL) 581 | # URL_TYPE = 'rel_path' 582 | 583 | # Extension for RSS feed files 584 | # RSS_EXTENSION = ".xml" 585 | 586 | # RSS filename base (without extension); used for indexes and galleries. 587 | # (translatable) 588 | # RSS_FILENAME_BASE = "rss" 589 | 590 | # Final location for the blog main RSS feed is: 591 | # output / TRANSLATION[lang] / RSS_PATH / RSS_FILENAME_BASE RSS_EXTENSION 592 | # (translatable) 593 | # RSS_PATH = "" 594 | 595 | # Final location for the blog main Atom feed is: 596 | # output / TRANSLATION[lang] / ATOM_PATH / ATOM_FILENAME_BASE ATOM_EXTENSION 597 | # (translatable) 598 | # ATOM_PATH = "" 599 | 600 | # Atom filename base (without extension); used for indexes. 601 | # (translatable) 602 | ATOM_FILENAME_BASE = "feed" 603 | 604 | # Extension for Atom feed files 605 | # ATOM_EXTENSION = ".atom" 606 | 607 | # Slug the Tag URL. Easier for users to type, special characters are 608 | # often removed or replaced as well. 609 | # SLUG_TAG_PATH = True 610 | 611 | # Slug the Author URL. Easier for users to type, special characters are 612 | # often removed or replaced as well. 613 | # SLUG_AUTHOR_PATH = True 614 | 615 | # A list of redirection tuples, [("foo/from.html", "/bar/to.html")]. 616 | # 617 | # A HTML file will be created in output/foo/from.html that redirects 618 | # to the "/bar/to.html" URL. notice that the "from" side MUST be a 619 | # relative URL. 620 | # 621 | # If you don't need any of these, just set to [] 622 | REDIRECTIONS = [] 623 | 624 | # Presets of commands to execute to deploy. Can be anything, for 625 | # example, you may use rsync: 626 | # "rsync -rav --delete output/ joe@my.site:/srv/www/site" 627 | # And then do a backup, or run `nikola ping` from the `ping` 628 | # plugin (`nikola plugin -i ping`). Or run `nikola check -l`. 629 | # You may also want to use github_deploy (see below). 630 | # You can define multiple presets and specify them as arguments 631 | # to `nikola deploy`. If no arguments are specified, a preset 632 | # named `default` will be executed. You can use as many presets 633 | # in a `nikola deploy` command as you like. 634 | # DEPLOY_COMMANDS = { 635 | # 'default': [ 636 | # "rsync -rav --delete output/ joe@my.site:/srv/www/site", 637 | # ] 638 | # } 639 | 640 | # github_deploy configuration 641 | # For more details, read the manual: 642 | # https://getnikola.com/handbook.html#deploying-to-github 643 | # You will need to configure the deployment branch on GitHub. 644 | GITHUB_SOURCE_BRANCH = 'src' 645 | GITHUB_DEPLOY_BRANCH = 'master' 646 | 647 | # The name of the remote where you wish to push to, using github_deploy. 648 | GITHUB_REMOTE_NAME = 'origin' 649 | 650 | # Whether or not github_deploy should commit to the source branch automatically 651 | # before deploying. 652 | GITHUB_COMMIT_SOURCE = True 653 | 654 | # Where the output site should be located 655 | # If you don't use an absolute path, it will be considered as relative 656 | # to the location of conf.py 657 | # OUTPUT_FOLDER = 'output' 658 | 659 | # where the "cache" of partial generated content should be located 660 | # default: 'cache' 661 | # CACHE_FOLDER = 'cache' 662 | 663 | # Filters to apply to the output. 664 | # A directory where the keys are either: a file extensions, or 665 | # a tuple of file extensions. 666 | # 667 | # And the value is a list of commands to be applied in order. 668 | # 669 | # Each command must be either: 670 | # 671 | # A string containing a '%s' which will 672 | # be replaced with a filename. The command *must* produce output 673 | # in place. 674 | # 675 | # Or: 676 | # 677 | # A python callable, which will be called with the filename as 678 | # argument. 679 | # 680 | # By default, only .php files uses filters to inject PHP into 681 | # Nikola’s templates. All other filters must be enabled through FILTERS. 682 | # 683 | # Many filters are shipped with Nikola. A list is available in the manual: 684 | # 685 | # 686 | # from nikola import filters 687 | # FILTERS = { 688 | # ".html": [filters.typogrify], 689 | # ".js": [filters.closure_compiler], 690 | # ".jpg": ["jpegoptim --strip-all -m75 -v %s"], 691 | # } 692 | 693 | # Executable for the "yui_compressor" filter (defaults to 'yui-compressor'). 694 | # YUI_COMPRESSOR_EXECUTABLE = 'yui-compressor' 695 | 696 | # Executable for the "closure_compiler" filter (defaults to 'closure-compiler'). 697 | # CLOSURE_COMPILER_EXECUTABLE = 'closure-compiler' 698 | 699 | # Executable for the "optipng" filter (defaults to 'optipng'). 700 | # OPTIPNG_EXECUTABLE = 'optipng' 701 | 702 | # Executable for the "jpegoptim" filter (defaults to 'jpegoptim'). 703 | # JPEGOPTIM_EXECUTABLE = 'jpegoptim' 704 | 705 | # Executable for the "html_tidy_withconfig", "html_tidy_nowrap", 706 | # "html_tidy_wrap", "html_tidy_wrap_attr" and "html_tidy_mini" filters 707 | # (defaults to 'tidy5'). 708 | # HTML_TIDY_EXECUTABLE = 'tidy5' 709 | 710 | # List of XPath expressions which should be used for finding headers 711 | # ({hx} is replaced by headers h1 through h6). 712 | # You must change this if you use a custom theme that does not use 713 | # "e-content entry-content" as a class for post and page contents. 714 | # HEADER_PERMALINKS_XPATH_LIST = ['*//div[@class="e-content entry-content"]//{hx}'] 715 | # Include *every* header (not recommended): 716 | # HEADER_PERMALINKS_XPATH_LIST = ['*//{hx}'] 717 | 718 | # File blacklist for header permalinks. Contains output path 719 | # (eg. 'output/index.html') 720 | # HEADER_PERMALINKS_FILE_BLACKLIST = [] 721 | 722 | # Expert setting! Create a gzipped copy of each generated file. Cheap server- 723 | # side optimization for very high traffic sites or low memory servers. 724 | # GZIP_FILES = False 725 | # File extensions that will be compressed 726 | # GZIP_EXTENSIONS = ('.txt', '.htm', '.html', '.css', '.js', '.json', '.atom', '.xml') 727 | # Use an external gzip command? None means no. 728 | # Example: GZIP_COMMAND = "pigz -k {filename}" 729 | # GZIP_COMMAND = None 730 | # Make sure the server does not return a "Accept-Ranges: bytes" header for 731 | # files compressed by this option! OR make sure that a ranged request does not 732 | # return partial content of another representation for these resources. Do not 733 | # use this feature if you do not understand what this means. 734 | 735 | # ############################################################################# 736 | # Image Gallery Options 737 | # ############################################################################# 738 | 739 | # One or more folders containing galleries. The format is a dictionary of 740 | # {"source": "relative_destination"}, where galleries are looked for in 741 | # "source/" and the results will be located in 742 | # "OUTPUT_PATH/relative_destination/gallery_name" 743 | # Default is: 744 | # GALLERY_FOLDERS = {"galleries": "galleries"} 745 | # More gallery options: 746 | # THUMBNAIL_SIZE = 180 747 | # MAX_IMAGE_SIZE = 1280 748 | # USE_FILENAME_AS_TITLE = True 749 | # EXTRA_IMAGE_EXTENSIONS = [] 750 | # 751 | # If set to False, it will sort by filename instead. Defaults to True 752 | # GALLERY_SORT_BY_DATE = True 753 | 754 | # If set to True, EXIF data will be copied when an image is thumbnailed or 755 | # resized. (See also EXIF_WHITELIST) 756 | # PRESERVE_EXIF_DATA = False 757 | 758 | # If you have enabled PRESERVE_EXIF_DATA, this option lets you choose EXIF 759 | # fields you want to keep in images. (See also PRESERVE_EXIF_DATA) 760 | # 761 | # For a full list of field names, please see here: 762 | # http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf 763 | # 764 | # This is a dictionary of lists. Each key in the dictionary is the 765 | # name of a IDF, and each list item is a field you want to preserve. 766 | # If you have a IDF with only a '*' item, *EVERY* item in it will be 767 | # preserved. If you don't want to preserve anything in a IDF, remove it 768 | # from the setting. By default, no EXIF information is kept. 769 | # Setting the whitelist to anything other than {} implies 770 | # PRESERVE_EXIF_DATA is set to True 771 | # To preserve ALL EXIF data, set EXIF_WHITELIST to {"*": "*"} 772 | 773 | # EXIF_WHITELIST = {} 774 | 775 | # Some examples of EXIF_WHITELIST settings: 776 | 777 | # Basic image information: 778 | # EXIF_WHITELIST['0th'] = [ 779 | # "Orientation", 780 | # "XResolution", 781 | # "YResolution", 782 | # ] 783 | 784 | # If you want to keep GPS data in the images: 785 | # EXIF_WHITELIST['GPS'] = ["*"] 786 | 787 | # Embedded thumbnail information: 788 | # EXIF_WHITELIST['1st'] = ["*"] 789 | 790 | # If set to True, any ICC profile will be copied when an image is thumbnailed or 791 | # resized. 792 | # PRESERVE_ICC_PROFILES = False 793 | 794 | # Folders containing images to be used in normal posts or pages. 795 | # IMAGE_FOLDERS is a dictionary of the form {"source": "destination"}, 796 | # where "source" is the folder containing the images to be published, and 797 | # "destination" is the folder under OUTPUT_PATH containing the images copied 798 | # to the site. Thumbnail images will be created there as well. 799 | 800 | # To reference the images in your posts, include a leading slash in the path. 801 | # For example, if IMAGE_FOLDERS = {'images': 'images'}, write 802 | # 803 | # .. image:: /images/tesla.jpg 804 | # 805 | # See the Nikola Handbook for details (in the “Embedding Images” and 806 | # “Thumbnails” sections) 807 | 808 | # Images will be scaled down according to IMAGE_THUMBNAIL_SIZE and MAX_IMAGE_SIZE 809 | # options, but will have to be referenced manually to be visible on the site 810 | # (the thumbnail has ``.thumbnail`` added before the file extension by default, 811 | # but a different naming template can be configured with IMAGE_THUMBNAIL_FORMAT). 812 | 813 | IMAGE_FOLDERS = {'images': 'images'} 814 | # IMAGE_THUMBNAIL_SIZE = 400 815 | # IMAGE_THUMBNAIL_FORMAT = '{name}.thumbnail{ext}' 816 | 817 | # ############################################################################# 818 | # HTML fragments and diverse things that are used by the templates 819 | # ############################################################################# 820 | 821 | # Data about post-per-page indexes. 822 | # INDEXES_PAGES defaults to ' old posts, page %d' or ' page %d' (translated), 823 | # depending on the value of INDEXES_PAGES_MAIN. 824 | # 825 | # (translatable) If the following is empty, defaults to BLOG_TITLE: 826 | # INDEXES_TITLE = "" 827 | # 828 | # (translatable) If the following is empty, defaults to ' [old posts,] page %d' (see above): 829 | # INDEXES_PAGES = "" 830 | # 831 | # If the following is True, INDEXES_PAGES is also displayed on the main (the 832 | # newest) index page (index.html): 833 | # INDEXES_PAGES_MAIN = False 834 | # 835 | # If the following is True, index-1.html has the oldest posts, index-2.html the 836 | # second-oldest posts, etc., and index.html has the newest posts. This ensures 837 | # that all posts on index-x.html will forever stay on that page, now matter how 838 | # many new posts are added. 839 | # If False, index-1.html has the second-newest posts, index-2.html the third-newest, 840 | # and index-n.html the oldest posts. When this is active, old posts can be moved 841 | # to other index pages when new posts are added. 842 | # INDEXES_STATIC = True 843 | # 844 | # (translatable) If PRETTY_URLS is set to True, this setting will be used to create 845 | # prettier URLs for index pages, such as page/2/index.html instead of index-2.html. 846 | # Valid values for this settings are: 847 | # * False, 848 | # * a list or tuple, specifying the path to be generated, 849 | # * a dictionary mapping languages to lists or tuples. 850 | # Every list or tuple must consist of strings which are used to combine the path; 851 | # for example: 852 | # ['page', '{number}', '{index_file}'] 853 | # The replacements 854 | # {number} --> (logical) page number; 855 | # {old_number} --> the page number inserted into index-n.html before (zero for 856 | # the main page); 857 | # {index_file} --> value of option INDEX_FILE 858 | # are made. 859 | # Note that in case INDEXES_PAGES_MAIN is set to True, a redirection will be created 860 | # for the full URL with the page number of the main page to the normal (shorter) main 861 | # page URL. 862 | # INDEXES_PRETTY_PAGE_URL = False 863 | # 864 | # If the following is true, a page range navigation will be inserted to indices. 865 | # Please note that this will undo the effect of INDEXES_STATIC, as all index pages 866 | # must be recreated whenever the number of pages changes. 867 | # SHOW_INDEX_PAGE_NAVIGATION = False 868 | 869 | # If the following is True, a meta name="generator" tag is added to pages. The 870 | # generator tag is used to specify the software used to generate the page 871 | # (it promotes Nikola). 872 | # META_GENERATOR_TAG = True 873 | 874 | # Color scheme to be used for code blocks. If your theme provides 875 | # "assets/css/code.css" this is ignored. Set to None to disable. 876 | # Can be any of: 877 | # algol, algol_nu, autumn, borland, bw, colorful, default, emacs, friendly, 878 | # fruity, igor, lovelace, manni, monokai, murphy, native, paraiso-dark, 879 | # paraiso-light, pastie, perldoc, rrt, tango, trac, vim, vs, xcode 880 | # This list MAY be incomplete since pygments adds styles every now and then. 881 | # Check with list(pygments.styles.get_all_styles()) in an interpreter. 882 | # CODE_COLOR_SCHEME = 'default' 883 | 884 | # FAVICONS contains (name, file, size) tuples. 885 | # Used to create favicon link like this: 886 | # 887 | # FAVICONS = ( 888 | # ("icon", "/favicon.ico", "16x16"), 889 | # ("icon", "/icon_128x128.png", "128x128"), 890 | # ) 891 | 892 | # Show teasers (instead of full posts) in indexes? Defaults to False. 893 | # INDEX_TEASERS = False 894 | 895 | # HTML fragments with the Read more... links. 896 | # The following tags exist and are replaced for you: 897 | # {link} A link to the full post page. 898 | # {read_more} The string “Read more” in the current language. 899 | # {reading_time} An estimate of how long it will take to read the post. 900 | # {remaining_reading_time} An estimate of how long it will take to read the post, sans the teaser. 901 | # {min_remaining_read} The string “{remaining_reading_time} min remaining to read” in the current language. 902 | # {paragraph_count} The amount of paragraphs in the post. 903 | # {remaining_paragraph_count} The amount of paragraphs in the post, sans the teaser. 904 | # {post_title} The title of the post. 905 | # {{ A literal { (U+007B LEFT CURLY BRACKET) 906 | # }} A literal } (U+007D RIGHT CURLY BRACKET) 907 | 908 | # 'Read more...' for the index page, if INDEX_TEASERS is True (translatable) 909 | INDEX_READ_MORE_LINK = '

{read_more}…

' 910 | # 'Read more...' for the feeds, if FEED_TEASERS is True (translatable) 911 | FEED_READ_MORE_LINK = '

{read_more}… ({min_remaining_read})

' 912 | 913 | # Append a URL query to the FEED_READ_MORE_LINK in Atom and RSS feeds. Advanced 914 | # option used for traffic source tracking. 915 | # Minimum example for use with Piwik: "pk_campaign=feed" 916 | # The following tags exist and are replaced for you: 917 | # {feedRelUri} A relative link to the feed. 918 | # {feedFormat} The name of the syndication format. 919 | # Example using replacement for use with Google Analytics: 920 | # "utm_source={feedRelUri}&utm_medium=nikola_feed&utm_campaign={feedFormat}_feed" 921 | FEED_LINKS_APPEND_QUERY = False 922 | 923 | # A HTML fragment describing the license, for the sidebar. 924 | # (translatable) 925 | LICENSE = "" 926 | # I recommend using the Creative Commons' wizard: 927 | # https://creativecommons.org/choose/ 928 | # LICENSE = """ 929 | # 930 | # Creative Commons License BY-NC-SA""" 933 | 934 | # A small copyright notice for the page footer (in HTML). 935 | # (translatable) 936 | CONTENT_FOOTER = 'Contents © {date} {author} - Powered by Nikola {license}' 937 | 938 | # Things that will be passed to CONTENT_FOOTER.format(). This is done 939 | # for translatability, as dicts are not formattable. Nikola will 940 | # intelligently format the setting properly. 941 | # The setting takes a dict. The keys are languages. The values are 942 | # tuples of tuples of positional arguments and dicts of keyword arguments 943 | # to format(). For example, {'en': (('Hello'), {'target': 'World'})} 944 | # results in CONTENT_FOOTER['en'].format('Hello', target='World'). 945 | # If you need to use the literal braces '{' and '}' in your footer text, use 946 | # '{{' and '}}' to escape them (str.format is used) 947 | # WARNING: If you do not use multiple languages with CONTENT_FOOTER, this 948 | # still needs to be a dict of this format. (it can be empty if you 949 | # do not need formatting) 950 | # (translatable) 951 | CONTENT_FOOTER_FORMATS = { 952 | DEFAULT_LANG: ( 953 | (), 954 | { 955 | "email": BLOG_EMAIL, 956 | "author": BLOG_AUTHOR, 957 | "date": time.gmtime().tm_year, 958 | "license": LICENSE 959 | } 960 | ) 961 | } 962 | 963 | # A simple copyright tag for inclusion in RSS feeds that works just 964 | # like CONTENT_FOOTER and CONTENT_FOOTER_FORMATS 965 | RSS_COPYRIGHT = 'Contents © {date} {author} {license}' 966 | RSS_COPYRIGHT_PLAIN = 'Contents © {date} {author} {license}' 967 | RSS_COPYRIGHT_FORMATS = CONTENT_FOOTER_FORMATS 968 | 969 | # To use comments, you can choose between different third party comment 970 | # systems. The following comment systems are supported by Nikola: 971 | # disqus, facebook, intensedebate, isso, muut, commento 972 | # You can leave this option blank to disable comments. 973 | COMMENT_SYSTEM = "disqus" 974 | # And you also need to add your COMMENT_SYSTEM_ID which 975 | # depends on what comment system you use. The default is 976 | # "nikolademo" which is a test account for Disqus. More information 977 | # is in the manual. 978 | COMMENT_SYSTEM_ID = "nikolademo" 979 | 980 | # Create index.html for page folders? 981 | # WARNING: if a page would conflict with the index file (usually 982 | # caused by setting slug to `index`), the PAGE_INDEX 983 | # will not be generated for that directory. 984 | # PAGE_INDEX = False 985 | # Enable comments on pages (i.e. not posts)? 986 | # COMMENTS_IN_PAGES = False 987 | # Enable comments on picture gallery pages? 988 | # COMMENTS_IN_GALLERIES = False 989 | 990 | # What file should be used for directory indexes? 991 | # Defaults to index.html 992 | # Common other alternatives: default.html for IIS, index.php 993 | # INDEX_FILE = "index.html" 994 | 995 | # If a link ends in /index.html, drop the index.html part. 996 | # http://mysite/foo/bar/index.html => http://mysite/foo/bar/ 997 | # (Uses the INDEX_FILE setting, so if that is, say, default.html, 998 | # it will instead /foo/default.html => /foo) 999 | STRIP_INDEXES = True 1000 | 1001 | # List of files relative to the server root (!) that will be asked to be excluded 1002 | # from indexing and other robotic spidering. * is supported. Will only be effective 1003 | # if SITE_URL points to server root. The list is used to exclude resources from 1004 | # /robots.txt and /sitemap.xml, and to inform search engines about /sitemapindex.xml. 1005 | # ROBOTS_EXCLUSIONS = ["/archive.html", "/category/*.html"] 1006 | 1007 | # Instead of putting files in .html, put them in /index.html. 1008 | # No web server configuration is required. Also enables STRIP_INDEXES. 1009 | # This can be disabled on a per-page/post basis by adding 1010 | # .. pretty_url: False 1011 | # to the metadata. 1012 | PRETTY_URLS = True 1013 | 1014 | # If True, publish future dated posts right away instead of scheduling them. 1015 | # Defaults to False. 1016 | # FUTURE_IS_NOW = False 1017 | 1018 | # If True, future dated posts are allowed in deployed output 1019 | # Only the individual posts are published/deployed; not in indexes/sitemap 1020 | # Generally, you want FUTURE_IS_NOW and DEPLOY_FUTURE to be the same value. 1021 | # DEPLOY_FUTURE = False 1022 | # If False, draft posts will not be deployed 1023 | # DEPLOY_DRAFTS = True 1024 | 1025 | # Allows scheduling of posts using the rule specified here (new_post -s) 1026 | # Specify an iCal Recurrence Rule: http://www.kanzaki.com/docs/ical/rrule.html 1027 | # SCHEDULE_RULE = '' 1028 | # If True, use the scheduling rule to all posts (not pages!) by default 1029 | # SCHEDULE_ALL = False 1030 | 1031 | # Do you want a add a Mathjax config file? 1032 | # MATHJAX_CONFIG = "" 1033 | 1034 | # If you want support for the $.$ syntax (which may conflict with running 1035 | # text!), just use this config: 1036 | # MATHJAX_CONFIG = """ 1037 | # 1050 | # """ 1051 | 1052 | # Want to use KaTeX instead of MathJax? While KaTeX may not support every 1053 | # feature yet, it's faster and the output looks better. 1054 | # USE_KATEX = False 1055 | 1056 | # KaTeX auto-render settings. If you want support for the $.$ syntax (which may 1057 | # conflict with running text!), just use this config: 1058 | # KATEX_AUTO_RENDER = """ 1059 | # delimiters: [ 1060 | # {left: "$$", right: "$$", display: true}, 1061 | # {left: "\\\\[", right: "\\\\]", display: true}, 1062 | # {left: "\\\\begin{equation*}", right: "\\\\end{equation*}", display: true}, 1063 | # {left: "$", right: "$", display: false}, 1064 | # {left: "\\\\(", right: "\\\\)", display: false} 1065 | # ] 1066 | # """ 1067 | 1068 | # Do you want to customize the nbconversion of your IPython notebook? 1069 | # IPYNB_CONFIG = {} 1070 | # With the following example configuration you can use a custom jinja template 1071 | # called `toggle.tpl` which has to be located in your site/blog main folder: 1072 | # IPYNB_CONFIG = {'Exporter': {'template_file': 'toggle'}} 1073 | 1074 | # What Markdown extensions to enable? 1075 | # You will also get gist, nikola and podcast because those are 1076 | # done in the code, hope you don't mind ;-) 1077 | # Note: most Nikola-specific extensions are done via the Nikola plugin system, 1078 | # with the MarkdownExtension class and should not be added here. 1079 | # Defaults are markdown.extensions.(fenced_code|codehilite|extra) 1080 | # markdown.extensions.meta is required for Markdown metadata. 1081 | MARKDOWN_EXTENSIONS = ['markdown.extensions.fenced_code', 'markdown.extensions.codehilite', 'markdown.extensions.extra'] 1082 | 1083 | # Options to be passed to markdown extensions (See https://python-markdown.github.io/reference/) 1084 | # Default is {} (no config at all) 1085 | # MARKDOWN_EXTENSION_CONFIGS = {} 1086 | 1087 | 1088 | # Extra options to pass to the pandoc command. 1089 | # by default, it's empty, is a list of strings, for example 1090 | # ['-F', 'pandoc-citeproc', '--bibliography=/Users/foo/references.bib'] 1091 | # Pandoc does not demote headers by default. To enable this, you can use, for example 1092 | # ['--base-header-level=2'] 1093 | # PANDOC_OPTIONS = [] 1094 | 1095 | # Social buttons. This is sample code for AddThis (which was the default for a 1096 | # long time). Insert anything you want here, or even make it empty (which is 1097 | # the default right now) 1098 | # (translatable) 1099 | # SOCIAL_BUTTONS_CODE = """ 1100 | # 1101 | #
1102 | # Share 1103 | #
  • 1104 | #
  • 1105 | #
  • 1106 | #
  • 1107 | #
1108 | #
1109 | # 1110 | # 1111 | # """ 1112 | 1113 | # Show link to source for the posts? 1114 | # SHOW_SOURCELINK = True 1115 | # Copy the source files for your pages? 1116 | # Setting it to False implies SHOW_SOURCELINK = False 1117 | # COPY_SOURCES = True 1118 | 1119 | # Modify the number of Post per Index Page 1120 | # Defaults to 10 1121 | # INDEX_DISPLAY_POST_COUNT = 10 1122 | 1123 | # By default, Nikola generates RSS files for the website and for tags, and 1124 | # links to it. Set this to False to disable everything RSS-related. 1125 | # GENERATE_RSS = True 1126 | 1127 | # By default, Nikola does not generates Atom files for indexes and links to 1128 | # them. Generate Atom for tags by setting TAG_PAGES_ARE_INDEXES to True. 1129 | # Atom feeds are built based on INDEX_DISPLAY_POST_COUNT and not FEED_LENGTH 1130 | # Switch between plain-text summaries and full HTML content using the 1131 | # FEED_TEASER option. FEED_LINKS_APPEND_QUERY is also respected. Atom feeds 1132 | # are generated even for old indexes and have pagination link relations 1133 | # between each other. Old Atom feeds with no changes are marked as archived. 1134 | # GENERATE_ATOM = False 1135 | 1136 | # Only include teasers in Atom and RSS feeds. Disabling include the full 1137 | # content. Defaults to True. 1138 | # FEED_TEASERS = True 1139 | 1140 | # Strip HTML from Atom and RSS feed summaries and content. Defaults to False. 1141 | # FEED_PLAIN = False 1142 | 1143 | # Number of posts in Atom and RSS feeds. 1144 | # FEED_LENGTH = 10 1145 | 1146 | # RSS_LINK is a HTML fragment to link the RSS or Atom feeds. If set to None, 1147 | # the base.tmpl will use the feed Nikola generates. However, you may want to 1148 | # change it for a FeedBurner feed or something else. 1149 | # RSS_LINK = None 1150 | 1151 | # A search form to search this site, for the sidebar. You can use a Google 1152 | # custom search (https://www.google.com/cse/) 1153 | # Or a DuckDuckGo search: https://duckduckgo.com/search_box.html 1154 | # Default is no search form. 1155 | # (translatable) 1156 | # SEARCH_FORM = "" 1157 | # 1158 | # This search form works for any site and looks good in the "site" theme where 1159 | # it appears on the navigation bar: 1160 | # 1161 | # SEARCH_FORM = """ 1162 | # 1163 | # 1173 | # 1174 | # """ % SITE_URL 1175 | # 1176 | # If you prefer a Google search form, here's an example that should just work: 1177 | # SEARCH_FORM = """ 1178 | # 1179 | # 1188 | # 1189 | # """ % SITE_URL 1190 | 1191 | # Use content distribution networks for jQuery, twitter-bootstrap css and js, 1192 | # and html5shiv (for older versions of Internet Explorer) 1193 | # If this is True, jQuery and html5shiv are served from the Google CDN and 1194 | # Bootstrap is served from BootstrapCDN (provided by MaxCDN) 1195 | # Set this to False if you want to host your site without requiring access to 1196 | # external resources. 1197 | # USE_CDN = False 1198 | 1199 | # Check for USE_CDN compatibility. 1200 | # If you are using custom themes, have configured the CSS properly and are 1201 | # receiving warnings about incompatibility but believe they are incorrect, you 1202 | # can set this to False. 1203 | # USE_CDN_WARNING = True 1204 | 1205 | # Extra things you want in the pages HEAD tag. This will be added right 1206 | # before 1207 | # (translatable) 1208 | EXTRA_HEAD_DATA = """\ 1209 | 1210 | """ 1211 | # Google Analytics or whatever else you use. Added to the bottom of 1212 | # in the default template (base.tmpl). 1213 | # (translatable) 1214 | # BODY_END = "" 1215 | 1216 | # The possibility to extract metadata from the filename by using a 1217 | # regular expression. 1218 | # To make it work you need to name parts of your regular expression. 1219 | # The following names will be used to extract metadata: 1220 | # - title 1221 | # - slug 1222 | # - date 1223 | # - tags 1224 | # - link 1225 | # - description 1226 | # 1227 | # An example re is the following: 1228 | # '.*\/(?P\d{4}-\d{2}-\d{2})-(?P.*)-(?P.*)\.rst' 1229 | # (Note the '.*\/' in the beginning -- matches source paths relative to conf.py) 1230 | # FILE_METADATA_REGEXP = None 1231 | 1232 | # Should titles fetched from file metadata be unslugified (made prettier?) 1233 | # FILE_METADATA_UNSLUGIFY_TITLES = True 1234 | 1235 | # If enabled, extract metadata from docinfo fields in reST documents. 1236 | # If your text files start with a level 1 heading, it will be treated as the 1237 | # document title and will be removed from the text. 1238 | # USE_REST_DOCINFO_METADATA = False 1239 | 1240 | # If enabled, hide docinfo fields in reST document output 1241 | # HIDE_REST_DOCINFO = False 1242 | 1243 | # Map metadata from other formats to Nikola names. 1244 | # Supported formats: yaml, toml, rest_docinfo, markdown_metadata 1245 | # METADATA_MAPPING = {} 1246 | # 1247 | # Example for Pelican compatibility: 1248 | # METADATA_MAPPING = { 1249 | # "rest_docinfo": {"summary": "description", "modified": "updated"}, 1250 | # "markdown_metadata": {"summary": "description", "modified": "updated"} 1251 | # } 1252 | # Other examples: https://getnikola.com/handbook.html#mapping-metadata-from-other-formats 1253 | 1254 | # Map metadata between types/values. (Runs after METADATA_MAPPING.) 1255 | # Supported formats: nikola, yaml, toml, rest_docinfo, markdown_metadata 1256 | # The value on the right should be a dict of callables. 1257 | # METADATA_VALUE_MAPPING = {} 1258 | # Examples: 1259 | # METADATA_VALUE_MAPPING = { 1260 | # "yaml": {"keywords": lambda value: ', '.join(value)}, # yaml: 'keywords' list -> str 1261 | # "nikola": { 1262 | # "widgets": lambda value: value.split(', '), # nikola: 'widgets' comma-separated string -> list 1263 | # "tags": str.lower # nikola: force lowercase 'tags' (input would be string) 1264 | # } 1265 | # } 1266 | 1267 | # Additional metadata that is added to a post when creating a new_post 1268 | # ADDITIONAL_METADATA = {} 1269 | 1270 | # Nikola supports Twitter Card summaries, but they are disabled by default. 1271 | # They make it possible for you to attach media to Tweets that link 1272 | # to your content. 1273 | # 1274 | # Uncomment and modify to following lines to match your accounts. 1275 | # Images displayed come from the `previewimage` meta tag. 1276 | # You can specify the card type by using the `card` parameter in TWITTER_CARD. 1277 | # TWITTER_CARD = { 1278 | # # 'use_twitter_cards': True, # enable Twitter Cards 1279 | # # 'card': 'summary', # Card type, you can also use 'summary_large_image', 1280 | # # see https://dev.twitter.com/cards/types 1281 | # # 'site': '@website', # twitter nick for the website 1282 | # # 'creator': '@username', # Username for the content creator / author. 1283 | # } 1284 | 1285 | # Bundle JS and CSS into single files to make site loading faster in a HTTP/1.1 1286 | # environment but is not recommended for HTTP/2.0 when caching is used. 1287 | # Defaults to True. 1288 | # USE_BUNDLES = True 1289 | 1290 | # Plugins you don't want to use. Be careful :-) 1291 | # DISABLED_PLUGINS = ["render_galleries"] 1292 | 1293 | # Special settings to disable only parts of the indexes plugin. 1294 | # Use with care. 1295 | # DISABLE_INDEXES = False 1296 | # DISABLE_MAIN_ATOM_FEED = False 1297 | # DISABLE_MAIN_RSS_FEED = False 1298 | 1299 | # Add the absolute paths to directories containing plugins to use them. 1300 | # For example, the `plugins` directory of your clone of the Nikola plugins 1301 | # repository. 1302 | # EXTRA_PLUGINS_DIRS = [] 1303 | 1304 | # Add the absolute paths to directories containing themes to use them. 1305 | # For example, the `v7` directory of your clone of the Nikola themes 1306 | # repository. 1307 | # EXTRA_THEMES_DIRS = [] 1308 | 1309 | # List of regular expressions, links matching them will always be considered 1310 | # valid by "nikola check -l" 1311 | # LINK_CHECK_WHITELIST = [] 1312 | 1313 | # If set to True, enable optional hyphenation in your posts (requires pyphen) 1314 | # Enabling hyphenation has been shown to break math support in some cases, 1315 | # use with caution. 1316 | # HYPHENATE = False 1317 | 1318 | # The <hN> tags in HTML generated by certain compilers (reST/Markdown) 1319 | # will be demoted by that much (1 → h1 will become h2 and so on) 1320 | # This was a hidden feature of the Markdown and reST compilers in the 1321 | # past. Useful especially if your post titles are in <h1> tags too, for 1322 | # example. 1323 | # (defaults to 1.) 1324 | # DEMOTE_HEADERS = 1 1325 | 1326 | # If you don’t like slugified file names ([a-z0-9] and a literal dash), 1327 | # and would prefer to use all the characters your file system allows. 1328 | # USE WITH CARE! This is also not guaranteed to be perfect, and may 1329 | # sometimes crash Nikola, your web server, or eat your cat. 1330 | # USE_SLUGIFY = True 1331 | 1332 | # If set to True, the tags 'draft', 'mathjax' and 'private' have special 1333 | # meaning. If set to False, these tags are handled like regular tags. 1334 | USE_TAG_METADATA = False 1335 | 1336 | # If set to True, a warning is issued if one of the 'draft', 'mathjax' 1337 | # and 'private' tags are found in a post. Useful for checking that 1338 | # migration was successful. 1339 | WARN_ABOUT_TAG_METADATA = False 1340 | 1341 | # Templates will use those filters, along with the defaults. 1342 | # Consult your engine's documentation on filters if you need help defining 1343 | # those. 1344 | # TEMPLATE_FILTERS = {} 1345 | 1346 | # Put in global_context things you want available on all your templates. 1347 | # It can be anything, data, functions, modules, etc. 1348 | GLOBAL_CONTEXT = {} 1349 | 1350 | # Add functions here and they will be called with template 1351 | # GLOBAL_CONTEXT as parameter when the template is about to be 1352 | # rendered 1353 | GLOBAL_CONTEXT_FILLER = [] 1354 | -------------------------------------------------------------------------------- /files/admin/config.yml: -------------------------------------------------------------------------------- 1 | backend: 2 | name: git-gateway 3 | branch: master 4 | display_url: https://example.com 5 | media_folder: "images/uploads" 6 | public_folder: "/images/uploads" 7 | collections: 8 | - name: "posts" # Used in routes, e.g., /admin/collections/blog 9 | label: "Posts" # Used in the UI 10 | label_singular: "Post" 11 | description: > 12 | Posts (blog entries), visible in indexes and RSS feeds. 13 | folder: "posts" # The path to the folder where the documents are stored 14 | create: true # Allow users to create new documents in this collection 15 | format: "yaml-frontmatter" 16 | slug: "{{slug}}" # Filename template, e.g., YYYY-MM-DD-title.md 17 | fields: # The fields for each document, usually in front matter 18 | - {label: "Title", name: "title", widget: "string"} 19 | - {label: "Author", name: "author", widget: "string", required: false} 20 | - {label: "Date", name: "date", widget: "datetime"} 21 | - {label: "Updated", name: "updated", widget: "datetime", required: false} 22 | - {label: "Status", name: "status", widget: "select", options: ["published", "featured", "draft", "private"], required: false} 23 | - {label: "Tags", name: "tags", widget: "list", required: false} 24 | - {label: "Category", name: "category", widget: "string", required: false} 25 | - {label: "Description", name: "description", widget: "string", required: false} 26 | - {label: "Featured Image", name: "previewimage", widget: "image", required: false} 27 | - {label: "Body", name: "body", widget: "markdown"} 28 | - name: "pages" # Used in routes, e.g., /admin/collections/blog 29 | label: "Pages" # Used in the UI 30 | label_singular: "Page" 31 | description: > 32 | Pages (stories), used to display information outside of indexes/feeds. 33 | Great for an “About me” page, for example. 34 | folder: "pages" # The path to the folder where the documents are stored 35 | create: true # Allow users to create new documents in this collection 36 | format: "yaml-frontmatter" 37 | slug: "{{slug}}" # Filename template, e.g., YYYY-MM-DD-title.md 38 | fields: # The fields for each document, usually in front matter 39 | - {label: "Title", name: "title", widget: "string"} 40 | - {label: "Author", name: "author", widget: "string", required: false} 41 | - {label: "Date", name: "date", widget: "datetime"} 42 | - {label: "Updated", name: "updated", widget: "datetime", required: false} 43 | - {label: "Status", name: "status", widget: "select", options: ["published", "featured", "draft", "private"], required: false} 44 | - {label: "Tags", name: "tags", widget: "list", required: false} 45 | - {label: "Category", name: "category", widget: "string", required: false} 46 | - {label: "Description", name: "description", widget: "string", required: false} 47 | - {label: "Featured Image", name: "previewimage", widget: "image", required: false} 48 | - {label: "Body", name: "body", widget: "markdown"} 49 | -------------------------------------------------------------------------------- /files/admin/index.html: -------------------------------------------------------------------------------- 1 | <!doctype html> 2 | <html> 3 | <head> 4 | <meta charset="utf-8" /> 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 | <title>Content Manager 7 | 8 | 9 | 10 | 11 | 12 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | base = "" 3 | publish = "output" 4 | command = "nikola build" 5 | -------------------------------------------------------------------------------- /posts/your-first-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Your First Post 3 | slug: your-first-post 4 | date: 2016-08-29 15:29:40 UTC 5 | --- 6 | Write your post here. 7 | -------------------------------------------------------------------------------- /requirements.in: -------------------------------------------------------------------------------- 1 | Nikola[extras] 2 | ruamel.yaml 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.11 3 | # by the following command: 4 | # 5 | # pip-compile 6 | # 7 | aiohappyeyeballs==2.3.5 8 | # via aiohttp 9 | aiohttp==3.10.11 10 | # via nikola 11 | aiosignal==1.3.1 12 | # via aiohttp 13 | anyio==4.2.0 14 | # via 15 | # httpx 16 | # jupyter-server 17 | argon2-cffi==23.1.0 18 | # via jupyter-server 19 | argon2-cffi-bindings==21.2.0 20 | # via argon2-cffi 21 | arrow==1.3.0 22 | # via isoduration 23 | asttokens==2.4.1 24 | # via stack-data 25 | async-lru==2.0.4 26 | # via jupyterlab 27 | attrs==23.2.0 28 | # via 29 | # aiohttp 30 | # jsonschema 31 | # referencing 32 | babel==2.14.0 33 | # via 34 | # jupyterlab-server 35 | # nikola 36 | beautifulsoup4==4.12.3 37 | # via nbconvert 38 | bleach==6.1.0 39 | # via nbconvert 40 | blinker==1.7.0 41 | # via nikola 42 | certifi==2024.7.4 43 | # via 44 | # httpcore 45 | # httpx 46 | # requests 47 | cffi==1.16.0 48 | # via argon2-cffi-bindings 49 | charset-normalizer==3.3.2 50 | # via requests 51 | cloudpickle==3.0.0 52 | # via doit 53 | comm==0.2.1 54 | # via ipykernel 55 | debugpy==1.8.0 56 | # via ipykernel 57 | decorator==5.1.1 58 | # via ipython 59 | defusedxml==0.7.1 60 | # via nbconvert 61 | docutils==0.20.1 62 | # via nikola 63 | doit==0.36.0 64 | # via nikola 65 | executing==2.0.1 66 | # via stack-data 67 | fastjsonschema==2.19.1 68 | # via nbformat 69 | fqdn==1.5.1 70 | # via jsonschema 71 | frozenlist==1.4.1 72 | # via 73 | # aiohttp 74 | # aiosignal 75 | ghp-import==2.1.0 76 | # via nikola 77 | h11==0.14.0 78 | # via httpcore 79 | hsluv==5.0.4 80 | # via nikola 81 | html5lib==1.1 82 | # via nikola 83 | httpcore==1.0.5 84 | # via httpx 85 | httpx==0.27.2 86 | # via jupyterlab 87 | idna==3.7 88 | # via 89 | # anyio 90 | # httpx 91 | # jsonschema 92 | # requests 93 | # yarl 94 | importlib-metadata==7.0.1 95 | # via 96 | # doit 97 | # pygal 98 | ipykernel==6.29.0 99 | # via 100 | # jupyterlab 101 | # nikola 102 | ipython==8.20.0 103 | # via ipykernel 104 | isoduration==20.11.0 105 | # via jsonschema 106 | jedi==0.19.1 107 | # via ipython 108 | jinja2==3.1.6 109 | # via 110 | # jupyter-server 111 | # jupyterlab 112 | # jupyterlab-server 113 | # nbconvert 114 | # nikola 115 | json5==0.9.14 116 | # via jupyterlab-server 117 | jsonpointer==2.4 118 | # via jsonschema 119 | jsonschema[format-nongpl]==4.21.1 120 | # via 121 | # jupyter-events 122 | # jupyterlab-server 123 | # nbformat 124 | jsonschema-specifications==2023.12.1 125 | # via jsonschema 126 | jupyter-client==8.6.0 127 | # via 128 | # ipykernel 129 | # jupyter-server 130 | # nbclient 131 | jupyter-core==5.7.1 132 | # via 133 | # ipykernel 134 | # jupyter-client 135 | # jupyter-server 136 | # jupyterlab 137 | # nbclient 138 | # nbconvert 139 | # nbformat 140 | jupyter-events==0.9.0 141 | # via jupyter-server 142 | jupyter-lsp==2.2.2 143 | # via jupyterlab 144 | jupyter-server==2.12.5 145 | # via 146 | # jupyter-lsp 147 | # jupyterlab 148 | # jupyterlab-server 149 | # notebook 150 | # notebook-shim 151 | jupyter-server-terminals==0.5.1 152 | # via jupyter-server 153 | jupyterlab==4.2.5 154 | # via notebook 155 | jupyterlab-pygments==0.3.0 156 | # via nbconvert 157 | jupyterlab-server==2.27.3 158 | # via 159 | # jupyterlab 160 | # notebook 161 | lxml==5.1.0 162 | # via nikola 163 | mako==1.3.0 164 | # via nikola 165 | markdown==3.5.2 166 | # via nikola 167 | markupsafe==2.1.3 168 | # via 169 | # jinja2 170 | # mako 171 | # nbconvert 172 | matplotlib-inline==0.1.6 173 | # via 174 | # ipykernel 175 | # ipython 176 | micawber==0.5.5 177 | # via nikola 178 | mistune==3.0.2 179 | # via nbconvert 180 | multidict==6.0.4 181 | # via 182 | # aiohttp 183 | # yarl 184 | natsort==8.4.0 185 | # via nikola 186 | nbclient==0.9.0 187 | # via nbconvert 188 | nbconvert==7.14.2 189 | # via jupyter-server 190 | nbformat==5.9.2 191 | # via 192 | # jupyter-server 193 | # nbclient 194 | # nbconvert 195 | nest-asyncio==1.5.9 196 | # via ipykernel 197 | nikola[extras]==8.3.0 198 | # via -r requirements.in 199 | notebook==7.2.2 200 | # via nikola 201 | notebook-shim==0.2.3 202 | # via 203 | # jupyterlab 204 | # notebook 205 | overrides==7.4.0 206 | # via jupyter-server 207 | packaging==23.2 208 | # via 209 | # ipykernel 210 | # jupyter-server 211 | # jupyterlab 212 | # jupyterlab-server 213 | # nbconvert 214 | pandocfilters==1.5.1 215 | # via nbconvert 216 | parso==0.8.3 217 | # via jedi 218 | pexpect==4.9.0 219 | # via ipython 220 | phpserialize==1.3 221 | # via nikola 222 | piexif==1.1.3 223 | # via nikola 224 | pillow==10.3.0 225 | # via nikola 226 | platformdirs==4.1.0 227 | # via jupyter-core 228 | prometheus-client==0.19.0 229 | # via jupyter-server 230 | prompt-toolkit==3.0.43 231 | # via ipython 232 | propcache==0.2.0 233 | # via yarl 234 | psutil==5.9.8 235 | # via ipykernel 236 | ptyprocess==0.7.0 237 | # via 238 | # pexpect 239 | # terminado 240 | pure-eval==0.2.2 241 | # via stack-data 242 | pycparser==2.21 243 | # via cffi 244 | pygal==3.0.4 245 | # via nikola 246 | pygments==2.17.2 247 | # via 248 | # ipython 249 | # nbconvert 250 | # nikola 251 | pyphen==0.14.0 252 | # via nikola 253 | pyrss2gen==1.1 254 | # via nikola 255 | python-dateutil==2.8.2 256 | # via 257 | # arrow 258 | # ghp-import 259 | # jupyter-client 260 | # nikola 261 | python-json-logger==2.0.7 262 | # via jupyter-events 263 | pyyaml==6.0.1 264 | # via jupyter-events 265 | pyzmq==25.1.2 266 | # via 267 | # ipykernel 268 | # jupyter-client 269 | # jupyter-server 270 | referencing==0.32.1 271 | # via 272 | # jsonschema 273 | # jsonschema-specifications 274 | # jupyter-events 275 | requests==2.32.0 276 | # via 277 | # jupyterlab-server 278 | # nikola 279 | rfc3339-validator==0.1.4 280 | # via 281 | # jsonschema 282 | # jupyter-events 283 | rfc3986-validator==0.1.1 284 | # via 285 | # jsonschema 286 | # jupyter-events 287 | rpds-py==0.17.1 288 | # via 289 | # jsonschema 290 | # referencing 291 | ruamel-yaml==0.18.5 292 | # via 293 | # -r requirements.in 294 | # nikola 295 | ruamel-yaml-clib==0.2.8 296 | # via ruamel-yaml 297 | send2trash==1.8.2 298 | # via jupyter-server 299 | six==1.16.0 300 | # via 301 | # asttokens 302 | # bleach 303 | # html5lib 304 | # python-dateutil 305 | # rfc3339-validator 306 | smartypants==2.0.1 307 | # via typogrify 308 | sniffio==1.3.0 309 | # via 310 | # anyio 311 | # httpx 312 | soupsieve==2.5 313 | # via beautifulsoup4 314 | stack-data==0.6.3 315 | # via ipython 316 | terminado==0.18.0 317 | # via 318 | # jupyter-server 319 | # jupyter-server-terminals 320 | tinycss2==1.2.1 321 | # via nbconvert 322 | toml==0.10.2 323 | # via nikola 324 | tornado==6.5.1 325 | # via 326 | # ipykernel 327 | # jupyter-client 328 | # jupyter-server 329 | # jupyterlab 330 | # notebook 331 | # terminado 332 | traitlets==5.14.1 333 | # via 334 | # comm 335 | # ipykernel 336 | # ipython 337 | # jupyter-client 338 | # jupyter-core 339 | # jupyter-events 340 | # jupyter-server 341 | # jupyterlab 342 | # matplotlib-inline 343 | # nbclient 344 | # nbconvert 345 | # nbformat 346 | types-python-dateutil==2.8.19.20240106 347 | # via arrow 348 | typogrify==2.0.7 349 | # via nikola 350 | unidecode==1.3.8 351 | # via nikola 352 | uri-template==1.3.0 353 | # via jsonschema 354 | urllib3==2.2.2 355 | # via requests 356 | watchdog==3.0.0 357 | # via nikola 358 | wcwidth==0.2.13 359 | # via prompt-toolkit 360 | webcolors==1.13 361 | # via jsonschema 362 | webencodings==0.5.1 363 | # via 364 | # bleach 365 | # html5lib 366 | # tinycss2 367 | websocket-client==1.7.0 368 | # via jupyter-server 369 | yarl==1.17.2 370 | # via aiohttp 371 | zipp==3.19.1 372 | # via importlib-metadata 373 | 374 | # The following packages are considered to be unsafe in a requirements file: 375 | # setuptools 376 | -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | 3.8 2 | --------------------------------------------------------------------------------