Browse Source

Initial commit - v0.1.0

master
Eric Woodward 11 months ago
commit
769c04c294

+ 3
- 0
.gitignore View File

@@ -0,0 +1,3 @@
1
+base_uri
2
+node_modules
3
+www

+ 5
- 0
LICENSE.md View File

@@ -0,0 +1,5 @@
1
+**Source and Content released under CC0 Public Domain License v1.0**
2
+
3
+To the extent possible under law, and except where otherwise indicated, Eric Woodward has waived all copyright and related or neighboring rights to [both the source and content of the Wonder Dome website](https://git.itsericwoodward.com/eric/wonderdome-site/).
4
+
5
+http://creativecommons.org/publicdomain/zero/1.0/

+ 35
- 0
README.md View File

@@ -0,0 +1,35 @@
1
+# The Wonder Dome
2
+
3
+This website serves as a tiny, little source of information about a specific tiny, little server sitting in a tiny, little house nestled in a tiny, little suburb of Charlotte, NC, USA, Earth.
4
+
5
+You can see this site at: https://www.wonderdome.net/
6
+
7
+## Installing
8
+
9
++ Requires: [git](https://git-scm.com/), [Node](https://nodejs.org/), [Gulp](http://gulpjs.com/), and a static web server (we recommend [nginx](https://nginx.org/)).
10
+
11
++ Clone from the git repo:
12
+
13
+    git clone https://git.itsericwoodward.com/eric/wonderdome-site.git wonderdome
14
+
15
++ Go into the directory for the site:
16
+
17
+    cd wonderdome
18
+
19
++ Install the required NPM libraries:
20
+
21
+    npm install
22
+
23
++ Put the site's base URI in a file called `base_uri` (or copy one of the supplied ones, based on your chosen environment):
24
+
25
+    cp base_uri.production base_uri
26
+
27
++ Build the site
28
+
29
+    gulp build
30
+
31
++ The build command will output to the `www` directory.
32
+
33
++ Point the web server to the `www` directory.
34
+
35
++ Share and enjoy!

+ 105
- 0
assets/fonts/LICENSE.md View File

@@ -0,0 +1,105 @@
1
+   Copyright (c) 2010, Matt McInerney <matt@pixelspread.com>, with Reserved Font Name: "Raleway".
2
+
3
+        This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+        This license is copied below, and is also available with a FAQ at:
5
+        http://scripts.sil.org/OFL
6
+
7
+        Version 1.1 - 26 February 2007
8
+
9
+
10
+SIL Open Font License
11
+====================================================
12
+
13
+
14
+Preamble
15
+----------
16
+
17
+The goals of the Open Font License (OFL) are to stimulate worldwide
18
+development of collaborative font projects, to support the font creation
19
+efforts of academic and linguistic communities, and to provide a free and
20
+open framework in which fonts may be shared and improved in partnership
21
+with others.
22
+
23
+The OFL allows the licensed fonts to be used, studied, modified and
24
+redistributed freely as long as they are not sold by themselves. The
25
+fonts, including any derivative works, can be bundled, embedded,
26
+redistributed and/or sold with any software provided that any reserved
27
+names are not used by derivative works. The fonts and derivatives,
28
+however, cannot be released under any other type of license. The
29
+requirement for fonts to remain under this license does not apply
30
+to any document created using the fonts or their derivatives.
31
+
32
+Definitions
33
+-------------
34
+
35
+`"Font Software"` refers to the set of files released by the Copyright
36
+Holder(s) under this license and clearly marked as such. This may
37
+include source files, build scripts and documentation.
38
+
39
+`"Reserved Font Name"` refers to any names specified as such after the
40
+copyright statement(s).
41
+
42
+`"Original Version"` refers to the collection of Font Software components as
43
+distributed by the Copyright Holder(s).
44
+
45
+`"Modified Version"` refers to any derivative made by adding to, deleting,
46
+or substituting -- in part or in whole -- any of the components of the
47
+Original Version, by changing formats or by porting the Font Software to a
48
+new environment.
49
+
50
+`"Author"` refers to any designer, engineer, programmer, technical
51
+writer or other person who contributed to the Font Software.
52
+
53
+Permission & Conditions
54
+------------------------
55
+
56
+Permission is hereby granted, free of charge, to any person obtaining
57
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
58
+redistribute, and sell modified and unmodified copies of the Font
59
+Software, subject to the following conditions:
60
+
61
+1. Neither the Font Software nor any of its individual components,
62
+in Original or Modified Versions, may be sold by itself.
63
+
64
+2. Original or Modified Versions of the Font Software may be bundled,
65
+redistributed and/or sold with any software, provided that each copy
66
+contains the above copyright notice and this license. These can be
67
+included either as stand-alone text files, human-readable headers or
68
+in the appropriate machine-readable metadata fields within text or
69
+binary files as long as those fields can be easily viewed by the user.
70
+
71
+3. No Modified Version of the Font Software may use the Reserved Font
72
+Name(s) unless explicit written permission is granted by the corresponding
73
+Copyright Holder. This restriction only applies to the primary font name as
74
+presented to the users.
75
+
76
+4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font
77
+Software shall not be used to promote, endorse or advertise any
78
+Modified Version, except to acknowledge the contribution(s) of the
79
+Copyright Holder(s) and the Author(s) or with their explicit written
80
+permission.
81
+
82
+5. The Font Software, modified or unmodified, in part or in whole,
83
+must be distributed entirely under this license, and must not be
84
+distributed under any other license. The requirement for fonts to
85
+remain under this license does not apply to any document created
86
+using the Font Software.
87
+
88
+Termination
89
+-----------
90
+
91
+This license becomes null and void if any of the above conditions are
92
+not met.
93
+
94
+
95
+DISCLAIMER
96
+
97
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
98
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
99
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
100
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
101
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
102
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
103
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
104
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
105
+OTHER DEALINGS IN THE FONT SOFTWARE.

BIN
assets/fonts/raleway-bold.eot View File


+ 3278
- 0
assets/fonts/raleway-bold.svg
File diff suppressed because it is too large
View File


BIN
assets/fonts/raleway-bold.ttf View File


BIN
assets/fonts/raleway-bold.woff View File


BIN
assets/fonts/raleway-regular.eot View File


+ 3278
- 0
assets/fonts/raleway-regular.svg
File diff suppressed because it is too large
View File


BIN
assets/fonts/raleway-regular.ttf View File


BIN
assets/fonts/raleway-regular.woff View File


BIN
assets/images/404-bg.jpg View File


BIN
assets/images/server_pic.jpg View File


BIN
assets/images/title-bg.jpg View File


BIN
assets/images/wonderdome-bg.jpg View File


+ 8
- 0
assets/scripts/1-docready.min.js View File

@@ -0,0 +1,8 @@
1
+ /* @license
2
+docready.js
3
+https://github.com/jfriend00/docReady
4
+The MIT License (MIT)
5
+Copyright (c) 2014 John Friend
6
+*/
7
+
8
+!function(t,e){"use strict";function n(){if(!a){a=!0;for(var t=0;t<o.length;t++)o[t].fn.call(window,o[t].ctx);o=[]}}function d(){"complete"===document.readyState&&n()}t=t||"docReady",e=e||window;var o=[],a=!1,c=!1;e[t]=function(t,e){return a?void setTimeout(function(){t(e)},1):(o.push({fn:t,ctx:e}),void("complete"===document.readyState||!document.attachEvent&&"interactive"===document.readyState?setTimeout(n,1):c||(document.addEventListener?(document.addEventListener("DOMContentLoaded",n,!1),window.addEventListener("load",n,!1)):(document.attachEvent("onreadystatechange",d),window.attachEvent("onload",n)),c=!0)))}}("docReady",window);

+ 8
- 0
assets/scripts/2-lazy-progressive-enhancement.min.js View File

@@ -0,0 +1,8 @@
1
+/* @license
2
+lazy-progressive-enhancement.js
3
+https://github.com/tvler/lazy-progressive-enhancement
4
+The MIT License (MIT)
5
+Copyright (c) 2016 Tyler Deitz
6
+*/
7
+
8
+function loadMedia(t,e,n){"use strict";function r(t){if(t==null){t=document.querySelectorAll("noscript")}else if(t instanceof Element){t=[t]}else if(typeof t==="string"){t=document.querySelectorAll(t)}return t}function i(t,e){return window.setInterval(function(){var n=t.getBoundingClientRect(),r=150;if(n.bottom>=-r&&n.top-window.innerHeight<r&&(n.right>=-r&&n.left-window.innerWidth<r)){window.clearInterval(t.getAttribute("data-intervalid"));t.srcset=t.getAttribute("data-srcset");t.src=t.getAttribute("data-src");e&&e()}},100)}function a(t){var a,A,l="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";for(var d=0;d<(t=r(t)).length;d++){A=(new DOMParser).parseFromString((a=t[d]).textContent,"text/html").body.firstElementChild;if(n){A.setAttribute("data-src",A.getAttribute("src"));A.setAttribute("data-srcset",A.getAttribute("srcset")||"");A.src=A.srcset=l;a.parentElement.replaceChild(A,a);A.setAttribute("data-intervalid",i(A,e&&e.bind(A)))}else{A.onload=e;a.parentElement.replaceChild(A,a)}}}var A=function(){a(t)};if(document.readyState!=="loading"){A()}else{document.addEventListener("DOMContentLoaded",A)}}

+ 9
- 0
assets/scripts/3-js.cookie.min.js View File

@@ -0,0 +1,9 @@
1
+/*!
2
+ * JavaScript Cookie v2.1.1
3
+ * https://github.com/js-cookie/js-cookie
4
+ *
5
+ * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
6
+ * Released under the MIT license
7
+ */
8
+ 
9
+!function(e){if("function"==typeof define&&define.amd)define(e);else if("object"==typeof exports)module.exports=e();else{var n=window.Cookies,o=window.Cookies=e();o.noConflict=function(){return window.Cookies=n,o}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}function n(o){function t(n,i,r){var c;if("undefined"!=typeof document){if(arguments.length>1){if(r=e({path:"/"},t.defaults,r),"number"==typeof r.expires){var s=new Date;s.setMilliseconds(s.getMilliseconds()+864e5*r.expires),r.expires=s}try{c=JSON.stringify(i),/^[\{\[]/.test(c)&&(i=c)}catch(e){}return i=o.write?o.write(i,n):encodeURIComponent(String(i)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=encodeURIComponent(String(n)),n=n.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),n=n.replace(/[\(\)]/g,escape),document.cookie=[n,"=",i,r.expires&&"; expires="+r.expires.toUTCString(),r.path&&"; path="+r.path,r.domain&&"; domain="+r.domain,r.secure?"; secure":""].join("")}n||(c={});for(var a=document.cookie?document.cookie.split("; "):[],p=/(%[0-9A-Z]{2})+/g,d=0;d<a.length;d++){var f=a[d].split("="),u=f[0].replace(p,decodeURIComponent),l=f.slice(1).join("=");'"'===l.charAt(0)&&(l=l.slice(1,-1));try{if(l=o.read?o.read(l,u):o(l,u)||l.replace(p,decodeURIComponent),this.json)try{l=JSON.parse(l)}catch(e){}if(n===u){c=l;break}n||(c[u]=l)}catch(e){}}return c}}return t.set=t,t.get=function(e){return t(e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(n,o){t(n,"",e(o,{expires:-1}))},t.withConverter=n,t}return n(function(){})});

+ 18
- 0
assets/scripts/4-fontfaceobserver.min.js View File

@@ -0,0 +1,18 @@
1
+/* @license
2
+fontfaceobserver.js
3
+https://github.com/bramstein/fontfaceobserver
4
+The BSD License
5
+Copyright 2014-2016 Bram Stein. All rights reserved.
6
+*/
7
+
8
+(function(){'use strict';var f,g=[];function l(a){g.push(a);1==g.length&&f()}function m(){for(;g.length;)g[0](),g.shift()}f=function(){setTimeout(m)};function n(a){this.a=p;this.b=void 0;this.f=[];var b=this;try{a(function(a){q(b,a)},function(a){r(b,a)})}catch(c){r(b,c)}}var p=2;function t(a){return new n(function(b,c){c(a)})}function u(a){return new n(function(b){b(a)})}function q(a,b){if(a.a==p){if(b==a)throw new TypeError;var c=!1;try{var d=b&&b.then;if(null!=b&&"object"==typeof b&&"function"==typeof d){d.call(b,function(b){c||q(a,b);c=!0},function(b){c||r(a,b);c=!0});return}}catch(e){c||r(a,e);return}a.a=0;a.b=b;v(a)}}
9
+function r(a,b){if(a.a==p){if(b==a)throw new TypeError;a.a=1;a.b=b;v(a)}}function v(a){l(function(){if(a.a!=p)for(;a.f.length;){var b=a.f.shift(),c=b[0],d=b[1],e=b[2],b=b[3];try{0==a.a?"function"==typeof c?e(c.call(void 0,a.b)):e(a.b):1==a.a&&("function"==typeof d?e(d.call(void 0,a.b)):b(a.b))}catch(h){b(h)}}})}n.prototype.g=function(a){return this.c(void 0,a)};n.prototype.c=function(a,b){var c=this;return new n(function(d,e){c.f.push([a,b,d,e]);v(c)})};
10
+function w(a){return new n(function(b,c){function d(c){return function(d){h[c]=d;e+=1;e==a.length&&b(h)}}var e=0,h=[];0==a.length&&b(h);for(var k=0;k<a.length;k+=1)u(a[k]).c(d(k),c)})}function x(a){return new n(function(b,c){for(var d=0;d<a.length;d+=1)u(a[d]).c(b,c)})};window.Promise||(window.Promise=n,window.Promise.resolve=u,window.Promise.reject=t,window.Promise.race=x,window.Promise.all=w,window.Promise.prototype.then=n.prototype.c,window.Promise.prototype["catch"]=n.prototype.g);}());
11
+
12
+(function(){var k=!!document.addEventListener;function l(a,b){k?a.addEventListener("scroll",b,!1):a.attachEvent("scroll",b)}function v(a){document.body?a():k?document.addEventListener("DOMContentLoaded",a):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||a()})};function w(a){this.a=document.createElement("div");this.a.setAttribute("aria-hidden","true");this.a.appendChild(document.createTextNode(a));this.b=document.createElement("span");this.c=document.createElement("span");this.h=document.createElement("span");this.f=document.createElement("span");this.g=-1;this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";
13
+this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)}
14
+function y(a,b){a.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+b+";"}function z(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+"px";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function A(a,b){function c(){var a=m;z(a)&&null!==a.a.parentNode&&b(a.g)}var m=a;l(a.b,c);l(a.c,c);z(a)};function B(a,b){var c=b||{};this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal"}var C=null,D=null,H=!!window.FontFace;function I(){if(null===D){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}D=""!==a.style.font}return D}function J(a,b){return[a.style,a.weight,I()?a.stretch:"","100px",b].join(" ")}
15
+B.prototype.load=function(a,b){var c=this,m=a||"BESbswy",x=b||3E3,E=(new Date).getTime();return new Promise(function(a,b){if(H){var K=new Promise(function(a,b){function e(){(new Date).getTime()-E>=x?b():document.fonts.load(J(c,c.family),m).then(function(c){1<=c.length?a():setTimeout(e,25)},function(){b()})}e()}),L=new Promise(function(a,c){setTimeout(c,x)});Promise.race([L,K]).then(function(){a(c)},function(){b(c)})}else v(function(){function q(){var b;if(b=-1!=f&&-1!=g||-1!=f&&-1!=h||-1!=g&&-1!=
16
+h)(b=f!=g&&f!=h&&g!=h)||(null===C&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),C=!!b&&(536>parseInt(b[1],10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=C&&(f==r&&g==r&&h==r||f==t&&g==t&&h==t||f==u&&g==u&&h==u)),b=!b;b&&(null!==d.parentNode&&d.parentNode.removeChild(d),clearTimeout(G),a(c))}function F(){if((new Date).getTime()-E>=x)null!==d.parentNode&&d.parentNode.removeChild(d),b(c);else{var a=document.hidden;if(!0===a||void 0===a)f=e.a.offsetWidth,g=n.a.offsetWidth,
17
+h=p.a.offsetWidth,q();G=setTimeout(F,50)}}var e=new w(m),n=new w(m),p=new w(m),f=-1,g=-1,h=-1,r=-1,t=-1,u=-1,d=document.createElement("div"),G=0;d.dir="ltr";y(e,J(c,"sans-serif"));y(n,J(c,"serif"));y(p,J(c,"monospace"));d.appendChild(e.a);d.appendChild(n.a);d.appendChild(p.a);document.body.appendChild(d);r=e.a.offsetWidth;t=n.a.offsetWidth;u=p.a.offsetWidth;F();A(e,function(a){f=a;q()});y(e,J(c,'"'+c.family+'",sans-serif'));A(n,function(a){g=a;q()});y(n,J(c,'"'+c.family+'",serif'));A(p,function(a){h=
18
+a;q()});y(p,J(c,'"'+c.family+'",monospace'))})})};window.FontFaceObserver=B;window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=B.prototype.load;"undefined"!==typeof module&&(module.exports=window.FontFaceObserver);}());

+ 76
- 0
assets/scripts/scripts.js View File

@@ -0,0 +1,76 @@
1
+/****************************************************************************
2
+ * WonderDome.net
3
+ *
4
+ * Copyright 2018 Eric Woodward
5
+ * https://git.itsericwoodward.com/eric/wonderdome-site/
6
+ *
7
+ * Source released under CC0 Public Domain License v1.0
8
+ * http://creativecommons.org/publicdomain/zero/1.0/
9
+ ****************************************************************************/
10
+;
11
+
12
+(function(){
13
+  'use strict';
14
+
15
+  if (document.documentElement.className && document.documentElement.className.indexOf('lt-ie8') == -1) {
16
+    var
17
+      protocol = window.location.protocol;
18
+
19
+    // Indicate JS is loaded
20
+    document.documentElement.className = document.documentElement.className.replace('no-js', 'js');
21
+
22
+    // Enable cached fonts ASAP
23
+    if (typeof Cookies !== 'undefined' && Cookies.get('fonts_loaded') === 'false' ? false : !!Cookies.get('fonts_loaded')) {
24
+      document.documentElement.className += " js-hasFontsLoaded";
25
+    }
26
+
27
+    docReady(function() {
28
+      setTimeout(function() {
29
+        // Handle Fonts
30
+        if (typeof Cookies !== 'undefined') {
31
+          if (typeof FontFaceObserver !== 'undefined') {
32
+            var
33
+              font = new FontFaceObserver('raleway');
34
+            font
35
+              .load()
36
+              .then(function () {
37
+                if (document.documentElement.className.indexOf("js-hasFontsLoaded") == -1) {
38
+                  document.documentElement.className += " js-hasFontsLoaded";
39
+                }
40
+                Cookies.set('fonts_loaded', true);
41
+              });
42
+          }
43
+        }
44
+
45
+        // Lazy-Load Media
46
+        if (typeof loadMedia === 'function') {
47
+          loadMedia('.js-lazyLoader', null, true);
48
+        }
49
+        if (
50
+            document.documentElement.className.indexOf('is404') > -1 &&
51
+            document.getElementById("searchQuery")
52
+          ) {
53
+            document
54
+              .getElementById("searchQuery")
55
+              .value =
56
+                window
57
+                  .location
58
+                  .pathname
59
+                  .replace(/\\.html?$/, "")
60
+                  .replace(/\//g, " ");
61
+        }
62
+        if (document.getElementById("searchForm")) {
63
+          document
64
+            .getElementById("searchForm")
65
+            .addEventListener ("submit",
66
+              function(e) {
67
+                document
68
+                  .getElementById("searchQuery")
69
+                  .value += " site:" + window.location.hostname;
70
+              }
71
+            );
72
+        }
73
+      }, 1);
74
+    });
75
+  }
76
+})();

+ 23
- 0
assets/styles/fonts.css View File

@@ -0,0 +1,23 @@
1
+@font-face {
2
+    font-family: 'raleway';
3
+    src: url('/fonts/raleway-regular.eot');
4
+    src: url('/fonts/raleway-regular.eot?#iefix') format('embedded-opentype'),
5
+         url('/fonts/raleway-regular.woff') format('woff'),
6
+         url('/fonts/raleway-regular.ttf') format('truetype'),
7
+         url('/fonts/raleway-regular.svg#rock_saltregular') format('svg');
8
+    font-weight: normal;
9
+    font-style: normal;
10
+
11
+}
12
+
13
+@font-face {
14
+    font-family: 'raleway';
15
+    src: url('/fonts/raleway-bold.eot');
16
+    src: url('/fonts/raleway-bold.eot?#iefix') format('embedded-opentype'),
17
+         url('/fonts/raleway-bold.woff') format('woff'),
18
+         url('/fonts/raleway-bold.ttf') format('truetype'),
19
+         url('/fonts/raleway-bold.svg#rock_saltregular') format('svg');
20
+    font-weight: bold;
21
+    font-style: normal;
22
+
23
+}

+ 1
- 0
assets/styles/normalize.min.css View File

@@ -0,0 +1 @@
1
+/*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}

+ 331
- 0
assets/styles/style.css View File

@@ -0,0 +1,331 @@
1
+/*
2
+ * WonderDome.net
3
+ *
4
+ * Copyright 2018 Eric Woodward
5
+ * https://git.itsericwoodward.com/eric/wonderdome-site/
6
+ *
7
+ * Source released under CC0 Public Domain License v1.0
8
+ * http://creativecommons.org/publicdomain/zero/1.0/
9
+ */
10
+
11
+/* ==========================================================================
12
+   Default settings
13
+   ========================================================================== */
14
+
15
+/* Assumes Normalize already applied */
16
+
17
+/* set options */
18
+@charset "UTF-8";
19
+@-ms-viewport {
20
+  width: device-width;
21
+}
22
+
23
+@viewport {
24
+  width: device-width;
25
+}
26
+
27
+/* apply a natural box layout model to all elements */
28
+*, *:before, *:after {
29
+  -moz-box-sizing: border-box;
30
+  -webkit-box-sizing: border-box;
31
+  box-sizing: border-box;
32
+}
33
+
34
+html {
35
+  font-size: 16px;
36
+}
37
+
38
+/* Fix 300ms Delay */
39
+a, button {
40
+  -ms-touch-action: manipulation; /* IE10  */
41
+  touch-action: manipulation;     /* IE11+ */
42
+}
43
+
44
+/* ==========================================================================
45
+   Helper classes
46
+   ========================================================================== */
47
+
48
+.clearfix:before,
49
+.clearfix:after {
50
+  content: " ";
51
+  display: table;
52
+}
53
+
54
+.clearfix:after {
55
+  clear: both;
56
+}
57
+
58
+.clearfix {
59
+  *zoom: 1;
60
+}
61
+
62
+.pullRight{
63
+  float: right;
64
+}
65
+
66
+code, kbd, pre, samp {
67
+  font-size: .8em;
68
+}
69
+
70
+/* ==========================================================================
71
+   Site styles
72
+   ========================================================================== */
73
+
74
+/*
75
+  Using "Pleroma Dark" for colors.
76
+
77
+  BG: #121a24
78
+  FG: #182230
79
+  Text: #b9b9ba
80
+  Links: #d8a070
81
+  Blue (follow, reply): #0095ff
82
+  Orange (favorties): ffa500
83
+
84
+  Red (cancel): #d31014
85
+  Green (Retweet): #0fa00f
86
+
87
+*/
88
+
89
+html {
90
+  color: #b9b9ba;
91
+  background: url("/images/wonderdome-bg.jpg") no-repeat center top fixed;
92
+  background-size: cover;
93
+  font-family: 'raleway', 'Liberation Sans', sans-serif;
94
+  font-size: 18px;
95
+  line-height: 1.5em;
96
+}
97
+
98
+a {
99
+  border: 1px solid transparent;
100
+  border-bottom: 1px dashed #e7c6a9;
101
+  border-radius: 0;
102
+  color: #d8a070;
103
+  padding: .3em .2em .2em;
104
+  text-decoration: none;
105
+  -webkit-transition: .3s background-color, .3s color, .3s border-radius;
106
+  transition: .3s background-color, .3s color, .3s border-radius;
107
+}
108
+
109
+a:hover {
110
+  background-color: #e7c6a9;
111
+  background-color: rgba(216,160,112,.4);
112
+  border: 1px solid #e7c6a9;
113
+  border-radius: .5em;
114
+  color: #ffffff;
115
+}
116
+
117
+figcaption {
118
+  font-size: .85em;
119
+}
120
+
121
+h2 {
122
+  text-align: center;
123
+  line-height: 1.25em;
124
+}
125
+
126
+li {
127
+  margin-bottom: .6em;
128
+}
129
+
130
+ol, ul {
131
+  padding-left: 1.2em;
132
+}
133
+
134
+.licenseLink {
135
+  display: inline-block;
136
+  border: 1px solid transparent;
137
+  border-bottom: 1px solid transparent;
138
+  vertical-align: baseline;
139
+}
140
+
141
+.logoImg {
142
+  display: block;
143
+  margin: auto;
144
+}
145
+
146
+.page {
147
+  background-color: #121a24;
148
+  background-color: rgba(18,26,36,.9);
149
+  border: 1px solid #121a24;
150
+  border-radius: 1em;
151
+  margin: 0 auto;
152
+  max-width: 50em;
153
+  padding: 1em;
154
+}
155
+
156
+.pageFooter {
157
+  border-top: 1px solid #293039;
158
+  font-size: .85em;
159
+}
160
+
161
+.pageHeader {
162
+  margin-top: 1.5em;
163
+}
164
+
165
+.serverPic-img {
166
+  border-radius: .5em;
167
+  display: inline;
168
+  max-width: 100%;
169
+}
170
+
171
+.serverPic-link {
172
+  border-bottom: 1px solid transparent;
173
+  display: block;
174
+  margin: 1em auto;
175
+  max-width: 30em;
176
+  text-align: center;
177
+  width: 80%;
178
+}
179
+
180
+.siteTitle {
181
+  display: block;
182
+  margin: auto;
183
+  width: 10em;
184
+  height: auto;
185
+  max-width: 10em;
186
+  width: 67%;
187
+}
188
+
189
+.siteTitle-link {
190
+  border-bottom: 1px solid transparent;
191
+  display: block;
192
+  margin: 0 auto;
193
+  max-width: 4em;
194
+  padding: .2em;
195
+  text-align: center;
196
+}
197
+
198
+.siteTitle-link:hover {
199
+  border-radius: 1em;
200
+}
201
+
202
+.topLink {
203
+  display: block;
204
+  font-size: .85em;
205
+  font-size: .85rem;
206
+  margin: 1em auto;
207
+  text-align: center;
208
+  width: 6.5em;
209
+  width: -moz-fit-content;
210
+}
211
+
212
+/* ==========================================================================
213
+   JS Overrides
214
+   ========================================================================== */
215
+
216
+html.js-hasFontsLoaded {
217
+  line-height: 1.75em;
218
+}
219
+
220
+/* ==========================================================================
221
+   Media Queries
222
+   ========================================================================== */
223
+
224
+@media only screen and (min-width: 30em) {
225
+  html {
226
+    font-size: 20px;
227
+  }
228
+  .page {
229
+    max-width: 42em;
230
+  }
231
+}
232
+@media only screen and (min-width: 40em) {
233
+  a {
234
+    white-space:nowrap;
235
+  }
236
+}
237
+
238
+@media only screen and (min-width: 50em) {
239
+  html {
240
+    font-size: 22px;
241
+  }
242
+
243
+  .navMenu-navbar {
244
+    background-color: #808080;
245
+    background: rgba(80,80,80,.6);
246
+  }
247
+  .page {
248
+    max-width: 44em;
249
+  }
250
+
251
+}
252
+
253
+@media only screen and (min-width: 66em) {
254
+/* NOTHING YET */
255
+}
256
+
257
+/* ==========================================================================
258
+   Print styles
259
+   ========================================================================== */
260
+
261
+@media print {
262
+  * {
263
+    text-shadow: none !important;
264
+    color: #000 !important;
265
+    background: transparent !important;
266
+    box-shadow: none !important;
267
+  }
268
+  a,
269
+  a:visited {
270
+    text-decoration: underline;
271
+  }
272
+  a[href]:after {
273
+    content: " (" attr(href) ")";
274
+  }
275
+  abbr[title]:after {
276
+    content: " (" attr(title) ")";
277
+  }
278
+  a[href^="javascript:"]:after,
279
+  a[href^="#"]:after {
280
+    content: "";
281
+  }
282
+  pre,
283
+  blockquote {
284
+    border: 1px solid #999;
285
+    page-break-inside: avoid;
286
+  }
287
+  thead {
288
+    display: table-header-group;
289
+  }
290
+  tr,
291
+  img {
292
+    page-break-inside: avoid;
293
+  }
294
+  img {
295
+    max-width: 100% !important;
296
+  }
297
+  p,
298
+  h2,
299
+  h3 {
300
+    orphans: 3;
301
+    widows: 3;
302
+  }
303
+  h2,
304
+  h3 {
305
+    page-break-after: avoid;
306
+  }
307
+  select {
308
+    background: #FFFDD7 !important;
309
+  }
310
+  .navbar {
311
+    display: none;
312
+  }
313
+  .table td,
314
+  .table th {
315
+    background-color: #FFFDD7 !important;
316
+  }
317
+  .btn > .caret,
318
+  .dropup > .btn > .caret {
319
+    border-top-color: #000 !important;
320
+  }
321
+  .label {
322
+    border: 1px solid #000;
323
+  }
324
+  .table {
325
+    border-collapse: collapse !important;
326
+  }
327
+  .table-bordered th,
328
+  .table-bordered td {
329
+    border: 1px solid #ddd !important;
330
+  }
331
+}

+ 1
- 0
base_uri.development View File

@@ -0,0 +1 @@
1
+http://wd.local

+ 1
- 0
base_uri.production View File

@@ -0,0 +1 @@
1
+https://www.wonderdome.net

+ 71
- 0
content/pages/guide.md View File

@@ -0,0 +1,71 @@
1
+---
2
+title: A Brief Guide to Getting Started in the Fediverse
3
+description: As the title says, this guide helps get started in the Fediverse by introducing some key concepts, then explains how to get an account, before finally covering how to find good accounts to follow.
4
+date_pub: 2018-07-04T04:14:00-04:00
5
+date_upd: 2018-07-07T01:25:00-04:00
6
+content_type: formatted
7
+short_code: gd
8
+---
9
+
10
+## A Brief Guide to Getting Started in the Fediverse
11
+
12
+I've only been active in the Fediverse since February, but I've become so excited by the idea of it that I've made it my mission to help other people get online. The first step in this, for me, is to get several of my family and friends on the Fediverse, and I figured that it might be useful to have a document to help them figure out where to go after they sign up. This is that document.
13
+
14
+But first, a few quick terms.
15
+
16
+<a href="#" class="topLink">[ Back to Top ]</a>
17
+
18
+### Fediverse Terms
19
+
20
++ **The Fediverse** - A network of different decentralized social media application instances (web sites with special capabilities) which communicate with each other via one or more protocols (ActivityPub, OStatus, etc). Anyone with enough tech savy can run one of these applications on a server, creating a new instance, and expanding the Fediverse. Some instances are public, allowing anyone to join, while others are private, limited only to a specific group of people (or sometimes just a single person). Some the applications used to make up the Fediverse include...
21
+  + **[Mastodon](https://joinmastodon.org/)** - The most popular decentralized social media application by far (AFAIK). Features a [Tweetdeck](https://en.wikipedia.org/wiki/TweetDeck)-like, multi-column interface.
22
+  + **[Pleroma](https://pleroma.social/)** - Another decentralized social media application which is a little different from Mastodon, but still speaks the same protocols, allowing them to interact with each other. Pleroma is a significantly more lightweight application than Mastodon, and can actually be run on [an old computer in your house](/images/server_pic.jpg) (if you're willing and able to put the time into learning how).
23
+  + **[PeerTube](https://joinpeertube.org/)** - A relatively new application which aims to give a YouTube-like experience while using [peer-to-peer](https://en.wikipedia.org/wiki/Peer-to-peer) sharing to cut down on video hosting costs.
24
+  + Other applications include **[Friendica](https://friendi.ca/)** and **[Hubzilla](https://start.hubzilla.org/)**.
25
++ **Birdsite** - Another word for Twitter.
26
++ **Front-Ends** - One of the more interesting things about using the ActivityPub protocol is that it allows for developers to write applications that can support any ActivityPub server, not just a specific instance (or even a specific application). For example, most Pleroma instances also host copies of the Mastodon front-end, for people that prefer its [Tweetdeck](https://en.wikipedia.org/wiki/TweetDeck)-like interface. Other available front-ends include:
27
+  + [Pinafore](https://pinafore.social/), a most excellent (IMHO) web front-end that allows for a single user to manage multiple accounts (even on mobile).
28
+  + [Brutaldon](https://github.com/jfmcbrayer/brutaldon), a web front-end which supports terminal-based browsers like [Lynx](https://en.wikipedia.org/wiki/Lynx_(web_browser)).
29
+  + Or, if you'd prefer, you can choose to use one of the native Android or iOS frontend clients available in their respective stores.
30
++ **Toot** - A microblog entry on Mastodon, or the act of creating such an entry. On Pleroma, the equivalent term is **post** ([apparently](https://social.wonderdome.net/notice/3913)).
31
++ **Boost** - A reshare of a toot or post by someone else. Unlike on the birdsite, Pleroma and Mastodon don't support comments with the reshares, which (IMHO) seems to help minimize the "look at the stupid thing this person said" factor.
32
+
33
+OK, so now that we've gotten that out of the way, how should you actually get started in the Fediverse?
34
+
35
+<a href="#" class="topLink">[ Back to Top ]</a>
36
+
37
+### Step 1: Get an account.
38
+
39
+If you haven't been invited to join a specific instance and don't have a recommendation to go on (such as from a friend or associate), I'd suggest checking out [instances.social](https://instances.social/list), a website that lists a large number of Mastodon and Pleroma instances, many of which have open registrations.
40
+
41
+<a href="#" class="topLink">[ Back to Top ]</a>
42
+
43
+### Step 2: Follow people.
44
+
45
+Now that you're signed up, you need to start following others. So, how do you find people to follow? If you're signing up at a public instance (or even a private instance focused around some common interests or goals), you can start by viewing your instance's [Whole Known Network](https://pleroma.site/main/all) timeline. This timeline includes posts by people on that instance, as well as posts by the accounts that the people on that instance follow (for example, when you go to [mastodon.social](https://mastodon.social/), by default you'll see their Whole Known Network, consisting of every post from any account that's followed by at least one account on mastodon.social). Look for some posts that interest you, and follow the accounts that made those posts.
46
+
47
+If you're having trouble finding accounts to follow, you can use [instances.social](https://instances.social/list) for that, too. Just scroll through the list looking for instances devoted to [topics that](https://gamemaking.social/) [interest you](https://tenforward.social/), and follow some of the accounts that show up on their landing pages.
48
+
49
+Once you start following some accounts, if you're on a Pleroma instance, you'll probably see some posts in your feed that were made by people that you don't follow, and you may wonder how they got there. These are posts that have actually been _boosted_ by someone in your feed, but the Pleroma front-end (by default) doesn't explicitly indicate this.
50
+
51
+By the way, IMHO, this is one of the best aspects of the current version of the Fediverse: since there is no opaque [magic algorithm](http://www.slate.com/articles/technology/cover_story/2016/01/how_facebook_s_news_feed_algorithm_works.html) deciding for you what posts you should or shouldn't see, it's important to reshare the best of what you see in your feed, as *this makes the whole network better*.
52
+
53
+One quick word of warning - because of the way that both Mastodon and Pleroma are setup, once you start following an account, you won't actually see anything in your feed until those accounts start posting new material. As a result, it may take a few hours before your feed is fully populated with content, so be patient.
54
+
55
+<a href="#" class="topLink">[ Back to Top ]</a>
56
+
57
+### Step 3: Converse
58
+
59
+One of the things that I really like about the Fediverse is that it feels like the Twitter did back when I first joined in 2007: there aren't a ton of people (yet), almost no one has more than a few hundred followers (yet), and the businesses haven't taken over there (yet). But, unlike even the birdsite of yore, there is a much greater emphasis on community as opposed to the *performative* posts ("Look at me! Look at me!") that have dominated centralized social media for so long.
60
+
61
+So, once you start following people, the final step is to start actually conversing with them: reply to their questions, post questions of your own, and send messages of support when appropriate. As I said before, the smaller community size makes the connections that much more compelling, and the number of Mastodon and Pleroma instances virtually guarantees that there will be at least some other people out there who are into the same things you are.
62
+
63
+So, that's it. If you've followed the guide this far, you have now officially gotten started in the Fediverse. Where you go from here is up to you, and I hope you enjoy it as much as I do.
64
+
65
+One last thing - if you liked this guide, and enjoy reading posts about the web, surveillance capitalism, and/or [cats](https://social.wonderdome.net/notice/17646), you might consider following me, [@eric at the Wonder Dome](https://social.wonderdome.net/users/eric).
66
+
67
+And thanks for stopping by!
68
+
69
+<a href="#" class="topLink">[ Back to Top ]</a>
70
+
71
+_Now that you're a Fediverse whiz, you can either [check out Da Roolz for the Wonder Dome](./tos.html), or you can [go back to the front page](./index.html). You have the power!_

+ 27
- 0
content/pages/index.md View File

@@ -0,0 +1,27 @@
1
+---
2
+title: Welcome
3
+description: Welcome to the Wonder Dome, a tiny, little server sitting in a tiny, little house nestled in a tiny, little suburb of Charlotte, NC, USA, Earth.
4
+date_pub: 2018-07-04T03:26:00-04:00
5
+date_upd: 2018-07-07T01:21:00-04:00
6
+content_type: formatted
7
+---
8
+
9
+## Welcome to the Wonder Dome!
10
+
11
+You have stumbled upon a tiny, little server sitting in a tiny, little house nestled in a tiny, little suburb of Charlotte, NC, USA, Earth.
12
+
13
+<a href='/images/server_pic.jpg' class='serverPic-link'><figure><img src='/images/server_pic.jpg' alt='The Tiny, Little Wonder Dome Server' class='serverPic-img' /><figcaption>The Tiny, Little Wonder Dome Server</figcaption></figure></a>
14
+
15
+This box primarily serves as [a private Pleroma instance](https://social.wonderdome.net/) run by (and for) a certain family and their close ([meatspace](https://en.wikipedia.org/wiki/Real_life)) associates. Through this instance, said family (and said associates) may connect and converse with the [Fediverse](https://en.wikipedia.org/wiki/Fediverse)-at-large in an attempt to foster dialogue (and share [cat pictures](https://toot.cafe/@itsericwoodward/99988917928015328)) while avoiding the [evil corporate social media silos](https://indieweb.org/silo-quits).
16
+
17
+The main things you can find here are:
18
+
19
++ [The Terms of Service (aka *Da Roolz*)](./tos.html) for using the Wonder Dome's [Pleroma](https://pleroma.social/) instance (located at [social.wonderdome.net](https://social.wonderdome.net)), and
20
++ [A Brief Guide to Getting Started in the Fediverse](./guide.html), our brief guide to getting... started... in the.... Fediverse... Anyways, you should read it if you don't know where to begin with this whole "Mastodon / Pleroma / PeerTube / decentralized [birdsite](https://mastodon.social/tags/birdsite)" thing.
21
+
22
+If you have any questions or concerns about [our private Pleroma instance](https://social.wonderdome.net/) or [how to use it](./guide.html), please feel free to contact our admin [@eric via said instance](https://social.wonderdome.net/users/eric),
23
+or via e-mail at <a href="mailto:&#101;&#114;&#105;&#099;&#064;&#119;&#111;&#110;&#100;&#101;&#114;&#100;&#111;&#109;&#101;&#046;&#110;&#101;&#116;">&#101;&#114;&#105;&#099;&#064;&#119;&#111;&#110;&#100;&#101;&#114;&#100;&#111;&#109;&#101;&#046;&#110;&#101;&#116;</a>.
24
+
25
+Thanks for visiting!
26
+
27
+<a href="#" class="topLink">[ Back to Top ]</a>

+ 46
- 0
content/pages/tos.md View File

@@ -0,0 +1,46 @@
1
+---
2
+title: Terms of Service
3
+description: The Terms of Service for using the Pleroma instance located at social.wonderdome.net (aka Da Roolz).
4
+date_pub: 2018-07-04T03:59:00-04:00
5
+date_upd: 2018-07-07T01:21:00-04:00
6
+content_type: formatted
7
+short_code: ts
8
+---
9
+
10
+## Terms of Service for The Wonder Dome
11
+
12
+This document is intended to outline the general policy of the [Pleroma](https://pleroma.social/) instance at [social.wonderdome.net](https://social.wonderdome.net). It has been _heavily_ adapted from [the terms](https://info.pleroma.site/tos.html) used at [pleroma.site](https://pleroma.site).
13
+
14
+_Editor's note: Yes, we do take a light tone with the below roolz, but that's because we think "not being an jerk" should be the default way to behave, and shouldn't have to be spelled out in <strike>10</strike> **12** specific roolz. However, here you are, looking for roolz to follow, so we respectfully offer the following ones, in the hopes that we can cure society of all it's ills. Thanks. - The Editor_
15
+
16
+<a href="#" class="topLink">[ Back to Top ]</a>
17
+
18
+### Da Roolz
19
+
20
+Below are the <strike>10</strike> **12** simple roolz for using [social.wonderdome.net](https://social.wonderdome.net).
21
+
22
+1. You do not talk about Wonder Dome.
23
+2. On second thought, it's OK if you talk about Wonder Dome.
24
+3. If tonight's your first night, you gotta post something.
25
+4. Be excellent to each other. That means no harassment, stalking, or disclosure of others' personal details (doxing).
26
+5. Content which could be deemed inappropriate for a PG-13 movie or workplace environment should either be tagged <em>#nsfw</em>, or set as sensitive content, depending on the frontend used.
27
+6. There is no rool #6.
28
+7. If you, as a user of this instance, have trouble with a local or remote user violating these rules, _please do not take the law into your own hands_. Instead, contact an admin, as we can usually deal with the problem without resorting to bloodshed (usually). Likewise, we would prefer it if you don't contact the remote instance's admin about your troubles, as it tends to lead to bad blood between instances, but we will do so if we believe escalation is necessary.
29
+8. **We don't like spam!** As a result, mass-advertising content is prohibited. However, tastefully reminding your followers of things like Patreon or websites where they can purchase your content is perfectly fine.
30
+9. Content that is illegal in the United States is expressly prohibited, _no matter how stupid the laws banning such content may be_.
31
+10. There is still no rool #6, and now there is no rool #10.
32
+11. There are presently no content type restrictions on media uploads. *Please don't make us change this!* Uploading media that is malicious in nature (e.g. malware), or which belongs to others without permission or attribution, may result in us bringing down the ban-hammer.
33
+12. If you have any questions or concerns that aren't covered by the above policies, please feel free to [contact an admin](https://social.wonderdome.net/users/eric).
34
+
35
+<a href="#" class="topLink">[ Back to Top ]</a>
36
+
37
+### Moderator Contacts for Violations
38
+
39
+If you feel that you, or these rules, have been violated, please contact one of the below listed administrators:
40
+
41
++ [@eric](https://social.wonderdome.net/users/eric)
42
++ Sorry, he's the only one (so far), but believe us when we say that he's just as scared of you as you are of him.
43
+
44
+<a href="#" class="topLink">[ Back to Top ]</a>
45
+
46
+_From here, you can either [go put these terms to good use](./guide.html), or you can [go back to the front page](./index.html). The choice is yours!_

+ 69
- 0
content/support/error/404.html.ejs View File

@@ -0,0 +1,69 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+  <head>
4
+    <meta charset="utf-8">
5
+    <title>The Wonder Dome | Page Not Found</title>
6
+    <link rel="stylesheet" href="/styles/styles.<%= site.version -%>.css">
7
+    <style>
8
+      *, *:before, *:after {
9
+        box-sizing: inherit;
10
+      }
11
+
12
+      html {
13
+        box-sizing: border-box;
14
+        height: 100%;
15
+      }
16
+
17
+      a,
18
+      a:link {
19
+        color: #c9bb69;
20
+      }
21
+
22
+      a:visited {
23
+        color: #c57f5d;
24
+      }
25
+
26
+      a:hover {
27
+        color: #efb88f;
28
+      }
29
+
30
+      a:active {
31
+        background-color: #8c272d;
32
+        color: #efb88f;
33
+      }
34
+
35
+      body {
36
+          background: url("/images/404-bg.jpg") no-repeat center center fixed;
37
+          background-color: #121a24;
38
+          background-size: cover;
39
+          color: #b9b9ba;
40
+          line-height: 1.3em;
41
+          vertical-align: middle;
42
+      }
43
+      .container {
44
+        margin: 0 auto;
45
+        background-color: #333333;
46
+        background-color: rgba(33,33,33,.7);
47
+        border-radius: 1em;
48
+        max-width: 30em;
49
+        width: 100%;
50
+        padding: 2em;
51
+        margin: 2em auto;
52
+      }
53
+
54
+    </style>
55
+  </head>
56
+  <body>
57
+    <div class="container">
58
+      <h1>Page Not Found</h1>
59
+      <p>Sorry, but the page you were trying to view does not exist.</p>
60
+      <p>It looks like this was the result of either:</p>
61
+      <ul>
62
+        <li>a mistyped address,</li>
63
+        <li>an out-of-date link, or</li>
64
+        <li>a side effect of <a href="https://en.wikipedia.org/wiki/Hackers_(film)">some n00b trying to hack &quot;The Gibson&quot;</a>.</li>
65
+      </ul>
66
+      <p>You can <a href="javascript:history.go(-1);" title="Go back and hack!">go back and try again</a>, or just start over at the <a href="/" title="Give up and go to 127.0.0.1!">Wonder Dome home page</a>.</p>
67
+    </div>
68
+  </body>
69
+</html>

+ 56
- 0
content/support/feed.xml.ejs.off View File

@@ -0,0 +1,56 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
3
+  <channel>
4
+    <title><%- site.title %></title>
5
+    <link><%- site.uri %></link>
6
+    <description><%- site.description %></description>
7
+    <% if (language) { %>
8
+      <language><%= language %></language>
9
+    <% } %>
10
+    <% if (copyright) { %>
11
+      <copyright><%= copyright %></copyright>
12
+    <% } %>
13
+    <% 
14
+      if (keywords) {
15
+        var keywords = keywords.split(/\W+/);
16
+        for (var i=0; i < keywords.length; i++) {
17
+          if (keywords[i]) {
18
+          %>
19
+            <category><%= keywords[i] %></category>
20
+          <%
21
+          }
22
+        }
23
+      }  
24
+    %>
25
+    <% if (author.email) { %>
26
+      <managingEditor><%= author.email %></managingEditor>
27
+      <webMaster><%= author.email %></webMaster>
28
+    <% } %>
29
+    <% if (image) { %>
30
+      <image><%= image %></image>
31
+    <% } %>
32
+    <generator>HarpJS</generator>
33
+    <atom:link href="<%- site.uri %>/feed.xml" rel="self" type="application/rss+xml" />
34
+    <% 
35
+      for(slug in public._data) {
36
+        var 
37
+          post = public._data[slug],
38
+          now = new Date(),
39
+          then = post.date_pub ? new Date(post.date_pub) : new Date();
40
+        if (post.title && !post.is_draft && then.getTime() <= now.getTime()) {
41
+        %>
42
+          <item>
43
+            <title><%- post.title %></title>
44
+            <description><%= post.description %></description>
45
+            <pubDate><%= then.toUTCString() %></pubDate>
46
+            <link><%- site.uri %>/<%- slug %>.html</link>
47
+            <guid isPermaLink="true"><%- site.uri %>/<%- slug %>.html</guid>
48
+            
49
+          </item>
50
+        <% 
51
+        }
52
+      } 
53
+    %>
54
+  </channel>
55
+</rss>
56
+

+ 14
- 0
content/support/sitemap.xml.ejs View File

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+
3
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
4
+  <% site.pages.forEach(function(page) { -%>
5
+
6
+  <url>
7
+    <loc><%= page.path %></loc>
8
+    <lastmod><%= page.date %></lastmod>
9
+  </url>
10
+  <%
11
+    });
12
+  -%>
13
+
14
+</urlset>

+ 310
- 0
gulpfile.js View File

@@ -0,0 +1,310 @@
1
+var
2
+  // gulp
3
+  gulp            = require('gulp'),
4
+  cleancss        = require('gulp-clean-css'),
5
+  concat          = require('gulp-concat'),
6
+  frontmatter     = require('gulp-front-matter'),
7
+  imagemin        = require('gulp-imagemin'),
8
+  newer           = require('gulp-newer'),
9
+  rename          = require('gulp-rename'),
10
+
11
+  // components
12
+  del             = require('del'),
13
+  ejs             = require('ejs'),
14
+  fs              = require('fs'),
15
+  md              = require('markdown-it')({
16
+                      html:        true,
17
+                      xhtmlOut:    true,
18
+                      linkify:     true,
19
+                      typographer: true
20
+                    }),
21
+  path            = require('path'),
22
+  pump            = require('pump'),
23
+  seq             = require('run-sequence'),
24
+  through         = require('through2'),
25
+
26
+  // config
27
+  site            = require('./site.json'),
28
+  pkg             = require('./package.json'),
29
+
30
+  // variables
31
+  dest_dir        = 'www',
32
+  css_src_dir     = 'assets/styles',
33
+  js_src_dir      = 'assets/scripts',
34
+  pages_src_dir   = 'content/pages',
35
+  support_src_dir = 'content/support',
36
+
37
+  // functions
38
+  readFileIfExists = function (file_path){
39
+    try {
40
+      return fs.readFileSync(file_path, {encoding: 'utf8'});
41
+    } catch(err) {
42
+      if (err.code == 'ENOENT') return undefined;
43
+      throw err;
44
+    }
45
+  },
46
+
47
+  collectPages = function(base_path) {
48
+    var
49
+      fm = require('front-matter'),
50
+      pages = [],
51
+      tags = [];
52
+    return through.obj(function (file, enc, cb) {
53
+
54
+      var
55
+        data = fm.test(file.contents.toString()) ? fm(file.contents.toString()) : {},
56
+        contents = data && data.body ? data.body : file.contents.toString(),
57
+        page = file.page,
58
+        name = file.path.replace(file.base,'');
59
+      if (data && data.attributes) {
60
+        Object.assign(data.attributes, page)
61
+      }
62
+      page.content = contents;
63
+      page.path = file.path.replace(base_path, '');
64
+      page.path = page.path.substring(0, page.path.lastIndexOf('.')) + '.html';
65
+      page.name = page.path.substring(page.path.lastIndexOf('/') + 1, page.path.lastIndexOf('.'));
66
+
67
+      if (file.path.endsWith('.md')) {
68
+        page.content = md.render(contents);
69
+      } else if (file.path.endsWith('ejs')) {
70
+        page.content = ejs.render(contents, page, {});
71
+      }
72
+
73
+      pages.push(page);
74
+
75
+      if (page.tags) {
76
+        page.tags.split(' ').forEach(function (tag) {
77
+          if (tags.indexOf(tag) == -1) {
78
+            tags.push(tag);
79
+          }
80
+        });
81
+      }
82
+      this.push(file);
83
+      cb();
84
+    },
85
+    function (cb) {
86
+      if (site.pages) {
87
+        site.pages = site.pages.concat(pages);
88
+      } else {
89
+        site.pages = pages;
90
+      }
91
+      if (site.tags) {
92
+        site.tags = site.tags.concat(tags.filter(function (item) {
93
+            return tags.indexOf(item) < 0;
94
+        }));
95
+      } else {
96
+        site.tags = tags;
97
+      }
98
+
99
+      cb();
100
+    });
101
+  },
102
+
103
+  applyMarkdown = function() {
104
+    return through.obj(function (file, enc, cb) {
105
+      file.contents = new Buffer(md.render(file.contents.toString()), 'utf8');
106
+      this.push(file);
107
+      cb();
108
+    });
109
+
110
+  },
111
+
112
+  applyTemplate = function (template_file) {
113
+    // read template_file into a string
114
+    // pass string to ejs.render
115
+    var
116
+      filename = path.join(__dirname, template_file),
117
+      options = {
118
+        "filename": filename
119
+      },
120
+      template_str = fs.readFileSync(filename, 'utf8'),
121
+      tpl = ejs.compile(template_str, options);
122
+
123
+    return through.obj(function (file, enc, cb) {
124
+      var
125
+        name = file.path.replace(file.base,''),
126
+        data = {
127
+            name: name.substring(0, name.lastIndexOf('.')),
128
+            site: site,
129
+            page: file.page,
130
+            content: file.contents.toString()
131
+        };
132
+
133
+      file.contents = new Buffer(tpl(data), 'utf8');
134
+      this.push(file);
135
+      cb();
136
+    });
137
+  },
138
+
139
+  readJson = function () {
140
+    return through.obj(function (file, enc, cb) {
141
+      var data = readFileIfExists(path.join(path.dirname(file.path), path.basename(file.path)) + '.json');
142
+      if (data !== undefined) {
143
+        file.page = JSON.parse(data);
144
+      }
145
+      this.push(file);
146
+      cb();
147
+    });
148
+  },
149
+
150
+  parseEJS = function(){
151
+    return through.obj(function (file, enc, cb) {
152
+      var data = {
153
+          site: site,
154
+          page: file.page
155
+      };
156
+      file.contents = new Buffer(ejs.render(file.contents.toString(), data, {}));
157
+      this.push(file);
158
+      cb();
159
+    });
160
+  },
161
+
162
+  buildSupportFiles = function() {
163
+    var dest = dest_dir;
164
+    console.log('Building Support Files...');
165
+    return gulp
166
+      .src(path.join(support_src_dir,'**/*.ejs'))
167
+      .pipe(parseEJS())
168
+      .pipe(rename({
169
+        extname: ''
170
+      }))
171
+      .pipe(gulp.dest(dest));
172
+  }
173
+  ;
174
+
175
+site.time = new Date();
176
+site.base_uri = (readFileIfExists('./base_uri') || '').trim();
177
+site.version = pkg.version;
178
+
179
+gulp
180
+  .task('default', function() {
181
+    // place code for your default task here
182
+  })
183
+  // start with the files from the old web site
184
+  .task('css', function() {
185
+    var dest = path.join(dest_dir,'styles');
186
+    console.log('Concat & cache-bust CSS');
187
+    return gulp
188
+      // set source (src/**/*.css)
189
+      .src(path.join(css_src_dir,'*.css'))
190
+      // write to site.<pkg-ver>.css
191
+      .pipe(concat('styles.' + pkg.version + '.css'))
192
+      // write to dest/content
193
+      .pipe(gulp.dest(dest));
194
+  })
195
+  .task('files', function(){
196
+    var dest = path.join(dest_dir,'files');
197
+    console.log('Copy files');
198
+    return gulp
199
+      .src('assets/files/*')
200
+      .pipe(newer(dest))
201
+      .pipe(gulp.dest(dest));
202
+  })
203
+  .task('fonts', function(){
204
+    var dest = path.join(dest_dir,'fonts');
205
+    console.log('Copy fonts');
206
+    return gulp
207
+      .src('assets/fonts/**')
208
+      .pipe(newer(dest))
209
+      .pipe(gulp.dest(dest));
210
+  })
211
+  .task('images', function(){
212
+    var dest = path.join(dest_dir,'images');
213
+    console.log('Compress, cache and copy images');
214
+    return gulp
215
+      .src('assets/images/**/*')
216
+      .pipe(newer(dest))
217
+      .pipe(imagemin({
218
+        optimizationLevel: 3
219
+      }))
220
+      .pipe(gulp.dest(dest));
221
+  })
222
+  .task('js', function (cb) {
223
+    var dest = path.join(dest_dir,'scripts');
224
+    console.log('Cache-bust JS');
225
+    pump([
226
+        // set source
227
+        gulp.src(path.join(js_src_dir,'*.js')),
228
+        // write to scripts.<pkg-ver>.js
229
+        concat(`scripts.${pkg.version}.js`),
230
+        // write to dest
231
+        gulp.dest(dest)
232
+      ],
233
+      cb
234
+    );
235
+  })
236
+  .task('pages:md', function () {
237
+    var dest = dest_dir;
238
+    console.log('Building Pages (MD)...');
239
+    return gulp
240
+      .src(path.join(pages_src_dir,'**/*.md'))
241
+      .pipe(frontmatter({
242
+          property: 'page',
243
+          remove: true
244
+        }))
245
+      .pipe(collectPages(path.join(process.cwd(), pages_src_dir)))
246
+      .pipe(applyMarkdown())
247
+      .pipe(applyTemplate('./templates/default.ejs'))
248
+      .pipe(rename({extname: '.html'}))
249
+      .pipe(gulp.dest(dest));
250
+  })
251
+  .task('pages:ejs', function () {
252
+    var dest = dest_dir;
253
+    console.log('Building Pages (EJS)...');
254
+    return gulp
255
+      .src(path.join(pages_src_dir,'**/*.ejs'))
256
+      .pipe(frontmatter({
257
+          property: 'page',
258
+          remove: true
259
+        }))
260
+      .pipe(collectPages(path.join(process.cwd(), pages_src_dir)))
261
+      .pipe(parseEJS())
262
+      .pipe(applyTemplate('./templates/default.ejs'))
263
+      .pipe(rename({
264
+        extname: '.html'
265
+      }))
266
+      .pipe(gulp.dest(dest));
267
+  })
268
+  .task('support', buildSupportFiles)
269
+  .task('pages', function() {
270
+  	seq(
271
+  		'pages:md',
272
+      'pages:ejs'
273
+  	);
274
+  })
275
+
276
+  .task('build', [
277
+    'css', 'files', 'fonts', 'images', 'js', 'pages'
278
+  ], buildSupportFiles)
279
+  .task('clean', function () {
280
+    var dest = dest_dir;
281
+    return del([
282
+      dest
283
+    ]);
284
+  })
285
+
286
+  .task('watch', function() {
287
+      gulp.watch(css_src_dir, ['css']);
288
+      gulp.watch(js_src_dir, ['js']);
289
+      gulp.watch(pages_src_dir, ['pages']);
290
+      gulp.watch(support_src_dir, ['support']);
291
+  })
292
+
293
+  .task('test', function (cb) {
294
+    var dest = dest_dir;
295
+    console.log('Testing...');
296
+    pump([
297
+      gulp.src('content/pages/**/*.md'),
298
+      (function(){
299
+        return through.obj(function (file, enc, cb) {
300
+          var file_name = file.path.replace(file.base,'');
301
+          console.log(JSON.stringify(file_name.substring(0, file_name.lastIndexOf('.')), null, 2));
302
+          cb();
303
+        });
304
+      })()
305
+      ],
306
+      cb
307
+    );
308
+  })
309
+
310
+  ;

+ 34
- 0
package.json View File

@@ -0,0 +1,34 @@
1
+{
2
+  "name": "wonderdome-site",
3
+  "version": "0.1.0",
4
+  "description": "WonderDome.net static site, built using Gulp.",
5
+  "dependencies": {},
6
+  "devDependencies": {
7
+    "del": "^3.0.0",
8
+    "ejs": "^2.5.2",
9
+    "event-stream": "^3.3.4",
10
+    "front-matter": "^2.1.0",
11
+    "fs": "0.0.1-security",
12
+    "gulp": "^3.9.1",
13
+    "gulp-clean-css": "^3.9.2",
14
+    "gulp-concat": "^2.6.0",
15
+    "gulp-front-matter": "^1.3.0",
16
+    "gulp-imagemin": "^4.1.0",
17
+    "gulp-newer": "^1.2.0",
18
+    "gulp-rename": "^1.2.2",
19
+    "markdown-it": "^8.4.1",
20
+    "path": "^0.12.7",
21
+    "pump": "^3.0.0",
22
+    "run-sequence": "^2.2.1",
23
+    "through2": "^2.0.1"
24
+  },
25
+  "scripts": {
26
+    "test": "echo \"Error: no test specified\" && exit 1"
27
+  },
28
+  "author": "Eric Woodward",
29
+  "license": "CC0-1.0",
30
+  "repository": {
31
+    "type": "git",
32
+    "url": "git://git.itsericwoodward.com/eric/wonderdome-site.git"
33
+  }
34
+}

+ 11
- 0
site.json View File

@@ -0,0 +1,11 @@
1
+{
2
+  "title"      : "The Wonder Dome",
3
+  "author": {
4
+    "_desc"    : "*** Author Info ***",
5
+    "name"     : "Eric Woodward",
6
+    "email"    : "eric@itsericwoodward.com"
7
+  },
8
+  "robots"     : "index,follow",
9
+  "language"   : "en-us",
10
+  "copyright"  : "To the extent possible under law, Eric Woodward has waived all copyright and related or neighboring rights to the source for the Wonder Dome website."
11
+}

+ 14
- 0
templates/default.ejs View File

@@ -0,0 +1,14 @@
1
+<%- include("partials/top") %>
2
+<body>
3
+  <div class="page <%= (page.category || '').toLowerCase() %> <%= (page.name || '') %>">
4
+	  <header id="header" class="pageHeader pageSection">
5
+		  <div class="pageHeader-inner clearfix">
6
+			  <h1 class="siteTitle"><a href="/" class="siteTitle-link"><img src="https://social.wonderdome.net/static/wonderdome-logo.png" alt="<%= site.title %>" class="logoImg"></a></h1>
7
+		  </div>
8
+	  </header>
9
+	  <main id="content" class="pageMain pageSection">
10
+		  <div class="pageMain-inner">
11
+        <%- content %>
12
+		  </div>
13
+	  </main>
14
+<%- include("partials/bottom") %>

+ 42
- 0
templates/partials/bottom.ejs View File

@@ -0,0 +1,42 @@
1
+<footer id="footer" class="pageFooter footer" role="contentinfo">
2
+	<div class="footer-inner clearfix">
3
+		<p xmlns:dct="http://purl.org/dc/terms/" xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#">
4
+		  <a rel="license"
5
+			   class="licenseLink"
6
+		     href="http://creativecommons.org/publicdomain/zero/1.0/">
7
+		    <img src="https://licensebuttons.net/p/zero/1.0/80x15.png" class="licenseImg" alt="CC0" />
8
+		  </a> Site &copy; 2018 Eric Woodward, No Rights Reserved.<br />
9
+		  To the extent possible under law, and except where otherwise indicated,
10
+		  <a rel="dct:publisher"
11
+		     href="https://wonderdome.net/">
12
+		    <span property="dct:title">Eric Woodward</span></a>
13
+		  has waived all copyright and related or neighboring rights to
14
+		  <span property="dct:title">both the source and content of the <em>Wonder Dome website</em></span>.
15
+		This work is published from:
16
+		<span property="vcard:Country" datatype="dct:ISO3166"
17
+		      content="US" about="https://wonderdome.net/">
18
+		  United States</span>.
19
+		</p>
20
+		<p>
21
+			Uses the <a href="https://www.theleagueofmoveabletype.com/raleway">Raleway font</a> by
22
+			  <a href="http://matt.cc/">Matt McInerney</a>.
23
+	  </p>
24
+		<p>
25
+			Powered by
26
+			<a href="https://nodejs.org/">Node</a>,
27
+			<a href="http://gulpjs.com/">Gulp</a>,
28
+			<a href="https://nginx.org/">nginx</a>,
29
+			<a href="https://atom.io/">Atom</a>,
30
+			and <strong>the power of decentralized social media</strong>.
31
+		</p>
32
+		<p>
33
+			The source code for building this site is available at
34
+			  <a href='https://git.itsericwoodward.com/eric/wonderdome-site/'>git.itsericwoodward.com</a>.
35
+		</p>
36
+
37
+		<a href="#" class="footer-topLink topLink">[ Back to Top ]</a>
38
+	</div>
39
+</footer>
40
+</div>
41
+<script type="text/javascript" src="/scripts/scripts.<%= site.version -%>.js"></script></body>
42
+</html>

+ 61
- 0
templates/partials/top.ejs View File

@@ -0,0 +1,61 @@
1
+<%
2
+  var
3
+    getPageField = function(field_name) {
4
+      return page[field_name] || site[field_name] || '';
5
+    }
6
+-%>
7
+<!doctype html>
8
+<!--[if lt IE 7]>      <html class="no-js ie lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
9
+<!--[if IE 7]>         <html class="no-js ie lt-ie10 lt-ie9 lt-ie8" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
10
+<!--[if IE 8]>         <html class="no-js ie lt-ie10 lt-ie9" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
11
+<!--[if IE 9]>         <html class="no-js ie lt-ie10" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
12
+<!--[if gt IE 9]> <html class="no-js ie" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
13
+<!--[if !IE]>--> <html class="no-js" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <!--<![endif]-->
14
+<head>
15
+	<meta charset="utf-8" />
16
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
17
+  <meta name="viewport" content="width=device-width, initial-scale=1">
18
+	<base href="<%= site.base_uri %><%= page.path %>" />
19
+  <title><%= page.title ? page.title + ' | ' : ''%><%= site.title %></title>
20
+
21
+  <meta name="description" content="<%= getPageField('description') %>">
22
+  <meta name="author" content="<%= (page.author || site.author).name %>">
23
+  <meta name="generator" content="Gulp"/>
24
+  <meta name="keywords" content="<%= getPageField('keywords') %>">
25
+  <meta name="robots" content="<%= getPageField('robots') %>">
26
+
27
+  <!-- Open Graph -->
28
+  <meta property="og:type" content="website" />
29
+  <meta property="og:url" content="<%= site.base_uri %><%= page.path %>" />
30
+  <meta property="og:site_name" content="<%= site.title %>" />
31
+  <meta property="og:title" content="<%= getPageField('title') %>" />
32
+<% if (page.image) { %>
33
+  <meta property="og:image" content="<%= page.image %>"/>
34
+<% } %>
35
+<% if (page.description) { %>
36
+  <meta property="og:description" content="<%= page.description %>" />
37
+<% } %>
38
+
39
+  <!-- Twitter Card -->
40
+<% if (page.image) { %>
41
+  <meta name="twitter:card" content="summary_large_image">
42
+<% } else { %>
43
+  <meta name="twitter:card" content="summary" />
44
+<% } %>
45
+  <meta name="twitter:url" content="<%= site.base_uri %><%= page.path %>" />
46
+  <meta name="twitter:title" content="<%= getPageField('title') %>" />
47
+  <meta name="twitter:description" content="<%= getPageField('description') %>">
48
+  <meta name="twitter:image:src" content="<%= getPageField('image') %>">
49
+<% if (page.author && page.author.twitter) { %>
50
+  <meta name="twitter:creator" content="<%= page.author.twitter %>">
51
+<% } else if (site.author && site.author.twitter) { %>
52
+  <meta name="twitter:creator" content="<%= site.author.twitter %>">
53
+<% } %>
54
+  <link rel="start" href="<%= site.base_uri %>/"/>
55
+  <link rel="contents" href="/sitemap.xml" title="Sitemap"/>
56
+  <link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed"/>
57
+  <link rel="canonical" href="<%= site.base_uri %><%= page.path %>"/>
58
+
59
+	<link rel="stylesheet" href="/styles/styles.<%= site.version -%>.css" type="text/css" />
60
+
61
+</head>

+ 62
- 0
templates/sitemap.ejs View File

@@ -0,0 +1,62 @@
1
+<% 
2
+  var
3
+    generateSitemapList = function(the_head, the_tail) {
4
+      var 
5
+        filter = /(\.html$)/,
6
+        replace = /(\.html$)|(^index\.html$)/,
7
+        tree = function (head, tail) {
8
+          var 
9
+            output = '',
10
+            tree_output = '',
11
+            data, content;
12
+          for (var key in head) {
13
+            var 
14
+              val = head[key];
15
+            if (key !== '.git') {
16
+              if (key == '_data') {
17
+                data = val;
18
+              } else if (key == '_contents') {
19
+                content = val;
20
+              } else {
21
+                tree_output += tree(val, tail + key + "/");
22
+              }
23
+            }
24
+          }
25
+        
26
+          if (content && data) {
27
+            for (var i in content) {
28
+              var 
29
+                file = content[i],
30
+                slug = file.replace(replace, ""),
31
+                file_data = data && data[slug] ? data[slug] : {},
32
+                now = new Date(),
33
+                show_item = false,
34
+                title, date;
35
+              if (filter.test(file) && !(/^404\.html/).test(file)) {
36
+                show_item = true;
37
+                if (file_data) {
38
+                  var is_draft = file_data.is_draft || false;
39
+                  date = file_data.date_pub ? new Date(file_data.date_pub) : '';
40
+                  title = file_data.title || '';
41
+                  if (is_draft || title === '' || (date && date.getTime() > now.getTime())) {
42
+                    show_item = false;
43
+                  }
44
+                }
45
+              }
46
+              if (show_item) {
47
+//              file = file.replace(replace, "");
48
+                output += 
49
+                  '\n<li><a href="' + tail + file + '">' + title + '</a></li>\n';                
50
+              }
51
+            }      
52
+          }
53
+          return output + tree_output;
54
+        };
55
+      return tree(the_head, the_tail);
56
+    };
57
+%>
58
+
59
+<urlset>
60
+  <%- generateSitemapList(public, "/") %>
61
+</urlset>
62
+

Loading…
Cancel
Save