introduce #sg-handbook-revision-url and #sg-handbook-revision-url + other preprocessor improvements

This commit is contained in:
Mamadou Babaei
2024-08-16 18:01:03 +02:00
parent c7c8ed1e3a
commit cb02cc75c9
4 changed files with 79 additions and 36 deletions
+40 -15
View File
@@ -41,10 +41,12 @@ SG_PLUGIN_DIR := $(realpath $(SG_HANDBOOK_DIR)/..)
SG_PLUGIN_RESOURCES_DIR := $(SG_PLUGIN_DIR)/Resources
SG_PLUGIN_FILE := $(SG_PLUGIN_DIR)/SenseGlove.uplugin
SG_DOCUMENTATION_URL := https://unreal.docs.senseglove.com
SG_DOCUMENTATION_DIR := $(SG_PLUGIN_DIR)/Documentation
SG_DOCUMENTATION_EPUB_DIR := $(SG_DOCUMENTATION_DIR)/epub
SG_DOCUMENTATION_HTML_DIR := $(SG_DOCUMENTATION_DIR)/html
SG_DOCUMENTATION_PDF_DIR := $(SG_DOCUMENTATION_DIR)/pdf-outline
SG_DOCUMENTATION_PDF_FILE := $(SG_DOCUMENTATION_PDF_DIR)/output.pdf
SG_BROWSER_BINARY_PATH_LINUX := $(shell which brave-bin 2>/dev/null)
SG_BROWSER_BINARY_PATH_WINDOWS := C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe
@@ -178,6 +180,12 @@ ifeq ($(strip $(SG_HANDBOOK_REVISION)),)
SG_HANDBOOK_REVISION := mismatched
endif # ($(strip $(SG_HANDBOOK_REVISION)),)
ifneq ($(strip $(SG_HANDBOOK_REVISION)),mismatched)
SG_HANDBOOK_REVISION_URL := $(SG_DOCUMENTATION_URL)/$(SG_HANDBOOK_REVISION)
SG_HANDBOOK_ESCAPED_NAME := $(shell echo $(SG_PROJECT_NAME)-$(SG_HANDBOOK_REVISION) | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g')
SG_HANDBOOK_PDF_URL := $(SG_HANDBOOK_REVISION_URL)/$(SG_HANDBOOK_ESCAPED_NAME).pdf
endif
################################################################################
# mdbook-pdf Configuration
################################################################################
@@ -227,8 +235,11 @@ $(info Setting up a deployment temporary directory '$(SG_HANDBOOK_DEPLOY_TEMP_DI
SG_HANDBOOK_DEPLOY_TEMP_DIR := $(shell mktemp -d -t $(SG_HANDBOOK_DEPLOY_TEMP_DIR_NAME))
$(info Temporary directory has been set up at '$(SG_HANDBOOK_DEPLOY_TEMP_DIR)')
SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE := $(SG_HANDBOOK_DEPLOY_TEMP_DIR)/$(SG_HANDBOOK_ESCAPED_NAME).pdf
SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE := $(SG_HANDBOOK_DEPLOY_TEMP_DIR)/revisions.txt
SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE := $(SG_HANDBOOK_DEPLOY_TEMP_DIR)/index.html
SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE := $(SG_HANDBOOK_DEPLOY_TEMP_DIR)/index.html
################################################################################
# Env Configuration Functions
@@ -271,6 +282,8 @@ info:
@echo "$(SG_PROJECT_NAME) build information:"
@echo ""
@echo " - Handbook Revision : $(SG_HANDBOOK_REVISION)"
@echo " - Handbook Revision URL : $(SG_HANDBOOK_REVISION_URL)"
@echo " - Handbook PDF URL : $(SG_HANDBOOK_PDF_URL)"
@echo " - Git Branch : $(SG_GIT_BRANCH)"
@echo " - Git Tag : $(SG_GIT_TAG)"
@echo " - Git Commit : $(SG_GIT_COMMIT)"
@@ -378,6 +391,8 @@ _mdbook_serve:
@echo "Serving $(SG_HANDBOOK_DIR)..."
@env SG_PROJECT_NAME='$(SG_PROJECT_NAME)' \
SG_HANDBOOK_REVISION='$(SG_HANDBOOK_REVISION)' \
SG_HANDBOOK_REVISION_URL='$(SG_HANDBOOK_REVISION_URL)' \
SG_HANDBOOK_PDF_URL='$(SG_HANDBOOK_PDF_URL)' \
SG_GIT_BRANCH='$(SG_GIT_BRANCH)' \
SG_GIT_TAG='$(SG_GIT_TAG)' \
SG_GIT_COMMIT='$(SG_GIT_COMMIT)' \
@@ -405,6 +420,8 @@ _mdbook_build:
@echo "Building $(SG_HANDBOOK_DIR)..."
@env SG_PROJECT_NAME='$(SG_PROJECT_NAME)' \
SG_HANDBOOK_REVISION='$(SG_HANDBOOK_REVISION)' \
SG_HANDBOOK_REVISION_URL='$(SG_HANDBOOK_REVISION_URL)' \
SG_HANDBOOK_PDF_URL='$(SG_HANDBOOK_PDF_URL)' \
SG_GIT_BRANCH='$(SG_GIT_BRANCH)' \
SG_GIT_TAG='$(SG_GIT_TAG)' \
SG_GIT_COMMIT='$(SG_GIT_COMMIT)' \
@@ -432,6 +449,14 @@ _deploy:
@echo "Deploying '$(SG_HANDBOOK_DIR)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)'..."
@rsync -avze "ssh -p $(SG_HANDBOOK_SSH_PORT)" --perms --chmod=u+rwx,g+rx,o+rx,g-w,o-wx\
--delete $(SG_DOCUMENTATION_HTML_DIR)/ $(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)
@echo "Copying '$(SG_DOCUMENTATION_PDF_FILE)' to '$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)'..."
@cp -vr $(SG_DOCUMENTATION_PDF_FILE) $(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)
@echo "Uploading '$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)'..."
@scp \
-P $(SG_HANDBOOK_SSH_PORT) \
$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE) \
$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)
@cp -vr $(SG_DOCUMENTATION_PDF_FILE) $(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)
@echo "Retrieving the list of deployed handbook revisions from '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_PORT)/$(SG_HANDBOOK_SSH_REMOTE_DIR)'..."
@ssh \
-p $(SG_HANDBOOK_SSH_PORT) $(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST) \
@@ -449,22 +474,22 @@ _deploy:
@echo "Revisions list saved to '$(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE)'!"
@echo "Current revisions:"
@sed 's/^/ - /' $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE)
@echo "Generating '$(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)'..."
@echo "<html><head><style>" > $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo "body { font-family: Arial, sans-serif; background-color: #003070; color: #fff; margin: 0; padding: 0; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo ".container { display: table; width: 300px; margin: 0 auto; padding: 20px; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo ".row { display: table-row; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo ".cell { display: table-cell; background-color: #004890; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); margin: 10px 100px; padding: 20px; text-align: center; transition: transform 0.2s; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo ".cell:hover { transform: scale(1.05); }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo ".cell a { text-decoration: none; color: #fff; font-weight: bold; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo "</style></head><body><div style='padding: 2.0em; text-align:center;'><h1>Welcome to the SenseGlove Unreal Engine Handbook</h1><h3>Please choose a revision to continue!</h3><h5>* Please note that the next revision is the documentation for the unstable next release of the plugin and subject to change!</h5></div><div class='container'>" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo "Generating '$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)'..."
@echo "<html><head><style>" > $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo "body { font-family: Arial, sans-serif; background-color: #003070; color: #fff; margin: 0; padding: 0; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo ".container { display: table; width: 300px; margin: 0 auto; padding: 20px; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo ".row { display: table-row; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo ".cell { display: table-cell; background-color: #004890; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); margin: 10px 100px; padding: 20px; text-align: center; transition: transform 0.2s; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo ".cell:hover { transform: scale(1.05); }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo ".cell a { text-decoration: none; color: #fff; font-weight: bold; }" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo "</style></head><body><div style='padding: 2.0em; text-align:center;'><h1>Welcome to the SenseGlove Unreal Engine Handbook</h1><h3>Please choose a revision to continue!</h3><h5>* Please note that the next revision is the documentation for the unstable next release of the plugin and subject to change!</h5></div><div class='container'>" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@while read dir; \
do \
echo "<div class='row'><div class='cell'><a href=\"$$dir\">$$dir</a></div></div>"; \
done < $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE) >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo "</div></body></html>" >> $(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)
@echo "Uploading '$(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)'"
done < $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE) >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo "</div></body></html>" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
@echo "Uploading '$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)'"
@scp \
-P $(SG_HANDBOOK_SSH_PORT) \
$(SG_HANDBOOK_DEPLOY_GENERATED_INDEX_FILE) \
$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)
$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE) \
$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)
+34 -18
View File
@@ -42,6 +42,8 @@ escape_string() {
SG_PROJECT_NAME_ESCAPED=$(escape_string "${SG_PROJECT_NAME}")
SG_HANDBOOK_REVISION_ESCAPED=$(escape_string "${SG_HANDBOOK_REVISION}")
SG_HANDBOOK_REVISION_URL_ESCAPED=$(escape_string "${SG_HANDBOOK_REVISION_URL}")
SG_HANDBOOK_PDF_URL_ESCAPED=$(escape_string "${SG_HANDBOOK_PDF_URL}")
SG_GIT_BRANCH_ESCAPED=$(escape_string "${SG_GIT_BRANCH}")
SG_GIT_TAG_ESCAPED=$(escape_string "${SG_GIT_TAG}")
SG_GIT_COMMIT_ESCAPED=$(escape_string "${SG_GIT_COMMIT}")
@@ -58,27 +60,41 @@ SG_PLUGIN_VERSION_PATCH_ESCAPED=$(escape_string "${SG_PLUGIN_VERSION_PATCH}")
SG_BUILD_HOST_ESCAPED=$(escape_string "${SG_BUILD_HOST}")
SG_BUILD_TIME_ESCAPED=$(escape_string "${SG_BUILD_TIME}")
PARSED_BOOK=$(echo "${BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-project-name }}\"; \"${SG_PROJECT_NAME_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-handbook-revision }}\"; \"${SG_HANDBOOK_REVISION_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-branch }}\"; \"${SG_GIT_BRANCH_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-tag }}\"; \"${SG_GIT_TAG_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-commit }}\"; \"${SG_GIT_COMMIT_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-commit-nums-since-tag }}\"; \"${SG_GIT_COMMIT_NUMS_SINCE_TAG_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-tree-state }}\"; \"${SG_GIT_TREE_STATE_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version }}\"; \"${SG_GIT_VERSION_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version-major }}\"; \"${SG_GIT_VERSION_MAJOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version-minor }}\"; \"${SG_GIT_VERSION_MINOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version-patch }}\"; \"${SG_GIT_VERSION_PATCH_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version }}\"; \"${SG_PLUGIN_VERSION_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version-major }}\"; \"${SG_PLUGIN_VERSION_MAJOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version-minor }}\"; \"${SG_PLUGIN_VERSION_MINOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version-patch }}\"; \"${SG_PLUGIN_VERSION_PATCH_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-build-host }}\"; \"${SG_BUILD_HOST_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-build-time }}\"; \"${SG_BUILD_TIME_ESCAPED}\")")
PARSED_BOOK=$(echo "${BOOK}" | xq "
.sections[] |= (
if has(\"Chapter\") then
.Chapter.content |=
walk(if type == \"string\" then
. | gsub(\"{{ #sg-project-name }}\"; \"${SG_PROJECT_NAME_ESCAPED}\") |
gsub(\"{{ #sg-handbook-revision }}\"; \"${SG_HANDBOOK_REVISION_ESCAPED}\") |
gsub(\"{{ #sg-handbook-revision-url }}\"; \"${SG_HANDBOOK_REVISION_URL_ESCAPED}\") |
gsub(\"{{ #sg-handbook-pdf-url }}\"; \"${SG_HANDBOOK_PDF_URL_ESCAPED}\") |
gsub(\"{{ #sg-git-branch }}\"; \"${SG_GIT_BRANCH_ESCAPED}\") |
gsub(\"{{ #sg-git-tag }}\"; \"${SG_GIT_TAG_ESCAPED}\") |
gsub(\"{{ #sg-git-commit }}\"; \"${SG_GIT_COMMIT_ESCAPED}\") |
gsub(\"{{ #sg-git-commit-nums-since-tag }}\"; \"${SG_GIT_COMMIT_NUMS_SINCE_TAG_ESCAPED}\") |
gsub(\"{{ #sg-git-tree-state }}\"; \"${SG_GIT_TREE_STATE_ESCAPED}\") |
gsub(\"{{ #sg-git-version }}\"; \"${SG_GIT_VERSION_ESCAPED}\") |
gsub(\"{{ #sg-git-version-major }}\"; \"${SG_GIT_VERSION_MAJOR_ESCAPED}\") |
gsub(\"{{ #sg-git-version-minor }}\"; \"${SG_GIT_VERSION_MINOR_ESCAPED}\") |
gsub(\"{{ #sg-git-version-patch }}\"; \"${SG_GIT_VERSION_PATCH_ESCAPED}\") |
gsub(\"{{ #sg-plugin-version }}\"; \"${SG_PLUGIN_VERSION_ESCAPED}\") |
gsub(\"{{ #sg-plugin-version-major }}\"; \"${SG_PLUGIN_VERSION_MAJOR_ESCAPED}\") |
gsub(\"{{ #sg-plugin-version-minor }}\"; \"${SG_PLUGIN_VERSION_MINOR_ESCAPED}\") |
gsub(\"{{ #sg-plugin-version-patch }}\"; \"${SG_PLUGIN_VERSION_PATCH_ESCAPED}\") |
gsub(\"{{ #sg-build-host }}\"; \"${SG_BUILD_HOST_ESCAPED}\") |
gsub(\"{{ #sg-build-time }}\"; \"${SG_BUILD_TIME_ESCAPED}\")
else
.
end)
else
.
end
)")
# For debugging purpose only!
#echo "CONTEXT: ${CONTEXT}" >&2
#echo "BOOK: ${BOOK}" >&2
#echo "PARSED_BOOK: ${PARSED_BOOK}" >&2
echo "${PARSED_BOOK}" | xq '.'
echo "${PARSED_BOOK}" | xq '.'
+1 -1
View File
@@ -4,7 +4,7 @@ Welcome to the documentation for the SenseGlove Unreal Engine Plugin (a.k.a. The
This handbook is an ongoing effort and a work in progress to document the SenseGlove Unreal Engine Plugin. Feel free to visit this handbook on a regular basis.
Due to superior formatting and frequent updates, we recommend [the online version of the handbook](); nonetheless, it's available in [PDF](pdf/output.pdf) format as well.
Due to superior formatting and frequent updates, we recommend [the online version of the handbook]({{ #sg-handbook-revision-url }}); nonetheless, it's available in [PDF]({{ #sg-handbook-pdf-url }}) format as well.
> [!TIP]
> Feel free to check out [the SenseGlove Unreal Engine Plugin landing page on the UE Marketplace](https://www.unrealengine.com/marketplace/en-US/product/the-senseglove-unreal-engine-plugin) as well
+4 -2
View File
@@ -2,7 +2,9 @@
| | {{ #sg-project-name }} |
|-----------------------|-------------------------------------|
| Handbook Revision | {{ #sg-handbook-revision }} |
| Handbook Revision | {{ #sg-handbook-revision }} |
| Handbook Revision URL | [{{ #sg-handbook-revision-url }}]({{ #sg-handbook-revision-url }}) |
| Handbook PDF URL | [{{ #sg-handbook-pdf-url }}]({{ #sg-handbook-pdf-url }}) |
| Git Branch | {{ #sg-git-branch }} |
| Git Tag | {{ #sg-git-tag }} |
| Git Commit | {{ #sg-git-commit }} |
@@ -17,4 +19,4 @@
| Plugin Version Minor | {{ #sg-plugin-version-minor }} |
| Plugin Version Patch | {{ #sg-plugin-version-patch }} |
| Build Host | {{ #sg-build-host }} |
| Build Time | {{ #sg-build-time }} |
| Build Time | {{ #sg-build-time }} |