first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
@@ -0,0 +1,16 @@
{
"node": "n8n-nodes-base.markdown",
"nodeVersion": "1.0",
"codexVersion": "1.0",
"categories": ["Core Nodes"],
"resources": {
"primaryDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.markdown/"
}
]
},
"subcategories": {
"Core Nodes": ["Data Transformation"]
}
}
@@ -0,0 +1,617 @@
import isEmpty from 'lodash/isEmpty';
import set from 'lodash/set';
import type {
IExecuteFunctions,
IDataObject,
INodeExecutionData,
INodeType,
INodeTypeDescription,
JsonObject,
} from 'n8n-workflow';
import { NodeConnectionTypes, deepCopy } from 'n8n-workflow';
import { NodeHtmlMarkdown } from 'node-html-markdown';
import { Converter } from 'showdown';
export class Markdown implements INodeType {
description: INodeTypeDescription = {
displayName: 'Markdown',
name: 'markdown',
icon: { light: 'file:markdown.svg', dark: 'file:markdown.dark.svg' },
group: ['output'],
version: 1,
subtitle:
'={{$parameter["mode"]==="markdownToHtml" ? "Markdown to HTML" : "HTML to Markdown"}}',
description: 'Convert data between Markdown and HTML',
defaults: {
name: 'Markdown',
},
inputs: [NodeConnectionTypes.Main],
outputs: [NodeConnectionTypes.Main],
credentials: [],
properties: [
{
displayName: 'Mode',
name: 'mode',
type: 'options',
options: [
{
name: 'Markdown to HTML',
value: 'markdownToHtml',
description: 'Convert data from Markdown to HTML',
},
{
name: 'HTML to Markdown',
value: 'htmlToMarkdown',
description: 'Convert data from HTML to Markdown',
},
],
default: 'htmlToMarkdown',
},
{
displayName: 'HTML',
name: 'html',
type: 'string',
displayOptions: {
show: {
mode: ['htmlToMarkdown'],
},
},
default: '',
required: true,
description: 'The HTML to be converted to markdown',
},
{
displayName: 'Markdown',
name: 'markdown',
type: 'string',
displayOptions: {
show: {
mode: ['markdownToHtml'],
},
},
default: '',
required: true,
description: 'The Markdown to be converted to html',
},
{
displayName: 'Destination Key',
name: 'destinationKey',
type: 'string',
displayOptions: {
show: {
mode: ['markdownToHtml', 'htmlToMarkdown'],
},
},
default: 'data',
required: true,
placeholder: '',
description:
'The field to put the output in. Specify nested fields using dots, e.g."level1.level2.newKey".',
},
//============= HTML to Markdown Options ===============
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add option',
default: {},
displayOptions: {
show: {
mode: ['htmlToMarkdown'],
},
},
options: [
{
displayName: 'Bullet Marker',
name: 'bulletMarker',
type: 'string',
default: '*',
description: 'Specify bullet marker, default *',
},
{
displayName: 'Code Block Fence',
name: 'codeFence',
type: 'string',
default: '```',
description: 'Specify code block fence, default ```',
},
{
displayName: 'Emphasis Delimiter',
name: 'emDelimiter',
type: 'string',
default: '_',
description: 'Specify emphasis delimiter, default _',
},
{
displayName: 'Global Escape Pattern',
name: 'globalEscape',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
default: {},
description:
'Setting this will override the default escape settings, you might want to use textReplace option instead',
options: [
{
name: 'value',
displayName: 'Value',
values: [
{
displayName: 'Pattern',
name: 'pattern',
type: 'string',
default: '',
description: 'RegEx for pattern',
},
{
displayName: 'Replacement',
name: 'replacement',
type: 'string',
default: '',
description: 'String replacement',
},
],
},
],
},
{
displayName: 'Ignored Elements',
name: 'ignore',
type: 'string',
default: '',
description:
'Supplied elements will be ignored (ignores inner text does not parse children)',
placeholder: 'e.g. h1, p ...',
hint: 'Comma separated elements',
},
{
displayName: 'Keep Images With Data',
name: 'keepDataImages',
type: 'boolean',
default: false,
description:
'Whether to keep images with data: URI (Note: These can be up to 1MB each), e.g. <img src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSK......0o/">',
},
{
displayName: 'Line Start Escape Pattern',
name: 'lineStartEscape',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
default: {},
description:
'Setting this will override the default escape settings, you might want to use textReplace option instead',
options: [
{
name: 'value',
displayName: 'Value',
values: [
{
displayName: 'Pattern',
name: 'pattern',
type: 'string',
default: '',
description: 'RegEx for pattern',
},
{
displayName: 'Replacement',
name: 'replacement',
type: 'string',
default: '',
description: 'String replacement',
},
],
},
],
},
{
displayName: 'Max Consecutive New Lines',
name: 'maxConsecutiveNewlines',
type: 'number',
default: 3,
description: 'Specify max consecutive new lines allowed',
},
{
displayName: 'Place URLs At The Bottom',
name: 'useLinkReferenceDefinitions',
type: 'boolean',
default: false,
description:
'Whether to Place URLS at the bottom and format links using link reference definitions',
},
{
displayName: 'Strong Delimiter',
name: 'strongDelimiter',
type: 'string',
default: '**',
description: 'Specify strong delimiter, default **',
},
{
displayName: 'Style For Code Block',
name: 'codeBlockStyle',
type: 'options',
default: 'fence',
description: 'Specify style for code block, default "fence"',
options: [
{
name: 'Fence',
value: 'fence',
},
{
name: 'Indented',
value: 'indented',
},
],
},
{
displayName: 'Text Replacement Pattern',
name: 'textReplace',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: [],
description:
'User-defined text replacement pattern (Replaces matching text retrieved from nodes)',
options: [
{
name: 'values',
displayName: 'Values',
values: [
{
displayName: 'Pattern',
name: 'pattern',
type: 'string',
default: '',
description: 'RegEx for pattern',
},
{
displayName: 'Replacement',
name: 'replacement',
type: 'string',
default: '',
description: 'String replacement',
},
],
},
],
},
{
displayName: 'Treat As Blocks',
name: 'blockElements',
type: 'string',
default: '',
description:
'Supplied elements will be treated as blocks (surrounded with blank lines)',
placeholder: 'e.g. p, div, ...',
hint: 'Comma separated elements',
},
],
},
//============= Markdown to HTML Options ===============
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add option',
default: {},
displayOptions: {
show: {
mode: ['markdownToHtml'],
},
},
options: [
{
displayName: 'Add Blank To Links',
name: 'openLinksInNewWindow',
type: 'boolean',
default: false,
description:
'Whether to open all links in new windows (by adding the attribute target="_blank" to <a> tags)',
},
{
displayName: 'Automatic Linking to URLs',
name: 'simplifiedAutoLink',
type: 'boolean',
default: false,
description: 'Whether to enable automatic linking to URLs',
},
{
displayName: 'Backslash Escapes HTML Tags',
name: 'backslashEscapesHTMLTags',
type: 'boolean',
default: false,
description: 'Whether to support for HTML Tag escaping ex: &lt;div&gt;foo&lt;/div&gt;',
},
{
displayName: 'Complete HTML Document',
name: 'completeHTMLDocument',
type: 'boolean',
default: false,
description:
'Whether to output a complete html document, including &lt;html&gt;, &lt;head&gt; and &lt;body&gt; tags instead of an HTML fragment',
},
{
displayName: 'Customized Header ID',
name: 'customizedHeaderId',
type: 'boolean',
default: false,
description: 'Whether to use text in curly braces as header ID',
},
{
displayName: 'Emoji Support',
name: 'emoji',
type: 'boolean',
default: false,
description:
'Whether to enable emoji support. Ex: this is a :smile: emoji For more info on available emojis, see https://github.com/showdownjs/showdown/wiki/Emojis.',
},
{
displayName: 'Encode Emails',
name: 'encodeEmails',
type: 'boolean',
default: true,
description:
'Whether to enable e-mail addresses encoding through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',
},
{
displayName: 'Exclude Trailing Punctuation From URLs',
name: 'excludeTrailingPunctuationFromURLs',
type: 'boolean',
default: false,
description:
'Whether to exclude trailing punctuation from autolinking URLs. Punctuation excluded: . ! ? ( ). Only applies if simplifiedAutoLink option is set to true.',
},
{
displayName: 'GitHub Code Blocks',
name: 'ghCodeBlocks',
type: 'boolean',
default: true,
description: 'Whether to enable support for GFM code block style',
},
{
displayName: 'GitHub Compatible Header IDs',
name: 'ghCompatibleHeaderId',
type: 'boolean',
default: false,
description:
'Whether to generate header IDs compatible with github style (spaces are replaced with dashes and a bunch of non alphanumeric chars are removed)',
},
{
displayName: 'GitHub Mention Link',
name: 'ghMentionsLink',
type: 'string',
default: 'https://github.com/{u}',
description:
'Whether to change the link generated by @mentions. Showdown will replace {u} with the username. Only applies if ghMentions option is enabled.',
},
{
displayName: 'GitHub Mentions',
name: 'ghMentions',
type: 'boolean',
default: false,
description: 'Whether to enable github @mentions, which link to the username mentioned',
},
{
displayName: 'GitHub Task Lists',
name: 'tasklists',
type: 'boolean',
default: false,
description: 'Whether to enable support for GFM tasklists',
},
{
displayName: 'Header Level Start',
name: 'headerLevelStart',
type: 'number',
default: 1,
description: 'Whether to set the header starting level',
},
{
displayName: 'Mandatory Space Before Header',
name: 'requireSpaceBeforeHeadingText',
type: 'boolean',
default: false,
description: 'Whether to make adding a space between # and the header text mandatory',
},
{
displayName: 'Middle Word Asterisks',
name: 'literalMidWordAsterisks',
type: 'boolean',
default: false,
description:
'Whether to stop showdown from interpreting asterisks in the middle of words as <em> and <strong> and instead treat them as literal asterisks',
},
{
displayName: 'Middle Word Underscores',
name: 'literalMidWordUnderscores',
type: 'boolean',
default: false,
description:
'Whether to stop showdown from interpreting underscores in the middle of words as <em> and <strong> and instead treat them as literal underscores',
},
{
displayName: 'No Header ID',
name: 'noHeaderId',
type: 'boolean',
default: false,
description: 'Whether to disable the automatic generation of header IDs',
},
{
displayName: 'Parse Image Dimensions',
name: 'parseImgDimensions',
type: 'boolean',
default: false,
description:
'Whether to enable support for setting image dimensions from within markdown syntax',
},
{
displayName: 'Prefix Header ID',
name: 'prefixHeaderId',
type: 'string',
default: 'section',
description: 'Add a prefix to the generated header IDs',
},
{
displayName: 'Raw Header ID',
name: 'rawHeaderId',
type: 'boolean',
default: false,
description:
'Whether to remove only spaces, \' and " from generated header IDs (including prefixes), replacing them with dashes (-)',
},
{
displayName: 'Raw Prefix Header ID',
name: 'rawPrefixHeaderId',
type: 'boolean',
default: false,
description: 'Whether to prevent showdown from modifying the prefix',
},
{
displayName: 'Simple Line Breaks',
name: 'simpleLineBreaks',
type: 'boolean',
default: false,
description:
'Whether to parse line breaks as &lt;br&gt;, like GitHub does, without needing 2 spaces at the end of the line',
},
{
displayName: 'Smart Indentation Fix',
name: 'smartIndentationFix',
type: 'boolean',
default: false,
description:
'Whether to try to smartly fix indentation problems related to es6 template strings in the midst of indented code',
},
{
displayName: 'Spaces Indented Sublists',
name: 'disableForced4SpacesIndentedSublists',
type: 'boolean',
default: false,
description:
'Whether to disable the requirement of indenting sublists by 4 spaces for them to be nested, effectively reverting to the old behavior where 2 or 3 spaces were enough',
},
{
displayName: 'Split Adjacent Blockquotes',
name: 'splitAdjacentBlockquotes',
type: 'boolean',
default: false,
description: 'Whether to split adjacent blockquote blocks',
},
{
displayName: 'Strikethrough',
name: 'strikethrough',
type: 'boolean',
default: false,
description: 'Whether to enable support for strikethrough syntax',
},
{
displayName: 'Tables Header ID',
name: 'tablesHeaderId',
type: 'boolean',
default: false,
description: 'Whether to add an ID property to table headers tags',
},
{
displayName: 'Tables Support',
name: 'tables',
type: 'boolean',
default: false,
description: 'Whether to enable support for tables syntax',
},
],
},
],
};
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
const items = this.getInputData();
const returnData: IDataObject[] = [];
const mode = this.getNodeParameter('mode', 0) as string;
const { length } = items;
for (let i = 0; i < length; i++) {
try {
if (mode === 'htmlToMarkdown') {
const options = this.getNodeParameter('options', i);
const destinationKey = this.getNodeParameter('destinationKey', i) as string;
const textReplaceOption = this.getNodeParameter(
'options.textReplace.values',
i,
[],
) as IDataObject[];
options.textReplace = !isEmpty(textReplaceOption)
? textReplaceOption.map((entry) => [entry.pattern, entry.replacement])
: undefined;
const lineStartEscapeOption = this.getNodeParameter(
'options.lineStartEscape.value',
i,
{},
) as IDataObject;
options.lineStartEscape = !isEmpty(lineStartEscapeOption)
? [lineStartEscapeOption.pattern, lineStartEscapeOption.replacement]
: undefined;
const globalEscapeOption = this.getNodeParameter(
'options.globalEscape.value',
i,
{},
) as IDataObject;
options.globalEscape = !isEmpty(globalEscapeOption)
? [globalEscapeOption.pattern, globalEscapeOption.replacement]
: undefined;
options.ignore = options.ignore
? (options.ignore as string).split(',').map((element) => element.trim())
: undefined;
options.blockElements = options.blockElements
? (options.blockElements as string).split(',').map((element) => element.trim())
: undefined;
const markdownOptions = {} as IDataObject;
Object.keys(options).forEach((option) => {
if (options[option]) {
markdownOptions[option] = options[option];
}
});
const html = this.getNodeParameter('html', i) as string;
const markdownFromHTML = NodeHtmlMarkdown.translate(html, markdownOptions);
const newItem = deepCopy(items[i].json);
set(newItem, destinationKey, markdownFromHTML);
returnData.push(newItem);
}
if (mode === 'markdownToHtml') {
const markdown = this.getNodeParameter('markdown', i) as string;
const destinationKey = this.getNodeParameter('destinationKey', i) as string;
const options = this.getNodeParameter('options', i);
const converter = new Converter();
Object.keys(options).forEach((key) => converter.setOption(key, options[key]));
const htmlFromMarkdown = converter.makeHtml(markdown);
const newItem = deepCopy(items[i].json);
set(newItem, destinationKey, htmlFromMarkdown);
returnData.push(newItem);
}
} catch (error) {
if (this.continueOnFail()) {
returnData.push({ error: (error as JsonObject).message });
continue;
}
throw error;
}
}
return [this.helpers.returnJsonArray(returnData)];
}
}
@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M37.1164 32.6187H2.88357C2.5049 32.6187 2.12993 32.5441 1.78008 32.3992C1.43023 32.2543 1.11234 32.0419 0.844579 31.7741C0.576815 31.5064 0.364412 31.1885 0.219499 30.8386C0.0745858 30.4888 0 30.1138 0 29.7351V10.8836C0 10.1188 0.303804 9.38535 0.844579 8.84458C1.38535 8.3038 2.1188 8 2.88357 8H37.1164C37.4951 8 37.8701 8.07459 38.2199 8.2195C38.5698 8.36441 38.8877 8.57681 39.1554 8.84458C39.4232 9.11234 39.6356 9.43023 39.7805 9.78008C39.9254 10.1299 40 10.5049 40 10.8836V29.7318C40.0002 30.1106 39.9258 30.4858 39.781 30.8358C39.6362 31.1859 39.4238 31.5039 39.156 31.7719C38.8882 32.0398 38.5703 32.2524 38.2203 32.3974C37.8703 32.5424 37.4952 32.6187 37.1164 32.6187ZM9.61413 26.8482V19.3476L13.4611 24.1563L17.3064 19.3476V26.8482H21.1534V13.7721H17.3064L13.4611 18.5809L9.61413 13.7721H5.76715V26.8516L9.61413 26.8482ZM35.3863 20.3094H31.5393V13.7705H27.694V20.3094H23.847L29.6158 27.0416L35.3863 20.3094Z" fill="#E7EBF3"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M37.1164 32.6187H2.88357C2.5049 32.6187 2.12993 32.5441 1.78008 32.3992C1.43023 32.2543 1.11234 32.0419 0.844579 31.7741C0.576815 31.5064 0.364412 31.1885 0.219499 30.8386C0.0745858 30.4888 0 30.1138 0 29.7351V10.8836C0 10.1188 0.303804 9.38535 0.844579 8.84458C1.38535 8.3038 2.1188 8 2.88357 8H37.1164C37.4951 8 37.8701 8.07459 38.2199 8.2195C38.5698 8.36441 38.8877 8.57681 39.1554 8.84458C39.4232 9.11234 39.6356 9.43023 39.7805 9.78008C39.9254 10.1299 40 10.5049 40 10.8836V29.7318C40.0002 30.1106 39.9258 30.4858 39.781 30.8358C39.6362 31.1859 39.4238 31.5039 39.156 31.7719C38.8882 32.0398 38.5703 32.2524 38.2203 32.3974C37.8703 32.5424 37.4952 32.6187 37.1164 32.6187ZM9.61413 26.8482V19.3476L13.4611 24.1563L17.3064 19.3476V26.8482H21.1534V13.7721H17.3064L13.4611 18.5809L9.61413 13.7721H5.76715V26.8516L9.61413 26.8482ZM35.3863 20.3094H31.5393V13.7705H27.694V20.3094H23.847L29.6158 27.0416L35.3863 20.3094Z" fill="#383839"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,5 @@
import { NodeTestHarness } from '@nodes-testing/node-test-harness';
describe('Test Markdown Node', () => {
new NodeTestHarness().setupTests();
});
@@ -0,0 +1,183 @@
{
"name": "Markdown report generation",
"nodes": [
{
"parameters": {},
"name": "On clicking 'execute'",
"type": "n8n-nodes-base.manualTrigger",
"position": [700, 420],
"typeVersion": 1,
"id": "bc5de3f0-e5f1-4fc0-ab50-ef91bada8b35"
},
{
"parameters": {
"html": "={{ $json.data }}",
"options": {}
},
"id": "01b5727e-79a2-4cc1-b52f-32ea1ba67a6f",
"name": "Markdown1",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [1200, 420]
},
{
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $json.data }}",
"options": {
"completeHTMLDocument": true
}
},
"id": "43950238-9726-403e-a17a-a9cab8089041",
"name": "Markdown",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [1500, 700]
},
{
"parameters": {
"data": {
"data": "<!doctype html> <html> <head> <title>Example Domain</title> <meta charset=\"utf-8\" /> <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> <style type=\"text/css\"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p> </div> </body> </html>"
}
},
"id": "d1f890b1-c484-441f-be70-7b35959ba9b4",
"name": "Code",
"type": "n8n-nodes-testing.testData",
"typeVersion": 1,
"position": [940, 420]
},
{
"parameters": {
"html": "={{ $json.data }}",
"options": {
"ignore": "h1"
}
},
"id": "b9f9b71d-8b27-45a3-92cc-51e1138f688b",
"name": "Markdown2",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [1200, 220]
},
{
"parameters": {
"html": "={{ $json.data }}",
"options": {
"textReplace": {
"values": [
{
"pattern": "Example Domain",
"replacement": "REPLACED"
}
]
}
}
},
"id": "9e1f3ade-067b-40b0-b702-be077e3ab653",
"name": "Markdown3",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [1200, 20]
},
{
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $json.data }}",
"options": {}
},
"id": "b7db1d99-8af5-404d-aa82-14690f879b4d",
"name": "Markdown4",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"position": [1500, 520]
}
],
"pinData": {
"Markdown3": [
{
"json": {
"data": " \n\n# REPLACED\n\nThis domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.\n\n[More information...](https://www.iana.org/domains/example)"
}
}
],
"Markdown2": [
{
"json": {
"data": " \n\n# Example Domain\n\nThis domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.\n\n[More information...](https://www.iana.org/domains/example)"
}
}
],
"Markdown4": [
{
"json": {
"data": "<h1 id=\"exampledomain\">Example Domain</h1>\n<p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>\n<p><a href=\"https://www.iana.org/domains/example\">More information…</a></p>"
}
}
],
"Markdown": [
{
"json": {
"data": "<!DOCTYPE HTML>\n<html>\n<head>\n<meta charset=\"utf-8\">\n</head>\n<body>\n<h1 id=\"exampledomain\">Example Domain</h1>\n<p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>\n<p><a href=\"https://www.iana.org/domains/example\">More information…</a></p>\n</body>\n</html>"
}
}
]
},
"connections": {
"On clicking 'execute'": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Markdown1": {
"main": [
[
{
"node": "Markdown",
"type": "main",
"index": 0
},
{
"node": "Markdown4",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Markdown1",
"type": "main",
"index": 0
},
{
"node": "Markdown2",
"type": "main",
"index": 0
},
{
"node": "Markdown3",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {},
"versionId": "fadb0d9c-191d-461d-904c-5ce47763ae25",
"id": "115",
"meta": {
"instanceId": "36203ea1ce3cef713fa25999bd9874ae26b9e4c2c3a90a365f2882a154d031d0"
},
"tags": []
}