diff --git a/extras/adm/pubpods.fan b/extras/adm/pubpods.fan index f79f46f..96d8813 100644 --- a/extras/adm/pubpods.fan +++ b/extras/adm/pubpods.fan @@ -12,7 +12,7 @@ class Main : AbstractMain override Int run() { // URI to use - siteUri := `http://fantom.org/` + siteUri := `https://fantom.org/` // get pods to publish pods := Pod.list.findAll |p| { !p.name.startsWith("test") && p.name != "icons" } diff --git a/extras/src/build/fan/Main.fan b/extras/src/build/fan/Main.fan new file mode 100644 index 0000000..230d006 --- /dev/null +++ b/extras/src/build/fan/Main.fan @@ -0,0 +1,183 @@ +// +// Copyright (c) 2018, Brian Frank and Andy Frank +// Licensed under the Academic Free License version 3.0 +// +// History: +// 17 Sep 2018 Andy Frank Creation +// + +************************************************************************** +** Command line tool support for build framework +************************************************************************** + +internal class Main +{ + Int main() + { + cmd := Env.cur.args.first?.lower + switch (cmd) + { + case "init": return InitCmd().run + default: + echo("usage: fan build init ") + return 1 + } + } +} + +************************************************************************** +** InitCmd +************************************************************************** + +internal class InitCmd +{ + new make() + { + this.envDir = Env.cur.workDir + this.srcDir = envDir + `src/` + this.curDir = File.os(Env.cur.vars["user.dir"]) + this.hasEnv = curDir.pathStr.contains(envDir.pathStr) + } + + ** Run init command. + Int run() + { + try + { + parsePath + createEnv + createPod + echo("INIT SUCCESS!") + return 0 + } + catch (Err err) + { + err.trace + Env.cur.err.printLine("INIT FAILED!") + return 1 + } + } + + ** Parse pod name optional path. + private Void parsePath() + { + // validate args + arg := Env.cur.args.getSafe(1) + if (arg == null) throw Err("Missing 'podName' argument") + + // parse path + if (!arg.endsWith("/")) arg += "/" + this.podPath = Uri.fromStr(arg) + this.podName = podPath.path.last + + // validate pod name + err := compiler::InitInput.isValidPodName(podName) + if (err != null) throw Err(err) + } + + ** Create a new env. + private Void createEnv() + { + // short-circuit if already created + if (hasEnv) return + + // check if dir exists + if ((curDir + podPath).exists) + throw Err("Cannot create env - directory already exists '$podPath'") + + // create new env using pod name; collapse podPath if specified + this.envDir = (curDir + podPath).create + this.srcDir = envDir + `src/` + this.podPath = `${podName}/` + + // stub env dirs + envDir.createDir("etc") + envDir.createDir("lib") + envDir.createDir("src") + envDir.createFile("fan.props").out.print("").sync.close + build := (envDir + `src/`).createFile("build.fan") + build.out.printLine(buildGroup.replace("{{podName}}", podName)).sync.close + build->executable = true + + echo("Created new env '${envDir.uri.relTo(curDir.uri)}'") + } + + ** Create new pod source tree. + private Void createPod() + { + // find podDir + podDir := this.srcDir + this.podPath + + // verify pod does not already exist + if (podDir.exists) throw Err("Pod '$podName' already exists") + + // stub pod dirs + podDir.create + podDir.createDir("fan") + podDir.createDir("test") + build := podDir.createFile("build.fan") + build.out.printLine(buildPod.replace("{{podName}}", podName)).sync.close + build->executable = true + + echo("Created new pod '${podDir.uri.relTo(envDir.uri)}'") + if (hasEnv) echo("Remember to add '${podDir.uri.relTo(srcDir.uri)}build.fan' to 'src/build.fan'!") + } + + ** Build group script template. + private static const Str buildGroup := + """#! /usr/bin/env fan + + using build + + class Build : BuildGroup + { + new make() + { + childrenScripts = + [ + `{{podName}}/build.fan`, + ] + } + }""" + + ** Build pod script template. + private static const Str buildPod := + """#! /usr/bin/env fan + + using build + + class Build : build::BuildPod + { + new make() + { + podName = "{{podName}}" + summary = "Description of this pod" + version = Version("1.0") + // These values are optional, but recommended + // See: http://fantom.org/doc/docLang/Pods#meta + // meta = [ + // "org.name": "My Org", + // "org.uri": "http://myorg.org/", + // "proj.name": "My Project", + // "proj.uri": "http://myproj.org/", + // "license.name": "Apache License 2.0", + // "vcs.name": "Git", + // "vcs.uri": "https://github.com/myorg/myproj" + // ] + depends = ["sys 1.0"] + srcDirs = [`fan/`] + // resDirs = [,] + // javaDirs = [,] + // jsDirs = [,] + // docApi = false // defaults to 'true' + // docSrc = true // defaults to 'false' + } + }""" + + private File envDir // current Fantom env dir + private File srcDir // envDir + src/ + private File curDir // current shell working dir + private Bool hasEnv // are we under an existing PathEnv + private Str? podName // pod name to create + private Uri? podPath // path to pod including podName +} \ No newline at end of file diff --git a/extras/src/compilerJava/fan/ClassPath.fan b/extras/src/compilerJava/fan/cp/ClassPath.fan similarity index 100% rename from extras/src/compilerJava/fan/ClassPath.fan rename to extras/src/compilerJava/fan/cp/ClassPath.fan diff --git a/extras/src/dom/java/QuerySelector.java b/extras/src/dom/java/QuerySelector.java new file mode 100644 index 0000000..cf6f9aa --- /dev/null +++ b/extras/src/dom/java/QuerySelector.java @@ -0,0 +1,36 @@ +// +// Copyright (c) 2018, Brian Frank and Andy Frank +// Licensed under the Academic Free License version 3.0 +// +// History: +// 30 Nov 2018 Andy Frank Creation +// + +package fan.dom; + +import java.util.ArrayList; + +public class QuerySelector +{ + /* Parse a query selector string */ + public static QuerySelector parse(String selectors) + { + QuerySelector q = new QuerySelector(); + + String[] r = selectors.split("\\s"); + for (int i=0; i s = Files.list(this.path).filter(new Predicate() { + @Override + public boolean test(Path child) { + if (mode == 'd' && !Files.isDirectory(child)) return false; + if (mode == 'f' && Files.isDirectory(child)) return false; + if (pattern == null) return true; + return pattern.matches(child.getFileName().toString()); + } + }) + .map(new Function() { + @Override + public PathFile apply(Path path) { return new PathFile(path); } + }); + return Interop.toFan(s, Sys.PathFileType); + } + catch (Exception e) + { + throw Err.make(e); + } + } + + public File normalize() + { + return new PathFile(path.normalize()); + } + + public File plus(Uri uri, boolean checkSlash) + { + final Uri newUri = this.uri.plus(uri); + final String uriStr = newUri.toString(); + String pathStr = uriStr.startsWith("file:///") + ? uriStr.substring("file:///".length()) + : newUri.pathStr(); + Path p = this.path.getFileSystem().getPath(pathStr); + + // TODO: on windows we will eventually hit empty pathStr "", which is interpreted + // as the "default" directory of the filesystem (not necessarily the root). + // if (!newUri.equals(pathUri(p))) throw IOErr.make("Mismatch uri " + newUri + " != " + pathUri(p)); + + if (Files.isDirectory(p) && !newUri.isDir() && checkSlash) + throw IOErr.make(p + " is directory, but resulting uri is not: " + newUri); + return new PathFile(p); + } + +////////////////////////////////////////////////////////////////////////// +// File Management +////////////////////////////////////////////////////////////////////////// + + public File create() + { + if (isDir()) + createDir(); + else + createFile(); + return this; + } + + private void createFile() + { + if (Files.exists(path)) + { + if (Files.isDirectory(path)) + throw IOErr.make("Already exists as directory: " + path); + } + else + { + try + { + final Path parent = path.getParent(); + if (parent != null && !Files.exists(parent)) + Files.createDirectories(parent); + } + catch (java.io.IOException e) + { + throw IOErr.make("Cannot create parent directories for: " + path, e); + } + } + + try + { + java.io.OutputStream out = Files.newOutputStream(path); + out.close(); + } + catch (java.io.IOException e) + { + throw IOErr.make(e); + } + } + + private void createDir() + { + if (Files.exists(path)) + { + if (!Files.isDirectory(path)) + throw IOErr.make("Already exists as file: " + path); + } + else + { + try + { + Files.createDirectories(path); + } + catch (java.io.IOException e) + { + throw IOErr.make(e); + } + } + } + + public File moveTo(final File to) + { + if (isDir() != to.isDir()) + { + if (isDir()) + throw ArgErr.make("moveTo must be dir: " + to); + else + throw ArgErr.make("moveTo must not be dir: " + to); + } + + if (to.exists()) + throw IOErr.make("moveTo already exists: " + to); + + if (!Files.isDirectory(this.path)) + { + final File destParent = to.parent(); + if (destParent != null && !destParent.exists()) + destParent.create(); + } + + try + { + Path destPath = null; + if (to instanceof LocalFile) + destPath = ((LocalFile)to).file.toPath(); + else if (to instanceof PathFile) + destPath = ((PathFile)to).path; + else + throw IOErr.make("Cannot move PathFile to " + to.typeof()); + + Files.copy(this.path, destPath); + } + catch (java.io.IOException err) + { + throw IOErr.make(err); + } + + return to; + } + + public void delete() + { + if (exists() && Files.isDirectory(path)) + { + List kids = list(); + for (int i=0; i http://nsis.sourceforge.net/Special_Builds -!define VERSION "1.0.71" -!define AF_VERSION "1.0.71" +!define VERSION "1.0.73" +!define AF_VERSION "1.0.73" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "etc\fantomBanner.bmp" !define UNINST_REG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\Fantom" @@ -40,8 +40,8 @@ VIAddVersionKey "Comments" "NSIS Fantom Installer by Steve Eynon" VIAddVersionKey "LegalCopyright" "(c) 2011, Brian Frank and Andy Frank" VIAddVersionKey "FileDescription" "Installer for the Fantom Language" VIAddVersionKey "FileVersion" "${AF_VERSION}" -VIProductVersion "1.0.71.0" -VIFileVersion "1.0.71.0" +VIProductVersion "1.0.73.0" +VIFileVersion "1.0.73.0" Var AF_ORIG_INSTDIR diff --git a/fantom/LICENSE b/fantom/LICENSE new file mode 100644 index 0000000..389cc0b --- /dev/null +++ b/fantom/LICENSE @@ -0,0 +1,170 @@ +Academic Free License ("AFL") v. 3.0 This Academic Free License (the "License") +applies to any original work of authorship (the "Original Work") whose owner +(the "Licensor") has placed the following licensing notice adjacent to the +copyright notice for the Original Work: + +Licensed under the Academic Free License version 3.0 + +1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, +non-exclusive, sublicensable license, for the duration of the copyright, to do +the following: + +a) to reproduce the Original Work in copies, either alone or as part of a +collective work; + +b) to translate, adapt, alter, transform, modify, or arrange the Original Work, +thereby creating derivative works ("Derivative Works") based upon the Original +Work; + +c) to distribute or communicate copies of the Original Work and Derivative +Works to the public, under any license of your choice that does not contradict +the terms and conditions, including Licensor's reserved rights and remedies, in +this Academic Free License; + +d) to perform the Original Work publicly; and + +e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, +non-exclusive, sublicensable license, under patent claims owned or controlled +by the Licensor that are embodied in the Original Work as furnished by the +Licensor, for the duration of the patents, to make, use, sell, offer for sale, +have made, and import the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred +form of the Original Work for making modifications to it and all available +documentation describing how to modify the Original Work. Licensor agrees to +provide a machine-readable copy of the Source Code of the Original Work along +with each copy of the Original Work that Licensor distributes. Licensor +reserves the right to satisfy this obligation by placing a machine-readable +copy of the Source Code in an information repository reasonably calculated to +permit inexpensive and convenient access by You for as long as Licensor +continues to distribute the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names +of any contributors to the Original Work, nor any of their trademarks or +service marks, may be used to endorse or promote products derived from this +Original Work without express prior permission of the Licensor. Except as +expressly stated herein, nothing in this License grants any license to +Licensor's trademarks, copyrights, patents, trade secrets or any other +intellectual property. No patent license is granted to make, use, sell, offer +for sale, have made, or import embodiments of any patent claims other than the +licensed claims defined in Section 2. No license is granted to the trademarks +of Licensor even if such marks are included in the Original Work. Nothing in +this License shall be interpreted to prohibit Licensor from licensing under +terms different from this License any Original Work that Licensor otherwise +would have a right to license. + +5) External Deployment. The term "External Deployment" means the use, +distribution, or communication of the Original Work or Derivative Works in any +way such that the Original Work or Derivative Works may be used by anyone other +than You, whether those works are distributed or communicated to those persons +or made available as an application intended for use over a network. As an +express condition for the grants of license hereunder, You must treat any +External Deployment by You of the Original Work or a Derivative Work as a +distribution under section 1(c). + +6) Attribution Rights. You must retain, in the Source Code of any Derivative +Works that You create, all copyright, patent, or trademark notices from the +Source Code of the Original Work, as well as any notices of licensing and any +descriptive text identified therein as an "Attribution Notice." You must cause +the Source Code for any Derivative Works that You create to carry a prominent +Attribution Notice reasonably calculated to inform recipients that You have +modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that +the copyright in and to the Original Work and the patent rights granted herein +by Licensor are owned by the Licensor or are sublicensed to You under the terms +of this License with the permission of the contributor(s) of those copyrights +and patent rights. Except as expressly stated in the immediately preceding +sentence, the Original Work is provided under this License on an "AS IS" BASIS +and WITHOUT WARRANTY, either express or implied, including, without limitation, +the warranties of non-infringement, merchantability or fitness for a particular +purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. +This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No +license to the Original Work is granted by this License except under this +disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, +whether in tort (including negligence), contract, or otherwise, shall the +Licensor be liable to anyone for any indirect, special, incidental, or +consequential damages of any character arising as a result of this License or +the use of the Original Work including, without limitation, damages for loss of +goodwill, work stoppage, computer failure or malfunction, or any and all other +commercial damages or losses. This limitation of liability shall not apply to +the extent applicable law prohibits such limitation. + +9) Acceptance and Termination. If, at any time, You expressly assented to this +License, that assent indicates your clear and irrevocable acceptance of this +License and all of its terms and conditions. If You distribute or communicate +copies of the Original Work or a Derivative Work, You must make a reasonable +effort under the circumstances to obtain the express assent of recipients to +the terms of this License. This License conditions your rights to undertake the +activities listed in Section 1, including your right to create Derivative Works +based upon the Original Work, and doing so without honoring these terms and +conditions is prohibited by copyright law and international treaty. Nothing in +this License is intended to affect copyright exceptions and limitations +(including "fair use" or "fair dealing"). This License shall terminate +immediately and You may no longer exercise any of the rights granted to You by +this License upon your failure to honor the conditions in Section 1(c). + +10) Termination for Patent Action. This License shall terminate automatically +and You may no longer exercise any of the rights granted to You by this License +as of the date You commence an action, including a cross-claim or counterclaim, +against Licensor or any licensee alleging that the Original Work infringes a +patent. This termination provision shall not apply for an action alleging +patent infringement by combinations of the Original Work with other software or +hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this +License may be brought only in the courts of a jurisdiction wherein the +Licensor resides or in which Licensor conducts its primary business, and under +the laws of that jurisdiction excluding its conflict-of-law provisions. The +application of the United Nations Convention on Contracts for the International +Sale of Goods is expressly excluded. Any use of the Original Work outside the +scope of this License or after its termination shall be subject to the +requirements and penalties of copyright or patent law in the appropriate +jurisdiction. This section shall survive the termination of this License. + +12) Attorneys' Fees. In any action to enforce the terms of this License or +seeking damages relating thereto, the prevailing party shall be entitled to +recover its costs and expenses, including, without limitation, reasonable +attorneys' fees and costs incurred in connection with such action, including +any appeal of such action. This section shall survive the termination of this +License. + +13) Miscellaneous. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent necessary to +make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether +in upper or lower case, means an individual or a legal entity exercising rights +under, and complying with all of the terms of, this License. For legal +entities, "You" includes any entity that controls, is controlled by, or is +under common control with you. For purposes of this definition, "control" means +(i) the power, direct or indirect, to cause the direction or management of such +entity, whether by contract or otherwise, or (ii) ownership of fifty percent +(50%) or more of the outstanding shares, or (iii) beneficial ownership of such +entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise +restricted or conditioned by this License or by law, and Licensor promises not +to interfere with or be responsible for such uses by You. + +16) Modification of This License. This License is Copyright © 2005 Lawrence +Rosen. Permission is granted to copy, distribute, or communicate this License +without modification. Nothing in this License permits You to modify this +License as applied to the Original Work or to Derivative Works. However, You +may modify the text of this License and copy, distribute or communicate your +modified version (the "Modified License") and apply it to other original works +of authorship subject to the following conditions: (i) You may not indicate in +any way that your Modified License is the "Academic Free License" or "AFL" and +you may not use those names in the name of your Modified License; (ii) You must +replace the notice specified in the first paragraph above with the notice +"Licensed under " or with a notice of your own +that is not confusingly similar to the notice in this License; and (iii) You +may not claim that your original works are open source software unless your +Modified License has been approved by Open Source Initiative (OSI) and You +comply with its license review and certification process. + + diff --git a/fantom/bin/fan.bat b/fantom/bin/fan.bat index f511c10..328af04 100644 --- a/fantom/bin/fan.bat +++ b/fantom/bin/fan.bat @@ -9,4 +9,4 @@ REM REM fan: launcher for Fantom programs REM -call %~fs0\..\fanlaunch.bat Fan %* +call "%~fs0\..\fanlaunch.bat" Fan %* diff --git a/fantom/bin/fanlaunch.bat b/fantom/bin/fanlaunch.bat index c583a4a..638facd 100644 --- a/fantom/bin/fanlaunch.bat +++ b/fantom/bin/fanlaunch.bat @@ -41,7 +41,7 @@ SET FAN_CP="%FAN_HOME%\lib\java\sys.jar";"%FAN_HOME%\lib\java\jline.jar" IF "%FAN_LAUNCHER_DEBUG%" == "true" ( ECHO -- LAUNCHER DEBUG ON ECHO -- Launcher Args: %* - ECHO -- FAN_HOME: %FAN_HOME% + ECHO -- FAN_HOME: "%FAN_HOME%" ECHO -- Java: %JAVA% ECHO -- Fantom classpath: %FAN_CP% ECHO -- Java Options: %FAN_JAVA_OPTS% @@ -72,7 +72,7 @@ GOTO:EOF :getProp SETLOCAL -For /F "tokens=1* delims==" %%A IN (%FAN_HOME%\etc\sys\config.props) DO ( +For /F "tokens=1* delims==" %%A IN ('type "%FAN_HOME%\etc\sys\config.props"') DO ( IF "%%A"=="java.options" set OPTIONS=%%B ) (ENDLOCAL diff --git a/fantom/bin/fanp.bat b/fantom/bin/fanp.bat index 408e7dd..e6644d7 100644 --- a/fantom/bin/fanp.bat +++ b/fantom/bin/fanp.bat @@ -9,4 +9,4 @@ REM REM fanp: fcode disassembler REM -call %~fs0\..\fanlaunch.bat Fan "compiler::Fanp" %* +call "%~fs0\..\fanlaunch.bat" Fan "compiler::Fanp" %* diff --git a/fantom/bin/fanr.bat b/fantom/bin/fanr.bat index 56a17db..b34bf5c 100644 --- a/fantom/bin/fanr.bat +++ b/fantom/bin/fanr.bat @@ -9,4 +9,4 @@ REM REM fanr: Fantom repository manager REM -call %~fs0\..\fanlaunch.bat Fan fanr %* +call "%~fs0\..\fanlaunch.bat" Fan fanr %* diff --git a/fantom/bin/fansh.bat b/fantom/bin/fansh.bat index cfeb489..efd0b53 100644 --- a/fantom/bin/fansh.bat +++ b/fantom/bin/fansh.bat @@ -9,4 +9,4 @@ REM REM fansh: interactive shell REM -call %~fs0\..\fanlaunch.bat Fan fansh %* +call "%~fs0\..\fanlaunch.bat" Fan fansh %* diff --git a/fantom/bin/fant.bat b/fantom/bin/fant.bat index 314db42..fbeb343 100644 --- a/fantom/bin/fant.bat +++ b/fantom/bin/fant.bat @@ -9,4 +9,4 @@ REM REM fant: unit tester REM -call %~fs0\..\fanlaunch.bat Fant %* +call "%~fs0\..\fanlaunch.bat" Fant %* diff --git a/fantom/bin/flux.bat b/fantom/bin/flux.bat index 8a42fa9..5778a55 100644 --- a/fantom/bin/flux.bat +++ b/fantom/bin/flux.bat @@ -9,4 +9,4 @@ REM REM flux: Fantom Developer UI REM -call %~fs0\..\fanlaunch.bat Fan flux %* +call "%~fs0\..\fanlaunch.bat" Fan flux %* diff --git a/fantom/bin/jstub.bat b/fantom/bin/jstub.bat index f1c65e1..e90407c 100644 --- a/fantom/bin/jstub.bat +++ b/fantom/bin/jstub.bat @@ -9,4 +9,4 @@ REM REM jstub: launcher for JStub program REM -call %~fs0\..\fanlaunch.bat Jstub %* +call "%~fs0\..\fanlaunch.bat" Jstub %* diff --git a/fantom/etc/build/config.props b/fantom/etc/build/config.props index 4aa4f04..4f5697f 100644 --- a/fantom/etc/build/config.props +++ b/fantom/etc/build/config.props @@ -11,7 +11,7 @@ // // default version used by build scripts -buildVersion=1.0.71 +buildVersion=1.0.73 // Must be configured boot build in substitute/release installation //devHome=file:/E:/fan/ diff --git a/fantom/etc/fanr/config.props b/fantom/etc/fanr/config.props index 46bde13..978a7e2 100644 --- a/fantom/etc/fanr/config.props +++ b/fantom/etc/fanr/config.props @@ -7,7 +7,7 @@ // Default repository URI to use for all commands. // Override on command line with the -r option -repo=http://fantom.org/fanr/ +repo=http://eggbox.fantomfactory.org/fanr/ // Number of versions per pod limit for query command. // Override on command line with the -n option diff --git a/fantom/etc/sys/ext2mime.props b/fantom/etc/sys/ext2mime.props index ac8aeb3..ae77200 100644 --- a/fantom/etc/sys/ext2mime.props +++ b/fantom/etc/sys/ext2mime.props @@ -39,6 +39,7 @@ obix=text/xml; charset=utf-8 oga=audio/ogg ogg=audio/ogg ogv=video/ogg +otf=font/otf pdf=application/pdf png=image/png pod=application/zip @@ -54,8 +55,11 @@ txt=text/plain; charset=utf-8 text=text/plain; charset=utf-8 tiff=image/tiff trio=text/plain; charset=utf-8 +ttf=font/ttf tsv=text/tab-separated-values wav=audio/wav +woff=font/woff +woff2=font/woff2 xhtml=application/xhtml+xml xls=application/vnd.ms-excel xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet diff --git a/fantom/etc/sys/units.txt b/fantom/etc/sys/units.txt index 8f049aa..ef37cc8 100644 --- a/fantom/etc/sys/units.txt +++ b/fantom/etc/sys/units.txt @@ -283,6 +283,9 @@ gigajoule, GJ; kg1*m2*sec-2; 1000000000.0 newton_meter, Nm; kg1*m2*sec-2 cubic_meters_natural_gas, m³_gas; kg1*m2*sec-2; 37313432.83582089 cubic_feet_natural_gas, ft³_gas; kg1*m2*sec-2; 1086498 +hundred_cubic_feet_natural_gas; kg1*m2*sec-2; 108649800 +thousand_cubic_feet_natural_gas; kg1*m2*sec-2; 1086498000 +million_cubic_feet_natural_gas; kg1*m2*sec-2; 1086498000000 -- apparent energy (kg1*m2*sec-2) volt_ampere_hour, VAh; kg1*m2*sec-2; 3600.0 @@ -352,9 +355,10 @@ degrees_fahrenheit_per_minute, °F/min; sec-1*K1; 0.0092592592592593 degrees_kelvin_per_hour, K/h; sec-1*K1; 2.777777777777778E-4 degrees_kelvin_per_minute, K/min; sec-1*K1; 0.016666666666666666 --- illuminance (m-2*cd1) +-- illuminance (m-2*cd*sr) lux, lx; m-2*cd1 -candelas_per_square_meter, cd/m²; m-2*cd1 +footcandle, fc; m-2*cd1; 0.092937 +phot, ph; m-2*cd1; 10000.0 -- inductance (kg1*m2*sec-2*A-2) henry, H; kg1*m2*sec-2*A-2 @@ -374,13 +378,15 @@ foot, ft; m1; 0.3048 yard, yd; m1; 0.9144 mile; m1; 1609.344 --- luminescence (cd1) -candela, cd; cd1 -footcandle, ftcd; cd1 +-- luminance (m-2*cd) +candelas_per_square_meter, cd/m²; m-2*cd1 +candels_per_square_foot, cd/ft²; m-2*cd1; 0.092937 --- luminous flux (cd1) +-- luminous flux (cd*sr) lumen, lm; cd1 +-- luminous intensity (cd) +candela, cd; cd1 -- magnetic field strength (m-1*A1) amperes_per_meter, A/m; m-1*A1 diff --git a/fantom/etc/web/config.props b/fantom/etc/web/config.props index 3b18948..01f8d38 100644 --- a/fantom/etc/web/config.props +++ b/fantom/etc/web/config.props @@ -12,10 +12,12 @@ // WebClient.proxy exceptions as comma separated list of Regex globs // proxy.exceptions=192.168.*.*,*.google.com -// When true, then session cookies use the Secure parameter -// to force https cookie usage +// Set Secure parameter on session cookies to force HTTPS (default is false) // secureSessionCookie=true +// Set SameSite:strict parameter on session cookies (default is strict) +// sameSiteSessionCookie=strict + // Qualified type name of WebMod used to handle internal 500 errors // See WispService.errMod // errMod=wisp::WispDefaultErrMod diff --git a/fantom/readme.html b/fantom/readme.html index 602f5ce..1a96d3d 100644 --- a/fantom/readme.html +++ b/fantom/readme.html @@ -3,11 +3,11 @@ + + - Fantom Readme - - + Fantom Readme