18e5cc2e04894bcfefdfe28a4639e677c6a86ea9
[ndcode_site.git] / _lib / 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 get_session = await _require('/_lib/get_session.jst')
8
9   // initialize env.session_key, set cookie in env.response
10   let transaction = await env.site.database.Transaction()
11   try {
12     let root = await transaction.get({})
13     let session = await get_session(env, root)
14
15     let pageviews = await root.get('pageviews', {})
16     let pageview = await pageviews.get(env.parsed_url.pathname, {})
17     pageview.set('visits', (await pageview.get('visits') || 0) + 1)
18
19     let session_pageviews = await session.get('pageviews', {})
20     let i = await session_pageviews.get(env.parsed_url.pathname)
21     if (i === undefined) {
22       pageview.set(
23         'unique_visits',
24         (await pageview.get('unique_visits') || 0) + 1
25       )
26       i = 0
27     }
28     session_pageviews.set(env.parsed_url.pathname, i + 1)
29
30     await transaction.commit()
31   }
32   catch (error) {
33     transaction.rollback()
34     throw error
35   }
36
37   let _out = []
38   _out.push('<!doctype html>')
39   html(lang="en") {
40     head {
41       // Required meta tags
42       meta(charset="utf-8") {}
43       meta(name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no") {}
44
45       // Bootstrap CSS
46       //link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous") {}
47       link(rel="stylesheet" href="/css/bootstrap/bootstrap.css") {}
48       link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Frank+Ruhl+Libre:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {}
49       link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Nunito+Sans:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {}
50
51       await head(_out) //title {'Hello, world!'}
52     }
53     body {
54       await body(_out) //h1 {'Hello, world!'}
55
56       // Optional JavaScript; choose one of the two!
57
58       // Option 1: jQuery and Bootstrap Bundle (includes Popper)
59       script(src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous") {}
60       script(src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous") {}
61
62       // Option 2: Separate Popper and Bootstrap JS
63       //script(src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous") {}
64       //script(src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous") {}
65       //script(src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.min.js" integrity="sha384-VHvPCCyXqtD5DqJeNxl2dtTyhF78xXNXdkwX1CZeRusQfRKp+tA7hAShOK/B/fQ2" crossorigin="anonymous") {}
66
67       await scripts(_out)
68     }
69   }
70   env.site.serve(env, 200, Buffer.from(_out.join('')), 'page.jst')
71 }