let XDate = require('xdate') let cookie = require('cookie') let crypto = require('crypto') return async (env, head, body, scripts) => { let favicons = await env.site.get_min_html('/_favicon/favicons.html') let globals = await env.site.get_json('/_config/globals.json') let session_cookie = await _require('/session_cookie.jst') // initialize env.session_key, set cookie in env.response let transaction = env.site.database.Transaction() let session = await session_cookie(env, transaction) let pageview = await ( await ( await transaction.get({}) ).get('pageviews', {}) ).get(env.parsed_url.pathname, {}) pageview.set('visits', (await pageview.get('visits') || 0) + 1) let session_pageviews = await session.get('pageviews', {}) let i = await session_pageviews.get(env.parsed_url.pathname) if (i === undefined) { pageview.set( 'unique_visits', (await pageview.get('unique_visits') || 0) + 1 ) i = 0 } session_pageviews.set(env.parsed_url.pathname, i + 1) await transaction.commit() let _out = [] _out.push('') html(lang="en") { head { // Required meta tags meta(charset="utf-8") {} meta(name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no") {} // Bootstrap CSS //link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous") {} link(rel="stylesheet" href="/css/bootstrap/bootstrap.css") {} link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Frank+Ruhl+Libre:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {} link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Nunito+Sans:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {} await head(_out) //title {'Hello, world!'} } body { await body(_out) //h1 {'Hello, world!'} // Optional JavaScript; choose one of the two! // Option 1: jQuery and Bootstrap Bundle (includes Popper) 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") {} script(src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous") {} // Option 2: Separate Popper and Bootstrap JS //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") {} //script(src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous") {} //script(src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.min.js" integrity="sha384-VHvPCCyXqtD5DqJeNxl2dtTyhF78xXNXdkwX1CZeRusQfRKp+tA7hAShOK/B/fQ2" crossorigin="anonymous") {} await scripts(_out) } } env.site.serve(env, 200, Buffer.from(_out.join('')), 'page.jst') }