Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - temporal-community/snipsync · GitHub
Skip to content

Repository files navigation

Snipsync

Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.

Prerequisites

This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.

Install

Yarn:

yarn add snipsync

Configure

Create a file called "snipsync.config.yaml" in the project root. This file specifies the following:

  • origins: The Github repositories or local files where the tool will look for source code snippets.
  • targets: The local directories that contain the files to be spliced with the code snippets.

The origins property is a list of objects that have one of the following 2 formats:

  1. owner, repo, and optionally ref: Pull snippets from a GitHub repo
  2. files: a set of strings:
  • pattern: Relative path to load snippets from. Supports glob syntax.
  • owner: GitHub repo owner name, to be used in the source snippets links
  • repo: Name of the repo snipsync is being used in, to link to the source snippets
  • ref: (Optional, defaults to main) Used for writing source snippet links.

If the ref key is left blank or not specified, then the most recent commit from the main branch will be used. If the enable_source_link key in features is not specified, then it will default to true. If the enable_code_block key in features is not specified, then it will default to true.

The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt]. If the allowed_target_extensions key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.

The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.

Example of a complete snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplesref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporaliorepo: java-samples
- files:
pattern: ./sample-apps/typescript/*.tsowner: temporaliorepo: documentationref: maintargets:
- docs
- blogfeatures:
enable_source_link: falseenable_code_block: falseallowed_target_extensions: [.md]enable_code_dedenting: false

Example of a bare minimum snipsync.config.yaml:

origins:
- owner: temporaliorepo: go-samplestargets:
- docs

Comment wrappers

Use comments to identify code snippets and the locations where they should be merged.

Source code

In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:

// @@@SNIPSTART hellouniversefuncHelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND

In the example above, "hellouniverse" is the unique identifier for the code snippet.

Unique identifiers can contain letters, numbers, hyphens, and underscores.

Target files

In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:

<!--SNIPSTART hellouniverse--><!--SNIPEND-->

In the example above, the "hellouniverse" code snippet will be spliced between the comments. Any text inside of the placeholders will be replaced by the code snippet when the tool runs. The tool will automatically specify the code type for markdown rendering. For example, if the source file ends in ".go" then the code section will be written like this: ```go

Per-snip features

To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.

<!--SNIPSTART hellouniverse {"enable_source_link": false, "enable_code_block": false}--><!--SNIPEND-->

Selected lines

A single source code snippet may be used in multiple places. If so, you may wish to customize which lines are rendered. Add a "selected" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"selectedLines": ["1", "3-5"]}-->

The line numbers are relative to the snippet, not the source file.

The feature supports multiple selections as either a single line or a range.

Highlighed lines

Some frameworks support highlighting code lines in code blocks. If so, you can add a "highlights" configuration to the snip start line.

<!--SNIPSTART hellouniverse {"highlightedLines": "{1, 3-4}"}-->

The line numbers are relative to the published snippet. That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.

If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting

Regex snipping

Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. Specify a startPattern and an endPattern:

<!--SNIPSTART hellouniverse {"startPattern" : "const \\{ greet", "endPattern": "\\}\\)"} -->

Specifying a source file

If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:

<!--SNIPSTART money-transfer-project-template-go-workflow @https://github.com/temporalio/money-transfer-project-template-go/workflow.go -->

Run

From the root directory of your project run the following command:

yarn snipsync

Sync only some files

Pass --target with a glob to splice a subset of your target files:

yarn snipsync --target "docs/develop/dotnet/index.mdx"
yarn snipsync --target "docs/develop/dotnet/**/*.mdx"

Origins are still downloaded and all snippets extracted, so only the splice step gets faster. Scoping to a single page in the Temporal documentation repository takes a run from about 90 seconds to under 20.

Notes on the glob:

  • It resolves from the directory you run the command in.
  • It replaces targets rather than filtering it, so it can match files outside your configured target directories.
  • allowed_target_extensions still applies.
  • Quote it and pass it as a separate argument, so your shell does not expand it.

Remove snippets

In some cases, you may want to remove the snippets from your target files. Use the --clear flag to do that:

yarn snipsync --clear

--clear takes --target too:

yarn snipsync --clear --target "docs/develop/dotnet/index.mdx"

Development

The snipsync tool is set up to run its own functionality during development. Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.

While developing, you can add files to /docs define the snipsync.config.yaml file, and run yarn dev to run snipsync from the root of the repo.

To clear the snippets run yarn dev --clear

Testing

Run yarn test from the root of the repo to run the testing suites.

About

No description or website provided.

Topics

Resources

Stars

82 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages