Make /_config/*.jst use ES6 superclass calls, fix failure to await the superclass...
[challenger_site.git] / page.jst
1 let XDate = require('xdate')
2 let cookie = require('cookie')
3 let crypto = require('crypto')
4
5 return async (env, head, body, scripts) => {
6   let favicons = await env.site.get_min_html('/_favicon/favicons.html')
7   let globals = await env.site.get_json('/_config/globals.json')
8
9   await env.site.ensure_dir('/_analytics')
10   let sessions = await env.site.read_json('/_analytics/sessions.json', {})
11   let pageviews = await env.site.read_json('/_analytics/pageviews.json', {})
12
13   let cookies = cookie.parse(env.request.headers.cookie || '')
14   let session_key
15   if (
16     !Object.prototype.hasOwnProperty.call(cookies, 'session_key') ||
17     !Object.prototype.hasOwnProperty.call(
18       sessions,
19       session_key = cookies.session_key
20     )
21   ) {
22     session_key = crypto.randomBytes(16).toString('hex')
23     console.log('new session', session_key)
24     sessions[session_key] = {pageviews: {}}
25   }
26   let session = sessions[session_key]
27     
28   let expires = new XDate()
29   expires.addMonths(1)
30   session.expires = expires.toUTCString()
31   env.response.setHeader(
32     'Set-Cookie',
33     'session_key=' +
34     session_key +
35     '; expires=' +
36     session.expires +
37     '; path=/;'
38   )
39
40   if (
41     !Object.prototype.hasOwnProperty.call(
42       pageviews,
43       env.parsed_url.pathname
44     )
45   ) {
46     console.log('new pageview', env.parsed_url.pathname)
47     pageviews[env.parsed_url.pathname] = {visits: 0, unique_visits: 0}
48   }
49   let pageview = pageviews[env.parsed_url.pathname]
50   ++pageview.visits;
51
52   //if (!Object.prototype.hasOwnProperty.call(session, 'pageviews'))
53   //  session.pageviews = {}
54   let session_pageviews = session.pageviews
55   if (
56     !Object.prototype.hasOwnProperty.call(
57       session_pageviews,
58       env.parsed_url.pathname
59     )
60   ) {
61     console.log('new session_pageview', env.parsed_url.pathname)
62     session_pageviews[env.parsed_url.pathname] = 0
63     ++pageview.unique_visits
64   }
65   ++session_pageviews[env.parsed_url.pathname]
66
67   env.site.write_json('/_analytics/sessions.json', sessions)
68   env.site.write_json('/_analytics/pageviews.json', pageviews)
69
70   let _out = []
71   _out.push('<!DOCTYPE html>')
72   html(lang="en") {
73     head {
74       meta(charset="utf-8") {}
75       meta(http-equiv="X-UA-Compatible" content="IE=edge") {}
76       meta(name="viewport" content="width=device-width,initial-scale=1") {}
77       // The above 3 meta tags *must* come first in the head;
78       // any other head content must come *after* these tags
79       title {
80         _out.push(
81           globals.site_title +
82           ": " +
83           (globals.page_to_title[env.parsed_url.pathname] || env.parsed_url.pathname)
84         )
85       }
86   
87       link(rel="stylesheet" href="/css/bootstrap.css") {}
88       link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Frank+Ruhl+Libre:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {}
89       link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Nunito+Sans:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {}
90   
91       await head(_out)
92
93       // HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries
94       // WARNING: Respond.js doesn't work if you view the page via file://
95       _out.push('<!--[if lt IE 9]>')
96       script(src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js") {}
97       script(src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js") {}
98       _out.push('<![endif]-->')
99
100       // use favicon generator website to get favicons.zip and favicons.html
101       _out.push(favicons)
102     }
103     body {
104       await body(_out)
105   
106       // jQuery (necessary for Bootstrap's JavaScript plugins)
107       script(src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js") {}
108       // Include all compiled plugins (below), or include individual files as needed
109       //script(src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous") {}
110       script(src="/js/bootstrap.js") {}
111
112       await scripts(_out)
113     }
114   }
115   env.site.serve(env, 200, Buffer.from(_out.join('')), 'page.jst')
116 }