Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • firmware/gluon
  • 0x4A6F/gluon
  • patrick/gluon
3 results
Show changes
Commits on Source (222)
Showing with 385 additions and 410 deletions
---
name: Bug report
about: Report a bug in a recent version of Gluon
label: bug
---
<!--
Please carefully fill out the questionaire below to help improve the
timely triaging of issues. Walk through the questions below and use
them as an inspiration for what information you can provide.
Make use of codeblocks (three backticks before and after) where
appropriate (configuration excerpts, log output, etc.). Example:
```
your code goes here
```
You can use the "Preview" tab to check how your issue is going to look
before you actually send it in.
Thank you for taking the time to report a bug with the Gluon project.
-->
### Bug report
**What is the problem?**
<!--
- What is not working as expected?
- How is it misbehaving?
- When did the problem first start showing up?
- What were you doing when you first noticed the problem?
- On which devices (vendor, model and revision) is it misbehaving?
- Does the issue appear on multiple devices or targets?
-->
**What is the expected behaviour?**
<!--
- How do you think it should work instead?
- Did it work like that before?
-->
**Gluon Version:**
<!--
Please provide a usable Git reference before applying custom patches:
By using a Git reference:
$ git describe --always
v2018.2-17-g3abadc28
Or the URL to the relevant Gluon commit
https://github.com/freifunk-gluon/gluon/commit/<commit hash here>
-->
**Site Configuration:**
<!--
Please provide the URL to your site configuration repository and the
explicit commit used to build the firmware experiencing the problem.
Additionally excerpts of problem-related configuration parts are
often helpful.
-->
**Custom patches:**
<!--
Be upfront about any custom patches you have applied to your Gluon build, as they might
be part of your problem.
-->
codes = true
std = "min"
self = false
read_globals = {
"getfenv",
"setfenv",
"unpack",
}
include_files = {
"**/*.lua",
"package/**/luasrc/**/*",
"targets/*",
}
exclude_files = {
"**/*.mk",
}
files["package/**/check_site.lua"] = {
read_globals = {
"alternatives",
"extend",
"in_domain",
"in_site",
"need",
"need_alphanumeric_key",
"need_array",
"need_array_of",
"need_boolean",
"need_chanlist",
"need_domain_name",
"need_number",
"need_one_of",
"need_string",
"need_string_array",
"need_string_array_match",
"need_string_match",
"need_table",
"need_value",
"obsolete",
"table_keys",
"this_domain",
},
}
files["package/**/luasrc/lib/gluon/config-mode/*"] = {
globals = {
"DynamicList",
"Flag",
"Form",
"i18n",
"ListValue",
"renderer.render",
"renderer.render_string",
"Section",
"TextValue",
"_translate",
"translate",
"translatef",
"Value",
},
}
files["package/**/luasrc/lib/gluon/**/controller/*"] = {
read_globals = {
"_",
"alias",
"call",
"entry",
"model",
"node",
"template",
},
}
files["package/**/luasrc/lib/gluon/ebtables/*"] = {
read_globals = {
"chain",
"rule",
},
max_line_length = false,
}
files["targets/*"] = {
read_globals = {
"config",
"defaults",
"device",
"env",
"envtrue",
"exec",
"exec_capture",
"exec_capture_raw",
"exec_raw",
"factory_image",
"include",
"no_opkg",
"packages",
"sysupgrade_image",
"try_config",
},
}
...@@ -50,4 +50,4 @@ existing commit messages to get the idea. ...@@ -50,4 +50,4 @@ existing commit messages to get the idea.
[packages]: https://gluon.readthedocs.io/en/latest/user/site.html#packages [packages]: https://gluon.readthedocs.io/en/latest/user/site.html#packages
[#gluon]: https://webirc.hackint.org/#gluon [#gluon]: https://webirc.hackint.org/#gluon
[mailing list]: mailto:gluon@luebeck.freifunk.net [mailing list]: mailto:gluon@luebeck.freifunk.net
[list of rejected features]: https://github.com/freifunk-gluon/gluon/issues?q=label%3Arejected [list of rejected features]: https://github.com/freifunk-gluon/gluon/issues?q=label%3A%222.+status%3A+rejected%22
...@@ -4,15 +4,6 @@ LC_ALL:=C ...@@ -4,15 +4,6 @@ LC_ALL:=C
LANG:=C LANG:=C
export LC_ALL LANG export LC_ALL LANG
# initialize (possibly already user set) directory variables
GLUON_SITEDIR ?= site
GLUON_TMPDIR ?= tmp
GLUON_OUTPUTDIR ?= output
GLUON_IMAGEDIR ?= $(GLUON_OUTPUTDIR)/images
GLUON_PACKAGEDIR ?= $(GLUON_OUTPUTDIR)/packages
# check for spaces & resolve possibly relative paths # check for spaces & resolve possibly relative paths
define mkabspath define mkabspath
ifneq (1,$(words [$($(1))])) ifneq (1,$(words [$($(1))]))
...@@ -21,14 +12,8 @@ define mkabspath ...@@ -21,14 +12,8 @@ define mkabspath
override $(1) := $(abspath $($(1))) override $(1) := $(abspath $($(1)))
endef endef
GLUON_SITEDIR ?= site
$(eval $(call mkabspath,GLUON_SITEDIR)) $(eval $(call mkabspath,GLUON_SITEDIR))
$(eval $(call mkabspath,GLUON_TMPDIR))
$(eval $(call mkabspath,GLUON_OUTPUTDIR))
$(eval $(call mkabspath,GLUON_IMAGEDIR))
$(eval $(call mkabspath,GLUON_PACKAGEDIR))
export GLUON_TMPDIR GLUON_IMAGEDIR GLUON_PACKAGEDIR DEVICES
$(GLUON_SITEDIR)/site.mk: $(GLUON_SITEDIR)/site.mk:
$(error No site configuration was found. Please check out a site configuration to $(GLUON_SITEDIR)) $(error No site configuration was found. Please check out a site configuration to $(GLUON_SITEDIR))
...@@ -37,11 +22,29 @@ include $(GLUON_SITEDIR)/site.mk ...@@ -37,11 +22,29 @@ include $(GLUON_SITEDIR)/site.mk
GLUON_RELEASE ?= $(error GLUON_RELEASE not set. GLUON_RELEASE can be set in site.mk or on the command line) GLUON_RELEASE ?= $(error GLUON_RELEASE not set. GLUON_RELEASE can be set in site.mk or on the command line)
GLUON_DEPRECATED ?= $(error GLUON_DEPRECATED not set. Please consult the documentation)
# initialize (possibly already user set) directory variables
GLUON_TMPDIR ?= tmp
GLUON_OUTPUTDIR ?= output
GLUON_IMAGEDIR ?= $(GLUON_OUTPUTDIR)/images
GLUON_PACKAGEDIR ?= $(GLUON_OUTPUTDIR)/packages
GLUON_TARGETSDIR ?= targets
GLUON_PATCHESDIR ?= patches
$(eval $(call mkabspath,GLUON_TMPDIR))
$(eval $(call mkabspath,GLUON_OUTPUTDIR))
$(eval $(call mkabspath,GLUON_IMAGEDIR))
$(eval $(call mkabspath,GLUON_PACKAGEDIR))
$(eval $(call mkabspath,GLUON_TARGETSDIR))
$(eval $(call mkabspath,GLUON_PATCHESDIR))
GLUON_MULTIDOMAIN ?= 0 GLUON_MULTIDOMAIN ?= 0
GLUON_WLAN_MESH ?= 11s GLUON_WLAN_MESH ?= 11s
GLUON_DEBUG ?= 0 GLUON_DEBUG ?= 0
export GLUON_RELEASE GLUON_REGION GLUON_MULTIDOMAIN GLUON_WLAN_MESH GLUON_DEBUG export GLUON_RELEASE GLUON_REGION GLUON_MULTIDOMAIN GLUON_WLAN_MESH GLUON_DEBUG GLUON_DEPRECATED GLUON_DEVICES \
GLUON_TARGETSDIR GLUON_PATCHESDIR GLUON_TMPDIR GLUON_IMAGEDIR GLUON_PACKAGEDIR
show-release: show-release:
@echo '$(GLUON_RELEASE)' @echo '$(GLUON_RELEASE)'
...@@ -70,7 +73,7 @@ GLUON_TARGET_$$(gluon_target)_BOARD := $(1) ...@@ -70,7 +73,7 @@ GLUON_TARGET_$$(gluon_target)_BOARD := $(1)
GLUON_TARGET_$$(gluon_target)_SUBTARGET := $(2) GLUON_TARGET_$$(gluon_target)_SUBTARGET := $(2)
endef endef
include targets/targets.mk include $(GLUON_TARGETSDIR)/targets.mk
OPENWRTMAKE = $(MAKE) -C openwrt OPENWRTMAKE = $(MAKE) -C openwrt
...@@ -86,18 +89,14 @@ GLUON_CONFIG_VARS := \ ...@@ -86,18 +89,14 @@ GLUON_CONFIG_VARS := \
BOARD='$(BOARD)' \ BOARD='$(BOARD)' \
SUBTARGET='$(SUBTARGET)' SUBTARGET='$(SUBTARGET)'
OPENWRT_TARGET := $(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))
export OPENWRT_TARGET
CheckTarget := [ '$(OPENWRT_TARGET)' ] \ CheckTarget := [ '$(BOARD)' ] \
|| (echo 'Please set GLUON_TARGET to a valid target. Gluon supports the following targets:'; $(foreach target,$(GLUON_TARGETS),echo ' * $(target)';) false) || (echo 'Please set GLUON_TARGET to a valid target. Gluon supports the following targets:'; $(foreach target,$(GLUON_TARGETS),echo ' * $(target)';) false)
CheckExternal := test -d openwrt || (echo 'You don'"'"'t seem to have obtained the external repositories needed by Gluon; please call `make update` first!'; false) CheckExternal := test -d openwrt || (echo 'You don'"'"'t seem to have obtained the external repositories needed by Gluon; please call `make update` first!'; false)
define CheckSite define CheckSite
@GLUON_SITEDIR='$(GLUON_SITEDIR)' GLUON_SITE_CONFIG='$(1).conf' $(LUA) scripts/site_config.lua \ @GLUON_SITEDIR='$(GLUON_SITEDIR)' GLUON_SITE_CONFIG='$(1).conf' $(LUA) -e 'assert(dofile("scripts/site_config.lua")(os.getenv("GLUON_SITE_CONFIG")))' \
|| (echo 'Your site configuration ($(1).conf) did not pass validation.'; false) || (echo 'Your site configuration ($(1).conf) did not pass validation.'; false)
endef endef
...@@ -106,6 +105,8 @@ list-targets: FORCE ...@@ -106,6 +105,8 @@ list-targets: FORCE
@$(foreach target,$(GLUON_TARGETS),echo '$(target)';) @$(foreach target,$(GLUON_TARGETS),echo '$(target)';)
GLUON_DEFAULT_PACKAGES := hostapd-mini
GLUON_FEATURE_PACKAGES := $(shell scripts/features.sh '$(GLUON_FEATURES)' || echo '__ERROR__') GLUON_FEATURE_PACKAGES := $(shell scripts/features.sh '$(GLUON_FEATURES)' || echo '__ERROR__')
ifneq ($(filter __ERROR__,$(GLUON_FEATURE_PACKAGES)),) ifneq ($(filter __ERROR__,$(GLUON_FEATURE_PACKAGES)),)
$(error Error while evaluating GLUON_FEATURES) $(error Error while evaluating GLUON_FEATURES)
...@@ -118,19 +119,7 @@ define merge_packages ...@@ -118,19 +119,7 @@ define merge_packages
GLUON_PACKAGES := $$(strip $$(filter-out -$$(patsubst -%,%,$(pkg)) $$(patsubst -%,%,$(pkg)),$$(GLUON_PACKAGES)) $(pkg)) GLUON_PACKAGES := $$(strip $$(filter-out -$$(patsubst -%,%,$(pkg)) $$(patsubst -%,%,$(pkg)),$$(GLUON_PACKAGES)) $(pkg))
) )
endef endef
$(eval $(call merge_packages,$(GLUON_FEATURE_PACKAGES) $(GLUON_SITE_PACKAGES))) $(eval $(call merge_packages,$(GLUON_DEFAULT_PACKAGES) $(GLUON_FEATURE_PACKAGES) $(GLUON_SITE_PACKAGES)))
config: FORCE
@$(CheckExternal)
@$(CheckTarget)
@$(GLUON_CONFIG_VARS) \
scripts/target_config.sh '$(GLUON_TARGET)' '$(GLUON_PACKAGES)' \
> openwrt/.config
+@$(OPENWRTMAKE) defconfig
@$(GLUON_CONFIG_VARS) \
scripts/target_config_check.sh '$(GLUON_TARGET)' '$(GLUON_PACKAGES)'
LUA := openwrt/staging_dir/hostpkg/bin/lua LUA := openwrt/staging_dir/hostpkg/bin/lua
...@@ -142,14 +131,27 @@ $(LUA): ...@@ -142,14 +131,27 @@ $(LUA):
+@$(OPENWRTMAKE) tools/install +@$(OPENWRTMAKE) tools/install
+@$(OPENWRTMAKE) package/lua/host/compile +@$(OPENWRTMAKE) package/lua/host/compile
prepare-target: config $(LUA) ;
all: prepare-target config: $(LUA) FORCE
@$(CheckExternal)
@$(CheckTarget)
$(foreach conf,site $(patsubst $(GLUON_SITEDIR)/%.conf,%,$(wildcard $(GLUON_SITEDIR)/domains/*.conf)),$(call CheckSite,$(conf))) $(foreach conf,site $(patsubst $(GLUON_SITEDIR)/%.conf,%,$(wildcard $(GLUON_SITEDIR)/domains/*.conf)),$(call CheckSite,$(conf)))
@scripts/clean_output.sh @$(GLUON_CONFIG_VARS) \
$(LUA) scripts/target_config.lua '$(GLUON_TARGET)' '$(GLUON_PACKAGES)' \
> openwrt/.config
+@$(OPENWRTMAKE) defconfig
@$(GLUON_CONFIG_VARS) \
$(LUA) scripts/target_config_check.lua '$(GLUON_TARGET)' '$(GLUON_PACKAGES)'
all: config
@$(GLUON_CONFIG_VARS) \
$(LUA) scripts/clean_output.lua
+@$(OPENWRTMAKE) +@$(OPENWRTMAKE)
@GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/copy_output.sh '$(GLUON_TARGET)' @$(GLUON_CONFIG_VARS) \
$(LUA) scripts/copy_output.lua '$(GLUON_TARGET)'
clean download: config clean download: config
+@$(OPENWRTMAKE) $@ +@$(OPENWRTMAKE) $@
...@@ -170,7 +172,7 @@ manifest: $(LUA) FORCE ...@@ -170,7 +172,7 @@ manifest: $(LUA) FORCE
echo 'PRIORITY=$(GLUON_PRIORITY)' && \ echo 'PRIORITY=$(GLUON_PRIORITY)' && \
echo && \ echo && \
$(foreach GLUON_TARGET,$(GLUON_TARGETS), \ $(foreach GLUON_TARGET,$(GLUON_TARGETS), \
GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/generate_manifest.sh '$(GLUON_TARGET)' && \ GLUON_SITEDIR='$(GLUON_SITEDIR)' $(LUA) scripts/generate_manifest.lua '$(GLUON_TARGET)' && \
) : \ ) : \
) > 'tmp/$(GLUON_BRANCH).manifest.tmp' ) > 'tmp/$(GLUON_BRANCH).manifest.tmp'
......
...@@ -4,7 +4,9 @@ https://gluon.readthedocs.io/. ...@@ -4,7 +4,9 @@ https://gluon.readthedocs.io/.
If you're new to Gluon and ready to get your feet wet, have a look at the If you're new to Gluon and ready to get your feet wet, have a look at the
[Getting Started Guide](https://gluon.readthedocs.io/en/latest/user/getting_started.html). [Getting Started Guide](https://gluon.readthedocs.io/en/latest/user/getting_started.html).
**Gluon IRC channel: `#gluon` in [hackint](https://hackint.org/)** Gluon's developers frequent an IRC chatroom at [#gluon](ircs://irc.hackint.org/#gluon)
on [hackint](https://hackint.org/). There is also a [webchat](https://webirc.hackint.org/#irc://irc.hackint.org/#gluon)
that allows for access from within your browser.
## Issues & Feature requests ## Issues & Feature requests
...@@ -19,7 +21,7 @@ the future development of Gluon. ...@@ -19,7 +21,7 @@ the future development of Gluon.
Please refrain from using the `master` branch for anything else but development purposes! Please refrain from using the `master` branch for anything else but development purposes!
Use the most recent release instead. You can list all releases by running `git tag` Use the most recent release instead. You can list all releases by running `git tag`
and switch to one by running `git checkout v2018.2 && make update`. and switch to one by running `git checkout v2019.1 && make update`.
If you're using the autoupdater, do not autoupdate nodes with anything but releases. If you're using the autoupdater, do not autoupdate nodes with anything but releases.
If you upgrade using random master commits the nodes *will break* eventually. If you upgrade using random master commits the nodes *will break* eventually.
......
FROM debian:buster-slim
RUN apt update && apt install -y --no-install-recommends \
ca-certificates \
file \
git \
subversion \
python \
build-essential \
gawk \
unzip \
libncurses5-dev \
zlib1g-dev \
libssl-dev \
libelf-dev \
wget \
time \
ecdsautils \
lua-check \
&& rm -rf /var/lib/apt/lists/*
RUN useradd -d /gluon gluon
USER gluon
VOLUME /gluon
WORKDIR /gluon
...@@ -15,7 +15,7 @@ The script may be performed multiple times to the same document ...@@ -15,7 +15,7 @@ The script may be performed multiple times to the same document
to indicate an approval by multiple developers. to indicate an approval by multiple developers.
See also See also
* ecdsautils on https://github.com/tcatm/ecdsautils * ecdsautils on https://github.com/freifunk-gluon/ecdsautils
EOHELP EOHELP
exit 1 exit 1
......
...@@ -8,8 +8,8 @@ sigtest.sh checks if a manifest is signed by the public key <public>. There is ...@@ -8,8 +8,8 @@ sigtest.sh checks if a manifest is signed by the public key <public>. There is
no output, success or failure is indicated via the return code. no output, success or failure is indicated via the return code.
See also: See also:
* ecdsautils in https://github.com/tcatm/ecdsautils * ecdsautils in https://github.com/freifunk-gluon/ecdsautils
* http://gluon.readthedocs.org/en/latest/features/autoupdater.html * https://gluon.readthedocs.io/en/latest/features/autoupdater.html
EOHELP EOHELP
exit 1 exit 1
......
# Makefile for Sphinx documentation # Minimal makefile for Sphinx documentation
# #
# You can set these variables from the command line. # You can set these variables from the command line.
SPHINXOPTS = SPHINXOPTS = -W --keep-going
SPHINXBUILD = sphinx-build SPHINXBUILD = sphinx-build
PAPER = SOURCEDIR = .
BUILDDIR = _build BUILDDIR = _build
# User-friendly check for sphinx-build # Put it first so that "make" without argument is like "make help".
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help: help:
@echo "Please use \`make <target>' where <target> is one of" @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Gluon.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Gluon.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/Gluon"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Gluon"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml: .PHONY: help Makefile
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml: # Catch-all target: route all unknown targets to Sphinx using the new
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
@echo %: Makefile
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
#!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Gluon documentation build configuration file, created by # Configuration file for the Sphinx documentation builder.
# sphinx-quickstart on Wed Jan 29 00:45:53 2014.
# #
# This file is execfile()d with the current directory set to its # This file does only contain a selection of the most common options. For a
# containing dir. # full list see the documentation:
# # http://www.sphinx-doc.org/en/master/config
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys # -- Path setup --------------------------------------------------------------
import os
# If extensions (or modules to document with autodoc) are in another directory, # If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the # add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here. # documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.')) #
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- Project information -----------------------------------------------------
project = 'Gluon'
copyright = '2015-2019, Project Gluon'
author = 'Project Gluon'
# -- General configuration ------------------------------------------------ # The short X.Y version
version = '2018.2+'
# The full version, including alpha/beta/rc tags
release = version
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here. # If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0' #
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be # Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones. # ones.
extensions = [ extensions = [
'sphinx.ext.mathjax',
] ]
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ['_templates']
# The suffix of source filenames. # The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst' source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document. # The master toctree document.
master_doc = 'index' master_doc = 'index'
# General information about the project.
project = 'Gluon'
copyright = '2015-2018, Project Gluon'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
version = release = '2018.2'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.
#language = None #
# This is also used if you do content translation via gettext catalogs.
# There are two options for replacing |today|: either, you set today to some # Usually you set "language" from the command line for these cases.
# non-false value, then it is used: language = None
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
exclude_patterns = ['_build'] # This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use. # The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx' pygments_style = None
# A list of ignored prefixes for module index sorting. # Don't highlight code blocks unless requested explicitly
#modindex_common_prefix = [] highlight_language = 'none'
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output -------------------------------------------------
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for # The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes. # a list of builtin themes.
#html_theme = 'default' #
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme # Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the # further. For a list of options available for each theme, see the
# documentation. # documentation.
#html_theme_options = {} #
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
#html_static_path = ['_static'] #
# html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # Custom sidebar templates, must be a dictionary that maps document names
#html_show_copyright = True # to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
# html_sidebars = {}
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml"). # -- Options for HTMLHelp output ---------------------------------------------
#html_file_suffix = None
# Output file base name for HTML help builder. # Output file base name for HTML help builder.
htmlhelp_basename = 'Gluondoc' htmlhelp_basename = 'Gluondoc'
# -- Options for LaTeX output --------------------------------------------- # -- Options for LaTeX output ------------------------------------------------
latex_elements = { latex_elements = {
# The paper size ('letterpaper' or 'a4paper'). # The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper', #
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# The font size ('10pt', '11pt' or '12pt'). # Additional stuff for the LaTeX preamble.
#'pointsize': '10pt', #
# 'preamble': '',
# Additional stuff for the LaTeX preamble. # Latex figure (float) alignment
#'preamble': '', #
# 'figure_align': 'htbp',
} }
# Grouping the document tree into LaTeX files. List of tuples # Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
('index', 'Gluon.tex', 'Gluon Documentation', (master_doc, 'Gluon.tex', 'Gluon Documentation',
'Project Gluon', 'manual'), 'Project Gluon', 'manual'),
] ]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ------------------------------------------
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [
('index', 'gluon', 'Gluon Documentation', (master_doc, 'gluon', 'Gluon Documentation',
['Project Gluon'], 1) [author], 1)
] ]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output ------------------------------------------- # -- Options for Texinfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples # Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
('index', 'Gluon', 'Gluon Documentation', (master_doc, 'Gluon', 'Gluon Documentation',
'Project Gluon', 'Gluon', 'One line description of project.', author, 'Gluon', 'One line description of project.',
'Miscellaneous'), 'Miscellaneous'),
] ]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated. # -- Options for Epub output -------------------------------------------------
#texinfo_domain_indices = True
# Bibliographic Dublin Core info.
epub_title = project
# How to display URL addresses: 'footnote', 'no', or 'inline'. # The unique identifier of the text. This can be a ISBN number
#texinfo_show_urls = 'footnote' # or the project homepage.
#
# epub_identifier = ''
# A unique identification for the text.
#
# epub_uid = ''
# If true, do not generate a @detailmenu in the "Top" node's menu. # A list of files that should not be packed into the epub file.
#texinfo_no_detailmenu = False epub_exclude_files = ['search.html']
...@@ -15,9 +15,13 @@ The `main repo`_ does have issues enabled. ...@@ -15,9 +15,13 @@ The `main repo`_ does have issues enabled.
IRC IRC
--- ---
Gluon's developers frequent `#gluon on hackint`_. You're welcome to join us! Gluon's developers frequent the IRC chatroom `#gluon`_ on `hackint`_.
There is a `webchat`_ that allows for easy access from within your
webbrowser. You're welcome to join us!
.. _#gluon on hackint: irc://irc.hackint.org/#gluon .. _#gluon: ircs://irc.hackint.org/#gluon
.. _hackint: https://hackint.org/
.. _webchat: https://webirc.hackint.org/#irc://irc.hackint.org/#gluon
Working with repositories Working with repositories
...@@ -32,9 +36,9 @@ rerun ...@@ -32,9 +36,9 @@ rerun
`make update` also applies the patches that can be found in the directories found in `make update` also applies the patches that can be found in the directories found in
`patches`; the resulting branch will be called `patched`, while the commit specified in `modules` `patches`; the resulting branch will be called `patched`, while the commit specified in `modules`
can be refered to by the branch `base`. can be referred to by the branch `base`.
After new patches have been commited on top of the `patched` branch (or existing commits After new patches have been committed on top of the `patched` branch (or existing commits
since the base commit have been edited or removed), the patch directories can be regenerated since the base commit have been edited or removed), the patch directories can be regenerated
using using
...@@ -50,16 +54,18 @@ commits, making `git reflog` the only way to recover them! ...@@ -50,16 +54,18 @@ commits, making `git reflog` the only way to recover them!
Development Guidelines Development Guidelines
---------------------- ----------------------
lua should be used instead of sh whenever sensible. The following criteria Lua should be used instead of sh whenever sensible. The following criteria
should be considered: should be considered:
- Is the script doing more than just executing external commands? if so, use lua - Is the script doing more than just executing external commands? if so, use Lua
- Is the script parsing/editing json-data? If so, use lua for speed - Is the script parsing/editing json-data? If so, use Lua for speed
- When using sh, use jsonfilter instead of json_* functions for speed - When using sh, use jsonfilter instead of json_* functions for speed
Code formatting may sound like a topic for the pedantic, however it helps if Code formatting may sound like a topic for the pedantic, however it helps if
the code in the project is formatted in the same way. The following rules the code in the project is formatted in the same way. The following basic rules
apply: apply:
- use tabs instead of spaces - use tabs instead of spaces
- trailing whitespaces must be eliminated - trailing whitespaces must be eliminated
If you add Lua scripts to gluon, check formatting with ``luacheck``.
...@@ -31,14 +31,14 @@ can work:: ...@@ -31,14 +31,14 @@ can work::
lua -e 'print(require("platform_info").get_image_name())' lua -e 'print(require("platform_info").get_image_name())'
While porting Gluon to a new device, it might happen that the profile name is un- While porting Gluon to a new device, it might happen that the profile name is
known. Best practise is to generate an image first by using an arbitrary value unknown. Best practise is to generate an image first by using an arbitrary value
and then executing the lua command on the device and use its output from then on. and then executing the lua command on the device and use its output from then on.
The second parameter defines the name of the image files generated by OpenWrt. Usually, The second parameter defines the name of the image files generated by OpenWrt. Usually,
it is also the OpenWrt profile name; for devices that still use the old image build it is also the OpenWrt profile name; for devices that still use the old image build
code, a third parameter with the OpenWrt profile name can be passed. The profile names code, a third parameter with the OpenWrt profile name can be passed. The profile names
can be found in the image Makefiles in ``lede/target/linux/<target>/image/Makefile``. can be found in the image Makefiles in ``openwrt/target/linux/<target>/image/Makefile``.
Examples:: Examples::
...@@ -99,7 +99,7 @@ target supports *per-default rootfs*). ...@@ -99,7 +99,7 @@ target supports *per-default rootfs*).
Configuration Configuration
''''''''''''' '''''''''''''
The ``config`` command allows to add arbitary target-specific OpenWrt configuration The ``config`` command allows to add arbitrary target-specific OpenWrt configuration
to be emitted to ``.config``. to be emitted to ``.config``.
Notes Notes
......
...@@ -10,7 +10,7 @@ Gluon package makefiles ...@@ -10,7 +10,7 @@ Gluon package makefiles
As many packages share the same or a similar structure, Gluon provides a ``package/gluon.mk`` that As many packages share the same or a similar structure, Gluon provides a ``package/gluon.mk`` that
can be included for common definitions. This file replaces OpenWrt's ``$(INCLUDE_DIR)/package.mk``; can be included for common definitions. This file replaces OpenWrt's ``$(INCLUDE_DIR)/package.mk``;
it is usually included as ``include ../gluon.mk`` from Gluon core packages, or as it is usually included as ``include ../gluon.mk`` from Gluon core packages, or as
``include $(TOPDIR)../package/gluon.mk`` from feeds. ``include $(TOPDIR)/../package/gluon.mk`` from feeds.
Provided macros Provided macros
*************** ***************
...@@ -74,7 +74,7 @@ Feature flags provide a convenient way to define package selections without ...@@ -74,7 +74,7 @@ Feature flags provide a convenient way to define package selections without
making it necessary to list each package explicitly. making it necessary to list each package explicitly.
The main feature flag definition file is ``package/features``, but each package The main feature flag definition file is ``package/features``, but each package
feed can provide additional defintions in a file called ``features`` at the root feed can provide additional definitions in a file called ``features`` at the root
of the feed repository. of the feed repository.
Each flag *$flag* without any explicit definition will simply include the package Each flag *$flag* without any explicit definition will simply include the package
......
...@@ -11,7 +11,7 @@ from Lua scripts. Example: ...@@ -11,7 +11,7 @@ from Lua scripts. Example:
The *site* object in this example does not directly represent the *site.conf* data structure; The *site* object in this example does not directly represent the *site.conf* data structure;
instead, it is wrapped in a way that makes it more convenient to access deeply nested elements. instead, it is wrapped in a way that makes it more convenient to access deeply nested elements.
To access the the underlying values, they must be unwrapped using the function call notation To access the underlying values, they must be unwrapped using the function call notation
(the ``()`` after ``site.wifi24.ap.ssid`` in the example). (the ``()`` after ``site.wifi24.ap.ssid`` in the example).
The wrapper objects have two advantages over simple Lua tables: The wrapper objects have two advantages over simple Lua tables:
......
...@@ -23,7 +23,7 @@ Best practices ...@@ -23,7 +23,7 @@ Best practices
This allows using the same code to create the initial configuration and upgrade configurations on upgrades. This allows using the same code to create the initial configuration and upgrade configurations on upgrades.
* If it is unavoidable to run different code during the initial installation, the ``sysconfig.gluon_version`` variable * If it is unavoidable to run different code during the initial installation, the ``sysconfig.gluon_version`` variable
can be checked. This variable is ``nil`` during the initial installation and contains the previously install Gluon can be checked. This variable is ``nil`` during the initial installation and contains the previously installed Gluon
version otherwise. version otherwise.
Script ordering Script ordering
......
...@@ -5,7 +5,7 @@ As the WAN port of a node will be connected to a user's private network, it ...@@ -5,7 +5,7 @@ As the WAN port of a node will be connected to a user's private network, it
is essential that the node only uses the WAN when it is absolutely necessary. is essential that the node only uses the WAN when it is absolutely necessary.
There are two cases in which the WAN port is used: There are two cases in which the WAN port is used:
* Mesh VPN (package ``gluon-mesh-vpn-fastd`` * Mesh VPN (package ``gluon-mesh-vpn-fastd``)
* DNS to resolve the VPN servers' addresses (package ``gluon-wan-dnsmasq``) * DNS to resolve the VPN servers' addresses (package ``gluon-wan-dnsmasq``)
After the VPN connection has been established, the node should be able to reach After the VPN connection has been established, the node should be able to reach
......
...@@ -2,7 +2,7 @@ Config Mode ...@@ -2,7 +2,7 @@ Config Mode
=========== ===========
The `Config Mode` consists of several modules that provide a range of different The `Config Mode` consists of several modules that provide a range of different
condiguration options: configuration options:
gluon-config-mode-core gluon-config-mode-core
This modules provides the core functionality for the config mode. This modules provides the core functionality for the config mode.
......
...@@ -71,7 +71,7 @@ Useful functions: ...@@ -71,7 +71,7 @@ Useful functions:
values for the given key. values for the given key.
- *status* (*code*, *message*): Writes the HTTP status to the reply. Has no effect - *status* (*code*, *message*): Writes the HTTP status to the reply. Has no effect
if a status has already been sent or non-header data has been written. if a status has already been sent or non-header data has been written.
- *header* (*key*, *value*): Adds an HTTP header to the reply to be sent to to - *header* (*key*, *value*): Adds an HTTP header to the reply to be sent to
the client. Has no effect when non-header data has already been written. the client. Has no effect when non-header data has already been written.
- *prepare_content* (*mime*): Sets the *Content-Type* header to the given MIME - *prepare_content* (*mime*): Sets the *Content-Type* header to the given MIME
type, potentially setting additional headers or modifying the MIME type to type, potentially setting additional headers or modifying the MIME type to
......
...@@ -51,14 +51,14 @@ Classes and methods ...@@ -51,14 +51,14 @@ Classes and methods
- *Form:write* () - *Form:write* ()
Is called after the form has beed submitted (but only if the data is valid). It Is called after the form has been submitted (but only if the data is valid). It
is called last (after all options' *write* methods) and is usually used is called last (after all options' *write* methods) and is usually used
to commit changed UCI packages. to commit changed UCI packages.
The default implementation of *write* doesn't do anything, but it can be The default implementation of *write* doesn't do anything, but it can be
overridden. overridden.
- *Section* (usually instanciated through *Form:section*) - *Section* (usually instantiated through *Form:section*)
- *Section:option* (*type*, *id*, *title*, *description*) - *Section:option* (*type*, *id*, *title*, *description*)
......
...@@ -11,7 +11,9 @@ Views are partial HTML pages, with additional template tags that allow ...@@ -11,7 +11,9 @@ Views are partial HTML pages, with additional template tags that allow
to embed Lua code and translation strings. The following tags are defined: to embed Lua code and translation strings. The following tags are defined:
- ``<%`` ... ``%>`` evaluates the enclosed Lua expression. - ``<%`` ... ``%>`` evaluates the enclosed Lua expression.
- ``<%=`` ... ``%>`` evaluates the enclosed Lua expression and prints its value. - ``<%|`` ... ``%>`` evaluates the enclosed Lua expression and prints its value.
- ``<%=`` ... ``%>`` evaluates the enclosed Lua expression and prints its value
*without escaping HTML entities*. This is useful when the value contains HTML code.
- ``<%+`` ... ``%>`` includes another template. - ``<%+`` ... ``%>`` includes another template.
- ``<%:`` ... ``%>`` translates the enclosed string using the loaded i18n catalog. - ``<%:`` ... ``%>`` translates the enclosed string using the loaded i18n catalog.
- ``<%_`` ... ``%>`` translates the enclosed string *without escaping HTML entities* - ``<%_`` ... ``%>`` translates the enclosed string *without escaping HTML entities*
......