#! /usr/bin/env fan
//
// Copyright (c) 2021, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 29 Jun 21 Andy Frank Creation
//

using dom
using util
using web
using webmod
using wisp

*************************************************************************
** JsEnvMain
*************************************************************************

class JsEnvMain : AbstractMain
{
 @Opt { help = "http port" }
 Int port := 8080

 override Int run()
 {
 wisp := WispService
 {
 it.httpPort = this.port
 it.root = JsEnvMod()
 }
 return runServices([wisp])
 }
}

*************************************************************************
** JsEnvMod
*************************************************************************

const class JsEnvMod : WebMod
{
 new make()
 {
 // app runtime js
 pods := ["sys", "dom"].map |n| { Pod.find(n) }
 app := File[,]
 .addAll(FilePack.toAppJsFiles(pods))
 .add(compileScriptJs)

 // additional locales to include (en-US is already included by sys.js)
 loc := ["es", "fr", "de"].map |n| {
 FilePack.toLocaleJsFile(Locale(n))
 }

 this.appPack = FilePack(app)
 this.locPack = FilePack(loc)
 }

 override Void onGet()
 {
 switch (req.modRel.path.first)
 {
 case null: onIndex
 case "app.js": appPack.onGet
 case "loc.js": locPack.onGet
 }
 }

 Void onIndex()
 {
 //
 // Modify or comment out to change booted env:
 // * if no tz is specified; query browser for current tz
 // * locale must be served in locPack; see make ctor
 //
 env := [
 "main": "env::JsEnv",
 "timezone": "Los_Angeles",
 "locale": "fr"
 ]

 res.headers["Content-Type"] = "text/html; charset=utf-8"
 out := res.out
 out.docType5
 out.html
 out.head
 .title.w("JS Env").titleEnd
 .initJs(env)
 .includeJs(`/app.js`)
 .includeJs(`/loc.js`)
 .style.w(
 "body {
 padding: 0.25em 2em;
 font: 16px -apple-system, BlinkMacSystemFont, sans-serif;
 }
 hr {
 border: none;
 background: #d9d9d9;
 height: 1px;
 margin: 1em 0;
 }
 pre {
 background: #f2f6f9;
 padding: 1em;
 border-radius: 5px;
 }
 table {
 border-collapse: collapse;
 border: 1px solid #d9d9d9;
 }
 td { padding: 0.5em 1em; }
 td + td { border-left: 1px solid #d9d9d9; }
 ").styleEnd
 out.headEnd
 out.body
 .h1.w("JS Env").h1End
 .hr
 .p.w("Env.vars (edit in JsEnvMod.onIndex):").pEnd
 .pre("id='env-vars'").preEnd
 .hr
 .table
 .tr.td.w("TimeZone.cur").tdEnd .td("id='tz-cur'").tdEnd.trEnd
 .tr.td.w("DateTime.now").tdEnd .td("id='dt-now'").tdEnd.trEnd
 .tr.td.w("DateTime.boot").tdEnd .td("id='dt-boot'").tdEnd.trEnd
 .tr.td.w("Locale.cur").tdEnd .td("id='loc-cur'").tdEnd.trEnd
 .tr.td.w("Locale Month").tdEnd .td("id='loc-mon'").tdEnd.trEnd
 .tr.td.w("Locale Weekday").tdEnd.td("id='loc-wd'").tdEnd.trEnd
 .tableEnd
 out.bodyEnd
 out.htmlEnd
 }

 **
 ** Normally your @Js code would exist in a pod, but since
 ** this is a Fantom script, we need to compile on the fly
 ** in order to get JS output to add to FilePack.
 **
 private File compileScriptJs()
 {
 src := Env.cur.homeDir + `examples/js/env.fan`
 js := Env.cur.compileScriptToJs(src, ["podName":"env"])
 temp := Env.cur.tempDir + `env.js`
 temp.out.print(js).sync.close
 return temp
 }

 private const FilePack appPack
 private const FilePack locPack
}

*************************************************************************
** JsEnv
*************************************************************************

@Js class JsEnv
{
 static Void main()
 {
 doc := Win.cur.doc
 doc.elemById("env-vars").text = Env.cur.vars.toStr

 // timezone
 doc.elemById("tz-cur").text = TimeZone.cur.toStr
 doc.elemById("dt-now").text = DateTime.now.toLocale
 doc.elemById("dt-boot").text = DateTime.boot.toLocale

 // locale
 doc.elemById("loc-cur").text = Locale.cur.toStr
 doc.elemById("loc-mon").text = Date.today.month.localeFull
 doc.elemById("loc-wd").text = Date.today.weekday.localeFull

 Win.cur.setInterval(1sec) {
 doc.elemById("dt-now").text = DateTime.now.toLocale
 }
 }
}

AltStyle によって変換されたページ (->オリジナル) /