data.prompt
-If you interactively need to ask user for an input, you may use
-the prompt
data source.
-The prompt
data source interactively asks for the user
+
If you interactively need to ask user for an input, you may use
+the prompt
data source.
+The prompt
data source interactively asks for the user
on the Command line interface, if the TTY supports it, or
asks the user on the Web UI (not implemented yet).
It is very likely that, depending on the execution engine,
-data.prompt
resources are placed at the beginning of the
-topological sorted layer to prevent interference from other
-running stages (in the case of CLIs), or in the case of
-Web UIs to collect all data in the beginning of pipeline
-execution, so that it can happen asynchronously.
It is very likely that, depending on the execution engine,
+data.prompt
resources are placed at the beginning of the
+topological sorted layer to prevent interference from other
+running stages (in the case of CLIs), or in the case of
+Web UIs to collect all data in the beginning of pipeline
+execution, so that it can happen asynchronously.
Prompting a user for response
-data "prompt" "name" {
- prompt = "what is your name?"
- default = "John Doe"
+data "prompt" "name" {
+ prompt = "what is your name?"
+ default = "John Doe"
}
Argument Reference
prompt
- The data that the user will be prompted for (optional)
-default
- Fallback data which will be returned if the user did not enter anything, or if the
+default
- Fallback data which will be returned if the user did not enter anything, or if the
TTY is absent, or if any other UI provider is missing. (optional)
Attributes Reference
@@ -203,7 +210,7 @@ Att
-
+
@@ -217,7 +224,7 @@ Att
-
+
diff --git a/configuration/import.html b/configuration/import.html
index 6358562..cb79544 100644
--- a/configuration/import.html
+++ b/configuration/import.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -170,38 +177,38 @@ togomak
Import
The import
block allows you to merge multiple pipelines together,
-into a flatter pipeline. import
blocks are evaluated before the
-dependency tree is generated, and hence, variables or expressions
-are not permitted. If you need to statisfy a more dynamic evaluation,
-use macro
instead.
+into a flatter pipeline. import
blocks are evaluated before the
+dependency tree is generated, and hence, variables or expressions
+are not permitted. If you need to statisfy a more dynamic evaluation,
+use macro
instead.
import
block accepts a single parameter without any id. The block
-specifies the source, which should be a constant value, and could
-be a local file,
+specifies the source, which should be a constant value, and could
+be a local file,
Example usage
togomak {
version = 2
}
import {
- source = "./module"
+ source = "./module"
}
-stage "main" {
- script = "echo script from the main file"
+stage "main" {
+ script = "echo script from the main file"
}
import {
- source = "git::https://github.com/srevinsaju/togomak-first-module"
+ source = "git::https://github.com/srevinsaju/togomak-first-module"
}
Argument reference
-source
- URL to fetch the pipeline from, could be local file path, relative file path, absolute file path, a Git URL, a HTTP URL, GCS bucket, AWS s3 bucket or mercurial.
+source
- URL to fetch the pipeline from, could be local file path, relative file path, absolute file path, a Git URL, a HTTP URL, GCS bucket, AWS s3 bucket or mercurial.
-The URL for source
may be link to the required pipeline inclusive of the
-protocol, or you may omit in certain cases, where detectors would
-be run on top of it.
+The URL for source
may be link to the required pipeline inclusive of the
+protocol, or you may omit in certain cases, where detectors would
+be run on top of it.
For example:
github.com/srevinsaju/togomak
would automatically evaluate to a SSH URL
@@ -210,8 +217,8 @@ Argumen
Additionally, you may add query strings like ?ref=abcdefg
to checkout a specific commit of the repository. Check out the documentation of the underlying library, go-getter
which powers terraform modules here: hashicorp/go-getter
What's the difference between macro
and import
?
-Great question, the following diagram may help you filter out the
-differences between them.
+Great question, the following diagram may help you filter out the
+differences between them.


@@ -223,7 +230,7 @@
-
+
@@ -237,7 +244,7 @@
-
+
diff --git a/configuration/introduction.html b/configuration/introduction.html
index 0d6710a..1422549 100644
--- a/configuration/introduction.html
+++ b/configuration/introduction.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -176,7 +183,7 @@ Configuration
-
+
@@ -190,7 +197,7 @@ Configuration
-
+
diff --git a/configuration/locals.html b/configuration/locals.html
index 2707848..94cd7c0 100644
--- a/configuration/locals.html
+++ b/configuration/locals.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,12 +174,12 @@ togomak
Locals
-If you plan to use a specific variable several times in your pipeline, you may use
-a locals {}
block.
+If you plan to use a specific variable several times in your pipeline, you may use
+a locals {}
block.
A simple usage may be shown below
locals {
var1 = 1
- var2 = "hello"
+ var2 = "hello"
var3 = {
apple = 2
orange = 3
@@ -185,13 +192,13 @@ Locals
}
locals {
- nerv_headquarters = "Tokyo-3"
- pilot_name = "Shinji"
+ nerv_headquarters = "Tokyo-3"
+ pilot_name = "Shinji"
}
-stage "eva01_synchronization" {
- name = "Eva-01 Synchronization Tests"
- script = "echo ${local.pilot_name} is now running synchronization tests at ${local.nerv_headquarters}"
+stage "eva01_synchronization" {
+ name = "Eva-01 Synchronization Tests"
+ script = "echo ${local.pilot_name} is now running synchronization tests at ${local.nerv_headquarters}"
}
@@ -203,7 +210,7 @@ Locals
-
+
@@ -217,7 +224,7 @@ Locals
-
+
diff --git a/configuration/macro.html b/configuration/macro.html
index 879269c..3ec7418 100644
--- a/configuration/macro.html
+++ b/configuration/macro.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,55 +174,55 @@ togomak
Macro
-Macros are reusable stages. If you would like to reuse the same stage multiple times
-in the same pipeline, with optionally different parameters, macros
are the right
+
Macros are reusable stages. If you would like to reuse the same stage multiple times
+in the same pipeline, with optionally different parameters, macros
are the right
thing for you.
You may use macro
in three ways:
- Inline stages (
stage
block): The stage is defined in the macro block, and re-used multiple times
- External files (
source
argument): Path to an external single pipeline located on the filesystem, which will
-be passed to an internal togomak child process, which will independently run the single file as a separate stage.
+be passed to an internal togomak child process, which will independently run the single file as a separate stage.
See Reusable Stages section for more information.
-- Pipeline content (
files
argument): A map containing files inline, which will be used by togomak, to create
-another child process which will run the contents of the file, as an independant stage.
+- Pipeline content (
files
argument): A map containing files inline, which will be used by togomak, to create
+another child process which will run the contents of the file, as an independant stage.
-Before you decide to use macro
, you might be interested in seeeing
+
Before you decide to use macro
, you might be interested in seeeing
import
block. See also What's the difference between macro and import?
Example usage (Inline stages)
togomak {
version = 2
}
-macro "explode" {
- stage "explode" {
+macro "explode" {
+ stage "explode" {
script = <<-EOT
for i in $(seq 1 10); do
sleep 0.1
- echo "${param.eva}: Loading $i..."
+ echo "${param.eva}: Loading $i..."
done
- echo "${param.eva}: entry plug connected! pilot ${param.pilot} synchronized! 🤖"
+ echo "${param.eva}: entry plug connected! pilot ${param.pilot} synchronized! 🤖"
EOT
}
}
-stage "entry_plug_eva01" {
+stage "entry_plug_eva01" {
use {
macro = macro.explode
parameters = {
- pilot = "Shinji Ikari 🙅♂️"
- eva = "01"
+ pilot = "Shinji Ikari 🙅♂️"
+ eva = "01"
}
}
}
-stage "entry_plug_eva02" {
+stage "entry_plug_eva02" {
use {
macro = macro.explode
parameters = {
- pilot = "Asuka Langley Soryu 🙅♀️"
- eva = "02"
+ pilot = "Asuka Langley Soryu 🙅♀️"
+ eva = "02"
}
}
}
@@ -236,16 +243,16 @@ Argumen
-The files
is a map, which accepts data in the format of key-value pairs, where the "key" is the path to the file
-and the "value" is the content of the file.
+The files
is a map, which accepts data in the format of key-value pairs, where the "key" is the path to the file
+and the "value" is the content of the file.
For example,
files = {
- "togomak.hcl" = <<-EOT
+ "togomak.hcl" = <<-EOT
togomak {
version = 2
}
- stage "hello" {
- script = "echo hello world"
+ stage "hello" {
+ script = "echo hello world"
}
EOT,
...
@@ -260,7 +267,7 @@ Argumen
-
+
@@ -274,7 +281,7 @@ Argumen
-
+
diff --git a/configuration/stage.html b/configuration/stage.html
index c206f77..9bfb0d7 100644
--- a/configuration/stage.html
+++ b/configuration/stage.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -168,17 +175,17 @@ togomak
Stage
A stage
is considered as an atomic runnable
-unit. Multiple stages may be executed
-concurrently.
-A stage can accept a script, a command and a set
-of arguments, or a macro.
+unit. Multiple stages may be executed
+concurrently.
+A stage can accept a script, a command and a set
+of arguments, or a macro.
Stage with Script
togomak {
version = 2
}
-stage "script" {
- script = "echo 'Hello World'"
+stage "script" {
+ script = "echo 'Hello World'"
}
Stage with Command and Arguments
@@ -186,8 +193,8 @@ version = 2
}
-stage "command" {
- args = ["echo", "Hello World"]
+stage "command" {
+ args = ["echo", "Hello World"]
}
Stage with Macro
@@ -195,13 +202,13 @@ Stage with
version = 2
}
-macro "echo" {
- stage "echo" {
- args = ["echo", "Hello World"]
+macro "echo" {
+ stage "echo" {
+ args = ["echo", "Hello World"]
}
}
-stage "macro" {
+stage "macro" {
use {
macro = macro.echo
}
@@ -212,13 +219,13 @@ version = 2
}
-stage "build" {
- script = "echo 'Building'"
+stage "build" {
+ script = "echo 'Building'"
}
-stage "install" {
+stage "install" {
depends_on = [stage.build]
- script = "echo 'Installing'"
+ script = "echo 'Installing'"
}
Stage with Retry
@@ -226,7 +233,7 @@ Stage with
version = 2
}
-stage "build" {
+stage "build" {
script = <<-EOT
echo this script will fail
exit 1
@@ -245,12 +252,12 @@ S
version = 2
}
-stage "example" {
+stage "example" {
container {
- image = "ubuntu"
+ image = "ubuntu"
volume {
- source = "${cwd}/diary"
- destination = "/newdiary"
+ source = "${cwd}/diary"
+ destination = "/newdiary"
}
}
script = <<-EOT
@@ -258,7 +265,7 @@ S
ls -al
for i in $(seq 1 10); do
sleep 1
- echo "Loading $i..."
+ echo "Loading $i..."
done
cat rei.diary.txt
ls -al /newdiary
@@ -320,7 +327,7 @@ Argum
-Daemonization is still wip, see daemonization for more information on availability
+Daemonization is still wip, see daemonization for more information on availability
The daemon
block supports:
@@ -342,7 +349,7 @@ Argum
-
+
@@ -356,7 +363,7 @@ Argum
-
+
diff --git a/configuration/togomak.html b/configuration/togomak.html
index 3fdf900..f154e1b 100644
--- a/configuration/togomak.html
+++ b/configuration/togomak.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,9 +174,9 @@ togomak
Togomak
-The togomak
block is a mandatory
+
The togomak
block is a mandatory
block for the file to be recognized as a valid
-togomak
pipeline.
+togomak
pipeline.
# togomak.hcl
togomak {
@@ -177,9 +184,9 @@ Togomak
version = 2
}
-The above block, with version
parameter
+
The above block, with version
parameter
is required for any pipeline to be considered
-"runnable".
+"runnable".
Arguments Reference
version
- The version of the Togomak pipeline file
@@ -201,7 +208,7 @@ Att
-
+
@@ -215,7 +222,7 @@ Att
-
+
diff --git a/contrib/plugins/introduction.html b/contrib/plugins/introduction.html
index ae23fca..c2dfb3f 100644
--- a/contrib/plugins/introduction.html
+++ b/contrib/plugins/introduction.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -176,7 +183,7 @@ Plugins
-
+
@@ -190,7 +197,7 @@ Plugins
-
+
diff --git a/contributing.html b/contributing.html
index f0b0716..b3b6ee7 100644
--- a/contributing.html
+++ b/contributing.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,7 +174,7 @@ togomak
Contributing
-Contributions are welcome, and encouraged.
+
Contributions are welcome, and encouraged.
All contributions are licensed under the MPL License v2.0
Table of Contents
@@ -191,8 +198,8 @@ C
- Open a pull request against the main repository's
v1
branch.
Commit Guidelines
-We follow the Conventional Commit standard for our commit messages.
-This standard helps us maintain a clean and informative commit history.
+
We follow the Conventional Commit standard for our commit messages.
+This standard helps us maintain a clean and informative commit history.
Each commit message should have the following format:
<type>: <description>
diff --git a/css/chrome.css b/css/chrome.css
index 29992f7..8b78255 100644
--- a/css/chrome.css
+++ b/css/chrome.css
@@ -37,9 +37,9 @@ a > .hljs {
display: flex;
flex-wrap: wrap;
background-color: var(--bg);
- border-bottom-color: var(--bg);
- border-bottom-width: 1px;
- border-bottom-style: solid;
+ border-block-end-color: var(--bg);
+ border-block-end-width: 1px;
+ border-block-end-style: solid;
}
#menu-bar.sticky,
.js #menu-bar-hover-placeholder:hover + #menu-bar,
@@ -56,7 +56,7 @@ a > .hljs {
height: var(--menu-bar-height);
}
#menu-bar.bordered {
- border-bottom-color: var(--table-border-color);
+ border-block-end-color: var(--table-border-color);
}
#menu-bar i, #menu-bar .icon-button {
position: relative;
@@ -93,7 +93,7 @@ a > .hljs {
display: flex;
margin: 0 5px;
}
-.no-js .left-buttons {
+.no-js .left-buttons button {
display: none;
}
@@ -160,7 +160,7 @@ a > .hljs {
}
.nav-wrapper {
- margin-top: 50px;
+ margin-block-start: 50px;
display: none;
}
@@ -173,23 +173,34 @@ a > .hljs {
background-color: var(--sidebar-bg);
}
-.previous {
- float: left;
-}
+/* Only Firefox supports flow-relative values */
+.previous { float: left; }
+[dir=rtl] .previous { float: right; }
+/* Only Firefox supports flow-relative values */
.next {
float: right;
right: var(--page-padding);
}
+[dir=rtl] .next {
+ float: left;
+ right: unset;
+ left: var(--page-padding);
+}
+
+/* Use the correct buttons for RTL layouts*/
+[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";}
+[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; }
@media only screen and (max-width: 1080px) {
.nav-wide-wrapper { display: none; }
.nav-wrapper { display: block; }
}
+/* sidebar-visible */
@media only screen and (max-width: 1380px) {
- .sidebar-visible .nav-wide-wrapper { display: none; }
- .sidebar-visible .nav-wrapper { display: block; }
+ #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; }
+ #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; }
}
/* Inline code */
@@ -236,7 +247,7 @@ pre > .buttons :hover {
background-color: var(--theme-hover);
}
pre > .buttons i {
- margin-left: 8px;
+ margin-inline-start: 8px;
}
pre > .buttons button {
cursor: inherit;
@@ -258,8 +269,14 @@ pre > .buttons button {
/* On mobile, make it easier to tap buttons. */
padding: 0.3rem 1rem;
}
+
+ .sidebar-resize-indicator {
+ /* Hide resize indicator on devices with limited accuracy */
+ display: none;
+ }
}
pre > code {
+ display: block;
padding: 1rem;
}
@@ -273,7 +290,7 @@ pre > code {
}
pre > .result {
- margin-top: 10px;
+ margin-block-start: 10px;
}
/* Search */
@@ -284,8 +301,14 @@ pre > .result {
mark {
border-radius: 2px;
- padding: 0 3px 1px 3px;
- margin: 0 -3px -1px -3px;
+ padding-block-start: 0;
+ padding-block-end: 1px;
+ padding-inline-start: 3px;
+ padding-inline-end: 3px;
+ margin-block-start: 0;
+ margin-block-end: -1px;
+ margin-inline-start: -3px;
+ margin-inline-end: -3px;
background-color: var(--search-mark-bg);
transition: background-color 300ms linear;
cursor: pointer;
@@ -297,14 +320,17 @@ mark.fade-out {
}
.searchbar-outer {
- margin-left: auto;
- margin-right: auto;
+ margin-inline-start: auto;
+ margin-inline-end: auto;
max-width: var(--content-max-width);
}
#searchbar {
width: 100%;
- margin: 5px auto 0px auto;
+ margin-block-start: 5px;
+ margin-block-end: 0;
+ margin-inline-start: auto;
+ margin-inline-end: auto;
padding: 10px 16px;
transition: box-shadow 300ms ease-in-out;
border: 1px solid var(--searchbar-border-color);
@@ -320,20 +346,23 @@ mark.fade-out {
.searchresults-header {
font-weight: bold;
font-size: 1em;
- padding: 18px 0 0 5px;
+ padding-block-start: 18px;
+ padding-block-end: 0;
+ padding-inline-start: 5px;
+ padding-inline-end: 0;
color: var(--searchresults-header-fg);
}
.searchresults-outer {
- margin-left: auto;
- margin-right: auto;
+ margin-inline-start: auto;
+ margin-inline-end: auto;
max-width: var(--content-max-width);
- border-bottom: 1px dashed var(--searchresults-border-color);
+ border-block-end: 1px dashed var(--searchresults-border-color);
}
ul#searchresults {
list-style: none;
- padding-left: 20px;
+ padding-inline-start: 20px;
}
ul#searchresults li {
margin: 10px 0px;
@@ -346,7 +375,10 @@ ul#searchresults li.focus {
ul#searchresults span.teaser {
display: block;
clear: both;
- margin: 5px 0 0 20px;
+ margin-block-start: 5px;
+ margin-block-end: 0;
+ margin-inline-start: 20px;
+ margin-inline-end: 0;
font-size: 0.8em;
}
ul#searchresults span.teaser em {
@@ -369,12 +401,14 @@ ul#searchresults span.teaser em {
background-color: var(--sidebar-bg);
color: var(--sidebar-fg);
}
+[dir=rtl] .sidebar { left: unset; right: 0; }
.sidebar-resizing {
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
+.no-js .sidebar,
.js:not(.sidebar-resizing) .sidebar {
transition: transform 0.3s; /* Animation: slide away */
}
@@ -394,16 +428,35 @@ ul#searchresults span.teaser em {
position: absolute;
cursor: col-resize;
width: 0;
- right: 0;
+ right: calc(var(--sidebar-resize-indicator-width) * -1);
top: 0;
bottom: 0;
+ display: flex;
+ align-items: center;
+}
+
+.sidebar-resize-handle .sidebar-resize-indicator {
+ width: 100%;
+ height: 12px;
+ background-color: var(--icons);
+ margin-inline-start: var(--sidebar-resize-indicator-space);
+}
+
+[dir=rtl] .sidebar .sidebar-resize-handle {
+ left: calc(var(--sidebar-resize-indicator-width) * -1);
+ right: unset;
}
.js .sidebar .sidebar-resize-handle {
cursor: col-resize;
- width: 5px;
+ width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space));
}
-.sidebar-hidden .sidebar {
- transform: translateX(calc(0px - var(--sidebar-width)));
+/* sidebar-hidden */
+#sidebar-toggle-anchor:not(:checked) ~ .sidebar {
+ transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
+ z-index: -1;
+}
+[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar {
+ transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
}
.sidebar::-webkit-scrollbar {
background: var(--sidebar-bg);
@@ -412,19 +465,26 @@ ul#searchresults span.teaser em {
background: var(--scrollbar);
}
-.sidebar-visible .page-wrapper {
- transform: translateX(var(--sidebar-width));
+/* sidebar-visible */
+#sidebar-toggle-anchor:checked ~ .page-wrapper {
+ transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
+}
+[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper {
+ transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
}
@media only screen and (min-width: 620px) {
- .sidebar-visible .page-wrapper {
+ #sidebar-toggle-anchor:checked ~ .page-wrapper {
+ transform: none;
+ margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width));
+ }
+ [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper {
transform: none;
- margin-left: var(--sidebar-width);
}
}
.chapter {
list-style: none outside none;
- padding-left: 0;
+ padding-inline-start: 0;
line-height: 2.2em;
}
@@ -454,7 +514,7 @@ ul#searchresults span.teaser em {
.chapter li > a.toggle {
cursor: pointer;
display: block;
- margin-left: auto;
+ margin-inline-start: auto;
padding: 0 10px;
user-select: none;
opacity: 0.68;
@@ -471,7 +531,7 @@ ul#searchresults span.teaser em {
.chapter li.chapter-item {
line-height: 1.5em;
- margin-top: 0.6em;
+ margin-block-start: 0.6em;
}
.chapter li.expanded > a.toggle div {
@@ -494,7 +554,7 @@ ul#searchresults span.teaser em {
.section {
list-style: none outside none;
- padding-left: 20px;
+ padding-inline-start: 20px;
line-height: 1.9em;
}
@@ -517,6 +577,7 @@ ul#searchresults span.teaser em {
/* Don't let the children's background extend past the rounded corners. */
overflow: hidden;
}
+[dir=rtl] .theme-popup { left: unset; right: 10px; }
.theme-popup .default {
color: var(--icons);
}
@@ -527,7 +588,7 @@ ul#searchresults span.teaser em {
padding: 2px 20px;
line-height: 25px;
white-space: nowrap;
- text-align: left;
+ text-align: start;
cursor: pointer;
color: inherit;
background: inherit;
@@ -540,6 +601,6 @@ ul#searchresults span.teaser em {
.theme-selected::before {
display: inline-block;
content: "✓";
- margin-left: -14px;
+ margin-inline-start: -14px;
width: 14px;
}
diff --git a/css/general.css b/css/general.css
index a6db680..e7d20da 100644
--- a/css/general.css
+++ b/css/general.css
@@ -25,6 +25,7 @@ body {
code {
font-family: var(--mono-font) !important;
font-size: var(--code-font-size);
+ direction: ltr !important;
}
/* make long words/inline code not x overflow */
@@ -48,13 +49,13 @@ h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
.hide-boring .boring { display: none; }
.hidden { display: none !important; }
-h2, h3 { margin-top: 2.5em; }
-h4, h5 { margin-top: 2em; }
+h2, h3 { margin-block-start: 2.5em; }
+h4, h5 { margin-block-start: 2em; }
.header + .header h3,
.header + .header h4,
.header + .header h5 {
- margin-top: 1em;
+ margin-block-start: 1em;
}
h1:target::before,
@@ -65,7 +66,7 @@ h5:target::before,
h6:target::before {
display: inline-block;
content: "»";
- margin-left: -30px;
+ margin-inline-start: -30px;
width: 30px;
}
@@ -74,28 +75,34 @@ h6:target::before {
https://bugs.webkit.org/show_bug.cgi?id=218076
*/
:target {
+ /* Safari does not support logical properties */
scroll-margin-top: calc(var(--menu-bar-height) + 0.5em);
}
.page {
outline: 0;
padding: 0 var(--page-padding);
- margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */
+ margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */
}
.page-wrapper {
box-sizing: border-box;
+ background-color: var(--bg);
}
+.no-js .page-wrapper,
.js:not(.sidebar-resizing) .page-wrapper {
transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */
}
+[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper {
+ transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */
+}
.content {
overflow-y: auto;
padding: 0 5px 50px 5px;
}
.content main {
- margin-left: auto;
- margin-right: auto;
+ margin-inline-start: auto;
+ margin-inline-end: auto;
max-width: var(--content-max-width);
}
.content p { line-height: 1.45em; }
@@ -145,8 +152,31 @@ blockquote {
padding: 0 20px;
color: var(--fg);
background-color: var(--quote-bg);
- border-top: .1em solid var(--quote-border);
- border-bottom: .1em solid var(--quote-border);
+ border-block-start: .1em solid var(--quote-border);
+ border-block-end: .1em solid var(--quote-border);
+}
+
+.warning {
+ margin: 20px;
+ padding: 0 20px;
+ border-inline-start: 2px solid var(--warning-border);
+}
+
+.warning:before {
+ position: absolute;
+ width: 3rem;
+ height: 3rem;
+ margin-inline-start: calc(-1.5rem - 21px);
+ content: "ⓘ";
+ text-align: center;
+ background-color: var(--bg);
+ color: var(--warning-border);
+ font-weight: bold;
+ font-size: 2rem;
+}
+
+blockquote .warning:before {
+ background-color: var(--quote-bg);
}
kbd {
@@ -164,7 +194,7 @@ kbd {
:not(.footnote-definition) + .footnote-definition,
.footnote-definition + :not(.footnote-definition) {
- margin-top: 2em;
+ margin-block-start: 2em;
}
.footnote-definition {
font-size: 0.9em;
diff --git a/css/print.css b/css/print.css
index 27d05e9..80ec3a5 100644
--- a/css/print.css
+++ b/css/print.css
@@ -7,8 +7,8 @@
}
#page-wrapper.page-wrapper {
- transform: none;
- margin-left: 0px;
+ transform: none !important;
+ margin-inline-start: 0px;
overflow-y: initial;
}
@@ -22,6 +22,10 @@
overflow-y: initial;
}
+code {
+ direction: ltr !important;
+}
+
pre > .buttons {
z-index: 2;
}
diff --git a/css/variables.css b/css/variables.css
index 59fcda8..0da55e8 100644
--- a/css/variables.css
+++ b/css/variables.css
@@ -3,6 +3,8 @@
:root {
--sidebar-width: 300px;
+ --sidebar-resize-indicator-width: 8px;
+ --sidebar-resize-indicator-space: 2px;
--page-padding: 15px;
--content-max-width: 750px;
--menu-bar-height: 50px;
@@ -38,6 +40,8 @@
--quote-bg: hsl(226, 15%, 17%);
--quote-border: hsl(226, 15%, 22%);
+ --warning-border: #ff8e00;
+
--table-border-color: hsl(210, 25%, 13%);
--table-header-bg: hsl(210, 25%, 28%);
--table-alternate-bg: hsl(210, 25%, 11%);
@@ -80,6 +84,8 @@
--quote-bg: hsl(234, 21%, 18%);
--quote-border: hsl(234, 21%, 23%);
+ --warning-border: #ff8e00;
+
--table-border-color: hsl(200, 7%, 13%);
--table-header-bg: hsl(200, 7%, 28%);
--table-alternate-bg: hsl(200, 7%, 11%);
@@ -122,6 +128,8 @@
--quote-bg: hsl(197, 37%, 96%);
--quote-border: hsl(197, 37%, 91%);
+ --warning-border: #ff8e00;
+
--table-border-color: hsl(0, 0%, 95%);
--table-header-bg: hsl(0, 0%, 80%);
--table-alternate-bg: hsl(0, 0%, 97%);
@@ -164,6 +172,8 @@
--quote-bg: hsl(226, 15%, 17%);
--quote-border: hsl(226, 15%, 22%);
+ --warning-border: #ff8e00;
+
--table-border-color: hsl(226, 23%, 16%);
--table-header-bg: hsl(226, 23%, 31%);
--table-alternate-bg: hsl(226, 23%, 14%);
@@ -206,6 +216,8 @@
--quote-bg: hsl(60, 5%, 75%);
--quote-border: hsl(60, 5%, 70%);
+ --warning-border: #ff8e00;
+
--table-border-color: hsl(60, 9%, 82%);
--table-header-bg: #b3a497;
--table-alternate-bg: hsl(60, 9%, 84%);
@@ -249,6 +261,8 @@
--quote-bg: hsl(234, 21%, 18%);
--quote-border: hsl(234, 21%, 23%);
+ --warning-border: #ff8e00;
+
--table-border-color: hsl(200, 7%, 13%);
--table-header-bg: hsl(200, 7%, 28%);
--table-alternate-bg: hsl(200, 7%, 11%);
diff --git a/features/concurrency.html b/features/concurrency.html
index 0abe3b7..17356a4 100644
--- a/features/concurrency.html
+++ b/features/concurrency.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -170,14 +177,14 @@ Concurrency
Togomak uses concurrency, by default. The number of stages
run in parallel, is theoritically infinity (see goroutines).
The number of stages run in parallel depends on the graph
-derived from the pipeline.
+derived from the pipeline.
Say, four stages are completely independent of each of other.
The number of stages run concurrently would be 4.
-Similarly, if stage A runs independently, but B, C, D depends
-on A, the maximum number of stages that will run in parallel would
-be 3.
-When togomak -n
or togomak --dry-run
is used, concurrency
-is disabled, so that the command output remains readable.
+Similarly, if stage A runs independently, but B, C, D depends
+on A, the maximum number of stages that will run in parallel would
+be 3.
+When togomak -n
or togomak --dry-run
is used, concurrency
+is disabled, so that the command output remains readable.
@@ -187,7 +194,7 @@ Concurrency
-
+
@@ -201,7 +208,7 @@ Concurrency
-
+
diff --git a/features/daemonizing.html b/features/daemonizing.html
index 40a90ce..fefc261 100644
--- a/features/daemonizing.html
+++ b/features/daemonizing.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,12 +174,12 @@ togomak
Daemonizing
-Sometimes, you might want to run a stage in the background, for example,
-an HTTP API server, and continue with multiple integrations tests on
-the same HTTP API server. In another scenario, you might just want
+
Sometimes, you might want to run a stage in the background, for example,
+an HTTP API server, and continue with multiple integrations tests on
+the same HTTP API server. In another scenario, you might just want
two live reloading servers for two frontends running in parallel.
Or, maybe you just need a postgres
database docker container running.
-In these cases, togomak
takes care of all the process management
+In these cases, togomak
takes care of all the process management
required for handling these daemon-like long-running process.
Here is a sample use case, directly from togomak
's togomak.hcl
togomak {
@@ -180,35 +187,35 @@ Daemonizing
}
-stage "fmt" {
- script = "go fmt github.com/srevinsaju/togomak/v1/..."
+stage "fmt" {
+ script = "go fmt github.com/srevinsaju/togomak/v1/..."
}
-stage "vet" {
- script = "go vet github.com/srevinsaju/togomak/v1/..."
+stage "vet" {
+ script = "go vet github.com/srevinsaju/togomak/v1/..."
}
-stage "build" {
+stage "build" {
depends_on = [stage.fmt, stage.vet]
- script = "go build -v -o ./cmd/togomak/togomak github.com/srevinsaju/togomak/v1/cmd/togomak"
+ script = "go build -v -o ./cmd/togomak/togomak github.com/srevinsaju/togomak/v1/cmd/togomak"
}
-stage "install" {
+stage "install" {
depends_on = [stage.build]
- script = "go install github.com/srevinsaju/togomak/v1/cmd/togomak"
+ script = "go install github.com/srevinsaju/togomak/v1/cmd/togomak"
}
-stage "docs_serve" {
+stage "docs_serve" {
daemon {
enabled = true
}
if = false
- script = "cd docs && mdbook serve"
+ script = "cd docs && mdbook serve"
}
-In the above togomak configuration file, the mdbook
generator, which
-is used for writing this documentation is allowed to run as a daemon
-process. Similarly, it is possible to have multiple processes running
+
In the above togomak configuration file, the mdbook
generator, which
+is used for writing this documentation is allowed to run as a daemon
+process. Similarly, it is possible to have multiple processes running
as well.
@@ -219,7 +226,7 @@ Daemonizing
-
+
@@ -233,7 +240,7 @@ Daemonizing
-
+
diff --git a/features/dependency.html b/features/dependency.html
index c9b9080..94c804d 100644
--- a/features/dependency.html
+++ b/features/dependency.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,47 +174,47 @@ togomak
Dependency Resolution
-togomak uses native dependency resolution, based on references within their attributes.
+
togomak uses native dependency resolution, based on references within their attributes.
Let's take a look at this example:
-stage "alice" {
- script = "echo hello world"
+stage "alice" {
+ script = "echo hello world"
}
-stage "bob" {
- script = "echo waiting for ${stage.alice.id}"
+stage "bob" {
+ script = "echo waiting for ${stage.alice.id}"
}
In the above example, stage.alice
naturally becomes a dependency of stage.bob
.
However, you can also explicitly specify dependencies if you would like to:
-stage "alice" {
- script = "hello world"
+stage "alice" {
+ script = "hello world"
}
-stage "bob" {
+stage "bob" {
depends_on = [stage.alice]
- script = "hello bob"
+ script = "hello bob"
}
Data evaluation
-Data blocks are lazily evaluated.
+
Data blocks are lazily evaluated.
Data blocks will be only evaluated before the stage requiring them, gets
-executed.
-stage "bob" {
- script = "echo Hello World"
+executed.
+stage "bob" {
+ script = "echo Hello World"
}
-data "env" "bob_name" {
- default = "Bob Ross"
+data "env" "bob_name" {
+ default = "Bob Ross"
}
-stage "alice" {
- script = "echo This is an environment variable: ${data.env.bob_name.value}"
+stage "alice" {
+ script = "echo This is an environment variable: ${data.env.bob_name.value}"
}
In the above example, the order of execution would be stage.bob
and env.bob_name
in parallel, and then stage.alice
.
If you would like to disable concurrency, and let all the execution happen synchronously and linearly,
-you can disable concurrency on togomak.pipeline.concurrency
options.
+you can disable concurrency on togomak.pipeline.concurrency
options.
@@ -217,7 +224,7 @@ Data evaluati
-
+
@@ -231,7 +238,7 @@ Data evaluati
-
+
diff --git a/features/docker.html b/features/docker.html
index 812f970..ca9d9a0 100644
--- a/features/docker.html
+++ b/features/docker.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -169,19 +176,19 @@ togomak
Container Support
podman
execution engine is not supported. togomak
uses the docker/client
SDK
-to directly interact with the running docker daemon.
+to directly interact with the running docker daemon.
Togomak has integrated docker container support, a sample usage would be as follows:
togomak {
version = 2
}
-stage "example" {
+stage "example" {
container {
- image = "ubuntu"
+ image = "ubuntu"
volume {
- source = "${cwd}/diary"
- destination = "/newdiary"
+ source = "${cwd}/diary"
+ destination = "/newdiary"
}
}
script = <<-EOT
@@ -189,7 +196,7 @@ Container
ls -al
for i in $(seq 1 10); do
sleep 1
- echo "Loading $i..."
+ echo "Loading $i..."
done
cat rei.diary.txt
ls -al /newdiary
@@ -205,7 +212,7 @@ Container
-
+
@@ -219,7 +226,7 @@ Container
-
+
diff --git a/features/interpolation.html b/features/interpolation.html
index a4b48ce..d1d833b 100644
--- a/features/interpolation.html
+++ b/features/interpolation.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -172,15 +179,15 @@ Interpolation
to achieve the same.
Let's take an example:
-stage "hello_world" {
- script = "echo ${upper('hello world')}"
+stage "hello_world" {
+ script = "echo ${upper('hello world')}"
}
The above stage prints HELLO WORLD
to standard output, thanks to the upper
helper function.
Similarly, you can even do math!
-stage "i_can_calculate" {
- script = "echo 1 plus 2 is ${1 + 2}"
+stage "i_can_calculate" {
+ script = "echo 1 plus 2 is ${1 + 2}"
}
For an incomplete list of functions, take a look at the detailed functions
page.
@@ -193,7 +200,7 @@ Interpolation
-
+
@@ -207,7 +214,7 @@ Interpolation
-
+
diff --git a/features/introduction.html b/features/introduction.html
index a65d994..82a665b 100644
--- a/features/introduction.html
+++ b/features/introduction.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -181,7 +188,7 @@ Features
-
+
@@ -195,7 +202,7 @@ Features
-
+
diff --git a/features/macros.html b/features/macros.html
index 97ae1c7..3171199 100644
--- a/features/macros.html
+++ b/features/macros.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,48 +174,48 @@ togomak
Reusable Stages
-Sometimes, you might have run into a scenario where you would like to
-repeat the same boring task multiple times in the same pipeline.
-Your first thought might be a shell script, with custom arguments
+
Sometimes, you might have run into a scenario where you would like to
+repeat the same boring task multiple times in the same pipeline.
+Your first thought might be a shell script, with custom arguments
as parameters, but maintaining these pipelines over multiple places
-would be a hassle. A single pipeline is already complicated enough in my opinion.
+would be a hassle. A single pipeline is already complicated enough in my opinion.
togomak
provides a feature called macros
which are re-usable stages.
-You can write a stage once, with a set of parameters, and re-use them
+You can write a stage once, with a set of parameters, and re-use them
in multiple stages later. Let's see how:
togomak {
version = 2
}
-macro "explode" {
- stage "explode" {
+macro "explode" {
+ stage "explode" {
script = <<-EOT
for i in $(seq 1 10); do
sleep 0.1
- echo "${param.eva}: Loading $i..."
+ echo "${param.eva}: Loading $i..."
done
- echo "${param.eva}: entry plug connected! pilot ${param.pilot} synchronized! 🤖"
+ echo "${param.eva}: entry plug connected! pilot ${param.pilot} synchronized! 🤖"
EOT
}
}
-stage "entry_plug_eva01" {
+stage "entry_plug_eva01" {
use {
macro = macro.explode
parameters = {
- pilot = "Shinji Ikari 🙅♂️"
- eva = "01"
+ pilot = "Shinji Ikari 🙅♂️"
+ eva = "01"
}
}
}
-stage "entry_plug_eva02" {
+stage "entry_plug_eva02" {
use {
macro = macro.explode
parameters = {
- pilot = "Asuka Langley Soryu 🙅♀️"
- eva = "02"
+ pilot = "Asuka Langley Soryu 🙅♀️"
+ eva = "02"
}
}
}
@@ -224,7 +231,7 @@ Reusable Stag
-
+
@@ -238,7 +245,7 @@ Reusable Stag
-
+
diff --git a/features/outputs.html b/features/outputs.html
index 6e78397..1eeb5f5 100644
--- a/features/outputs.html
+++ b/features/outputs.html
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
+
+
@@ -116,9 +123,9 @@
-
+
@@ -167,10 +174,10 @@ togomak
Outputs
-Sometimes, you would want to generate some outputs
-from your build. Sometimes, you might want to store
-the version you parsed from a file, or a list of files
-that you would want to share with another independent
+
Sometimes, you would want to generate some outputs
+from your build. Sometimes, you might want to store
+the version you parsed from a file, or a list of files
+that you would want to share with another independent
stage.
To do so, you can write as environment variables to $TOGOMAK_OUTPUTS
for example:
@@ -178,21 +185,21 @@ Outputs
version = 2
}
-stage "agent" {
+stage "agent" {
script = <<-EOT
set -u
- echo "AGENT=Ryoji Kaji" >> $TOGOMAK_OUTPUTS
+ echo "AGENT=Ryoji Kaji" >> $TOGOMAK_OUTPUTS
EOT
}
-stage "seele" {
+stage "seele" {
depends_on = [stage.agent]
- name = "seele"
- script = "echo The agent from Seele reporting! ${output.AGENT}"
+ name = "seele"
+ script = "echo The agent from Seele reporting! ${output.AGENT}"
}
-As a limitation, you can only share data within
-the same pipeline scope. i.e, data is not
+
As a limitation, you can only share data within
+the same pipeline scope. i.e, data is not
implicitly shared between pipelines run using
an remote source, or external file, in the case
of using macros
with external files. However,
@@ -206,7 +213,7 @@
Outputs
-
+
@@ -220,7 +227,7 @@ Outputs
-
+
diff --git a/highlight.js b/highlight.js
index 180385b..3256c00 100644
--- a/highlight.js
+++ b/highlight.js
@@ -3,4 +3,51 @@
License: BSD-3-Clause
Copyright (c) 2006-2020, Ivan Sagalaev
*/
-var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/
/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|[0-9]+;|[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"
+
+
@@ -116,9 +123,9 @@
-
+
@@ -178,7 +185,7 @@ Key FeaturesFlexibility and Extensibility
Togomak supports IPC-based plugins, allowing you to enhance its functionality using Golang or Python. With this capability, you can customize and extend Togomak to suit your specific needs, making it a truly versatile tool for your CICD build systems. Leveraging the power of hashicorp/go-plugin
, the same plugin system used by Terraform, Togomak offers extensive configuration capabilities for your CICD build systems. Customize and fine-tune your workflows with ease using this robust and battle-tested plugin system.
Declarative Configuration
-Forget complex configuration setups! Togomak uses a declarative HCL file to define your builds. This makes it straightforward to specify your requirements, ensuring a smooth and hassle-free configuration process. You can now even write your own parsers in any of your favorite languages to write a complex CICD pipeline now.
+Forget complex configuration setups! Togomak uses a declarative HCL file to define your builds. This makes it straightforward to specify your requirements, ensuring a smooth and hassle-free configuration process. You can now even write your own parsers in any of your favorite languages to write a complex CICD pipeline now.
Local Runner System
Togomak's local runner system is designed to run anywhere. You can detach it and execute your builds in your preferred environment, providing the flexibility and convenience you need as a developer. Say goodbye to limitations and run your builds wherever you choose.
Remote Tracking System
@@ -187,10 +194,10 @@
Collaboration made easy! Togomak includes a remote tracking server that securely stores your build logs and triggers builds through a user-friendly UI. Now you can share your build progress and collaborate with ease, whether you're working locally or on the cloud.
What's with the name?
-Togomak is a playful fusion of "tokamak" and "to go and make." "Tokamak" refers to a magnetic plasma holding device used in fusion reactors, symbolizing Togomak's aim to provide a solid framework for managing CICD processes. The implementation of Togomak in Golang represents the "to go and make" aspect, leveraging Golang's simplicity, performance, and concurrency to deliver a powerful and efficient solution for your CICD requirements. Together, these elements embody Togomak's commitment to stability, adaptability, and productivity in the world of CICD.
+Togomak is a playful fusion of "tokamak" and "to go and make." "Tokamak" refers to a magnetic plasma holding device used in fusion reactors, symbolizing Togomak's aim to provide a solid framework for managing CICD processes. The implementation of Togomak in Golang represents the "to go and make" aspect, leveraging Golang's simplicity, performance, and concurrency to deliver a powerful and efficient solution for your CICD requirements. Together, these elements embody Togomak's commitment to stability, adaptability, and productivity in the world of CICD.
Okay, that's a lot of talk. How do you pronounce it-
-toh-goh-mak.
-For the geeky users out there, Togomak is pronounced as "/toʊˈɡoʊˌmæk/."
+toh-goh-mak.
+For the geeky users out there, Togomak is pronounced as "/toʊˈɡoʊˌmæk/."
Contribute
Togomak is an open-source project and welcomes contributions from the community. If you have ideas for new features, bug fixes, or improvements, we'd love to hear from you! Check out our contribution guidelines to learn how you can get involved.
@@ -199,7 +206,7 @@ Contribute