From 3b75097fed2bb8a3a10dce9665f51b99abf93df1 Mon Sep 17 00:00:00 2001 From: NN Solex Date: Sun, 30 Apr 2023 14:08:32 +0300 Subject: [PATCH] init --- web/Makefile | 89 ++ web/__pycache__/pelicanconf.cpython-310.pyc | Bin 0 -> 1502 bytes web/content/pages/404.md | 5 + web/content/pages/home.md | 4 + web/content/tags/ein_hod_01.md | 7 + web/nfc-theme/LICENSE | 14 + web/nfc-theme/Makefile | 16 + web/nfc-theme/README.txt | 28 + web/nfc-theme/static/DavidLibre-Regular.ttf | Bin 0 -> 107772 bytes web/nfc-theme/static/geo.js | 10 + web/nfc-theme/static/local.css | 144 ++ web/nfc-theme/static/platform.js | 1260 +++++++++++++++++ web/nfc-theme/templates/404.html | 39 + web/nfc-theme/templates/archives.html | 1 + web/nfc-theme/templates/article.html | 13 + web/nfc-theme/templates/author.html | 1 + web/nfc-theme/templates/authors.html | 13 + web/nfc-theme/templates/base.html | 23 + web/nfc-theme/templates/categories.html | 8 + web/nfc-theme/templates/category.html | 5 + web/nfc-theme/templates/gosquared.html | 14 + web/nfc-theme/templates/index.html | 21 + web/nfc-theme/templates/page.html | 15 + web/nfc-theme/templates/pagination.html | 11 + web/nfc-theme/templates/period_archives.html | 11 + web/nfc-theme/templates/tag.html | 0 web/nfc-theme/templates/tags.html | 10 + web/nfc-theme/templates/translations.html | 8 + web/output/404.html | 39 + web/output/e8229.html | 21 + web/output/index.html | 18 + .../projects/blue-eyed-donkey/index.html | 27 + web/output/projects/index.html | 16 + web/output/tags/index.html | 26 + web/output/theme/DavidLibre-Regular.ttf | Bin 0 -> 107772 bytes web/output/theme/geo.js | 10 + web/output/theme/local.css | 144 ++ web/output/theme/platform.js | 1260 +++++++++++++++++ web/pelicanconf.py | 59 + web/plugins/geohash/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 169 bytes .../__pycache__/geohash.cpython-310.pyc | Bin 0 -> 861 bytes web/plugins/geohash/geohash.py | 12 + web/publishconf.py | 21 + web/tasks.py | 143 ++ 45 files changed, 3567 insertions(+) create mode 100644 web/Makefile create mode 100644 web/__pycache__/pelicanconf.cpython-310.pyc create mode 100644 web/content/pages/404.md create mode 100644 web/content/pages/home.md create mode 100644 web/content/tags/ein_hod_01.md create mode 100644 web/nfc-theme/LICENSE create mode 100644 web/nfc-theme/Makefile create mode 100644 web/nfc-theme/README.txt create mode 100644 web/nfc-theme/static/DavidLibre-Regular.ttf create mode 100644 web/nfc-theme/static/geo.js create mode 100644 web/nfc-theme/static/local.css create mode 100644 web/nfc-theme/static/platform.js create mode 100644 web/nfc-theme/templates/404.html create mode 100644 web/nfc-theme/templates/archives.html create mode 100644 web/nfc-theme/templates/article.html create mode 100644 web/nfc-theme/templates/author.html create mode 100644 web/nfc-theme/templates/authors.html create mode 100644 web/nfc-theme/templates/base.html create mode 100644 web/nfc-theme/templates/categories.html create mode 100644 web/nfc-theme/templates/category.html create mode 100644 web/nfc-theme/templates/gosquared.html create mode 100644 web/nfc-theme/templates/index.html create mode 100644 web/nfc-theme/templates/page.html create mode 100644 web/nfc-theme/templates/pagination.html create mode 100644 web/nfc-theme/templates/period_archives.html create mode 100644 web/nfc-theme/templates/tag.html create mode 100644 web/nfc-theme/templates/tags.html create mode 100644 web/nfc-theme/templates/translations.html create mode 100644 web/output/404.html create mode 100644 web/output/e8229.html create mode 100644 web/output/index.html create mode 100644 web/output/projects/blue-eyed-donkey/index.html create mode 100644 web/output/projects/index.html create mode 100644 web/output/tags/index.html create mode 100644 web/output/theme/DavidLibre-Regular.ttf create mode 100644 web/output/theme/geo.js create mode 100644 web/output/theme/local.css create mode 100644 web/output/theme/platform.js create mode 100644 web/pelicanconf.py create mode 100644 web/plugins/geohash/__init__.py create mode 100644 web/plugins/geohash/__pycache__/__init__.cpython-310.pyc create mode 100644 web/plugins/geohash/__pycache__/geohash.cpython-310.pyc create mode 100644 web/plugins/geohash/geohash.py create mode 100644 web/publishconf.py create mode 100644 web/tasks.py diff --git a/web/Makefile b/web/Makefile new file mode 100644 index 0000000..f41f7a4 --- /dev/null +++ b/web/Makefile @@ -0,0 +1,89 @@ +PY?= +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)/output +CONFFILE=$(BASEDIR)/pelicanconf.py +PUBLISHCONF=$(BASEDIR)/publishconf.py + +SSH_HOST=localhost +SSH_PORT=22 +SSH_USER=root +SSH_TARGET_DIR=/var/www + + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + PELICANOPTS += -D +endif + +RELATIVE ?= 0 +ifeq ($(RELATIVE), 1) + PELICANOPTS += --relative-urls +endif + +SERVER ?= "0.0.0.0" + +PORT ?= 0 +ifneq ($(PORT), 0) + PELICANOPTS += -p $(PORT) +endif + + +help: + @echo 'Makefile for a pelican Web site ' + @echo ' ' + @echo 'Usage: ' + @echo ' make html (re)generate the web site ' + @echo ' make clean remove the generated files ' + @echo ' make regenerate regenerate files upon modification ' + @echo ' make publish generate using production settings ' + @echo ' make serve [PORT=8000] serve site at http://localhost:8000' + @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' + @echo ' make devserver [PORT=8000] serve and regenerate together ' + @echo ' make devserver-global regenerate and serve on 0.0.0.0 ' + @echo ' make ssh_upload upload the web site via SSH ' + @echo ' make sftp_upload upload the web site via SFTP ' + @echo ' make rsync_upload upload the web site via rsync+ssh ' + @echo ' ' + @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' + @echo 'Set the RELATIVE variable to 1 to enable relative urls ' + @echo ' ' + +html: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +clean: + [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)" + +regenerate: + "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve-global: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER) + +devserver: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +devserver-global: + $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -b 0.0.0.0 + +publish: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS) + +ssh_upload: publish + scp -P $(SSH_PORT) -r "$(OUTPUTDIR)"/* "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + +sftp_upload: publish + printf 'put -r $(OUTPUTDIR)/*' | sftp $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) + +rsync_upload: publish + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + + +.PHONY: html help clean regenerate serve serve-global devserver publish ssh_upload rsync_upload \ No newline at end of file diff --git a/web/__pycache__/pelicanconf.cpython-310.pyc b/web/__pycache__/pelicanconf.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c383d5c4078068dcdf7d5378be0cb08f53b21df8 GIT binary patch literal 1502 zcmd1j<>g{vU|_gz>6g;T%E0g##6iZa3=9ko3=9m#I~W)kQW#Pga~N_NqnH>O+!<1s zQkYv9QkYYjvY4BhqgYZ|QkmjeQ&^(dQdpwcQ&^)oQrOZNqc~I8qqtHyqPSByqj*v{ zqj*y|qxe!dqxe%eqXbg8q6Aa8GZ{cIg=Y?PCS#OP3U8Ef3U8E13SX3H3V)PX3V)P% z3V)PD3V)Pjia?Z9ieNfplyr(vI%AYf3PY4^ig1)%ib#}vifEKVidd9lidd9Vig=WA zibOhNlu8O`FoUM#OOT&58E^3?<>V)47Zl|urxq9I7ZoRi#E~%*%)cTG3=F9ZQH&`J zQA{a}DNHR4QOqgK!3>%#w|M;W10W`3=A|byBWVY*85tNDoIxSR0tzw4Uq!{PH|KxNNarNn%n?YH^h;Ho3I?{F1!-2IYvoE zRovCZIi=~fdKo3TIaT~6iRs1qnRzLx6<~o|47b>m^YcnTfzJYxyTw|Nn4Vf(#i1Ih ztD38;nsSS|Br&~8xBwanNP4TJ;DQhp~ zoIq&~nqu;cAOR^FoLZ7vQR0!Bn37rqm%GL07#iZ?A9RZ&*fYe{&(YWQ7Hf!ytFP-V zo&cXvcTd0g0LKuI;9DFap1!V8{(i2vcwAiF97BCV;(Z+b+;8!^xw^Wq$Dj~TXCK%2&>){%{4h?iW0-5aWAH6rPd^vehzK$Wc1Ym-&u!@3(nkSO;cwn+%?+L(pQ0LwfcX9P` z4RMY44-E+j4T*R0403f2@ehi;#SV$LV5Iy7%27q2Om>UI29ho9KxIa;9|Hpe52Fwx x8#45DMEPq-4vv9!0!E$VjY>W_nP;n+MCIG6_pp*ar literal 0 HcmV?d00001 diff --git a/web/content/pages/404.md b/web/content/pages/404.md new file mode 100644 index 0000000..bd49d01 --- /dev/null +++ b/web/content/pages/404.md @@ -0,0 +1,5 @@ +Title: 404 +Save_as: 404.html +Template: 404 + +The page could not be found \ No newline at end of file diff --git a/web/content/pages/home.md b/web/content/pages/home.md new file mode 100644 index 0000000..9ca25eb --- /dev/null +++ b/web/content/pages/home.md @@ -0,0 +1,4 @@ +Title: +URL: +Save_as: index.html + diff --git a/web/content/tags/ein_hod_01.md b/web/content/tags/ein_hod_01.md new file mode 100644 index 0000000..506fd96 --- /dev/null +++ b/web/content/tags/ein_hod_01.md @@ -0,0 +1,7 @@ +Slug: e8229 +Date: 2023-04-12 +Category: Blue Eyed Donkey +Title: Entry 1 +Location: 32.70124169424201, 34.9805500394171 + +I noticed a peculiar sensation in the air as soon as I arrived in town. It was as if an electric charge was coursing through the air beneath the pastoral tranquillity, making me nervous. I looked around, but there was no one to be found. The faint odor of decay lingered around me, mingled with the sweet fragrance of incense. The mix made me feel uneasy, like if I'd stepped into a strange, surreal dream. \ No newline at end of file diff --git a/web/nfc-theme/LICENSE b/web/nfc-theme/LICENSE new file mode 100644 index 0000000..e7015e6 --- /dev/null +++ b/web/nfc-theme/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015 Michael Cardell Widerkrantz + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/web/nfc-theme/Makefile b/web/nfc-theme/Makefile new file mode 100644 index 0000000..b059125 --- /dev/null +++ b/web/nfc-theme/Makefile @@ -0,0 +1,16 @@ +VERSION=20150208 +DIST=mc-pelican-$(VERSION) +DISTFILES=README.txt LICENSE Makefile static templates + +$(DIST).tar.bz2: + mkdir $(DIST) + cp -r $(DISTFILES) $(DIST)/ + tar cf $(DIST).tar --exclude .git $(DIST) + bzip2 -9 $(DIST).tar + $(RM) -rf $(DIST) + +dist: $(DIST).tar.bz2 + +clean: + $(RM) -f $(DIST).tar.bz2 + diff --git a/web/nfc-theme/README.txt b/web/nfc-theme/README.txt new file mode 100644 index 0000000..6b836c5 --- /dev/null +++ b/web/nfc-theme/README.txt @@ -0,0 +1,28 @@ +A minimalist theme for the Pelican static blog generator: + + http://blog.getpelican.com/ + +It's based on the built-in simple theme with some small changes to the +templates and some very minimalist CSS. + +Install like this: + + # pelican-themes -i mc-pelican + +Then, in your pelicanconf.py: + + THEME = 'mc-pelican' + +You add menu items with MENUITEMS like this: + +MENUITEMS = ( + ('Homepage', '/mc/'), + ('About MC', '/mc/bio.html'), + ('Contact', '/mc/contact.html'), + ('Archives', '{0}/archives.html'.format(SITEURL)), ) + +If you want a blog description in the footer of all pages, define +DESCRIPTION. + +Happy blogging, +MC. diff --git a/web/nfc-theme/static/DavidLibre-Regular.ttf b/web/nfc-theme/static/DavidLibre-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cf23de8b33084422cc349f4c6596b84fb89c283c GIT binary patch literal 107772 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

GqN+CWuCwYYPW;V^#kv&W?*EP$W+Og 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,qlrMz7J1B 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 -1; +const ios = ua.indexOf("ios") > -1; +const windows = ua.indexOf("windows") > -1; +const linux = ua.indexOf("linux") > -1; +const mac = ua.indexOf("macos") > -1; +var hashlink = document.querySelector(".geo a"); +if ( windows || mac || linux ) hashlink.href = "https://maps.google.com/?q=" + hashlink.getAttribute("latlon"); +else if ( android ) hashlink.href = "geo:0,0?q=" + hashlink.getAttribute("latlon"); +else if ( ios ) hashlink.href = "http://maps.apple.com/?ll=" + hashlink.getAttribute("latlon") + "&q=" + hashlink.innerHTML; \ No newline at end of file diff --git a/web/nfc-theme/static/local.css b/web/nfc-theme/static/local.css new file mode 100644 index 0000000..44b6995 --- /dev/null +++ b/web/nfc-theme/static/local.css @@ -0,0 +1,144 @@ +@font-face { + font-family: 'David Libre'; + src: local('David Libre'), local('DavidLibre'), + url('DavidLibre-Regular.ttf') format('ttf') +} + +/* CSS Reset */ +html { + margin: 0; + padding: 0; + text-align: left; + text-rendering: optimizeLegibility; +} + +/* HTML5 tag defaults. */ +header, footer, aside, nav, article +{ + display: block; +} + +h1, h2, h3, h4, h5 { + margin-block-start: 0; + font-weight: normal; + text-align: left; + font-size: 1em; +} + +body { + font-family: 'David Libre'; + padding: 1em; + font-size: 1.4em; + line-height: 1.2em; + text-align: left; + color: #090A0E; + height: 100vh; + overflow-x: hidden; + overflow-y: hidden; + margin: auto; + max-width: 40em; +} + +p { + margin-block-start: 0; +} + +ul, ul li { + margin:0; + padding:0; + list-style:none +} + +ul li::before { + content: '*\00a0'; +} + +/* Use a thin border around all images. */ +img +{ + border: 1px solid; + max-width: 40em; + width: 100%; +} + +/* Navigation bar. */ +nav +{ + padding-bottom: 1ex; + margin-bottom: 4em; +} + +nav::after { + clear:left; +} + +nav ul +{ + padding: 0; + margin-left: 0; + list-style: none; +} + +nav ul li +{ + display: inline; + float: left; + margin-right: .4em; /* How far between items. */ + margin-top: .3em; +} + +nav li::before { + content: none; +} + +nav ul li a +{ + display: inline; + margin: 0; +} + +/* + * Use a border around tables, but don't draw lines around individual + * cells. + */ +table +{ + border-style: solid; + border-collapse: collapse; + border-width: thin; + font-size: 100%; +} + +th, td +{ + border-style: solid; + border-width: thin; +} + +a { + border-bottom: 1px solid #090A0E; +} + +/* for unvisited links: blue */ +a:link +{ + text-decoration: none; +} + +/* for visited links: purple */ +a:visited +{ + text-decoration: none; +} + +/* when mouse is over link or the link is active*/ +a:hover, a:active +{ + text-decoration: none; +} + +blockquote { + border: 1px solid; + margin: 0; + padding-left: 1em; +} \ No newline at end of file diff --git a/web/nfc-theme/static/platform.js b/web/nfc-theme/static/platform.js new file mode 100644 index 0000000..0f2a9ad --- /dev/null +++ b/web/nfc-theme/static/platform.js @@ -0,0 +1,1260 @@ +/*! + * Platform.js + * Copyright 2014-2020 Benjamin Tan + * Copyright 2011-2013 John-David Dalton + * Available under MIT license + */ +;(function() { + 'use strict'; + + /** Used to determine if values are of the language type `Object`. */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used as a reference to the global object. */ + var root = (objectTypes[typeof window] && window) || this; + + /** Backup possible global object. */ + var oldRoot = root; + + /** Detect free variable `exports`. */ + var freeExports = objectTypes[typeof exports] && exports; + + /** Detect free variable `module`. */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { + root = freeGlobal; + } + + /** + * Used as the maximum length of an array-like object. + * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength) + * for more details. + */ + var maxSafeInteger = Math.pow(2, 53) - 1; + + /** Regular expression to detect Opera. */ + var reOpera = /\bOpera/; + + /** Possible global object. */ + var thisBinding = this; + + /** Used for native method references. */ + var objectProto = Object.prototype; + + /** Used to check for own properties of an object. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to resolve the internal `[[Class]]` of values. */ + var toString = objectProto.toString; + + /*--------------------------------------------------------------------------*/ + + /** + * Capitalizes a string value. + * + * @private + * @param {string} string The string to capitalize. + * @returns {string} The capitalized string. + */ + function capitalize(string) { + string = String(string); + return string.charAt(0).toUpperCase() + string.slice(1); + } + + /** + * A utility function to clean up the OS name. + * + * @private + * @param {string} os The OS name to clean up. + * @param {string} [pattern] A `RegExp` pattern matching the OS name. + * @param {string} [label] A label for the OS. + */ + function cleanupOS(os, pattern, label) { + // Platform tokens are defined at: + // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx + // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx + var data = { + '10.0': '10', + '6.4': '10 Technical Preview', + '6.3': '8.1', + '6.2': '8', + '6.1': 'Server 2008 R2 / 7', + '6.0': 'Server 2008 / Vista', + '5.2': 'Server 2003 / XP 64-bit', + '5.1': 'XP', + '5.01': '2000 SP1', + '5.0': '2000', + '4.0': 'NT', + '4.90': 'ME' + }; + // Detect Windows version from platform tokens. + if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) && + (data = data[/[\d.]+$/.exec(os)])) { + os = 'Windows ' + data; + } + // Correct character case and cleanup string. + os = String(os); + + if (pattern && label) { + os = os.replace(RegExp(pattern, 'i'), label); + } + + os = format( + os.replace(/ ce$/i, ' CE') + .replace(/\bhpw/i, 'web') + .replace(/\bMacintosh\b/, 'Mac OS') + .replace(/_PowerPC\b/i, ' OS') + .replace(/\b(OS X) [^ \d]+/i, '$1') + .replace(/\bMac (OS X)\b/, '$1') + .replace(/\/(\d)/, ' $1') + .replace(/_/g, '.') + .replace(/(?: BePC|[ .]*fc[ \d.]+)$/i, '') + .replace(/\bx86\.64\b/gi, 'x86_64') + .replace(/\b(Windows Phone) OS\b/, '$1') + .replace(/\b(Chrome OS \w+) [\d.]+\b/, '$1') + .split(' on ')[0] + ); + + return os; + } + + /** + * An iteration utility for arrays and objects. + * + * @private + * @param {Array|Object} object The object to iterate over. + * @param {Function} callback The function called per iteration. + */ + function each(object, callback) { + var index = -1, + length = object ? object.length : 0; + + if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) { + while (++index < length) { + callback(object[index], index, object); + } + } else { + forOwn(object, callback); + } + } + + /** + * Trim and conditionally capitalize string values. + * + * @private + * @param {string} string The string to format. + * @returns {string} The formatted string. + */ + function format(string) { + string = trim(string); + return /^(?:webOS|i(?:OS|P))/.test(string) + ? string + : capitalize(string); + } + + /** + * Iterates over an object's own properties, executing the `callback` for each. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} callback The function executed per own property. + */ + function forOwn(object, callback) { + for (var key in object) { + if (hasOwnProperty.call(object, key)) { + callback(object[key], key, object); + } + } + } + + /** + * Gets the internal `[[Class]]` of a value. + * + * @private + * @param {*} value The value. + * @returns {string} The `[[Class]]`. + */ + function getClassOf(value) { + return value == null + ? capitalize(value) + : toString.call(value).slice(8, -1); + } + + /** + * Host objects can return type values that are different from their actual + * data type. The objects we are concerned with usually return non-primitive + * types of "object", "function", or "unknown". + * + * @private + * @param {*} object The owner of the property. + * @param {string} property The property to check. + * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`. + */ + function isHostType(object, property) { + var type = object != null ? typeof object[property] : 'number'; + return !/^(?:boolean|number|string|undefined)$/.test(type) && + (type == 'object' ? !!object[property] : true); + } + + /** + * Prepares a string for use in a `RegExp` by making hyphens and spaces optional. + * + * @private + * @param {string} string The string to qualify. + * @returns {string} The qualified string. + */ + function qualify(string) { + return String(string).replace(/([ -])(?!$)/g, '$1?'); + } + + /** + * A bare-bones `Array#reduce` like utility function. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function called per iteration. + * @returns {*} The accumulated result. + */ + function reduce(array, callback) { + var accumulator = null; + each(array, function(value, index) { + accumulator = callback(accumulator, value, index, array); + }); + return accumulator; + } + + /** + * Removes leading and trailing whitespace from a string. + * + * @private + * @param {string} string The string to trim. + * @returns {string} The trimmed string. + */ + function trim(string) { + return String(string).replace(/^ +| +$/g, ''); + } + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a new platform object. + * + * @memberOf platform + * @param {Object|string} [ua=navigator.userAgent] The user agent string or + * context object. + * @returns {Object} A platform object. + */ + function parse(ua) { + + /** The environment context object. */ + var context = root; + + /** Used to flag when a custom context is provided. */ + var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String'; + + // Juggle arguments. + if (isCustomContext) { + context = ua; + ua = null; + } + + /** Browser navigator object. */ + var nav = context.navigator || {}; + + /** Browser user agent string. */ + var userAgent = nav.userAgent || ''; + + ua || (ua = userAgent); + + /** Used to flag when `thisBinding` is the [ModuleScope]. */ + var isModuleScope = isCustomContext || thisBinding == oldRoot; + + /** Used to detect if browser is like Chrome. */ + var likeChrome = isCustomContext + ? !!nav.likeChrome + : /\bChrome\b/.test(ua) && !/internal|\n/i.test(toString.toString()); + + /** Internal `[[Class]]` value shortcuts. */ + var objectClass = 'Object', + airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject', + enviroClass = isCustomContext ? objectClass : 'Environment', + javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java), + phantomClass = isCustomContext ? objectClass : 'RuntimeObject'; + + /** Detect Java environments. */ + var java = /\bJava/.test(javaClass) && context.java; + + /** Detect Rhino. */ + var rhino = java && getClassOf(context.environment) == enviroClass; + + /** A character to represent alpha. */ + var alpha = java ? 'a' : '\u03b1'; + + /** A character to represent beta. */ + var beta = java ? 'b' : '\u03b2'; + + /** Browser document object. */ + var doc = context.document || {}; + + /** + * Detect Opera browser (Presto-based). + * http://www.howtocreate.co.uk/operaStuff/operaObject.html + * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini + */ + var opera = context.operamini || context.opera; + + /** Opera `[[Class]]`. */ + var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera)) + ? operaClass + : (opera = null); + + /*------------------------------------------------------------------------*/ + + /** Temporary variable used over the script's lifetime. */ + var data; + + /** The CPU architecture. */ + var arch = ua; + + /** Platform description array. */ + var description = []; + + /** Platform alpha/beta indicator. */ + var prerelease = null; + + /** A flag to indicate that environment features should be used to resolve the platform. */ + var useFeatures = ua == userAgent; + + /** The browser/environment version. */ + var version = useFeatures && opera && typeof opera.version == 'function' && opera.version(); + + /** A flag to indicate if the OS ends with "/ Version" */ + var isSpecialCasedOS; + + /* Detectable layout engines (order is important). */ + var layout = getLayout([ + { 'label': 'EdgeHTML', 'pattern': 'Edge' }, + 'Trident', + { 'label': 'WebKit', 'pattern': 'AppleWebKit' }, + 'iCab', + 'Presto', + 'NetFront', + 'Tasman', + 'KHTML', + 'Gecko' + ]); + + /* Detectable browser names (order is important). */ + var name = getName([ + 'Adobe AIR', + 'Arora', + 'Avant Browser', + 'Breach', + 'Camino', + 'Electron', + 'Epiphany', + 'Fennec', + 'Flock', + 'Galeon', + 'GreenBrowser', + 'iCab', + 'Iceweasel', + 'K-Meleon', + 'Konqueror', + 'Lunascape', + 'Maxthon', + { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' }, + 'Midori', + 'Nook Browser', + 'PaleMoon', + 'PhantomJS', + 'Raven', + 'Rekonq', + 'RockMelt', + { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' }, + 'SeaMonkey', + { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, + 'Sleipnir', + 'SlimBrowser', + { 'label': 'SRWare Iron', 'pattern': 'Iron' }, + 'Sunrise', + 'Swiftfox', + 'Vivaldi', + 'Waterfox', + 'WebPositive', + { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' }, + { 'label': 'UC Browser', 'pattern': 'UCBrowser' }, + 'Opera Mini', + { 'label': 'Opera Mini', 'pattern': 'OPiOS' }, + 'Opera', + { 'label': 'Opera', 'pattern': 'OPR' }, + 'Chromium', + 'Chrome', + { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' }, + { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' }, + { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' }, + { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' }, + { 'label': 'IE', 'pattern': 'IEMobile' }, + { 'label': 'IE', 'pattern': 'MSIE' }, + 'Safari' + ]); + + /* Detectable products (order is important). */ + var product = getProduct([ + { 'label': 'BlackBerry', 'pattern': 'BB10' }, + 'BlackBerry', + { 'label': 'Galaxy S', 'pattern': 'GT-I9000' }, + { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' }, + { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' }, + { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' }, + { 'label': 'Galaxy S5', 'pattern': 'SM-G900' }, + { 'label': 'Galaxy S6', 'pattern': 'SM-G920' }, + { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' }, + { 'label': 'Galaxy S7', 'pattern': 'SM-G930' }, + { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' }, + 'Google TV', + 'Lumia', + 'iPad', + 'iPod', + 'iPhone', + 'Kindle', + { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, + 'Nexus', + 'Nook', + 'PlayBook', + 'PlayStation Vita', + 'PlayStation', + 'TouchPad', + 'Transformer', + { 'label': 'Wii U', 'pattern': 'WiiU' }, + 'Wii', + 'Xbox One', + { 'label': 'Xbox 360', 'pattern': 'Xbox' }, + 'Xoom' + ]); + + /* Detectable manufacturers. */ + var manufacturer = getManufacturer({ + 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 }, + 'Alcatel': {}, + 'Archos': {}, + 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 }, + 'Asus': { 'Transformer': 1 }, + 'Barnes & Noble': { 'Nook': 1 }, + 'BlackBerry': { 'PlayBook': 1 }, + 'Google': { 'Google TV': 1, 'Nexus': 1 }, + 'HP': { 'TouchPad': 1 }, + 'HTC': {}, + 'Huawei': {}, + 'Lenovo': {}, + 'LG': {}, + 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 }, + 'Motorola': { 'Xoom': 1 }, + 'Nintendo': { 'Wii U': 1, 'Wii': 1 }, + 'Nokia': { 'Lumia': 1 }, + 'Oppo': {}, + 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 }, + 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 }, + 'Xiaomi': { 'Mi': 1, 'Redmi': 1 } + }); + + /* Detectable operating systems (order is important). */ + var os = getOS([ + 'Windows Phone', + 'KaiOS', + 'Android', + 'CentOS', + { 'label': 'Chrome OS', 'pattern': 'CrOS' }, + 'Debian', + { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' }, + 'Fedora', + 'FreeBSD', + 'Gentoo', + 'Haiku', + 'Kubuntu', + 'Linux Mint', + 'OpenBSD', + 'Red Hat', + 'SuSE', + 'Ubuntu', + 'Xubuntu', + 'Cygwin', + 'Symbian OS', + 'hpwOS', + 'webOS ', + 'webOS', + 'Tablet OS', + 'Tizen', + 'Linux', + 'Mac OS X', + 'Macintosh', + 'Mac', + 'Windows 98;', + 'Windows ' + ]); + + /*------------------------------------------------------------------------*/ + + /** + * Picks the layout engine from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected layout engine. + */ + function getLayout(guesses) { + return reduce(guesses, function(result, guess) { + return result || RegExp('\\b' + ( + guess.pattern || qualify(guess) + ) + '\\b', 'i').exec(ua) && (guess.label || guess); + }); + } + + /** + * Picks the manufacturer from an array of guesses. + * + * @private + * @param {Array} guesses An object of guesses. + * @returns {null|string} The detected manufacturer. + */ + function getManufacturer(guesses) { + return reduce(guesses, function(result, value, key) { + // Lookup the manufacturer by product or scan the UA for the manufacturer. + return result || ( + value[product] || + value[/^[a-z]+(?: +[a-z]+\b)*/i.exec(product)] || + RegExp('\\b' + qualify(key) + '(?:\\b|\\w*\\d)', 'i').exec(ua) + ) && key; + }); + } + + /** + * Picks the browser name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected browser name. + */ + function getName(guesses) { + return reduce(guesses, function(result, guess) { + return result || RegExp('\\b' + ( + guess.pattern || qualify(guess) + ) + '\\b', 'i').exec(ua) && (guess.label || guess); + }); + } + + /** + * Picks the OS name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected OS name. + */ + function getOS(guesses) { + return reduce(guesses, function(result, guess) { + var pattern = guess.pattern || qualify(guess); + if (!result && (result = + RegExp('\\b' + pattern + '(?:/[\\d.]+|[ \\w.]*)', 'i').exec(ua) + )) { + result = cleanupOS(result, pattern, guess.label || guess); + } + return result; + }); + } + + /** + * Picks the product name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected product name. + */ + function getProduct(guesses) { + return reduce(guesses, function(result, guess) { + var pattern = guess.pattern || qualify(guess); + if (!result && (result = + RegExp('\\b' + pattern + ' *\\d+[.\\w_]*', 'i').exec(ua) || + RegExp('\\b' + pattern + ' *\\w+-[\\w]*', 'i').exec(ua) || + RegExp('\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)', 'i').exec(ua) + )) { + // Split by forward slash and append product version if needed. + if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\d.]+/.test(result[0])) { + result[0] += ' ' + result[1]; + } + // Correct character case and cleanup string. + guess = guess.label || guess; + result = format(result[0] + .replace(RegExp(pattern, 'i'), guess) + .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ') + .replace(RegExp('(' + guess + ')[-_.]?(\\w)', 'i'), '$1 $2')); + } + return result; + }); + } + + /** + * Resolves the version using an array of UA patterns. + * + * @private + * @param {Array} patterns An array of UA patterns. + * @returns {null|string} The detected version. + */ + function getVersion(patterns) { + return reduce(patterns, function(result, pattern) { + return result || (RegExp(pattern + + '(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null; + }); + } + + /** + * Returns `platform.description` when the platform object is coerced to a string. + * + * @name toString + * @memberOf platform + * @returns {string} Returns `platform.description` if available, else an empty string. + */ + function toStringPlatform() { + return this.description || ''; + } + + /*------------------------------------------------------------------------*/ + + // Convert layout to an array so we can add extra details. + layout && (layout = [layout]); + + // Detect Android products. + // Browsers on Android devices typically provide their product IDS after "Android;" + // up to "Build" or ") AppleWebKit". + // Example: + // "Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36 + // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36" + if (/\bAndroid\b/.test(os) && !product && + (data = /\bAndroid[^;]*;(.*?)(?:Build|\) AppleWebKit)\b/i.exec(ua))) { + product = trim(data[1]) + // Replace any language codes (eg. "en-US"). + .replace(/^[a-z]{2}-[a-z]{2};\s*/i, '') + || null; + } + // Detect product names that contain their manufacturer's name. + if (manufacturer && !product) { + product = getProduct([manufacturer]); + } else if (manufacturer && product) { + product = product + .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\s]', 'i'), manufacturer + ' ') + .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\w)', 'i'), manufacturer + ' $2'); + } + // Clean up Google TV. + if ((data = /\bGoogle TV\b/.exec(product))) { + product = data[0]; + } + // Detect simulators. + if (/\bSimulator\b/i.test(ua)) { + product = (product ? product + ' ' : '') + 'Simulator'; + } + // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS. + if (name == 'Opera Mini' && /\bOPiOS\b/.test(ua)) { + description.push('running in Turbo/Uncompressed mode'); + } + // Detect IE Mobile 11. + if (name == 'IE' && /\blike iPhone OS\b/.test(ua)) { + data = parse(ua.replace(/like iPhone OS/, '')); + manufacturer = data.manufacturer; + product = data.product; + } + // Detect iOS. + else if (/^iP/.test(product)) { + name || (name = 'Safari'); + os = 'iOS' + ((data = / OS ([\d_]+)/i.exec(ua)) + ? ' ' + data[1].replace(/_/g, '.') + : ''); + } + // Detect Kubuntu. + else if (name == 'Konqueror' && /^Linux\b/i.test(os)) { + os = 'Kubuntu'; + } + // Detect Android browsers. + else if ((manufacturer && manufacturer != 'Google' && + ((/Chrome/.test(name) && !/\bMobile Safari\b/i.test(ua)) || /\bVita\b/.test(product))) || + (/\bAndroid\b/.test(os) && /^Chrome/.test(name) && /\bVersion\//i.test(ua))) { + name = 'Android Browser'; + os = /\bAndroid\b/.test(os) ? os : 'Android'; + } + // Detect Silk desktop/accelerated modes. + else if (name == 'Silk') { + if (!/\bMobi/i.test(ua)) { + os = 'Android'; + description.unshift('desktop mode'); + } + if (/Accelerated *= *true/i.test(ua)) { + description.unshift('accelerated'); + } + } + // Detect UC Browser speed mode. + else if (name == 'UC Browser' && /\bUCWEB\b/.test(ua)) { + description.push('speed mode'); + } + // Detect PaleMoon identifying as Firefox. + else if (name == 'PaleMoon' && (data = /\bFirefox\/([\d.]+)\b/.exec(ua))) { + description.push('identifying as Firefox ' + data[1]); + } + // Detect Firefox OS and products running Firefox. + else if (name == 'Firefox' && (data = /\b(Mobile|Tablet|TV)\b/i.exec(ua))) { + os || (os = 'Firefox OS'); + product || (product = data[1]); + } + // Detect false positives for Firefox/Safari. + else if (!name || (data = !/\bMinefield\b/i.test(ua) && /\b(?:Firefox|Safari)\b/.exec(name))) { + // Escape the `/` for Firefox 1. + if (name && !product && /[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) { + // Clear name of false positives. + name = null; + } + // Reassign a generic name. + if ((data = product || manufacturer || os) && + (product || manufacturer || /\b(?:Android|Symbian OS|Tablet OS|webOS)\b/.test(os))) { + name = /[a-z]+(?: Hat)?/i.exec(/\bAndroid\b/.test(os) ? os : data) + ' Browser'; + } + } + // Add Chrome version to description for Electron. + else if (name == 'Electron' && (data = (/\bChrome\/([\d.]+)\b/.exec(ua) || 0)[1])) { + description.push('Chromium ' + data); + } + // Detect non-Opera (Presto-based) versions (order is important). + if (!version) { + version = getVersion([ + '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\d.]+$)|UCBrowser|YaBrowser)', + 'Version', + qualify(name), + '(?:Firefox|Minefield|NetFront)' + ]); + } + // Detect stubborn layout engines. + if ((data = + layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' || + /\bOpera\b/.test(name) && (/\bOPR\b/.test(ua) ? 'Blink' : 'Presto') || + /\b(?:Midori|Nook|Safari)\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' || + !layout && /\bMSIE\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') || + layout == 'WebKit' && /\bPlayStation\b(?! Vita\b)/i.test(name) && 'NetFront' + )) { + layout = [data]; + } + // Detect Windows Phone 7 desktop mode. + if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua) || 0)[1])) { + name += ' Mobile'; + os = 'Windows Phone ' + (/\+$/.test(data) ? data : data + '.x'); + description.unshift('desktop mode'); + } + // Detect Windows Phone 8.x desktop mode. + else if (/\bWPDesktop\b/i.test(ua)) { + name = 'IE Mobile'; + os = 'Windows Phone 8.x'; + description.unshift('desktop mode'); + version || (version = (/\brv:([\d.]+)/.exec(ua) || 0)[1]); + } + // Detect IE 11 identifying as other browsers. + else if (name != 'IE' && layout == 'Trident' && (data = /\brv:([\d.]+)/.exec(ua))) { + if (name) { + description.push('identifying as ' + name + (version ? ' ' + version : '')); + } + name = 'IE'; + version = data[1]; + } + // Leverage environment features. + if (useFeatures) { + // Detect server-side environments. + // Rhino has a global function while others have a global object. + if (isHostType(context, 'global')) { + if (java) { + data = java.lang.System; + arch = data.getProperty('os.arch'); + os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version'); + } + if (rhino) { + try { + version = context.require('ringo/engine').version.join('.'); + name = 'RingoJS'; + } catch(e) { + if ((data = context.system) && data.global.system == context.system) { + name = 'Narwhal'; + os || (os = data[0].os || null); + } + } + if (!name) { + name = 'Rhino'; + } + } + else if ( + typeof context.process == 'object' && !context.process.browser && + (data = context.process) + ) { + if (typeof data.versions == 'object') { + if (typeof data.versions.electron == 'string') { + description.push('Node ' + data.versions.node); + name = 'Electron'; + version = data.versions.electron; + } else if (typeof data.versions.nw == 'string') { + description.push('Chromium ' + version, 'Node ' + data.versions.node); + name = 'NW.js'; + version = data.versions.nw; + } + } + if (!name) { + name = 'Node.js'; + arch = data.arch; + os = data.platform; + version = /[\d.]+/.exec(data.version); + version = version ? version[0] : null; + } + } + } + // Detect Adobe AIR. + else if (getClassOf((data = context.runtime)) == airRuntimeClass) { + name = 'Adobe AIR'; + os = data.flash.system.Capabilities.os; + } + // Detect PhantomJS. + else if (getClassOf((data = context.phantom)) == phantomClass) { + name = 'PhantomJS'; + version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch); + } + // Detect IE compatibility modes. + else if (typeof doc.documentMode == 'number' && (data = /\bTrident\/(\d+)/i.exec(ua))) { + // We're in compatibility mode when the Trident version + 4 doesn't + // equal the document mode. + version = [version, doc.documentMode]; + if ((data = +data[1] + 4) != version[1]) { + description.push('IE ' + version[1] + ' mode'); + layout && (layout[1] = ''); + version[1] = data; + } + version = name == 'IE' ? String(version[1].toFixed(1)) : version[0]; + } + // Detect IE 11 masking as other browsers. + else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\b/.test(name)) { + description.push('masking as ' + name + ' ' + version); + name = 'IE'; + version = '11.0'; + layout = ['Trident']; + os = 'Windows'; + } + os = os && format(os); + } + // Detect prerelease phases. + if (version && (data = + /(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version) || + /(?:alpha|beta)(?: ?\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) || + /\bMinefield\b/i.test(ua) && 'a' + )) { + prerelease = /b/i.test(data) ? 'beta' : 'alpha'; + version = version.replace(RegExp(data + '\\+?$'), '') + + (prerelease == 'beta' ? beta : alpha) + (/\d+\+?/.exec(data) || ''); + } + // Detect Firefox Mobile. + if (name == 'Fennec' || name == 'Firefox' && /\b(?:Android|Firefox OS|KaiOS)\b/.test(os)) { + name = 'Firefox Mobile'; + } + // Obscure Maxthon's unreliable version. + else if (name == 'Maxthon' && version) { + version = version.replace(/\.[\d.]+/, '.x'); + } + // Detect Xbox 360 and Xbox One. + else if (/\bXbox\b/i.test(product)) { + if (product == 'Xbox 360') { + os = null; + } + if (product == 'Xbox 360' && /\bIEMobile\b/.test(ua)) { + description.unshift('mobile mode'); + } + } + // Add mobile postfix. + else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) && + (os == 'Windows CE' || /Mobi/i.test(ua))) { + name += ' Mobile'; + } + // Detect IE platform preview. + else if (name == 'IE' && useFeatures) { + try { + if (context.external === null) { + description.unshift('platform preview'); + } + } catch(e) { + description.unshift('embedded'); + } + } + // Detect BlackBerry OS version. + // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp + else if ((/\bBlackBerry\b/.test(product) || /\bBB10\b/.test(ua)) && (data = + (RegExp(product.replace(/ +/g, ' *') + '/([.\\d]+)', 'i').exec(ua) || 0)[1] || + version + )) { + data = [data, /BB10/.test(ua)]; + os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0]; + version = null; + } + // Detect Opera identifying/masking itself as another browser. + // http://www.opera.com/support/kb/view/843/ + else if (this != forOwn && product != 'Wii' && ( + (useFeatures && opera) || + (/Opera/.test(name) && /\b(?:MSIE|Firefox)\b/i.test(ua)) || + (name == 'Firefox' && /\bOS X (?:\d+\.){2,}/.test(os)) || + (name == 'IE' && ( + (os && !/^Win/.test(os) && version > 5.5) || + /\bWindows XP\b/.test(os) && version > 8 || + version == 8 && !/\bTrident\b/.test(ua) + )) + ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) { + // When "identifying", the UA contains both Opera and the other browser's name. + data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : ''); + if (reOpera.test(name)) { + if (/\bIE\b/.test(data) && os == 'Mac OS') { + os = null; + } + data = 'identify' + data; + } + // When "masking", the UA contains only the other browser's name. + else { + data = 'mask' + data; + if (operaClass) { + name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2')); + } else { + name = 'Opera'; + } + if (/\bIE\b/.test(data)) { + os = null; + } + if (!useFeatures) { + version = null; + } + } + layout = ['Presto']; + description.push(data); + } + // Detect WebKit Nightly and approximate Chrome/Safari versions. + if ((data = (/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { + // Correct build number for numeric comparison. + // (e.g. "532.5" becomes "532.05") + data = [parseFloat(data.replace(/\.(\d)$/, '.0$1')), data]; + // Nightly builds are postfixed with a "+". + if (name == 'Safari' && data[1].slice(-1) == '+') { + name = 'WebKit Nightly'; + prerelease = 'alpha'; + version = data[1].slice(0, -1); + } + // Clear incorrect browser versions. + else if (version == data[1] || + version == (data[2] = (/\bSafari\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { + version = null; + } + // Use the full Chrome version when available. + data[1] = (/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(ua) || 0)[1]; + // Detect Blink layout engine. + if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') { + layout = ['Blink']; + } + // Detect JavaScriptCore. + // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi + if (!useFeatures || (!likeChrome && !data[1])) { + layout && (layout[1] = 'like Safari'); + data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12'); + } else { + layout && (layout[1] = 'like Chrome'); + data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28'); + } + // Add the postfix of ".x" or "+" for approximate versions. + layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+')); + // Obscure version for some Safari 1-2 releases. + if (name == 'Safari' && (!version || parseInt(version) > 45)) { + version = data; + } else if (name == 'Chrome' && /\bHeadlessChrome/i.test(ua)) { + description.unshift('headless'); + } + } + // Detect Opera desktop modes. + if (name == 'Opera' && (data = /\bzbov|zvav$/.exec(os))) { + name += ' '; + description.unshift('desktop mode'); + if (data == 'zvav') { + name += 'Mini'; + version = null; + } else { + name += 'Mobile'; + } + os = os.replace(RegExp(' *' + data + '$'), ''); + } + // Detect Chrome desktop mode. + else if (name == 'Safari' && /\bChrome\b/.exec(layout && layout[1])) { + description.unshift('desktop mode'); + name = 'Chrome Mobile'; + version = null; + + if (/\bOS X\b/.test(os)) { + manufacturer = 'Apple'; + os = 'iOS 4.3+'; + } else { + os = null; + } + } + // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number. + else if (/\bSRWare Iron\b/.test(name) && !version) { + version = getVersion('Chrome'); + } + // Strip incorrect OS versions. + if (version && version.indexOf((data = /[\d.]+$/.exec(os))) == 0 && + ua.indexOf('/' + data + '-') > -1) { + os = trim(os.replace(data, '')); + } + // Ensure OS does not include the browser name. + if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) { + os = os.replace(RegExp(' *' + qualify(name) + ' *'), ''); + } + // Add layout engine. + if (layout && !/\b(?:Avant|Nook)\b/.test(name) && ( + /Browser|Lunascape|Maxthon/.test(name) || + name != 'Safari' && /^iOS/.test(os) && /\bSafari\b/.test(layout[1]) || + /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) { + // Don't add layout details to description if they are falsey. + (data = layout[layout.length - 1]) && description.push(data); + } + // Combine contextual information. + if (description.length) { + description = ['(' + description.join('; ') + ')']; + } + // Append manufacturer to description. + if (manufacturer && product && product.indexOf(manufacturer) < 0) { + description.push('on ' + manufacturer); + } + // Append product to description. + if (product) { + description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product); + } + // Parse the OS into an object. + if (os) { + data = / ([\d.+]+)$/.exec(os); + isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/'; + os = { + 'architecture': 32, + 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os, + 'version': data ? data[1] : null, + 'toString': function() { + var version = this.version; + return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : ''); + } + }; + } + // Add browser/OS architecture. + if ((data = /\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch)) && !/\bi686\b/i.test(arch)) { + if (os) { + os.architecture = 64; + os.family = os.family.replace(RegExp(' *' + data), ''); + } + if ( + name && (/\bWOW64\b/i.test(ua) || + (useFeatures && /\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\bWin64; x64\b/i.test(ua))) + ) { + description.unshift('32-bit'); + } + } + // Chrome 39 and above on OS X is always 64-bit. + else if ( + os && /^OS X/.test(os.family) && + name == 'Chrome' && parseFloat(version) >= 39 + ) { + os.architecture = 64; + } + + ua || (ua = null); + + /*------------------------------------------------------------------------*/ + + /** + * The platform object. + * + * @name platform + * @type Object + */ + var platform = {}; + + /** + * The platform description. + * + * @memberOf platform + * @type string|null + */ + platform.description = ua; + + /** + * The name of the browser's layout engine. + * + * The list of common layout engines include: + * "Blink", "EdgeHTML", "Gecko", "Trident" and "WebKit" + * + * @memberOf platform + * @type string|null + */ + platform.layout = layout && layout[0]; + + /** + * The name of the product's manufacturer. + * + * The list of manufacturers include: + * "Apple", "Archos", "Amazon", "Asus", "Barnes & Noble", "BlackBerry", + * "Google", "HP", "HTC", "LG", "Microsoft", "Motorola", "Nintendo", + * "Nokia", "Samsung" and "Sony" + * + * @memberOf platform + * @type string|null + */ + platform.manufacturer = manufacturer; + + /** + * The name of the browser/environment. + * + * The list of common browser names include: + * "Chrome", "Electron", "Firefox", "Firefox for iOS", "IE", + * "Microsoft Edge", "PhantomJS", "Safari", "SeaMonkey", "Silk", + * "Opera Mini" and "Opera" + * + * Mobile versions of some browsers have "Mobile" appended to their name: + * eg. "Chrome Mobile", "Firefox Mobile", "IE Mobile" and "Opera Mobile" + * + * @memberOf platform + * @type string|null + */ + platform.name = name; + + /** + * The alpha/beta release indicator. + * + * @memberOf platform + * @type string|null + */ + platform.prerelease = prerelease; + + /** + * The name of the product hosting the browser. + * + * The list of common products include: + * + * "BlackBerry", "Galaxy S4", "Lumia", "iPad", "iPod", "iPhone", "Kindle", + * "Kindle Fire", "Nexus", "Nook", "PlayBook", "TouchPad" and "Transformer" + * + * @memberOf platform + * @type string|null + */ + platform.product = product; + + /** + * The browser's user agent string. + * + * @memberOf platform + * @type string|null + */ + platform.ua = ua; + + /** + * The browser/environment version. + * + * @memberOf platform + * @type string|null + */ + platform.version = name && version; + + /** + * The name of the operating system. + * + * @memberOf platform + * @type Object + */ + platform.os = os || { + + /** + * The CPU architecture the OS is built for. + * + * @memberOf platform.os + * @type number|null + */ + 'architecture': null, + + /** + * The family of the OS. + * + * Common values include: + * "Windows", "Windows Server 2008 R2 / 7", "Windows Server 2008 / Vista", + * "Windows XP", "OS X", "Linux", "Ubuntu", "Debian", "Fedora", "Red Hat", + * "SuSE", "Android", "iOS" and "Windows Phone" + * + * @memberOf platform.os + * @type string|null + */ + 'family': null, + + /** + * The version of the OS. + * + * @memberOf platform.os + * @type string|null + */ + 'version': null, + + /** + * Returns the OS string. + * + * @memberOf platform.os + * @returns {string} The OS string. + */ + 'toString': function() { return 'null'; } + }; + + platform.parse = parse; + platform.toString = toStringPlatform; + + if (platform.version) { + description.unshift(version); + } + if (platform.name) { + description.unshift(name); + } + if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) { + description.push(product ? '(' + os + ')' : 'on ' + os); + } + if (description.length) { + platform.description = description.join(' '); + } + return platform; + } + + /*--------------------------------------------------------------------------*/ + + // Export platform. + var platform = parse(); + + // Some AMD build optimizers, like r.js, check for condition patterns like the following: + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + // Expose platform on the global object to prevent errors when platform is + // loaded by a script tag in the presence of an AMD loader. + // See http://requirejs.org/docs/errors.html#mismatch for more details. + root.platform = platform; + + // Define as an anonymous module so platform can be aliased through path mapping. + define(function() { + return platform; + }); + } + // Check for `exports` after `define` in case a build optimizer adds an `exports` object. + else if (freeExports && freeModule) { + // Export for CommonJS support. + forOwn(platform, function(value, key) { + freeExports[key] = value; + }); + } + else { + // Export to the global object. + root.platform = platform; + } + }.call(this)); \ No newline at end of file diff --git a/web/nfc-theme/templates/404.html b/web/nfc-theme/templates/404.html new file mode 100644 index 0000000..0d694fb --- /dev/null +++ b/web/nfc-theme/templates/404.html @@ -0,0 +1,39 @@ + + + + 404 + + + + + + +

+
Windows
+

An exception 404 has occurred. The page could not be found. It may be possible to continue normally.

+
    +
  • Press the backspace key to attempt to continue.
  • +
  • Press CTRL+ALT+DEL to restart your computer. You will
    + lose any unsaved information in all applications.
  • +
+
+ + \ No newline at end of file diff --git a/web/nfc-theme/templates/archives.html b/web/nfc-theme/templates/archives.html new file mode 100644 index 0000000..63913c1 --- /dev/null +++ b/web/nfc-theme/templates/archives.html @@ -0,0 +1 @@ +{% extends "base.html" %} \ No newline at end of file diff --git a/web/nfc-theme/templates/article.html b/web/nfc-theme/templates/article.html new file mode 100644 index 0000000..53df4ec --- /dev/null +++ b/web/nfc-theme/templates/article.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} +
+
+ {{ article.content }} + {% if article.metadata.geohash %} + {{ article.metadata.geohash }} + {% endif %} +
+
+ + +{% endblock %} diff --git a/web/nfc-theme/templates/author.html b/web/nfc-theme/templates/author.html new file mode 100644 index 0000000..63913c1 --- /dev/null +++ b/web/nfc-theme/templates/author.html @@ -0,0 +1 @@ +{% extends "base.html" %} \ No newline at end of file diff --git a/web/nfc-theme/templates/authors.html b/web/nfc-theme/templates/authors.html new file mode 100644 index 0000000..4914904 --- /dev/null +++ b/web/nfc-theme/templates/authors.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Authors{% endblock %} + +{% block content %} +

Authors on {{ SITENAME }}

+ +
    + {%- for author, articles in authors|sort %} +
  • {{ author }} ({{ articles|count }})
  • + {% endfor %} +
+{% endblock %} diff --git a/web/nfc-theme/templates/base.html b/web/nfc-theme/templates/base.html new file mode 100644 index 0000000..31d21d4 --- /dev/null +++ b/web/nfc-theme/templates/base.html @@ -0,0 +1,23 @@ + + + + {% block head %} + + + + {% endblock head %} + + + + + {% block content %} + {% endblock %} + + {% if DESCRIPTION %} +
+
+ {{ DESCRIPTION }} +
+ {% endif %} + + diff --git a/web/nfc-theme/templates/categories.html b/web/nfc-theme/templates/categories.html new file mode 100644 index 0000000..e29be0c --- /dev/null +++ b/web/nfc-theme/templates/categories.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block content %} +
    +{% for category, articles in categories %} +
  • {{ category }}
  • +{% endfor %} +
+{% endblock %} diff --git a/web/nfc-theme/templates/category.html b/web/nfc-theme/templates/category.html new file mode 100644 index 0000000..f64ed15 --- /dev/null +++ b/web/nfc-theme/templates/category.html @@ -0,0 +1,5 @@ +{% extends "index.html" %} +{% block content_title %} +

{{ category }}

+{% endblock %} + diff --git a/web/nfc-theme/templates/gosquared.html b/web/nfc-theme/templates/gosquared.html new file mode 100644 index 0000000..f47efcf --- /dev/null +++ b/web/nfc-theme/templates/gosquared.html @@ -0,0 +1,14 @@ +{% if GOSQUARED_SITENAME %} + +{% endif %} diff --git a/web/nfc-theme/templates/index.html b/web/nfc-theme/templates/index.html new file mode 100644 index 0000000..b5921fb --- /dev/null +++ b/web/nfc-theme/templates/index.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% block content %} +
+{% block content_title %} +{% endblock %} + +{% for article in articles_page.object_list %} + + +{% endfor %} + +{% include 'pagination.html' %} +
+{% endblock content %} diff --git a/web/nfc-theme/templates/page.html b/web/nfc-theme/templates/page.html new file mode 100644 index 0000000..5ceb779 --- /dev/null +++ b/web/nfc-theme/templates/page.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{% block title %}{{ page.title }}{%endblock%} +{% block content %} +

{{ page.title }}

+ {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + + {{ page.content }} + + {% if page.modified %} +

+ Last updated: {{ page.locale_modified }} +

+ {% endif %} +{% endblock %} diff --git a/web/nfc-theme/templates/pagination.html b/web/nfc-theme/templates/pagination.html new file mode 100644 index 0000000..4219a5c --- /dev/null +++ b/web/nfc-theme/templates/pagination.html @@ -0,0 +1,11 @@ +{% if DEFAULT_PAGINATION %} +

+ {% if articles_page.has_previous() %} + « + {% endif %} + Page {{ articles_page.number }} / {{ articles_paginator.num_pages }} + {% if articles_page.has_next() %} + » + {% endif %} +

+{% endif %} diff --git a/web/nfc-theme/templates/period_archives.html b/web/nfc-theme/templates/period_archives.html new file mode 100644 index 0000000..d930dbb --- /dev/null +++ b/web/nfc-theme/templates/period_archives.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +

Archives for {{ period | reverse | join(' ') }}

+ +
+{% for article in dates %} +
{{ article.locale_date }}
+
{{ article.title }}
+{% endfor %} +
+{% endblock %} diff --git a/web/nfc-theme/templates/tag.html b/web/nfc-theme/templates/tag.html new file mode 100644 index 0000000..e69de29 diff --git a/web/nfc-theme/templates/tags.html b/web/nfc-theme/templates/tags.html new file mode 100644 index 0000000..b5d1482 --- /dev/null +++ b/web/nfc-theme/templates/tags.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Tags{% endblock %} + +{% block content %} +

Tags for {{ SITENAME }}

+ {%- for tag, articles in tags|sort %} +
  • {{ tag }} ({{ articles|count }})
  • + {% endfor %} +{% endblock %} diff --git a/web/nfc-theme/templates/translations.html b/web/nfc-theme/templates/translations.html new file mode 100644 index 0000000..6bd6c7d --- /dev/null +++ b/web/nfc-theme/templates/translations.html @@ -0,0 +1,8 @@ +{% macro translations_for(article) %} +{% if article.translations %} +{% for translation in article.translations %} +{{ translation.lang }} +{% endfor %} +{% endif %} +{% endmacro %} + diff --git a/web/output/404.html b/web/output/404.html new file mode 100644 index 0000000..0d694fb --- /dev/null +++ b/web/output/404.html @@ -0,0 +1,39 @@ + + + + 404 + + + + + + +
    +
    Windows
    +

    An exception 404 has occurred. The page could not be found. It may be possible to continue normally.

    +
      +
    • Press the backspace key to attempt to continue.
    • +
    • Press CTRL+ALT+DEL to restart your computer. You will
      + lose any unsaved information in all applications.
    • +
    +
    + + \ No newline at end of file diff --git a/web/output/e8229.html b/web/output/e8229.html new file mode 100644 index 0000000..68b5398 --- /dev/null +++ b/web/output/e8229.html @@ -0,0 +1,21 @@ + + + + + + + + + + +
    +
    +

    I noticed a peculiar sensation in the air as soon as I arrived in town. It was as if an electric charge was coursing through the air beneath the pastoral tranquillity, making me nervous. I looked around, but there was no one to be found. The faint odor of decay lingered around me, mingled with the sweet fragrance of incense. The mix made me feel uneasy, like if I'd stepped into a strange, surreal dream.

    + svbfh1049ck +
    +
    + + + + + \ No newline at end of file diff --git a/web/output/index.html b/web/output/index.html new file mode 100644 index 0000000..b06f007 --- /dev/null +++ b/web/output/index.html @@ -0,0 +1,18 @@ + + + + + + + + + + +

    + + + + + + + \ No newline at end of file diff --git a/web/output/projects/blue-eyed-donkey/index.html b/web/output/projects/blue-eyed-donkey/index.html new file mode 100644 index 0000000..c8d8f01 --- /dev/null +++ b/web/output/projects/blue-eyed-donkey/index.html @@ -0,0 +1,27 @@ + + + + + + + + + + +
    +

    Blue Eyed Donkey

    + + + + +
    + + + \ No newline at end of file diff --git a/web/output/projects/index.html b/web/output/projects/index.html new file mode 100644 index 0000000..8d7a1ff --- /dev/null +++ b/web/output/projects/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/output/tags/index.html b/web/output/tags/index.html new file mode 100644 index 0000000..48fccf1 --- /dev/null +++ b/web/output/tags/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + +
    + + + + +
    + + + \ No newline at end of file diff --git a/web/output/theme/DavidLibre-Regular.ttf b/web/output/theme/DavidLibre-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cf23de8b33084422cc349f4c6596b84fb89c283c GIT binary patch literal 107772 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

    GqN+CWuCwYYPW;V^#kv&W?*EP$W+Og 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,qlrMz7J1B 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 -1; +const ios = ua.indexOf("ios") > -1; +const windows = ua.indexOf("windows") > -1; +const linux = ua.indexOf("linux") > -1; +const mac = ua.indexOf("macos") > -1; +var hashlink = document.querySelector(".geo a"); +if ( windows || mac || linux ) hashlink.href = "https://maps.google.com/?q=" + hashlink.getAttribute("latlon"); +else if ( android ) hashlink.href = "geo:0,0?q=" + hashlink.getAttribute("latlon"); +else if ( ios ) hashlink.href = "http://maps.apple.com/?ll=" + hashlink.getAttribute("latlon") + "&q=" + hashlink.innerHTML; \ No newline at end of file diff --git a/web/output/theme/local.css b/web/output/theme/local.css new file mode 100644 index 0000000..44b6995 --- /dev/null +++ b/web/output/theme/local.css @@ -0,0 +1,144 @@ +@font-face { + font-family: 'David Libre'; + src: local('David Libre'), local('DavidLibre'), + url('DavidLibre-Regular.ttf') format('ttf') +} + +/* CSS Reset */ +html { + margin: 0; + padding: 0; + text-align: left; + text-rendering: optimizeLegibility; +} + +/* HTML5 tag defaults. */ +header, footer, aside, nav, article +{ + display: block; +} + +h1, h2, h3, h4, h5 { + margin-block-start: 0; + font-weight: normal; + text-align: left; + font-size: 1em; +} + +body { + font-family: 'David Libre'; + padding: 1em; + font-size: 1.4em; + line-height: 1.2em; + text-align: left; + color: #090A0E; + height: 100vh; + overflow-x: hidden; + overflow-y: hidden; + margin: auto; + max-width: 40em; +} + +p { + margin-block-start: 0; +} + +ul, ul li { + margin:0; + padding:0; + list-style:none +} + +ul li::before { + content: '*\00a0'; +} + +/* Use a thin border around all images. */ +img +{ + border: 1px solid; + max-width: 40em; + width: 100%; +} + +/* Navigation bar. */ +nav +{ + padding-bottom: 1ex; + margin-bottom: 4em; +} + +nav::after { + clear:left; +} + +nav ul +{ + padding: 0; + margin-left: 0; + list-style: none; +} + +nav ul li +{ + display: inline; + float: left; + margin-right: .4em; /* How far between items. */ + margin-top: .3em; +} + +nav li::before { + content: none; +} + +nav ul li a +{ + display: inline; + margin: 0; +} + +/* + * Use a border around tables, but don't draw lines around individual + * cells. + */ +table +{ + border-style: solid; + border-collapse: collapse; + border-width: thin; + font-size: 100%; +} + +th, td +{ + border-style: solid; + border-width: thin; +} + +a { + border-bottom: 1px solid #090A0E; +} + +/* for unvisited links: blue */ +a:link +{ + text-decoration: none; +} + +/* for visited links: purple */ +a:visited +{ + text-decoration: none; +} + +/* when mouse is over link or the link is active*/ +a:hover, a:active +{ + text-decoration: none; +} + +blockquote { + border: 1px solid; + margin: 0; + padding-left: 1em; +} \ No newline at end of file diff --git a/web/output/theme/platform.js b/web/output/theme/platform.js new file mode 100644 index 0000000..0f2a9ad --- /dev/null +++ b/web/output/theme/platform.js @@ -0,0 +1,1260 @@ +/*! + * Platform.js + * Copyright 2014-2020 Benjamin Tan + * Copyright 2011-2013 John-David Dalton + * Available under MIT license + */ +;(function() { + 'use strict'; + + /** Used to determine if values are of the language type `Object`. */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used as a reference to the global object. */ + var root = (objectTypes[typeof window] && window) || this; + + /** Backup possible global object. */ + var oldRoot = root; + + /** Detect free variable `exports`. */ + var freeExports = objectTypes[typeof exports] && exports; + + /** Detect free variable `module`. */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { + root = freeGlobal; + } + + /** + * Used as the maximum length of an array-like object. + * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength) + * for more details. + */ + var maxSafeInteger = Math.pow(2, 53) - 1; + + /** Regular expression to detect Opera. */ + var reOpera = /\bOpera/; + + /** Possible global object. */ + var thisBinding = this; + + /** Used for native method references. */ + var objectProto = Object.prototype; + + /** Used to check for own properties of an object. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to resolve the internal `[[Class]]` of values. */ + var toString = objectProto.toString; + + /*--------------------------------------------------------------------------*/ + + /** + * Capitalizes a string value. + * + * @private + * @param {string} string The string to capitalize. + * @returns {string} The capitalized string. + */ + function capitalize(string) { + string = String(string); + return string.charAt(0).toUpperCase() + string.slice(1); + } + + /** + * A utility function to clean up the OS name. + * + * @private + * @param {string} os The OS name to clean up. + * @param {string} [pattern] A `RegExp` pattern matching the OS name. + * @param {string} [label] A label for the OS. + */ + function cleanupOS(os, pattern, label) { + // Platform tokens are defined at: + // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx + // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx + var data = { + '10.0': '10', + '6.4': '10 Technical Preview', + '6.3': '8.1', + '6.2': '8', + '6.1': 'Server 2008 R2 / 7', + '6.0': 'Server 2008 / Vista', + '5.2': 'Server 2003 / XP 64-bit', + '5.1': 'XP', + '5.01': '2000 SP1', + '5.0': '2000', + '4.0': 'NT', + '4.90': 'ME' + }; + // Detect Windows version from platform tokens. + if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) && + (data = data[/[\d.]+$/.exec(os)])) { + os = 'Windows ' + data; + } + // Correct character case and cleanup string. + os = String(os); + + if (pattern && label) { + os = os.replace(RegExp(pattern, 'i'), label); + } + + os = format( + os.replace(/ ce$/i, ' CE') + .replace(/\bhpw/i, 'web') + .replace(/\bMacintosh\b/, 'Mac OS') + .replace(/_PowerPC\b/i, ' OS') + .replace(/\b(OS X) [^ \d]+/i, '$1') + .replace(/\bMac (OS X)\b/, '$1') + .replace(/\/(\d)/, ' $1') + .replace(/_/g, '.') + .replace(/(?: BePC|[ .]*fc[ \d.]+)$/i, '') + .replace(/\bx86\.64\b/gi, 'x86_64') + .replace(/\b(Windows Phone) OS\b/, '$1') + .replace(/\b(Chrome OS \w+) [\d.]+\b/, '$1') + .split(' on ')[0] + ); + + return os; + } + + /** + * An iteration utility for arrays and objects. + * + * @private + * @param {Array|Object} object The object to iterate over. + * @param {Function} callback The function called per iteration. + */ + function each(object, callback) { + var index = -1, + length = object ? object.length : 0; + + if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) { + while (++index < length) { + callback(object[index], index, object); + } + } else { + forOwn(object, callback); + } + } + + /** + * Trim and conditionally capitalize string values. + * + * @private + * @param {string} string The string to format. + * @returns {string} The formatted string. + */ + function format(string) { + string = trim(string); + return /^(?:webOS|i(?:OS|P))/.test(string) + ? string + : capitalize(string); + } + + /** + * Iterates over an object's own properties, executing the `callback` for each. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} callback The function executed per own property. + */ + function forOwn(object, callback) { + for (var key in object) { + if (hasOwnProperty.call(object, key)) { + callback(object[key], key, object); + } + } + } + + /** + * Gets the internal `[[Class]]` of a value. + * + * @private + * @param {*} value The value. + * @returns {string} The `[[Class]]`. + */ + function getClassOf(value) { + return value == null + ? capitalize(value) + : toString.call(value).slice(8, -1); + } + + /** + * Host objects can return type values that are different from their actual + * data type. The objects we are concerned with usually return non-primitive + * types of "object", "function", or "unknown". + * + * @private + * @param {*} object The owner of the property. + * @param {string} property The property to check. + * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`. + */ + function isHostType(object, property) { + var type = object != null ? typeof object[property] : 'number'; + return !/^(?:boolean|number|string|undefined)$/.test(type) && + (type == 'object' ? !!object[property] : true); + } + + /** + * Prepares a string for use in a `RegExp` by making hyphens and spaces optional. + * + * @private + * @param {string} string The string to qualify. + * @returns {string} The qualified string. + */ + function qualify(string) { + return String(string).replace(/([ -])(?!$)/g, '$1?'); + } + + /** + * A bare-bones `Array#reduce` like utility function. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function called per iteration. + * @returns {*} The accumulated result. + */ + function reduce(array, callback) { + var accumulator = null; + each(array, function(value, index) { + accumulator = callback(accumulator, value, index, array); + }); + return accumulator; + } + + /** + * Removes leading and trailing whitespace from a string. + * + * @private + * @param {string} string The string to trim. + * @returns {string} The trimmed string. + */ + function trim(string) { + return String(string).replace(/^ +| +$/g, ''); + } + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a new platform object. + * + * @memberOf platform + * @param {Object|string} [ua=navigator.userAgent] The user agent string or + * context object. + * @returns {Object} A platform object. + */ + function parse(ua) { + + /** The environment context object. */ + var context = root; + + /** Used to flag when a custom context is provided. */ + var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String'; + + // Juggle arguments. + if (isCustomContext) { + context = ua; + ua = null; + } + + /** Browser navigator object. */ + var nav = context.navigator || {}; + + /** Browser user agent string. */ + var userAgent = nav.userAgent || ''; + + ua || (ua = userAgent); + + /** Used to flag when `thisBinding` is the [ModuleScope]. */ + var isModuleScope = isCustomContext || thisBinding == oldRoot; + + /** Used to detect if browser is like Chrome. */ + var likeChrome = isCustomContext + ? !!nav.likeChrome + : /\bChrome\b/.test(ua) && !/internal|\n/i.test(toString.toString()); + + /** Internal `[[Class]]` value shortcuts. */ + var objectClass = 'Object', + airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject', + enviroClass = isCustomContext ? objectClass : 'Environment', + javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java), + phantomClass = isCustomContext ? objectClass : 'RuntimeObject'; + + /** Detect Java environments. */ + var java = /\bJava/.test(javaClass) && context.java; + + /** Detect Rhino. */ + var rhino = java && getClassOf(context.environment) == enviroClass; + + /** A character to represent alpha. */ + var alpha = java ? 'a' : '\u03b1'; + + /** A character to represent beta. */ + var beta = java ? 'b' : '\u03b2'; + + /** Browser document object. */ + var doc = context.document || {}; + + /** + * Detect Opera browser (Presto-based). + * http://www.howtocreate.co.uk/operaStuff/operaObject.html + * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini + */ + var opera = context.operamini || context.opera; + + /** Opera `[[Class]]`. */ + var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera)) + ? operaClass + : (opera = null); + + /*------------------------------------------------------------------------*/ + + /** Temporary variable used over the script's lifetime. */ + var data; + + /** The CPU architecture. */ + var arch = ua; + + /** Platform description array. */ + var description = []; + + /** Platform alpha/beta indicator. */ + var prerelease = null; + + /** A flag to indicate that environment features should be used to resolve the platform. */ + var useFeatures = ua == userAgent; + + /** The browser/environment version. */ + var version = useFeatures && opera && typeof opera.version == 'function' && opera.version(); + + /** A flag to indicate if the OS ends with "/ Version" */ + var isSpecialCasedOS; + + /* Detectable layout engines (order is important). */ + var layout = getLayout([ + { 'label': 'EdgeHTML', 'pattern': 'Edge' }, + 'Trident', + { 'label': 'WebKit', 'pattern': 'AppleWebKit' }, + 'iCab', + 'Presto', + 'NetFront', + 'Tasman', + 'KHTML', + 'Gecko' + ]); + + /* Detectable browser names (order is important). */ + var name = getName([ + 'Adobe AIR', + 'Arora', + 'Avant Browser', + 'Breach', + 'Camino', + 'Electron', + 'Epiphany', + 'Fennec', + 'Flock', + 'Galeon', + 'GreenBrowser', + 'iCab', + 'Iceweasel', + 'K-Meleon', + 'Konqueror', + 'Lunascape', + 'Maxthon', + { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' }, + 'Midori', + 'Nook Browser', + 'PaleMoon', + 'PhantomJS', + 'Raven', + 'Rekonq', + 'RockMelt', + { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' }, + 'SeaMonkey', + { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, + 'Sleipnir', + 'SlimBrowser', + { 'label': 'SRWare Iron', 'pattern': 'Iron' }, + 'Sunrise', + 'Swiftfox', + 'Vivaldi', + 'Waterfox', + 'WebPositive', + { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' }, + { 'label': 'UC Browser', 'pattern': 'UCBrowser' }, + 'Opera Mini', + { 'label': 'Opera Mini', 'pattern': 'OPiOS' }, + 'Opera', + { 'label': 'Opera', 'pattern': 'OPR' }, + 'Chromium', + 'Chrome', + { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' }, + { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' }, + { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' }, + { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' }, + { 'label': 'IE', 'pattern': 'IEMobile' }, + { 'label': 'IE', 'pattern': 'MSIE' }, + 'Safari' + ]); + + /* Detectable products (order is important). */ + var product = getProduct([ + { 'label': 'BlackBerry', 'pattern': 'BB10' }, + 'BlackBerry', + { 'label': 'Galaxy S', 'pattern': 'GT-I9000' }, + { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' }, + { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' }, + { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' }, + { 'label': 'Galaxy S5', 'pattern': 'SM-G900' }, + { 'label': 'Galaxy S6', 'pattern': 'SM-G920' }, + { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' }, + { 'label': 'Galaxy S7', 'pattern': 'SM-G930' }, + { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' }, + 'Google TV', + 'Lumia', + 'iPad', + 'iPod', + 'iPhone', + 'Kindle', + { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, + 'Nexus', + 'Nook', + 'PlayBook', + 'PlayStation Vita', + 'PlayStation', + 'TouchPad', + 'Transformer', + { 'label': 'Wii U', 'pattern': 'WiiU' }, + 'Wii', + 'Xbox One', + { 'label': 'Xbox 360', 'pattern': 'Xbox' }, + 'Xoom' + ]); + + /* Detectable manufacturers. */ + var manufacturer = getManufacturer({ + 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 }, + 'Alcatel': {}, + 'Archos': {}, + 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 }, + 'Asus': { 'Transformer': 1 }, + 'Barnes & Noble': { 'Nook': 1 }, + 'BlackBerry': { 'PlayBook': 1 }, + 'Google': { 'Google TV': 1, 'Nexus': 1 }, + 'HP': { 'TouchPad': 1 }, + 'HTC': {}, + 'Huawei': {}, + 'Lenovo': {}, + 'LG': {}, + 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 }, + 'Motorola': { 'Xoom': 1 }, + 'Nintendo': { 'Wii U': 1, 'Wii': 1 }, + 'Nokia': { 'Lumia': 1 }, + 'Oppo': {}, + 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 }, + 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 }, + 'Xiaomi': { 'Mi': 1, 'Redmi': 1 } + }); + + /* Detectable operating systems (order is important). */ + var os = getOS([ + 'Windows Phone', + 'KaiOS', + 'Android', + 'CentOS', + { 'label': 'Chrome OS', 'pattern': 'CrOS' }, + 'Debian', + { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' }, + 'Fedora', + 'FreeBSD', + 'Gentoo', + 'Haiku', + 'Kubuntu', + 'Linux Mint', + 'OpenBSD', + 'Red Hat', + 'SuSE', + 'Ubuntu', + 'Xubuntu', + 'Cygwin', + 'Symbian OS', + 'hpwOS', + 'webOS ', + 'webOS', + 'Tablet OS', + 'Tizen', + 'Linux', + 'Mac OS X', + 'Macintosh', + 'Mac', + 'Windows 98;', + 'Windows ' + ]); + + /*------------------------------------------------------------------------*/ + + /** + * Picks the layout engine from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected layout engine. + */ + function getLayout(guesses) { + return reduce(guesses, function(result, guess) { + return result || RegExp('\\b' + ( + guess.pattern || qualify(guess) + ) + '\\b', 'i').exec(ua) && (guess.label || guess); + }); + } + + /** + * Picks the manufacturer from an array of guesses. + * + * @private + * @param {Array} guesses An object of guesses. + * @returns {null|string} The detected manufacturer. + */ + function getManufacturer(guesses) { + return reduce(guesses, function(result, value, key) { + // Lookup the manufacturer by product or scan the UA for the manufacturer. + return result || ( + value[product] || + value[/^[a-z]+(?: +[a-z]+\b)*/i.exec(product)] || + RegExp('\\b' + qualify(key) + '(?:\\b|\\w*\\d)', 'i').exec(ua) + ) && key; + }); + } + + /** + * Picks the browser name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected browser name. + */ + function getName(guesses) { + return reduce(guesses, function(result, guess) { + return result || RegExp('\\b' + ( + guess.pattern || qualify(guess) + ) + '\\b', 'i').exec(ua) && (guess.label || guess); + }); + } + + /** + * Picks the OS name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected OS name. + */ + function getOS(guesses) { + return reduce(guesses, function(result, guess) { + var pattern = guess.pattern || qualify(guess); + if (!result && (result = + RegExp('\\b' + pattern + '(?:/[\\d.]+|[ \\w.]*)', 'i').exec(ua) + )) { + result = cleanupOS(result, pattern, guess.label || guess); + } + return result; + }); + } + + /** + * Picks the product name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected product name. + */ + function getProduct(guesses) { + return reduce(guesses, function(result, guess) { + var pattern = guess.pattern || qualify(guess); + if (!result && (result = + RegExp('\\b' + pattern + ' *\\d+[.\\w_]*', 'i').exec(ua) || + RegExp('\\b' + pattern + ' *\\w+-[\\w]*', 'i').exec(ua) || + RegExp('\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)', 'i').exec(ua) + )) { + // Split by forward slash and append product version if needed. + if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\d.]+/.test(result[0])) { + result[0] += ' ' + result[1]; + } + // Correct character case and cleanup string. + guess = guess.label || guess; + result = format(result[0] + .replace(RegExp(pattern, 'i'), guess) + .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ') + .replace(RegExp('(' + guess + ')[-_.]?(\\w)', 'i'), '$1 $2')); + } + return result; + }); + } + + /** + * Resolves the version using an array of UA patterns. + * + * @private + * @param {Array} patterns An array of UA patterns. + * @returns {null|string} The detected version. + */ + function getVersion(patterns) { + return reduce(patterns, function(result, pattern) { + return result || (RegExp(pattern + + '(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null; + }); + } + + /** + * Returns `platform.description` when the platform object is coerced to a string. + * + * @name toString + * @memberOf platform + * @returns {string} Returns `platform.description` if available, else an empty string. + */ + function toStringPlatform() { + return this.description || ''; + } + + /*------------------------------------------------------------------------*/ + + // Convert layout to an array so we can add extra details. + layout && (layout = [layout]); + + // Detect Android products. + // Browsers on Android devices typically provide their product IDS after "Android;" + // up to "Build" or ") AppleWebKit". + // Example: + // "Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36 + // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36" + if (/\bAndroid\b/.test(os) && !product && + (data = /\bAndroid[^;]*;(.*?)(?:Build|\) AppleWebKit)\b/i.exec(ua))) { + product = trim(data[1]) + // Replace any language codes (eg. "en-US"). + .replace(/^[a-z]{2}-[a-z]{2};\s*/i, '') + || null; + } + // Detect product names that contain their manufacturer's name. + if (manufacturer && !product) { + product = getProduct([manufacturer]); + } else if (manufacturer && product) { + product = product + .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\s]', 'i'), manufacturer + ' ') + .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\w)', 'i'), manufacturer + ' $2'); + } + // Clean up Google TV. + if ((data = /\bGoogle TV\b/.exec(product))) { + product = data[0]; + } + // Detect simulators. + if (/\bSimulator\b/i.test(ua)) { + product = (product ? product + ' ' : '') + 'Simulator'; + } + // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS. + if (name == 'Opera Mini' && /\bOPiOS\b/.test(ua)) { + description.push('running in Turbo/Uncompressed mode'); + } + // Detect IE Mobile 11. + if (name == 'IE' && /\blike iPhone OS\b/.test(ua)) { + data = parse(ua.replace(/like iPhone OS/, '')); + manufacturer = data.manufacturer; + product = data.product; + } + // Detect iOS. + else if (/^iP/.test(product)) { + name || (name = 'Safari'); + os = 'iOS' + ((data = / OS ([\d_]+)/i.exec(ua)) + ? ' ' + data[1].replace(/_/g, '.') + : ''); + } + // Detect Kubuntu. + else if (name == 'Konqueror' && /^Linux\b/i.test(os)) { + os = 'Kubuntu'; + } + // Detect Android browsers. + else if ((manufacturer && manufacturer != 'Google' && + ((/Chrome/.test(name) && !/\bMobile Safari\b/i.test(ua)) || /\bVita\b/.test(product))) || + (/\bAndroid\b/.test(os) && /^Chrome/.test(name) && /\bVersion\//i.test(ua))) { + name = 'Android Browser'; + os = /\bAndroid\b/.test(os) ? os : 'Android'; + } + // Detect Silk desktop/accelerated modes. + else if (name == 'Silk') { + if (!/\bMobi/i.test(ua)) { + os = 'Android'; + description.unshift('desktop mode'); + } + if (/Accelerated *= *true/i.test(ua)) { + description.unshift('accelerated'); + } + } + // Detect UC Browser speed mode. + else if (name == 'UC Browser' && /\bUCWEB\b/.test(ua)) { + description.push('speed mode'); + } + // Detect PaleMoon identifying as Firefox. + else if (name == 'PaleMoon' && (data = /\bFirefox\/([\d.]+)\b/.exec(ua))) { + description.push('identifying as Firefox ' + data[1]); + } + // Detect Firefox OS and products running Firefox. + else if (name == 'Firefox' && (data = /\b(Mobile|Tablet|TV)\b/i.exec(ua))) { + os || (os = 'Firefox OS'); + product || (product = data[1]); + } + // Detect false positives for Firefox/Safari. + else if (!name || (data = !/\bMinefield\b/i.test(ua) && /\b(?:Firefox|Safari)\b/.exec(name))) { + // Escape the `/` for Firefox 1. + if (name && !product && /[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) { + // Clear name of false positives. + name = null; + } + // Reassign a generic name. + if ((data = product || manufacturer || os) && + (product || manufacturer || /\b(?:Android|Symbian OS|Tablet OS|webOS)\b/.test(os))) { + name = /[a-z]+(?: Hat)?/i.exec(/\bAndroid\b/.test(os) ? os : data) + ' Browser'; + } + } + // Add Chrome version to description for Electron. + else if (name == 'Electron' && (data = (/\bChrome\/([\d.]+)\b/.exec(ua) || 0)[1])) { + description.push('Chromium ' + data); + } + // Detect non-Opera (Presto-based) versions (order is important). + if (!version) { + version = getVersion([ + '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\d.]+$)|UCBrowser|YaBrowser)', + 'Version', + qualify(name), + '(?:Firefox|Minefield|NetFront)' + ]); + } + // Detect stubborn layout engines. + if ((data = + layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' || + /\bOpera\b/.test(name) && (/\bOPR\b/.test(ua) ? 'Blink' : 'Presto') || + /\b(?:Midori|Nook|Safari)\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' || + !layout && /\bMSIE\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') || + layout == 'WebKit' && /\bPlayStation\b(?! Vita\b)/i.test(name) && 'NetFront' + )) { + layout = [data]; + } + // Detect Windows Phone 7 desktop mode. + if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua) || 0)[1])) { + name += ' Mobile'; + os = 'Windows Phone ' + (/\+$/.test(data) ? data : data + '.x'); + description.unshift('desktop mode'); + } + // Detect Windows Phone 8.x desktop mode. + else if (/\bWPDesktop\b/i.test(ua)) { + name = 'IE Mobile'; + os = 'Windows Phone 8.x'; + description.unshift('desktop mode'); + version || (version = (/\brv:([\d.]+)/.exec(ua) || 0)[1]); + } + // Detect IE 11 identifying as other browsers. + else if (name != 'IE' && layout == 'Trident' && (data = /\brv:([\d.]+)/.exec(ua))) { + if (name) { + description.push('identifying as ' + name + (version ? ' ' + version : '')); + } + name = 'IE'; + version = data[1]; + } + // Leverage environment features. + if (useFeatures) { + // Detect server-side environments. + // Rhino has a global function while others have a global object. + if (isHostType(context, 'global')) { + if (java) { + data = java.lang.System; + arch = data.getProperty('os.arch'); + os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version'); + } + if (rhino) { + try { + version = context.require('ringo/engine').version.join('.'); + name = 'RingoJS'; + } catch(e) { + if ((data = context.system) && data.global.system == context.system) { + name = 'Narwhal'; + os || (os = data[0].os || null); + } + } + if (!name) { + name = 'Rhino'; + } + } + else if ( + typeof context.process == 'object' && !context.process.browser && + (data = context.process) + ) { + if (typeof data.versions == 'object') { + if (typeof data.versions.electron == 'string') { + description.push('Node ' + data.versions.node); + name = 'Electron'; + version = data.versions.electron; + } else if (typeof data.versions.nw == 'string') { + description.push('Chromium ' + version, 'Node ' + data.versions.node); + name = 'NW.js'; + version = data.versions.nw; + } + } + if (!name) { + name = 'Node.js'; + arch = data.arch; + os = data.platform; + version = /[\d.]+/.exec(data.version); + version = version ? version[0] : null; + } + } + } + // Detect Adobe AIR. + else if (getClassOf((data = context.runtime)) == airRuntimeClass) { + name = 'Adobe AIR'; + os = data.flash.system.Capabilities.os; + } + // Detect PhantomJS. + else if (getClassOf((data = context.phantom)) == phantomClass) { + name = 'PhantomJS'; + version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch); + } + // Detect IE compatibility modes. + else if (typeof doc.documentMode == 'number' && (data = /\bTrident\/(\d+)/i.exec(ua))) { + // We're in compatibility mode when the Trident version + 4 doesn't + // equal the document mode. + version = [version, doc.documentMode]; + if ((data = +data[1] + 4) != version[1]) { + description.push('IE ' + version[1] + ' mode'); + layout && (layout[1] = ''); + version[1] = data; + } + version = name == 'IE' ? String(version[1].toFixed(1)) : version[0]; + } + // Detect IE 11 masking as other browsers. + else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\b/.test(name)) { + description.push('masking as ' + name + ' ' + version); + name = 'IE'; + version = '11.0'; + layout = ['Trident']; + os = 'Windows'; + } + os = os && format(os); + } + // Detect prerelease phases. + if (version && (data = + /(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version) || + /(?:alpha|beta)(?: ?\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) || + /\bMinefield\b/i.test(ua) && 'a' + )) { + prerelease = /b/i.test(data) ? 'beta' : 'alpha'; + version = version.replace(RegExp(data + '\\+?$'), '') + + (prerelease == 'beta' ? beta : alpha) + (/\d+\+?/.exec(data) || ''); + } + // Detect Firefox Mobile. + if (name == 'Fennec' || name == 'Firefox' && /\b(?:Android|Firefox OS|KaiOS)\b/.test(os)) { + name = 'Firefox Mobile'; + } + // Obscure Maxthon's unreliable version. + else if (name == 'Maxthon' && version) { + version = version.replace(/\.[\d.]+/, '.x'); + } + // Detect Xbox 360 and Xbox One. + else if (/\bXbox\b/i.test(product)) { + if (product == 'Xbox 360') { + os = null; + } + if (product == 'Xbox 360' && /\bIEMobile\b/.test(ua)) { + description.unshift('mobile mode'); + } + } + // Add mobile postfix. + else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) && + (os == 'Windows CE' || /Mobi/i.test(ua))) { + name += ' Mobile'; + } + // Detect IE platform preview. + else if (name == 'IE' && useFeatures) { + try { + if (context.external === null) { + description.unshift('platform preview'); + } + } catch(e) { + description.unshift('embedded'); + } + } + // Detect BlackBerry OS version. + // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp + else if ((/\bBlackBerry\b/.test(product) || /\bBB10\b/.test(ua)) && (data = + (RegExp(product.replace(/ +/g, ' *') + '/([.\\d]+)', 'i').exec(ua) || 0)[1] || + version + )) { + data = [data, /BB10/.test(ua)]; + os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0]; + version = null; + } + // Detect Opera identifying/masking itself as another browser. + // http://www.opera.com/support/kb/view/843/ + else if (this != forOwn && product != 'Wii' && ( + (useFeatures && opera) || + (/Opera/.test(name) && /\b(?:MSIE|Firefox)\b/i.test(ua)) || + (name == 'Firefox' && /\bOS X (?:\d+\.){2,}/.test(os)) || + (name == 'IE' && ( + (os && !/^Win/.test(os) && version > 5.5) || + /\bWindows XP\b/.test(os) && version > 8 || + version == 8 && !/\bTrident\b/.test(ua) + )) + ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) { + // When "identifying", the UA contains both Opera and the other browser's name. + data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : ''); + if (reOpera.test(name)) { + if (/\bIE\b/.test(data) && os == 'Mac OS') { + os = null; + } + data = 'identify' + data; + } + // When "masking", the UA contains only the other browser's name. + else { + data = 'mask' + data; + if (operaClass) { + name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2')); + } else { + name = 'Opera'; + } + if (/\bIE\b/.test(data)) { + os = null; + } + if (!useFeatures) { + version = null; + } + } + layout = ['Presto']; + description.push(data); + } + // Detect WebKit Nightly and approximate Chrome/Safari versions. + if ((data = (/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { + // Correct build number for numeric comparison. + // (e.g. "532.5" becomes "532.05") + data = [parseFloat(data.replace(/\.(\d)$/, '.0$1')), data]; + // Nightly builds are postfixed with a "+". + if (name == 'Safari' && data[1].slice(-1) == '+') { + name = 'WebKit Nightly'; + prerelease = 'alpha'; + version = data[1].slice(0, -1); + } + // Clear incorrect browser versions. + else if (version == data[1] || + version == (data[2] = (/\bSafari\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { + version = null; + } + // Use the full Chrome version when available. + data[1] = (/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(ua) || 0)[1]; + // Detect Blink layout engine. + if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') { + layout = ['Blink']; + } + // Detect JavaScriptCore. + // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi + if (!useFeatures || (!likeChrome && !data[1])) { + layout && (layout[1] = 'like Safari'); + data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12'); + } else { + layout && (layout[1] = 'like Chrome'); + data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28'); + } + // Add the postfix of ".x" or "+" for approximate versions. + layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+')); + // Obscure version for some Safari 1-2 releases. + if (name == 'Safari' && (!version || parseInt(version) > 45)) { + version = data; + } else if (name == 'Chrome' && /\bHeadlessChrome/i.test(ua)) { + description.unshift('headless'); + } + } + // Detect Opera desktop modes. + if (name == 'Opera' && (data = /\bzbov|zvav$/.exec(os))) { + name += ' '; + description.unshift('desktop mode'); + if (data == 'zvav') { + name += 'Mini'; + version = null; + } else { + name += 'Mobile'; + } + os = os.replace(RegExp(' *' + data + '$'), ''); + } + // Detect Chrome desktop mode. + else if (name == 'Safari' && /\bChrome\b/.exec(layout && layout[1])) { + description.unshift('desktop mode'); + name = 'Chrome Mobile'; + version = null; + + if (/\bOS X\b/.test(os)) { + manufacturer = 'Apple'; + os = 'iOS 4.3+'; + } else { + os = null; + } + } + // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number. + else if (/\bSRWare Iron\b/.test(name) && !version) { + version = getVersion('Chrome'); + } + // Strip incorrect OS versions. + if (version && version.indexOf((data = /[\d.]+$/.exec(os))) == 0 && + ua.indexOf('/' + data + '-') > -1) { + os = trim(os.replace(data, '')); + } + // Ensure OS does not include the browser name. + if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) { + os = os.replace(RegExp(' *' + qualify(name) + ' *'), ''); + } + // Add layout engine. + if (layout && !/\b(?:Avant|Nook)\b/.test(name) && ( + /Browser|Lunascape|Maxthon/.test(name) || + name != 'Safari' && /^iOS/.test(os) && /\bSafari\b/.test(layout[1]) || + /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) { + // Don't add layout details to description if they are falsey. + (data = layout[layout.length - 1]) && description.push(data); + } + // Combine contextual information. + if (description.length) { + description = ['(' + description.join('; ') + ')']; + } + // Append manufacturer to description. + if (manufacturer && product && product.indexOf(manufacturer) < 0) { + description.push('on ' + manufacturer); + } + // Append product to description. + if (product) { + description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product); + } + // Parse the OS into an object. + if (os) { + data = / ([\d.+]+)$/.exec(os); + isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/'; + os = { + 'architecture': 32, + 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os, + 'version': data ? data[1] : null, + 'toString': function() { + var version = this.version; + return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : ''); + } + }; + } + // Add browser/OS architecture. + if ((data = /\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch)) && !/\bi686\b/i.test(arch)) { + if (os) { + os.architecture = 64; + os.family = os.family.replace(RegExp(' *' + data), ''); + } + if ( + name && (/\bWOW64\b/i.test(ua) || + (useFeatures && /\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\bWin64; x64\b/i.test(ua))) + ) { + description.unshift('32-bit'); + } + } + // Chrome 39 and above on OS X is always 64-bit. + else if ( + os && /^OS X/.test(os.family) && + name == 'Chrome' && parseFloat(version) >= 39 + ) { + os.architecture = 64; + } + + ua || (ua = null); + + /*------------------------------------------------------------------------*/ + + /** + * The platform object. + * + * @name platform + * @type Object + */ + var platform = {}; + + /** + * The platform description. + * + * @memberOf platform + * @type string|null + */ + platform.description = ua; + + /** + * The name of the browser's layout engine. + * + * The list of common layout engines include: + * "Blink", "EdgeHTML", "Gecko", "Trident" and "WebKit" + * + * @memberOf platform + * @type string|null + */ + platform.layout = layout && layout[0]; + + /** + * The name of the product's manufacturer. + * + * The list of manufacturers include: + * "Apple", "Archos", "Amazon", "Asus", "Barnes & Noble", "BlackBerry", + * "Google", "HP", "HTC", "LG", "Microsoft", "Motorola", "Nintendo", + * "Nokia", "Samsung" and "Sony" + * + * @memberOf platform + * @type string|null + */ + platform.manufacturer = manufacturer; + + /** + * The name of the browser/environment. + * + * The list of common browser names include: + * "Chrome", "Electron", "Firefox", "Firefox for iOS", "IE", + * "Microsoft Edge", "PhantomJS", "Safari", "SeaMonkey", "Silk", + * "Opera Mini" and "Opera" + * + * Mobile versions of some browsers have "Mobile" appended to their name: + * eg. "Chrome Mobile", "Firefox Mobile", "IE Mobile" and "Opera Mobile" + * + * @memberOf platform + * @type string|null + */ + platform.name = name; + + /** + * The alpha/beta release indicator. + * + * @memberOf platform + * @type string|null + */ + platform.prerelease = prerelease; + + /** + * The name of the product hosting the browser. + * + * The list of common products include: + * + * "BlackBerry", "Galaxy S4", "Lumia", "iPad", "iPod", "iPhone", "Kindle", + * "Kindle Fire", "Nexus", "Nook", "PlayBook", "TouchPad" and "Transformer" + * + * @memberOf platform + * @type string|null + */ + platform.product = product; + + /** + * The browser's user agent string. + * + * @memberOf platform + * @type string|null + */ + platform.ua = ua; + + /** + * The browser/environment version. + * + * @memberOf platform + * @type string|null + */ + platform.version = name && version; + + /** + * The name of the operating system. + * + * @memberOf platform + * @type Object + */ + platform.os = os || { + + /** + * The CPU architecture the OS is built for. + * + * @memberOf platform.os + * @type number|null + */ + 'architecture': null, + + /** + * The family of the OS. + * + * Common values include: + * "Windows", "Windows Server 2008 R2 / 7", "Windows Server 2008 / Vista", + * "Windows XP", "OS X", "Linux", "Ubuntu", "Debian", "Fedora", "Red Hat", + * "SuSE", "Android", "iOS" and "Windows Phone" + * + * @memberOf platform.os + * @type string|null + */ + 'family': null, + + /** + * The version of the OS. + * + * @memberOf platform.os + * @type string|null + */ + 'version': null, + + /** + * Returns the OS string. + * + * @memberOf platform.os + * @returns {string} The OS string. + */ + 'toString': function() { return 'null'; } + }; + + platform.parse = parse; + platform.toString = toStringPlatform; + + if (platform.version) { + description.unshift(version); + } + if (platform.name) { + description.unshift(name); + } + if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) { + description.push(product ? '(' + os + ')' : 'on ' + os); + } + if (description.length) { + platform.description = description.join(' '); + } + return platform; + } + + /*--------------------------------------------------------------------------*/ + + // Export platform. + var platform = parse(); + + // Some AMD build optimizers, like r.js, check for condition patterns like the following: + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + // Expose platform on the global object to prevent errors when platform is + // loaded by a script tag in the presence of an AMD loader. + // See http://requirejs.org/docs/errors.html#mismatch for more details. + root.platform = platform; + + // Define as an anonymous module so platform can be aliased through path mapping. + define(function() { + return platform; + }); + } + // Check for `exports` after `define` in case a build optimizer adds an `exports` object. + else if (freeExports && freeModule) { + // Export for CommonJS support. + forOwn(platform, function(value, key) { + freeExports[key] = value; + }); + } + else { + // Export to the global object. + root.platform = platform; + } + }.call(this)); \ No newline at end of file diff --git a/web/pelicanconf.py b/web/pelicanconf.py new file mode 100644 index 0000000..26f51d6 --- /dev/null +++ b/web/pelicanconf.py @@ -0,0 +1,59 @@ +# Disable Setext Headers Monkey Patch +from markdown import blockprocessors as bp +class NoProcessing(bp.BlockProcessor): + def test(self, parent, block): + return False +bp.SetextHeaderProcessor = NoProcessing + +AUTHOR = 'NFC' +SITENAME = 'NFC' + +THEME = 'nfc-theme' +PLUGIN_PATHS = ['plugins'] +TIMEZONE = 'Asia/Jerusalem' + +DEFAULT_LANG = 'English' + +# Feed generation is usually not desired when developing +FEED_ALL_ATOM = None +CATEGORY_FEED_ATOM = None +TRANSLATION_FEED_ATOM = None +AUTHOR_FEED_ATOM = None +AUTHOR_FEED_RSS = None + +DEFAULT_PAGINATION = False + +# Uncomment following line if you want document-relative URLs when developing +#RELATIVE_URLS = True + +MARKDOWN = { + 'extension_configs': { + 'markdown.extensions.tables':{}, + 'markdown.extensions.footnotes':{}, + 'markdown.extensions.nl2br':{}, + } +} + +ARTICLE_URL = "{slug}.html" +ARTICLE_SAVE_AS = "{slug}.html" +INDEX_SAVE_AS = "tags/index.html" +ARCHIVES_SAVE_AS = '' +AUTHOR_SAVE_AS = '' +AUTHORS_SAVE_AS = '' +TAGS_SAVE_AS = '' + +PATH = 'content' +ARTICLE_PATHS = ['tags',] +PAGE_PATHS = ['pages',] + +SUMMARY_MAX_LENGTH = 0 +DEFAULT_DATE_FORMAT = '%Y-%m-%d' + +DEFAULT_CATEGORY = 'tag' +CATEGORIES_SAVE_AS = 'projects/index.html' +CATEGORY_URL = 'projects/{slug}/index.html' +CATEGORY_SAVE_AS = 'projects/{slug}/index.html' + +DELETE_OUTPUT_DIRECTORY = True + +PLUGINS = ['geohash'] \ No newline at end of file diff --git a/web/plugins/geohash/__init__.py b/web/plugins/geohash/__init__.py new file mode 100644 index 0000000..c58722d --- /dev/null +++ b/web/plugins/geohash/__init__.py @@ -0,0 +1 @@ +from .geohash import * \ No newline at end of file diff --git a/web/plugins/geohash/__pycache__/__init__.cpython-310.pyc b/web/plugins/geohash/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f07bf7798705cc61ef410d0e20b1572ffc93736 GIT binary patch literal 169 zcmd1j<>g{vU|?W0@k~wier-VQ&MB{(voA! vQg{vU|@)__Df-9Vqka-;vi!t1_lNP1_p*=4F(2=6owSW9EM!RC`LvQn<FiJ8kU`k<0VO_|yfH{S2 zA)^aJGh+->EmJKsx;&WAZo^Q*vVgUQsfIa)V{XEsmW0^RyS_BH5Vvvafj73rm3=EoVx7Z6(b25_?^S~BG@j?SGz9c_Cr?^O%fq?;HEJ!uP dM0B%la`RJ4b5iX%e4Ri literal 0 HcmV?d00001 diff --git a/web/plugins/geohash/geohash.py b/web/plugins/geohash/geohash.py new file mode 100644 index 0000000..a8d1e79 --- /dev/null +++ b/web/plugins/geohash/geohash.py @@ -0,0 +1,12 @@ +from pelican import signals +import geohash_tools as gh + +def generate_geohash(generator): + for article in generator.articles: + if "location" in article.metadata: + lat, lon = [float(i) for i in article.metadata['location'].replace(' ', '').split(',')] + article.metadata['latlon'] = article.metadata['location'].replace(' ', '') + article.metadata['geohash'] = gh.encode(lat, lon, 11) + +def register(): + signals.article_generator_finalized.connect(generate_geohash) \ No newline at end of file diff --git a/web/publishconf.py b/web/publishconf.py new file mode 100644 index 0000000..be3909b --- /dev/null +++ b/web/publishconf.py @@ -0,0 +1,21 @@ +# This file is only used if you use `make publish` or +# explicitly specify it as your config file. + +import os +import sys +sys.path.append(os.curdir) +from pelicanconf import * + +# If your site is available via HTTPS, make sure SITEURL begins with https:// +SITEURL = '' +RELATIVE_URLS = False + +FEED_ALL_ATOM = 'feeds/all.atom.xml' +CATEGORY_FEED_ATOM = 'feeds/{slug}.atom.xml' + +DELETE_OUTPUT_DIRECTORY = True + +# Following items are often useful when publishing + +#DISQUS_SITENAME = "" +#GOOGLE_ANALYTICS = "" \ No newline at end of file diff --git a/web/tasks.py b/web/tasks.py new file mode 100644 index 0000000..ba03676 --- /dev/null +++ b/web/tasks.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- + +import os +import shlex +import shutil +import sys +import datetime + +from invoke import task +from invoke.main import program +from invoke.util import cd +from pelican import main as pelican_main +from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer +from pelican.settings import DEFAULT_CONFIG, get_settings_from_file + +OPEN_BROWSER_ON_SERVE = True +SETTINGS_FILE_BASE = 'pelicanconf.py' +SETTINGS = {} +SETTINGS.update(DEFAULT_CONFIG) +LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE) +SETTINGS.update(LOCAL_SETTINGS) + +CONFIG = { + 'settings_base': SETTINGS_FILE_BASE, + 'settings_publish': 'publishconf.py', + # Output path. Can be absolute or relative to tasks.py. Default: 'output' + 'deploy_path': SETTINGS['OUTPUT_PATH'], + # Remote server configuration + 'ssh_user': 'root', + 'ssh_host': 'localhost', + 'ssh_port': '22', + 'ssh_path': '/var/www', + # Host and port for `serve` + 'host': 'localhost', + 'port': 8000, +} + +@task +def clean(c): + """Remove generated files""" + if os.path.isdir(CONFIG['deploy_path']): + shutil.rmtree(CONFIG['deploy_path']) + os.makedirs(CONFIG['deploy_path']) + +@task +def build(c): + """Build local version of site""" + pelican_run('-s {settings_base}'.format(**CONFIG)) + +@task +def rebuild(c): + """`build` with the delete switch""" + pelican_run('-d -s {settings_base}'.format(**CONFIG)) + +@task +def regenerate(c): + """Automatically regenerate site upon file modification""" + pelican_run('-r -s {settings_base}'.format(**CONFIG)) + +@task +def serve(c): + """Serve site at http://$HOST:$PORT/ (default is localhost:8000)""" + + class AddressReuseTCPServer(RootedHTTPServer): + allow_reuse_address = True + + server = AddressReuseTCPServer( + CONFIG['deploy_path'], + (CONFIG['host'], CONFIG['port']), + ComplexHTTPRequestHandler) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + sys.stderr.write('Serving at {host}:{port} ...\n'.format(**CONFIG)) + server.serve_forever() + +@task +def reserve(c): + """`build`, then `serve`""" + build(c) + serve(c) + +@task +def preview(c): + """Build production version of site""" + pelican_run('-s {settings_publish}'.format(**CONFIG)) + +@task +def livereload(c): + """Automatically reload browser tab upon file modification.""" + from livereload import Server + + def cached_build(): + cmd = '-s {settings_base} -e CACHE_CONTENT=true LOAD_CONTENT_CACHE=true' + pelican_run(cmd.format(**CONFIG)) + + cached_build() + server = Server() + theme_path = SETTINGS['THEME'] + watched_globs = [ + CONFIG['settings_base'], + '{}/templates/**/*.html'.format(theme_path), + ] + + content_file_extensions = ['.md', '.rst'] + for extension in content_file_extensions: + content_glob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension) + watched_globs.append(content_glob) + + static_file_extensions = ['.css', '.js'] + for extension in static_file_extensions: + static_file_glob = '{0}/static/**/*{1}'.format(theme_path, extension) + watched_globs.append(static_file_glob) + + for glob in watched_globs: + server.watch(glob, cached_build) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + server.serve(host=CONFIG['host'], port=CONFIG['port'], root=CONFIG['deploy_path']) + + +@task +def publish(c): + """Publish to production via rsync""" + pelican_run('-s {settings_publish}'.format(**CONFIG)) + c.run( + 'rsync --delete --exclude ".DS_Store" -pthrvz -c ' + '-e "ssh -p {ssh_port}" ' + '{} {ssh_user}@{ssh_host}:{ssh_path}'.format( + CONFIG['deploy_path'].rstrip('/') + '/', + **CONFIG)) + + +def pelican_run(cmd): + cmd += ' ' + program.core.remainder # allows to pass-through args to pelican + pelican_main(shlex.split(cmd)) \ No newline at end of file