mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Compare commits
1 Commits
1.0.6
...
setmessage
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5d9ac5c76 |
2
.github/ISSUE_TEMPLATE/--bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/--bug_report.md
vendored
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Reproducible software issues in the core of Node-RED
|
||||
about: Reproducable software issues in the core of Node-RED
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -29,6 +29,6 @@ the [forum](https://discourse.nodered.org) or
|
||||
<!-- Put an `x` in the boxes that apply -->
|
||||
|
||||
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
|
||||
- [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team.
|
||||
- [ ] For non-bugfix PRs, I have discussed this change on the mailing list/slack team.
|
||||
- [ ] I have run `grunt` to verify the unit tests pass
|
||||
- [ ] I have added suitable unit tests to cover the new/changed functionality
|
||||
|
||||
546
CHANGELOG.md
546
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -26,10 +26,6 @@ module.exports = function(grunt) {
|
||||
nodemonArgs.push(flowFile);
|
||||
}
|
||||
|
||||
var browserstack = grunt.option('browserstack');
|
||||
if (browserstack) {
|
||||
process.env.BROWSERSTACK = true;
|
||||
}
|
||||
var nonHeadless = grunt.option('non-headless');
|
||||
if (nonHeadless) {
|
||||
process.env.NODE_RED_NON_HEADLESS = true;
|
||||
@@ -193,8 +189,7 @@ module.exports = function(grunt) {
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-migrate-3.0.1.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js",
|
||||
"node_modules/marked/marked.min.js",
|
||||
"node_modules/dompurify/dist/purify.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/marked/marked.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js",
|
||||
"node_modules/jsonata/jsonata-es5.min.js",
|
||||
|
||||
30
package.json
30
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "node-red",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.3",
|
||||
"description": "Low-code programming for event-driven applications",
|
||||
"homepage": "http://nodered.org",
|
||||
"license": "Apache-2.0",
|
||||
@@ -24,7 +24,7 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"ajv": "6.12.0",
|
||||
"ajv": "6.10.2",
|
||||
"basic-auth": "2.0.1",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "1.19.0",
|
||||
@@ -32,7 +32,7 @@
|
||||
"clone": "2.1.2",
|
||||
"content-type": "1.0.4",
|
||||
"cookie": "0.4.0",
|
||||
"cookie-parser": "1.4.5",
|
||||
"cookie-parser": "1.4.4",
|
||||
"cors": "2.8.5",
|
||||
"cron": "1.7.2",
|
||||
"denque": "1.4.1",
|
||||
@@ -41,42 +41,40 @@
|
||||
"fs-extra": "8.1.0",
|
||||
"fs.notify": "0.0.4",
|
||||
"hash-sum": "2.0.0",
|
||||
"https-proxy-agent": "5.0.0",
|
||||
"https-proxy-agent": "2.2.4",
|
||||
"i18next": "15.1.2",
|
||||
"iconv-lite": "0.5.1",
|
||||
"iconv-lite": "0.5.0",
|
||||
"is-utf8": "0.2.1",
|
||||
"js-yaml": "3.13.1",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"jsonata": "1.8.3",
|
||||
"jsonata": "1.7.0",
|
||||
"media-typer": "1.1.0",
|
||||
"memorystore": "1.6.2",
|
||||
"memorystore": "1.6.1",
|
||||
"mime": "2.4.4",
|
||||
"mqtt": "2.18.8",
|
||||
"multer": "1.4.2",
|
||||
"mustache": "4.0.1",
|
||||
"mustache": "3.0.2",
|
||||
"node-red-node-rbe": "^0.2.6",
|
||||
"node-red-node-sentiment": "^0.1.6",
|
||||
"node-red-node-tail": "^0.1.0",
|
||||
"nopt": "4.0.3",
|
||||
"nopt": "4.0.1",
|
||||
"oauth2orize": "1.11.0",
|
||||
"on-headers": "1.0.2",
|
||||
"passport": "0.4.1",
|
||||
"passport": "0.4.0",
|
||||
"passport-http-bearer": "1.0.1",
|
||||
"passport-oauth2-client-password": "0.1.2",
|
||||
"raw-body": "2.4.1",
|
||||
"request": "2.88.0",
|
||||
"semver": "6.3.0",
|
||||
"uglify-js": "3.8.1",
|
||||
"uglify-js": "3.6.9",
|
||||
"when": "3.7.8",
|
||||
"ws": "6.2.1",
|
||||
"xml2js": "0.4.23"
|
||||
"xml2js": "0.4.22"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"bcrypt": "3.0.8"
|
||||
"bcrypt": "3.0.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"marked": "0.8.2",
|
||||
"dompurify": "2.0.8",
|
||||
"grunt": "~1.0.4",
|
||||
"grunt-chmod": "~1.1.1",
|
||||
"grunt-cli": "~1.3.2",
|
||||
@@ -104,7 +102,7 @@
|
||||
"mocha": "^5.2.0",
|
||||
"mosca": "^2.8.3",
|
||||
"node-red-node-test-helper": "^0.2.3",
|
||||
"node-sass": "^4.13.1",
|
||||
"node-sass": "^4.13.0",
|
||||
"should": "^8.4.0",
|
||||
"sinon": "1.17.7",
|
||||
"stoppable": "^1.1.0",
|
||||
|
||||
@@ -100,10 +100,7 @@ function login(req,res) {
|
||||
}
|
||||
} else if (mergedAdminAuth.type === "strategy") {
|
||||
|
||||
var urlPrefix = (settings.httpAdminRoot||"").replace(/\/$/,"");
|
||||
if (urlPrefix.length > 0) {
|
||||
urlPrefix += "/";
|
||||
}
|
||||
var urlPrefix = (settings.httpAdminRoot==='/')?"":settings.httpAdminRoot;
|
||||
response = {
|
||||
"type":"strategy",
|
||||
"prompts":[{type:"button",label:mergedAdminAuth.strategy.label, url: urlPrefix + "auth/strategy"}]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/editor-api",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.3",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./lib/index.js",
|
||||
"repository": {
|
||||
@@ -16,21 +16,21 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@node-red/util": "1.0.6",
|
||||
"@node-red/editor-client": "1.0.6",
|
||||
"@node-red/util": "1.0.3",
|
||||
"@node-red/editor-client": "1.0.3",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "1.19.0",
|
||||
"clone": "2.1.2",
|
||||
"cors": "2.8.5",
|
||||
"express-session": "1.17.0",
|
||||
"express": "4.17.1",
|
||||
"memorystore": "1.6.2",
|
||||
"memorystore": "1.6.1",
|
||||
"mime": "2.4.4",
|
||||
"mustache": "4.0.1",
|
||||
"mustache": "3.0.2",
|
||||
"oauth2orize": "1.11.0",
|
||||
"passport-http-bearer": "1.0.1",
|
||||
"passport-oauth2-client-password": "0.1.2",
|
||||
"passport": "0.4.1",
|
||||
"passport": "0.4.0",
|
||||
"when": "3.7.8",
|
||||
"ws": "6.2.1"
|
||||
},
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
"view" : "Ansicht",
|
||||
"grid" : "Gitter",
|
||||
"showGrid" : "Raster anzeigen",
|
||||
"snapGrid" : "Am Raster ausrichten",
|
||||
"snapGrid" : "Einrasten am Raster",
|
||||
"gridSize" : "Rastergröße",
|
||||
"textDir" : "Textrichtung",
|
||||
"defaultDir" : "Standard",
|
||||
"ltr" : "Von links nach rechts",
|
||||
"ltr" : "Links-nach-rechts",
|
||||
"rtl" : "Von rechts nach links",
|
||||
"auto" : "Kontextuell"
|
||||
},
|
||||
@@ -53,15 +53,15 @@
|
||||
"import" : "Import",
|
||||
"export" : "Exportieren",
|
||||
"search" : "Flows durchsuchen",
|
||||
"searchInput" : "Flows durchsuchen",
|
||||
"searchInput" : "durchsuchen Sie Ihre Flows",
|
||||
"subflows" : "Subflow",
|
||||
"createSubflow" : "Subflow erstellen",
|
||||
"selectionToSubflow" : "Auswahl zu Subflow",
|
||||
"selectionToSubflow" : "Auswahl für Subflow",
|
||||
"flows" : "Flows",
|
||||
"add" : "Hinzufügen",
|
||||
"rename" : "Umbenennen",
|
||||
"delete" : "Löschen",
|
||||
"keyboardShortcuts" : "Tastenkürzel",
|
||||
"keyboardShortcuts" : "Tastaturkurzbefehle",
|
||||
"login" : "Anmelden",
|
||||
"logout" : "Abmelden",
|
||||
"editPalette" : "Palette verwalten",
|
||||
@@ -217,7 +217,7 @@
|
||||
"remote" : "Ferne Änderungen",
|
||||
"reviewChanges" : "Änderungen prüfen",
|
||||
"noBinaryFileShowed" : "Der Inhalt der Binärdatei kann nicht angezeigt",
|
||||
"viewCommitDiff" : "Änderungen committen",
|
||||
"viewCommitDiff" : "Änderungen festschreiben",
|
||||
"compareChanges" : "Änderungen vergleichen",
|
||||
"saveConflict" : "Konfliktlösung speichern",
|
||||
"conflictHeader" : "<span> __resolved__ </span> von <span> __unresolved__ </span> -Konflikten behoben",
|
||||
@@ -226,8 +226,8 @@
|
||||
"newVersionError" : "Neue Version enthält keine gültige JSON-Datei:"
|
||||
},
|
||||
"subflow" : {
|
||||
"editSubflow" : "Subflow bearbeiten: __name__",
|
||||
"edit" : "Subflow bearbeiten",
|
||||
"editSubflow" : "Flowschablone bearbeiten: __name__",
|
||||
"edit" : "Flowsschablone bearbeiten",
|
||||
"subflowInstances" : "Es ist __count__ Instanz dieser Subflow-Vorlage vorhanden.",
|
||||
"subflowInstances_plural" : "Es gibt __count__ Instanzen dieser Subflow-Vorlage.",
|
||||
"editSubflowProperties" : "Eigenschaften bearbeiten",
|
||||
@@ -266,7 +266,7 @@
|
||||
}
|
||||
},
|
||||
"keyboard" : {
|
||||
"title" : "Tastenkürzel",
|
||||
"title" : "Tastaturkurzbefehle",
|
||||
"keyboard" : "Tastatur",
|
||||
"filterActions" : "Filteraktionen",
|
||||
"shortcut" : "Direktaufruf",
|
||||
@@ -283,7 +283,7 @@
|
||||
"exportNode" : "Node exportieren",
|
||||
"nudgeNode" : "Ausgewählte Nodes verschieben (1px)",
|
||||
"moveNode" : "Ausgewählte Nodes verschieben (20px)",
|
||||
"toggleSidebar" : "Seitenleiste ein-/ausblenden",
|
||||
"toggleSidebar" : "Seitenleiste ein-/ausschalten",
|
||||
"copyNode" : "Ausgewählte Nodes kopieren",
|
||||
"cutNode" : "Ausgewählte Nodes ausschneiden",
|
||||
"pasteNode" : "Node einfügen",
|
||||
@@ -308,7 +308,7 @@
|
||||
},
|
||||
"palette" : {
|
||||
"noInfo" : "Keine Informationen verfügbar",
|
||||
"filter" : "Nodes filtern",
|
||||
"filter" : "Filter Nodes",
|
||||
"search" : "Suchmodule",
|
||||
"addCategory" : "Neu hinzufügen ...",
|
||||
"label" : {
|
||||
@@ -366,11 +366,11 @@
|
||||
"remove" : "entfernen",
|
||||
"update" : "Update auf __version__",
|
||||
"updated" : "aktualisiert",
|
||||
"install" : "Installieren",
|
||||
"installed" : "Installiert",
|
||||
"install" : "installieren",
|
||||
"installed" : "installiert",
|
||||
"loading" : "Kataloge werden geladen ...",
|
||||
"tab-nodes" : "Nodes",
|
||||
"tab-install" : "Installieren",
|
||||
"tab-install" : "installieren",
|
||||
"sort" : "Sortierung:",
|
||||
"sortAZ" : "a-z",
|
||||
"sortRecent" : "kürzlich",
|
||||
@@ -452,7 +452,7 @@
|
||||
"name" : "Kontextdaten",
|
||||
"label" : "Kontext",
|
||||
"none" : "keine ausgewählt",
|
||||
"refresh" : "Zum Aktualisieren neu laden",
|
||||
"refresh" : "Aktualisierung zum Laden",
|
||||
"empty" : "leer",
|
||||
"node" : "Node",
|
||||
"flow" : "Flow",
|
||||
@@ -477,7 +477,7 @@
|
||||
"none" : "Keine",
|
||||
"install" : "installieren",
|
||||
"removeFromProject" : "Aus Projekt entfernen",
|
||||
"addToProject" : "Zu Projekt hinzufügen",
|
||||
"addToProject" : "zu Projekt hinzufügen",
|
||||
"files" : "Dateien",
|
||||
"flow" : "Flow",
|
||||
"credentials" : "Berechtigungsnachweis",
|
||||
@@ -510,7 +510,7 @@
|
||||
},
|
||||
"userSettings" : {
|
||||
"committerDetail" : "Committer-Details",
|
||||
"committerTip" : "Leer lassen für Systemstandard",
|
||||
"committerTip" : "Leer Wert für Systemstandardwert belassen",
|
||||
"userName" : "Benutzername",
|
||||
"email" : "E-Mail",
|
||||
"sshKeys" : "SSH-Schlüssel",
|
||||
@@ -544,7 +544,7 @@
|
||||
"revertChanges" : "Änderungen zurücksetzen",
|
||||
"localChanges" : "Lokale Änderungen",
|
||||
"none" : "Keine",
|
||||
"conflictResolve" : "Alle Konflikte wurden aufgelöst. Committe die Änderungen, um den Merge Request abzuschließen.",
|
||||
"conflictResolve" : "Alle Konflikte wurden aufgelöst. Festschreiben der Änderungen, um den Mischvorgang abzuschließen.",
|
||||
"localFiles" : "Lokale Dateien",
|
||||
"all" : "alle",
|
||||
"unmergedChanges" : "Nicht zusammengeführte Änderungen",
|
||||
|
||||
@@ -977,8 +977,7 @@
|
||||
"passphrase": "Passphrase",
|
||||
"retry": "Retry",
|
||||
"update-failed": "Failed to update auth",
|
||||
"unhandled": "Unhandled error response",
|
||||
"host-key-verify-failed": "<p>Host key verification failed.</p><p>The repository host key could not be verified. Please update your <code>known_hosts</code> file and try again."
|
||||
"unhandled": "Unhandled error response"
|
||||
},
|
||||
"create-branch-list": {
|
||||
"invalid": "Invalid branch",
|
||||
@@ -1009,7 +1008,6 @@
|
||||
"en-US": "English",
|
||||
"ja": "Japanese",
|
||||
"ko": "Korean",
|
||||
"zh-CN": "Chinese(Simplified)",
|
||||
"zh-TW": "Chinese(Traditional)"
|
||||
"zh-CN": "Chinese(Simplified)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,9 +262,5 @@
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "Returns an array with duplicate values removed from `array`"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "Returns the type of `value` as a string. If `value` is undefined, this will return `undefined`"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -803,9 +803,9 @@
|
||||
"expandItems": "要素を展開",
|
||||
"collapseItems": "要素を折り畳む",
|
||||
"duplicate": "複製",
|
||||
"error": {
|
||||
"invalidJSON": "不正なJSON: "
|
||||
}
|
||||
"error": {
|
||||
"invalidJSON": "不正なJSON: "
|
||||
}
|
||||
},
|
||||
"markdownEditor": {
|
||||
"title": "マークダウンエディタ",
|
||||
@@ -1007,7 +1007,6 @@
|
||||
"en-US": "英語",
|
||||
"ja": "日本語",
|
||||
"ko": "韓国語",
|
||||
"zh-CN": "中国語(簡体)",
|
||||
"zh-TW": "中国語(繁体)"
|
||||
"zh-CN": "中国語(簡体)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,11 +245,11 @@
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
"desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "Uniform Resource Locator (URL)要素を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
"desc": "Uniform Resource Locator (URL)要素を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
@@ -262,9 +262,5 @@
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "配列`array`から重複要素を削除した配列を返します。"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "`value` の型を文字列として返します。もし `value` が未定義の場合、 `undefined` が返されます。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,22 +10,7 @@
|
||||
"load": "读取",
|
||||
"save": "保存",
|
||||
"import": "导入",
|
||||
"export": "导出",
|
||||
"back": "后退",
|
||||
"next": "下一个",
|
||||
"clone": "克隆项目",
|
||||
"cont": "继续"
|
||||
},
|
||||
"type": {
|
||||
"string": "字符串",
|
||||
"number": "数字",
|
||||
"boolean": "布尔值",
|
||||
"array": "数组",
|
||||
"buffer": "buffer",
|
||||
"object": "对象",
|
||||
"jsonString": "JSON字符串",
|
||||
"undefined": "未定义",
|
||||
"null": "空"
|
||||
"export": "导出"
|
||||
}
|
||||
},
|
||||
"workspace": {
|
||||
@@ -34,13 +19,10 @@
|
||||
"confirmDelete": "确认删除",
|
||||
"delete": "你确定想删除 '__label__'?",
|
||||
"dropFlowHere": "把流程放到这里",
|
||||
"addFlow": "添加流程",
|
||||
"listFlows": "流程一览",
|
||||
"status": "状态",
|
||||
"enabled": "有效",
|
||||
"disabled": "无效",
|
||||
"info": "详细描述",
|
||||
"selectNodes": "点击节点来选择"
|
||||
"info": "详细描述"
|
||||
},
|
||||
"menu": {
|
||||
"label": {
|
||||
@@ -54,16 +36,11 @@
|
||||
"defaultDir": "默认方向",
|
||||
"ltr": "从左到右",
|
||||
"rtl": "从右到左",
|
||||
"auto": "上下文",
|
||||
"language": "语言",
|
||||
"browserDefault": "浏览器默认"
|
||||
"auto": "上下文"
|
||||
},
|
||||
"sidebar": {
|
||||
"show": "显示侧边栏"
|
||||
},
|
||||
"palette": {
|
||||
"show": "显示控制板"
|
||||
},
|
||||
"settings": "设置",
|
||||
"userSettings": "用户设置",
|
||||
"nodes": "节点",
|
||||
@@ -83,23 +60,11 @@
|
||||
"keyboardShortcuts": "键盘快捷方式",
|
||||
"login": "登陆",
|
||||
"logout": "退出",
|
||||
"editPalette": "节点管理",
|
||||
"editPalette":"节点管理",
|
||||
"other": "其他",
|
||||
"showTips": "显示小提示",
|
||||
"help": "Node-RED网页",
|
||||
"projects": "项目",
|
||||
"projects-new": "新建",
|
||||
"projects-open": "打开",
|
||||
"projects-settings": "项目设定",
|
||||
"showNodeLabelDefault": "显示新添加的节点的标签"
|
||||
"showTips": "显示小提示"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"toggle-navigator": "切换导航器",
|
||||
"zoom-out": "缩小",
|
||||
"zoom-reset": "重设缩放",
|
||||
"zoom-in": "放大"
|
||||
},
|
||||
"user": {
|
||||
"loggedInAs": "作为__name__登陆",
|
||||
"username": "账号",
|
||||
@@ -117,73 +82,29 @@
|
||||
"warning": "<strong>警告</strong>: __message__",
|
||||
"warnings": {
|
||||
"undeployedChanges": "节点中存在未部署的更改",
|
||||
"nodeActionDisabled": "节点操作已禁用",
|
||||
"nodeActionDisabledSubflow": "节点动作在子流程中被禁用",
|
||||
"missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息",
|
||||
"safe-mode": "<p>流程以安全模式停止。</p><p>您可以修改流程并部署更改以重新启动。</p>",
|
||||
"restartRequired": "Node-RED必须重新启动,以启用升级的模块",
|
||||
"credentials_load_failed": "<p>由于无法解密凭据,因此流程停止。</p><p>流程凭据文件已加密,但是项目的加密密钥丢失或无效。</p>",
|
||||
"credentials_load_failed_reset": "<p>凭据无法解密</p><p>流凭据文件已加密,但是项目的加密密钥丢失或无效。</p><p>流凭据文件将在下一次部署时重置。任何现有的流凭证将被清除。</p>",
|
||||
"missing_flow_file": "<p>找不到项目流程文件。</p><p>该项目未配置流程文件。</p>",
|
||||
"missing_package_file": "<p>找不到项目包文件。</p><p>项目缺少package.json文件。</p>",
|
||||
"project_empty": "<p>该项目为空。</p><p>是否要创建一组默认的项目文件?<br/>否则,您将必须在编辑器外部手动将文件添加到项目中。</p>",
|
||||
"project_not_found": "<p>未找到项目'__project__'。</p>",
|
||||
"git_merge_conflict": "<p>自动合并更改失败。</p><p>修复未合并的冲突,然后提交结果。</p>"
|
||||
"restartRequired": "Node-RED必须重新启动,以启用升级的模块"
|
||||
},
|
||||
"error": "<strong>错误</strong>: __message__",
|
||||
"error": "<strong>Error</strong>: __message__",
|
||||
"errors": {
|
||||
"lostConnection": "丢失与服务器的连接,重新连接...",
|
||||
"lostConnectionReconnect": "丢失与服务器的连接,__time__秒后重新连接",
|
||||
"lostConnectionTry": "现在尝试",
|
||||
"cannotAddSubflowToItself": "无法向其自身添加子流程",
|
||||
"cannotAddCircularReference": "无法添加子流程 - 循环引用",
|
||||
"unsupportedVersion": "您正在使用不受支持的Node.js版本<br/>请升级到最新版本的Node.js LTS",
|
||||
"failedToAppendNode": "<p>'__module__'加载失败</p><p>__error__</p>"
|
||||
},
|
||||
"project": {
|
||||
"change-branch": "转到本地分支'__project__'",
|
||||
"merge-abort": "Git合并中止",
|
||||
"loaded": "项目'__project__'已加载",
|
||||
"updated": "项目'__project__'已更新",
|
||||
"pull": "项目'__project__'已重新加载",
|
||||
"revert": "项目 '__project__'已还原",
|
||||
"merge-complete": "Git合并完成",
|
||||
"setupCredentials": "设定证书",
|
||||
"setupProjectFiles": "设置项目文件",
|
||||
"no": "不了,谢谢",
|
||||
"createDefault": "创建默认项目文件",
|
||||
"mergeConflict": "显示合并冲突"
|
||||
},
|
||||
"label": {
|
||||
"manage-project-dep": "管理项目依赖性",
|
||||
"setup-cred": "设定证书",
|
||||
"setup-project": "设置项目文件",
|
||||
"create-default-package": "创建默认的包文件",
|
||||
"no-thanks": "不了,谢谢",
|
||||
"create-default-project": "创建默认项目文件",
|
||||
"show-merge-conflicts": "显示合并冲突"
|
||||
"unsupportedVersion": "您正在使用不受支持的Node.js版本<br/>请升级到最新版本的Node.js LTS"
|
||||
}
|
||||
},
|
||||
"clipboard": {
|
||||
"clipboard": "剪贴板",
|
||||
"nodes": "节点",
|
||||
"node": "__count__节点",
|
||||
"node_plural": "__count__节点",
|
||||
"configNode": "__count__配置节点",
|
||||
"configNode_plural": "__count__配置节点",
|
||||
"flow": "__count__流程",
|
||||
"flow_plural": "__count__流程",
|
||||
"subflow": "__count__子流程",
|
||||
"subflow_plural": "__count__子流程",
|
||||
"pasteNodes": "在这里粘贴节点",
|
||||
"selectFile": "选择要导入的文件",
|
||||
"importNodes": "导入节点",
|
||||
"exportNodes": "导出节点至剪贴板",
|
||||
"download": "下载",
|
||||
"importUnrecognised": "导入了无法识别的类型:",
|
||||
"importUnrecognised_plural": "导入了无法识别的类型:",
|
||||
"nodesExported": "节点导出到了剪贴板",
|
||||
"nodesImported": "导入:",
|
||||
"nodeCopied": "已复制__count__个节点",
|
||||
"nodeCopied_plural": "已复制__count__个节点",
|
||||
"invalidFlow": "无效的流程: __message__",
|
||||
@@ -193,21 +114,11 @@
|
||||
"all": "所有流程",
|
||||
"compact": "紧凑",
|
||||
"formatted": "已格式化",
|
||||
"copy": "导出到剪贴板",
|
||||
"export": "到处到库",
|
||||
"exportAs": "导出为",
|
||||
"overwrite": "替换",
|
||||
"exists": "<p><b>\"__file__\"</b>已存在</p><p>是否要替换它?</p>"
|
||||
"copy": "导出到剪贴板"
|
||||
},
|
||||
"import": {
|
||||
"import": "导入到",
|
||||
"newFlow": "新流程",
|
||||
"errors": {
|
||||
"notArray": "输入的不是JSON数组",
|
||||
"itemNotObject": "输入的流无效 - 项目__index__不是节点对象",
|
||||
"missingId": "输入的流无效-项 __index__ 缺少'id'属性",
|
||||
"missingType": "输入的流程无效-项__index__缺少'类型'属性"
|
||||
}
|
||||
"newFlow": "新流程"
|
||||
},
|
||||
"copyMessagePath": "已复制路径",
|
||||
"copyMessageValue": "已复制数值",
|
||||
@@ -221,10 +132,7 @@
|
||||
"modifiedFlowsDesc": "只部署包含已更改节点的流",
|
||||
"modifiedNodes": "已更改的节点",
|
||||
"modifiedNodesDesc": "只部署已经更改的节点",
|
||||
"restartFlows": "重启流程",
|
||||
"restartFlowsDesc": "重新启动当前部署的流程",
|
||||
"successfulDeploy": "部署成功",
|
||||
"successfulRestart": "成功重启流程",
|
||||
"deployFailed": "部署失败: __message__",
|
||||
"unusedConfigNodes": "您有一些未使用的配置节点",
|
||||
"unusedConfigNodesLink": "点击此处查看它们",
|
||||
@@ -244,24 +152,16 @@
|
||||
"improperlyConfigured": "工作区包含一些未正确配置的节点:",
|
||||
"unknown": "工作区包含一些未知的节点类型:",
|
||||
"confirm": "你确定要部署吗?",
|
||||
"doNotWarn": "不要再对此发出警告",
|
||||
"conflict": "服务器正在运行较新的一组流程。",
|
||||
"backgroundUpdate": "服务器上的流程已更新。",
|
||||
"conflictChecking": "检查是否可以自动合并更改",
|
||||
"conflictAutoMerge": "此更改不包括冲突,可以自动合并",
|
||||
"conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。",
|
||||
"plusNMore": "+ __count__更多"
|
||||
"conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。"
|
||||
}
|
||||
},
|
||||
"eventLog": {
|
||||
"title": "事件记录日志",
|
||||
"view": "查看日志"
|
||||
},
|
||||
"diff": {
|
||||
"unresolvedCount": "__count__个未解决的冲突",
|
||||
"unresolvedCount_plural": "__count__个未解决的冲突",
|
||||
"globalNodes": "全局节点",
|
||||
"flowProperties": "流程属性",
|
||||
"type": {
|
||||
"added": "已添加",
|
||||
"changed": "已更改",
|
||||
@@ -275,19 +175,9 @@
|
||||
"nodeCount": "__count__个节点",
|
||||
"nodeCount_plural": "__count__个节点",
|
||||
"local": "本地",
|
||||
"remote": "远程",
|
||||
"reviewChanges": "查看变更",
|
||||
"noBinaryFileShowed": "无法显示二进制文件内容",
|
||||
"viewCommitDiff": "查看提交更改",
|
||||
"compareChanges": "比较变更",
|
||||
"saveConflict": "保存冲突解决",
|
||||
"conflictHeader": "已解决<span>__unresolved__</span>中的<span>__resolved__</span>个冲突",
|
||||
"commonVersionError": "通用版本不包含有效的JSON:",
|
||||
"oldVersionError": "旧版本不包含有效的JSON:",
|
||||
"newVersionError": "新版本不包含有效的JSON:"
|
||||
"remote": "远程"
|
||||
},
|
||||
"subflow": {
|
||||
"editSubflowInstance": "编辑子流实例:__name__",
|
||||
"editSubflow": "编辑流程模板: __name__",
|
||||
"edit": "编辑流程模板",
|
||||
"subflowInstances": "这个子流程模板有__count__个实例",
|
||||
@@ -295,14 +185,8 @@
|
||||
"editSubflowProperties": "编辑属性",
|
||||
"input": "输入:",
|
||||
"output": "输出:",
|
||||
"status": "状态节点",
|
||||
"deleteSubflow": "删除子流程",
|
||||
"info": "详细描述",
|
||||
"category": "类别",
|
||||
"env": {
|
||||
"restore": "恢复为默认子流",
|
||||
"remove": "删除环境变量"
|
||||
},
|
||||
"errors": {
|
||||
"noNodesSelected": "<strong>无法创建子流程</strong>: 未选择节点",
|
||||
"multipleInputsToSelection": "<strong>无法创建子流程</strong>: 多个输入到了选择"
|
||||
@@ -320,68 +204,18 @@
|
||||
"editConfig": "编辑__type__配置",
|
||||
"addNewType": "添加新的__type__节点",
|
||||
"nodeProperties": "节点属性",
|
||||
"label": "标签",
|
||||
"color": "颜色",
|
||||
"portLabels": "端口标签",
|
||||
"labelInputs": "输入",
|
||||
"labelOutputs": "输出",
|
||||
"settingIcon": "图标",
|
||||
"default": "默认",
|
||||
"noDefaultLabel": "无",
|
||||
"defaultLabel": "使用默认标签",
|
||||
"searchIcons": "搜索图标",
|
||||
"useDefault": "使用默认",
|
||||
"description": "描述",
|
||||
"show": "显示",
|
||||
"hide": "隐藏",
|
||||
"locale": "选择界面语言",
|
||||
"icon": "图标",
|
||||
"inputType": "输入类型",
|
||||
"inputs": {
|
||||
"input": "输入",
|
||||
"select": "选择",
|
||||
"checkbox": "复选框",
|
||||
"spinner": "微调器",
|
||||
"none": "空",
|
||||
"hidden": "隐藏属性"
|
||||
},
|
||||
"types": {
|
||||
"str": "字符串",
|
||||
"num": "数字",
|
||||
"bool": "布尔",
|
||||
"json": "JSON",
|
||||
"bin": "buffer",
|
||||
"env": "环境变量"
|
||||
},
|
||||
"menu": {
|
||||
"input": "输入",
|
||||
"select": "选择",
|
||||
"checkbox": "复选框",
|
||||
"spinner": "微调器",
|
||||
"hidden": "仅标签"
|
||||
},
|
||||
"select": {
|
||||
"label": "标签",
|
||||
"value": "值"
|
||||
},
|
||||
"spinner": {
|
||||
"min": "最小值",
|
||||
"max": "最大值"
|
||||
},
|
||||
"errors": {
|
||||
"scopeChange": "更改范围将使其他流中的节点无法使用",
|
||||
"invalidProperties": "无效的属性:"
|
||||
"scopeChange": "更改范围将使其他流中的节点无法使用"
|
||||
}
|
||||
},
|
||||
"keyboard": {
|
||||
"title": "键盘快捷键",
|
||||
"keyboard": "键盘",
|
||||
"filterActions": "筛选动作",
|
||||
"shortcut": "快捷键",
|
||||
"scope": "范围",
|
||||
"unassigned": "未分配",
|
||||
"global": "全局",
|
||||
"workspace": "工作组",
|
||||
"selectAll": "选择所有节点",
|
||||
"selectAllConnected": "选择所有连接的节点",
|
||||
"addRemoveNode": "从选择中添加/删除节点",
|
||||
@@ -392,14 +226,12 @@
|
||||
"nudgeNode": "移动所选节点(1px)",
|
||||
"moveNode": "移动所选节点(20px)",
|
||||
"toggleSidebar": "切换侧边栏",
|
||||
"togglePalette": "切换控制板",
|
||||
"copyNode": "复制所选节点",
|
||||
"cutNode": "剪切所选节点",
|
||||
"pasteNode": "粘贴节点",
|
||||
"undoChange": "撤消上次执行的更改",
|
||||
"searchBox": "打开搜索框",
|
||||
"managePalette": "管理面板",
|
||||
"actionList": "动作列表"
|
||||
"managePalette": "管理面板"
|
||||
},
|
||||
"library": {
|
||||
"library": "库",
|
||||
@@ -407,42 +239,30 @@
|
||||
"saveToLibrary": "保存到库...",
|
||||
"typeLibrary": "__type__类型库",
|
||||
"unnamedType": "无名__type__",
|
||||
"exportedToLibrary": "节点导出到库",
|
||||
"exportToLibrary": "将节点导出到库",
|
||||
"dialogSaveOverwrite": "一个叫做__libraryName__的__libraryType__已经存在,您需要覆盖么?",
|
||||
"invalidFilename": "无效的文件名",
|
||||
"savedNodes": "保存的节点",
|
||||
"savedType": "已保存__type__",
|
||||
"saveFailed": "保存失败: __message__",
|
||||
"newFolder": "新文件夹",
|
||||
"types": {
|
||||
"local": "本地的",
|
||||
"examples": "例子"
|
||||
},
|
||||
"exportToLibrary": "将节点导出到库"
|
||||
}
|
||||
},
|
||||
"palette": {
|
||||
"noInfo": "无可用信息",
|
||||
"filter": "过滤节点",
|
||||
"search": "搜索模块",
|
||||
"addCategory": "添加新的...",
|
||||
"label": {
|
||||
"subflows": "子流程",
|
||||
"network": "网络",
|
||||
"common": "共通",
|
||||
"input": "输入",
|
||||
"output": "输出",
|
||||
"function": "功能",
|
||||
"sequence": "序列",
|
||||
"parser": "解析",
|
||||
"social": "社交",
|
||||
"storage": "存储",
|
||||
"analysis": "分析",
|
||||
"advanced": "高级"
|
||||
},
|
||||
"actions": {
|
||||
"collapse-all": "收起所有类别",
|
||||
"expand-all": "展开所有类别"
|
||||
},
|
||||
"event": {
|
||||
"nodeAdded": "添加到面板中的节点:",
|
||||
"nodeAdded_plural": "添加到面板中的多个节点",
|
||||
@@ -456,7 +276,6 @@
|
||||
},
|
||||
"editor": {
|
||||
"title": "面板管理",
|
||||
"palette": "控制板",
|
||||
"times": {
|
||||
"seconds": "秒前",
|
||||
"minutes": "分前",
|
||||
@@ -490,8 +309,6 @@
|
||||
"updated": "已更新",
|
||||
"install": "安装",
|
||||
"installed": "已安装",
|
||||
"conflict": "冲突",
|
||||
"conflictTip": "<p>无法安装此模块,因为它包含已安装的<br/>节点类型</p><p>与<code>__module__</code>冲突</p>",
|
||||
"loading": "加载目录...",
|
||||
"tab-nodes": "节点",
|
||||
"tab-install": "安装",
|
||||
@@ -539,7 +356,6 @@
|
||||
"label": "信息",
|
||||
"node": "节点",
|
||||
"type": "类型",
|
||||
"module": "模组",
|
||||
"id": "ID",
|
||||
"status": "状态",
|
||||
"enabled": "启用",
|
||||
@@ -548,18 +364,17 @@
|
||||
"instances": "实例",
|
||||
"properties": "属性",
|
||||
"info": "信息",
|
||||
"desc": "描述",
|
||||
"blank": "空白",
|
||||
"null": "空",
|
||||
"showMore": "展开",
|
||||
"showLess": "收起",
|
||||
"flow": "流程",
|
||||
"selection": "选择",
|
||||
"nodes": "__count__ 个节点",
|
||||
"selection":"选择",
|
||||
"nodes":"__count__ 个节点",
|
||||
"flowDesc": "流程描述",
|
||||
"subflowDesc": "子流程描述",
|
||||
"nodeHelp": "节点帮助",
|
||||
"none": "无",
|
||||
"none":"无",
|
||||
"arrayItems": "__count__个项目",
|
||||
"showTips": "您可以从设置面板启用提示信息"
|
||||
},
|
||||
@@ -571,25 +386,9 @@
|
||||
"subflows": "子流程",
|
||||
"flows": "流程",
|
||||
"filterAll": "所有",
|
||||
"showAllConfigNodes": "显示所有配置节点",
|
||||
"filterUnused": "未使用",
|
||||
"showAllUnusedConfigNodes": "显示所有未使用的配置节点",
|
||||
"filtered": "__count__ 个隐藏"
|
||||
},
|
||||
"context": {
|
||||
"name": "上下文数据",
|
||||
"label": "上下午",
|
||||
"none": "未选择",
|
||||
"refresh": "刷新以加载",
|
||||
"empty": "空",
|
||||
"node": "节点",
|
||||
"flow": "流程",
|
||||
"global": "全局",
|
||||
"deleteConfirm": "你确定要删除这个项目吗?",
|
||||
"autoRefresh": "刷新选择更改",
|
||||
"refrsh": "刷新",
|
||||
"delete": "删除"
|
||||
},
|
||||
"palette": {
|
||||
"name": "节点管理",
|
||||
"label": "节点"
|
||||
@@ -600,151 +399,8 @@
|
||||
"description": "描述",
|
||||
"dependencies": "依赖",
|
||||
"settings": "设置",
|
||||
"noSummaryAvailable": "无可用摘要",
|
||||
"editDescription": "编辑项目描述",
|
||||
"editDependencies": "编辑项目依赖",
|
||||
"noDescriptionAvailable": "没有可用的描述",
|
||||
"editReadme": "编辑README.md",
|
||||
"showProjectSettings": "显示项目设置",
|
||||
"projectSettings": {
|
||||
"title": "项目设置",
|
||||
"edit": "编辑",
|
||||
"none": "空",
|
||||
"install": "安装",
|
||||
"removeFromProject": "从项目中删除",
|
||||
"addToProject": "添加到项目",
|
||||
"files": "文件",
|
||||
"package": "包",
|
||||
"flow": "流程",
|
||||
"credentials": "证书",
|
||||
"packageCreate": "保存更改后将创建文件",
|
||||
"fileNotExist": "文件不存在",
|
||||
"selectFile": "选择文件",
|
||||
"invalidEncryptionKey": "无效的加密密钥",
|
||||
"encryptionEnabled": "启用加密",
|
||||
"encryptionDisabled": "加密已禁用",
|
||||
"setTheEncryptionKey": "设置加密密钥",
|
||||
"resetTheEncryptionKey": "重置加密密钥",
|
||||
"changeTheEncryptionKey": "更改加密密钥",
|
||||
"currentKey": "当前密钥",
|
||||
"newKey": "新密钥",
|
||||
"credentialsAlert": "这将删除所有现有凭证",
|
||||
"versionControl": "版本控制",
|
||||
"branches": "分支",
|
||||
"noBranches": "没有分支",
|
||||
"deleteConfirm": "您确定要删除本地分支'__name__'吗? 这不能被撤消。",
|
||||
"unmergedConfirm": "本地分支'__name__'具有未合并的更改,这些更改将丢失。你确定要删除吗?",
|
||||
"deleteUnmergedBranch": "删除未合并的分支",
|
||||
"gitRemotes": "Git远程仓库",
|
||||
"addRemote": "添加远程仓库",
|
||||
"addRemote2": "添加远程仓库",
|
||||
"remoteName": "远程仓库名",
|
||||
"nameRule": "只能包含A-Z 0-9 _ -",
|
||||
"url": "URL",
|
||||
"urlRule": "https://, ssh:// or file://",
|
||||
"urlRule2": "网址中不能包含用户名/密码",
|
||||
"noRemotes": "没有远程仓库",
|
||||
"deleteRemoteConfrim": "您确定要删除远程仓库'__name__'吗?",
|
||||
"deleteRemote": "删除远程仓库"
|
||||
},
|
||||
"userSettings": {
|
||||
"committerDetail": "提交者详细信息",
|
||||
"committerTip": "保留空白以使用系统默认值",
|
||||
"userName": "用户名",
|
||||
"email": "电子邮件",
|
||||
"sshKeys": "SSH密钥",
|
||||
"sshKeysTip": "允许您创建到远程git存储库的安全连接。",
|
||||
"add": "添加密钥",
|
||||
"addSshKey": "添加SSH密钥",
|
||||
"addSshKeyTip": "生成新的公钥/私钥对",
|
||||
"name": "名字",
|
||||
"nameRule": "只能包含A-Z 0-9 _ -",
|
||||
"passphrase": "密码短语",
|
||||
"passphraseShort": "密码短语过短",
|
||||
"optional": "可选的",
|
||||
"cancel": "取消",
|
||||
"generate": "生成密钥",
|
||||
"noSshKeys": "没有SSH密钥",
|
||||
"copyPublicKey": "将公钥复制到剪贴板",
|
||||
"delete": "删除密钥",
|
||||
"gitConfig": "Git配置",
|
||||
"deleteConfirm": "您确定要删除SSH密钥__name__吗?这不能被撤消。"
|
||||
},
|
||||
"versionControl": {
|
||||
"unstagedChanges": "未暂存的变更",
|
||||
"stagedChanges": "暂存的变更",
|
||||
"unstageChange": "取消变更的暂存",
|
||||
"stageChange": "暂存变更",
|
||||
"unstageAllChange": "取消所有变更的暂存",
|
||||
"stageAllChange": "暂存所有变更",
|
||||
"commitChanges": "提交变更",
|
||||
"resolveConflicts": "解决冲突",
|
||||
"head": "HEAD",
|
||||
"staged": "暂存的",
|
||||
"unstaged": "未暂存的",
|
||||
"local": "本地的",
|
||||
"remote": "远程的",
|
||||
"revert": "您确定要将更改恢复为'__file__'吗?这不能被撤消。",
|
||||
"revertChanges": "还原变更",
|
||||
"localChanges": "本地变更",
|
||||
"none": "None",
|
||||
"conflictResolve": "解决所有冲突。提交更改以完成合并。",
|
||||
"localFiles": "本地文件",
|
||||
"all": "所有的",
|
||||
"unmergedChanges": "未合并的更改",
|
||||
"abortMerge": "中止合并",
|
||||
"commit": "提交",
|
||||
"changeToCommit": "提交变更",
|
||||
"commitPlaceholder": "输入您的提交信息",
|
||||
"cancelCapital": "取消",
|
||||
"commitCapital": "提交",
|
||||
"commitHistory": "提交历史",
|
||||
"branch": "分支:",
|
||||
"moreCommits": "更多提交",
|
||||
"changeLocalBranch": "变更本地分支",
|
||||
"createBranchPlaceholder": "查找或创建分支",
|
||||
"upstream": "上游",
|
||||
"localOverwrite": "切换分支会覆盖您现有的本地更改。您必须先提交或撤消那些更改。",
|
||||
"manageRemoteBranch": "管理远程分支",
|
||||
"unableToAccess": "无法访问远程存储库",
|
||||
"retry": "重试",
|
||||
"setUpstreamBranch": "设置为上游分支",
|
||||
"createRemoteBranchPlaceholder": "查找或创建远程分支",
|
||||
"trackedUpstreamBranch": "创建的分支将被设置为跟踪的上游分支。",
|
||||
"selectUpstreamBranch": "分支将被创建。 在下面选择以将其设置为被跟踪的上游分支。",
|
||||
"pushFailed": "推送失败,因为远程具有更多的最新提交。请先拉取并合并,然后再尝试推送。",
|
||||
"push": "推送",
|
||||
"pull": "拉取",
|
||||
"unablePull": "<p>无法提取远程更改;您未暂存的本地更改将被覆盖。</p><p>请先提交更改,然后重试。</p>",
|
||||
"showUnstagedChanges": "显示未暂存的更改",
|
||||
"connectionFailed": "无法连接到远程存储库:",
|
||||
"pullUnrelatedHistory": "<p>远程有无关的提交历史</p><p>您确定要将这些更改拉入本地仓库吗?</p>",
|
||||
"pullChanges": "拉取更改",
|
||||
"history": "历史",
|
||||
"projectHistory": "项目历史",
|
||||
"daysAgo": "__count__天前",
|
||||
"daysAgo_plural": "__count__天前",
|
||||
"hoursAgo": "__count__小时前",
|
||||
"hoursAgo_plural": "__count__小时前",
|
||||
"minsAgo": "__count__分钟前",
|
||||
"minsAgo_plural": "__count__分钟前",
|
||||
"secondsAgo": "秒前",
|
||||
"notTracking": "您的本地分支当前未跟踪一个远程分支。",
|
||||
"statusUnmergedChanged": "您的仓库中有未合并的更改。您需要解决冲突并提交结果。",
|
||||
"repositoryUpToDate": "您的仓库是最新的。",
|
||||
"commitsAhead": "您的存储库领先远程仓库__count__次提交。您现在可以推送这些提交。",
|
||||
"commitsAhead_plural": "您的存储库领先远程仓库__count__次提交。您现在可以推送这些提交。",
|
||||
"commitsBehind": "您的存储库落后远程仓库__count__次提交。您现在可以拉取这些提交。",
|
||||
"commitsBehind_plural": "您的存储库落后远程仓库__count__次提交。您现在可以拉取这些提交。",
|
||||
"commitsAheadAndBehind1": "您的存储库落后远程仓库__count__次提交",
|
||||
"commitsAheadAndBehind1_plural": "您的存储库落后远程仓库__count__次提交",
|
||||
"commitsAheadAndBehind2": "领先远程仓库__count__次提交。",
|
||||
"commitsAheadAndBehind2_plural": "领先远程仓库__count__次提交。",
|
||||
"commitsAheadAndBehind3": "您必须先拉取远程提交,然后才能进行推送。",
|
||||
"commitsAheadAndBehind3_plural": "您必须先拉取远程提交,然后才能进行推送。",
|
||||
"refreshCommitHistory": "刷新提交历史",
|
||||
"refreshChanges": "刷新更改"
|
||||
}
|
||||
"editDependencies": "编辑项目依赖"
|
||||
}
|
||||
},
|
||||
"typedInput": {
|
||||
@@ -752,12 +408,10 @@
|
||||
"str": "文字列",
|
||||
"num": "数字",
|
||||
"re": "正则表达式",
|
||||
"bool": "布尔值",
|
||||
"bool": "布尔",
|
||||
"json": "JSON",
|
||||
"bin": "二进制流",
|
||||
"date": "时间戳",
|
||||
"jsonata": "表达式",
|
||||
"env": "环境变量"
|
||||
"date": "时间戳"
|
||||
}
|
||||
},
|
||||
"editableList": {
|
||||
@@ -769,10 +423,8 @@
|
||||
},
|
||||
"expressionEditor": {
|
||||
"functions": "功能",
|
||||
"functionReference": "功能reference",
|
||||
"insert": "插入",
|
||||
"title": "JSONata表达式编辑器",
|
||||
"test": "测试",
|
||||
"data": "示例消息",
|
||||
"result": "结果",
|
||||
"format": "格式表达方法",
|
||||
@@ -786,229 +438,14 @@
|
||||
"eval": "评估表达式错误:\n __message__"
|
||||
}
|
||||
},
|
||||
"jsEditor": {
|
||||
"title": "JavaScript编辑器"
|
||||
},
|
||||
"textEditor": {
|
||||
"title": "文本编辑器"
|
||||
},
|
||||
"jsonEditor": {
|
||||
"title": "JSON编辑器",
|
||||
"format": "格式化JSON",
|
||||
"rawMode": "编辑 JSON",
|
||||
"uiMode": "Visual编辑器",
|
||||
"insertAbove": "在上方插入",
|
||||
"insertBelow": "在下方插入",
|
||||
"addItem": "添加项目",
|
||||
"copyPath": "复制路径到项目",
|
||||
"expandItems": "展开项目",
|
||||
"collapseItems": "收合项目",
|
||||
"duplicate": "重复",
|
||||
"error": {
|
||||
"invalidJSON": "无效的JSON: "
|
||||
}
|
||||
},
|
||||
"markdownEditor": {
|
||||
"title": "Markdown编辑器",
|
||||
"expand": "展开",
|
||||
"format": "格式化为markdown",
|
||||
"heading1": "标题 1",
|
||||
"heading2": "标题 2",
|
||||
"heading3": "标题 3",
|
||||
"bold": "粗体",
|
||||
"italic": "斜体",
|
||||
"code": "代码",
|
||||
"ordered-list": "排序的列表",
|
||||
"unordered-list": "非排序的列表",
|
||||
"quote": "引用",
|
||||
"link": "链接",
|
||||
"horizontal-rule": "水平线",
|
||||
"toggle-preview": "切换预览"
|
||||
"format": "格式化JSON"
|
||||
},
|
||||
"bufferEditor": {
|
||||
"title": "缓冲区编辑器",
|
||||
"modeString": "作为UTF-8字符串处理",
|
||||
"modeArray": "作为JSON数组处理",
|
||||
"modeDesc": "<h3>缓冲区编辑器</h3><p>缓冲区类型被存储为字节值的JSON数组。编辑器将尝试将输入的数值解析为JSON数组。如果它不是有效的JSON,它将被视为UTF-8字符串,并被转换为单个字符代码点的数组。</p><p>例如,<code>Hello World</code>的值会被转换为JSON数组:<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>"
|
||||
},
|
||||
"projects": {
|
||||
"config-git": "配置Git客户端",
|
||||
"welcome": {
|
||||
"hello": "你好! 我们已经将“项目”引入了Node-RED。",
|
||||
"desc0": "这是一种用于管理流程文件的新方法,并且包括对流程的版本控制。",
|
||||
"desc1": "首先,您可以创建您的第一个项目或从git存储库克隆现有项目。",
|
||||
"desc2": "如果不确定,可以暂时跳过此步骤。您仍然可以随时通过“项目”菜单创建第一个项目。",
|
||||
"create": "建立专案",
|
||||
"clone": "克隆仓库",
|
||||
"openExistingProject": "打开现有项目",
|
||||
"not-right-now": "不是现在"
|
||||
},
|
||||
"git-config": {
|
||||
"setup": "设置您的版本控制客户端",
|
||||
"desc0": "Node-RED使用开源工具Git进行版本控制。它跟踪对项目文件的更改,并允许您将其推送到远程存储库。",
|
||||
"desc1": "提交一组更改时,Git会使用用户名和电子邮件地址记录谁进行了更改。用户名可以是您想要的任何名称-不必是您的真实姓名。",
|
||||
"desc2": "您的Git客户端已经配置了以下详细信息。",
|
||||
"desc3": "您可以稍后在设置对话框的'Git config'标签下更改这些设置。",
|
||||
"username": "用户名",
|
||||
"email": "电子邮件"
|
||||
},
|
||||
"project-details": {
|
||||
"create": "创建你的项目",
|
||||
"desc0": "项目被维护为Git仓库。与他人一起共享您的流程",
|
||||
"desc1": "您可以创建多个项目,并通过编辑器在它们之间快速切换。",
|
||||
"desc2": "首先,您的项目需要一个名称和一个可选的描述。",
|
||||
"already-exists": "项目已存在",
|
||||
"must-contain": "只能包含A-Z 0-9 _ -",
|
||||
"project-name": "项目名",
|
||||
"desc": "描述",
|
||||
"opt": "可选的"
|
||||
},
|
||||
"clone-project": {
|
||||
"clone": "克隆一个项目",
|
||||
"desc0": "如果您已经有一个包含项目的git仓库,则可以对其进行克隆以开始使用。",
|
||||
"already-exists": "项目已存在",
|
||||
"must-contain": "只能包含A-Z 0-9 _ -",
|
||||
"project-name": "项目名",
|
||||
"no-info-in-url": "网址中不要包含用户名/密码",
|
||||
"git-url": "Git仓库的url",
|
||||
"protocols": "https://, ssh:// or file://",
|
||||
"auth-failed": "认证失败",
|
||||
"username": "用户名",
|
||||
"passwd": "秘密啊",
|
||||
"ssh-key": "SSH密钥",
|
||||
"passphrase": "密码短语",
|
||||
"ssh-key-desc": "在通过ssh克隆仓库之前,必须添加SSH密钥才能访问它。",
|
||||
"ssh-key-add": "添加一个ssh密钥",
|
||||
"credential-key": "证书加密密钥",
|
||||
"cant-get-ssh-key": "错误! 无法获取所选的SSH密钥路径。",
|
||||
"already-exists2": "已存在",
|
||||
"git-error": "git错误",
|
||||
"connection-failed": "连接失败",
|
||||
"not-git-repo": "不是一个git仓库",
|
||||
"repo-not-found": "未发现仓库"
|
||||
},
|
||||
"default-files": {
|
||||
"create": "创建您的项目文件",
|
||||
"desc0": "一个包含您的流程文件,Readme文件和package.json文件的项目。",
|
||||
"desc1": "它可以包含您要在Git仓库中维护的任何其他文件。",
|
||||
"desc2": "您现有的流程和凭证文件将被复制到项目中。",
|
||||
"flow-file": "流程文件",
|
||||
"credentials-file": "证书文件"
|
||||
},
|
||||
"encryption-config": {
|
||||
"setup": "设置证书文件的加密",
|
||||
"desc0": "您的流程证书文件可以被加密以确保其内容安全。",
|
||||
"desc1": "如果要将这些证书存储在公共Git存储库中,则必须通过提供密钥短语来对它们进行加密。",
|
||||
"desc2": "您的流程证书文件当前未加密。",
|
||||
"desc3": "这意味着任何有权访问该文件的人都可以读取其内容,例如密码和访问令牌。",
|
||||
"desc4": "如果要将这些证书存储在公共Git仓库中,则必须通过提供密钥短语来对它们进行加密。",
|
||||
"desc5": "当前,使用设置文件中的credentialSecret属性作为密钥来加密流程证书文件。",
|
||||
"desc6": "您的流程证书文件当前使用系统生成的密钥加密。您应该为此项目提供一个新的密钥。",
|
||||
"desc7": "密钥将与项目文件分开存储。您将需要提供在另一个Node-RED实例中使用该项目的密钥。",
|
||||
"credentials": "证书",
|
||||
"enable": "启用加密",
|
||||
"disable": "禁用加密",
|
||||
"disabled": "禁用的",
|
||||
"copy": "复制现有密钥",
|
||||
"use-custom": "使用自定义密钥",
|
||||
"desc8": "证书文件不会被加密,其内容很容易阅读",
|
||||
"create-project-files": "创建项目文件",
|
||||
"create-project": "创建项目",
|
||||
"already-exists": "已存在",
|
||||
"git-error": "git错误",
|
||||
"git-auth-error": "git认证错误"
|
||||
},
|
||||
"create-success": {
|
||||
"success": "您已经成功创建了第一个项目!",
|
||||
"desc0": "现在,您可以像往常一样继续使用Node-RED。",
|
||||
"desc1": "侧栏中的“信息”标签显示了您当前的活动项目。名称旁边的按钮可用于访问项目设置视图。",
|
||||
"desc2": "侧栏中的“历史记录”标签可用于查看项目中已更改的文件并提交。它向您显示了提交的完整历史记录,并允许您将更改推送到远程存储库。"
|
||||
},
|
||||
"create": {
|
||||
"projects": "项目",
|
||||
"already-exists": "项目已存在",
|
||||
"must-contain": "只能包含A-Z 0-9 _ -",
|
||||
"no-info-in-url": "网址中不要包含用户名/密码",
|
||||
"open": "打开项目",
|
||||
"create": "创建项目",
|
||||
"clone": "克隆仓库",
|
||||
"project-name": "项目名",
|
||||
"desc": "描述",
|
||||
"opt": "可选的",
|
||||
"flow-file": "流程文件",
|
||||
"credentials": "证书",
|
||||
"enable-encryption": "启用加密",
|
||||
"disable-encryption": "禁用加密",
|
||||
"encryption-key": "加密密钥",
|
||||
"desc0": "用来保护您的凭证的短语",
|
||||
"desc1": "凭证文件不会被加密,其内容很容易阅读",
|
||||
"git-url": "Git存储库URL",
|
||||
"protocols": "https://, ssh:// or file://",
|
||||
"auth-failed": "验证失败",
|
||||
"username": "用户名",
|
||||
"password": "密码",
|
||||
"ssh-key": "SSH密钥",
|
||||
"passphrase": "密码短语",
|
||||
"desc2": "在通过ssh克隆存储库之前,必须添加SSH密钥才能访问它。",
|
||||
"add-ssh-key": "添加一个ssh密钥",
|
||||
"credentials-encryption-key": "证书加密密钥",
|
||||
"already-exists-2": "已存在",
|
||||
"git-error": "git错误",
|
||||
"con-failed": "连接失败",
|
||||
"not-git": "不是git仓库",
|
||||
"no-resource": "找不到存储库",
|
||||
"cant-get-ssh-key-path": "错误!无法获取所选的SSH密钥路径。",
|
||||
"unexpected_error": "意外的错误"
|
||||
},
|
||||
"delete": {
|
||||
"confirm": "您确定要删除此项目吗?"
|
||||
},
|
||||
"create-project-list": {
|
||||
"search": "搜索您的项目",
|
||||
"current": "当前的"
|
||||
},
|
||||
"require-clean": {
|
||||
"confirm": "<p>您有未部署的更改,这些更改将丢失。</p><p>您要继续吗?</p>"
|
||||
},
|
||||
"send-req": {
|
||||
"auth-req": "存储库需要认证",
|
||||
"username": "用户名",
|
||||
"password": "秘密",
|
||||
"passphrase": "密码短语",
|
||||
"retry": "重试",
|
||||
"update-failed": "无法更新身份验证",
|
||||
"unhandled": "未处理的错误响应"
|
||||
},
|
||||
"create-branch-list": {
|
||||
"invalid": "无效的分支",
|
||||
"create": "创建分支",
|
||||
"current": "当前的"
|
||||
},
|
||||
"create-default-file-set": {
|
||||
"no-active": "没有活动项目就无法创建默认文件集",
|
||||
"no-empty": "无法在非空项目上创建默认文件集",
|
||||
"git-error": "git错误"
|
||||
},
|
||||
"errors": {
|
||||
"no-username-email": "您的Git客户端未配置用户名/电子邮件。",
|
||||
"unexpected": "发生了一个意料之外的问题",
|
||||
"code": "代码"
|
||||
}
|
||||
},
|
||||
"editor-tab": {
|
||||
"properties": "属性",
|
||||
"envProperties": "环境变量",
|
||||
"description": "描述",
|
||||
"appearance": "外观",
|
||||
"preview": "UI预览",
|
||||
"defaultValue": "默认值"
|
||||
},
|
||||
"languages": {
|
||||
"de": "德语",
|
||||
"en-US": "英文",
|
||||
"ja": "日语",
|
||||
"ko": "韩文",
|
||||
"zh-CN": "简体中文",
|
||||
"zh-TW": "繁体中文"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -214,57 +214,5 @@
|
||||
"$toMillis": {
|
||||
"args": "timestamp",
|
||||
"desc": "将ISO 8601格式的字符串`timestamp`转换为从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。如果该字符串的格式不正确,则抛出错误。"
|
||||
},
|
||||
"$env": {
|
||||
"args": "arg",
|
||||
"desc": "返回环境变量的值。\n\n这是Node-RED定义的函数。"
|
||||
},
|
||||
"$eval": {
|
||||
"args": "expr [, context]",
|
||||
"desc": "使用当前上下文来作为评估依据,分析并评估字符串`expr`,其中包含文字JSON或JSONata表达式。"
|
||||
},
|
||||
"$formatInteger": {
|
||||
"args": "number, picture",
|
||||
"desc": "将“数字”转换为字符串,并将其格式化为“图片”字符串指定的整数表示形式。图片字符串参数定义了数字的格式,并具有与XPath F&O 3.1 规范中的fn:format-integer相同的语法。"
|
||||
},
|
||||
"$parseInteger": {
|
||||
"args": "string, picture",
|
||||
"desc": "使用“图片”字符串指定的格式将“字符串”参数的内容解析为整数(作为JSON数字)。图片字符串参数与$formatInteger格式相同。."
|
||||
},
|
||||
"$error": {
|
||||
"args": "[str]",
|
||||
"desc": "引发错误并显示一条消息。 可选的`str`将替代$error()函数评估的默认消息。"
|
||||
},
|
||||
"$assert": {
|
||||
"args": "arg, str",
|
||||
"desc": "如果`arg`为真,则该函数返回。 如果arg为假,则抛出带有str的异常作为异常消息。"
|
||||
},
|
||||
"$single": {
|
||||
"args": "array, function",
|
||||
"desc": "返回满足参数function谓语的array参数中的唯一值 (比如:传递值时,函数返回布尔值“true”)。如果匹配值的数量不唯一时,则抛出异常。\n\n应在以下签名中提供函数:`function(value [,index [,array []]])`其中value是数组的每个输入,index是该值的位置,整个数组作为第三个参数传递。"
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)组件进行编码。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)进行编码。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "解码以前由encodeUrlComponent创建的统一资源定位器(URL)组件。 \n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||
},
|
||||
"$decodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "解码先前由encodeUrl创建的统一资源定位符(URL)。 \n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||
},
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "返回一个数组,其中重复的值已从`数组`中删除"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "以字符串形式返回`值`的类型。 如果该`值`未定义,则将返回`未定义`"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"info": {
|
||||
"tip0" : "您可以用 {{core:delete-selection}} 刪除選擇的節點或連結。",
|
||||
"tip1" : "{{core:search}} 可以在流程內搜索節點。",
|
||||
"tip2": "{{core:toggle-sidebar}} 可以顯示或隱藏邊側欄。",
|
||||
"tip3": "您可以在 {{core:manage-palette}} 中管理節點的控制台。",
|
||||
"tip4": "側邊欄中會列出流程中所有的配置節點。您可以通過功能表或者 {{core:show-config-tab}} 來訪問這些節點。",
|
||||
"tip5": "您可以在設定中選擇顯示或隱藏這些提示。",
|
||||
"tip6": "您可以用[left] [up] [down] [right]鍵來移動被選中的節點。按住[shift]可以更快地移動節點。",
|
||||
"tip7": "把節點拖到連接上可以向連接中插入節點。",
|
||||
"tip8": "您可以用 {{core:show-export-dialog}} 來匯出被選中的節點或標籤頁中的流程。",
|
||||
"tip9": "您可以將流程的json文字檔拖入編輯方塊或 {{core:show-import-dialog}} 來導入流程。",
|
||||
"tip10": "按住[shift]後按一下並拖動節點可以將該節點的多個連接一併移動到其他節點的埠。",
|
||||
"tip11": "{{core:show-info-tab}} 可以顯示「資訊」標籤頁。 {{core:show-debug-tab}} 可以顯示「調試」標籤頁。",
|
||||
"tip12": "按住[ctrl]的同時點擊工作介面可以在節點的對話欄中快速添加節點。",
|
||||
"tip13": "按住[ctrl]的同時點擊節點的埠或後續節點可以快速連接多個節點。",
|
||||
"tip14": "按住[shift]的同時點擊節點會選中所有被連接的節點。",
|
||||
"tip15": "按住[ctrl]的同時點擊節點可以在選中或取消選中節點。",
|
||||
"tip16": "{{core:show-previous-tab}} 和 {{core:show-next-tab}} 可以切換標籤頁。",
|
||||
"tip17": "您可以在節點的屬性配置畫面中通過 {{core:confirm-edit-tray}} 來更改設置,或者用 {{core:cancel-edit-tray}} 來取消更改。",
|
||||
"tip18": "您可以通過點擊 {{core:edit-selected-node}} 來顯示被選中節點的屬性設置畫面。"
|
||||
}
|
||||
}
|
||||
@@ -1,270 +0,0 @@
|
||||
{
|
||||
"$string": {
|
||||
"args": "arg",
|
||||
"desc": "通過以下的類型轉換規則將參數*arg*轉換成字串:\n\n - 字串不轉換。\n -函數轉換成空的字串。\n - JSON的值無法用數字表示所以用無限大或者NaN(非數)表示。\n - 用’JSON.stringify’函數將其他值轉換成JSON字串。"
|
||||
},
|
||||
"$length": {
|
||||
"args": "str",
|
||||
"desc": "輸出字串’str’的字數。如果’str’不是字串,拋出錯誤。"
|
||||
},
|
||||
"$substring": {
|
||||
"args": "str, start[, length]",
|
||||
"desc": "輸出`start`位置後的的首次出現的包括`str`的子字串。 如果`length`被指定,那麼的字串中將只包括前`length`個文字。如果`start`是負數則輸出從`str`末尾開始的`length`個文字"
|
||||
},
|
||||
"$substringBefore": {
|
||||
"args": "str, chars",
|
||||
"desc": "輸出’str’中首次出現的’chars’之前的子字串,如果’str’中不包括’chars’則輸出’str’。"
|
||||
},
|
||||
"$substringAfter": {
|
||||
"args": "str, chars",
|
||||
"desc": "輸出’str’中首次出現的’chars’之後的子字串,如果’str’中不包括’chars’則輸出’str’。"
|
||||
},
|
||||
"$uppercase": {
|
||||
"args": "str",
|
||||
"desc": "`將’str’中的所有字母變為大寫後輸出。"
|
||||
},
|
||||
"$lowercase": {
|
||||
"args": "str",
|
||||
"desc": "將’str’中的所有字母變為小寫後輸出。"
|
||||
},
|
||||
"$trim": {
|
||||
"args": "str",
|
||||
"desc": "將以下步驟應用於`str`來去除所有空白文字並實現標準化。\n\n – 將全部tab定位字元、Enter鍵、換行字元用空白代替。\n- 將連續的空白文字變成一個空白文字。\n- 消除開頭和末尾的空白文字。\n\n如果`str`沒有被指定(即在無輸入參數的情況下調用本函數),將上下文的值作為`str`來使用。 如果`str` 不是字串則拋出錯誤。"
|
||||
},
|
||||
"$contains": {
|
||||
"args": "str, pattern",
|
||||
"desc": "字串`str` 和 `pattern`匹配的話輸出`true`,不匹配的情況下輸出 `false`。 不指定`str`的情況下(比如用一個參數調用本函數時)、將上下文的值作為`str`來使用。參數 `pattern`可以為字串或正則表達。"
|
||||
},
|
||||
"$split": {
|
||||
"args": "str[, separator][, limit]",
|
||||
"desc": "將參數`str`分解成由子字串組成的陣列。 如果`str`不是字串拋出錯誤。可以省略的參數 `separator`中指定字串`str`的分隔符號。分隔符號可以是文字或規則運算式。在不指定`separator`的情況下、將分隔符號看作空的字串並把`str`拆分成由單個字母組成的陣列。如果`separator`不是字串則拋出錯誤。在可省略的參數`limit`中指定分割後的子字串的最大個數。超出個數的子字串將被捨棄。如果`limit`沒有被指定,`str` 將不考慮子字串的個數而將字串完全分隔。如果`limit`是負數則拋出錯誤。"
|
||||
},
|
||||
"$join": {
|
||||
"args": "array[, separator]",
|
||||
"desc": "用可以省略的參數 `separator`來把多個字元串連接。如果`array`不是字串則拋出錯誤。 如果沒有指定`separator`,則用空字串來連接字元(即字串之間沒有`separator`)。 如果`separator`不是字元則拋出錯誤。"
|
||||
},
|
||||
"$match": {
|
||||
"args": "str, pattern [, limit]",
|
||||
"desc": "對字串`str`使用規則運算式`pattern`並輸出與`str`相匹配的部分資訊。"
|
||||
},
|
||||
"$replace": {
|
||||
"args": "str, pattern, replacement [, limit]",
|
||||
"desc": "在字串`str`中搜索`pattern`並用`replacement`來替換。\n\n可選參數`limit`用來指定替換次數的上限。"
|
||||
},
|
||||
"$now": {
|
||||
"args": "",
|
||||
"desc": "生成ISO 8601互換格式的時刻,並作為字串輸出。"
|
||||
},
|
||||
"$base64encode": {
|
||||
"args": "string",
|
||||
"desc": "將ASCII格式的字串轉換為Base 64格式。將字串中的文字視作二進位形式的資料處理。包含URI編碼在內的字串文字必須在0x00到0xFF的範圍內,否則不會被支持。"
|
||||
},
|
||||
"$base64decode": {
|
||||
"args": "string",
|
||||
"desc": "用UTF-8內碼表將Base 64形式二進位值轉換為字串。"
|
||||
},
|
||||
"$number": {
|
||||
"args": "arg",
|
||||
"desc": "用下述的規則將參數 `arg`轉換為數值。:\n\n – 數值不做轉換。\n – 將字串中合法的JSON數値表示轉換成數値。\n – 其他形式的值則拋出錯誤。"
|
||||
},
|
||||
"$abs": {
|
||||
"args": "number",
|
||||
"desc": "輸出參數`number`的絕對值。"
|
||||
},
|
||||
"$floor": {
|
||||
"args": "number",
|
||||
"desc": "輸出比`number`的值小的最大整數。"
|
||||
},
|
||||
"$ceil": {
|
||||
"args": "number",
|
||||
"desc": "輸出比`number`的值大的最小整數。"
|
||||
},
|
||||
"$round": {
|
||||
"args": "number [, precision]",
|
||||
"desc": "輸出四捨五入後的參數`number`。可省略的參數 `precision`指定四捨五入後小數點下的位數。"
|
||||
},
|
||||
"$power": {
|
||||
"args": "base, exponent",
|
||||
"desc": "輸出底數`base`的`exponent`次冪。"
|
||||
},
|
||||
"$sqrt": {
|
||||
"args": "number",
|
||||
"desc": "輸出參數 `number`的平方根。"
|
||||
},
|
||||
"$random": {
|
||||
"args": "",
|
||||
"desc": "輸出比0大,比1小的偽亂數。"
|
||||
},
|
||||
"$millis": {
|
||||
"args": "",
|
||||
"desc": "返回從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數。在同一個運算式的測試中所有對`$millis()`的調用將會返回相同的值。"
|
||||
},
|
||||
"$sum": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的總和。如果`array`不是數值則拋出錯誤。"
|
||||
},
|
||||
"$max": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的最大值。如果`array`不是數值則拋出錯誤。"
|
||||
},
|
||||
"$min": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的最小值。如果`array`不是數值則拋出錯誤。。"
|
||||
},
|
||||
"$average": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的平均數。如果`array`不是數值則拋出錯誤。。"
|
||||
},
|
||||
"$boolean": {
|
||||
"args": "arg",
|
||||
"desc": "用下述規則將資料轉換成布林值。:\n\n - 不轉換布林值`Boolean`。\n – 將空的字串`string`轉換為`false`\n – 將不為空的字串`string`轉換為`true`\n – 將為0的數位`number`轉換成`false`\n –將不為0的數位`number`轉換成`true`\n –將`null`轉換成`false`\n –將空的陣列`array`轉換成`false`\n –如果陣列`array`中含有可以轉換成`true`的要素則轉換成`true`\n –如果`array`中沒有可轉換成`true`的要素則轉換成`false`\n – 空的物件`object`轉換成`false`\n – 非空的物件`object`轉換成`true`\n –將函數`function`轉換成`false`"
|
||||
},
|
||||
"$not": {
|
||||
"args": "arg",
|
||||
"desc": "輸出做反轉運算後的布林值。首先將`arg`轉換為布林值。"
|
||||
},
|
||||
"$exists": {
|
||||
"args": "arg",
|
||||
"desc": "如果算式`arg`的值存在則輸出`true`。如果算式的值不存在(比如指向不存在區域的引用)則輸出`false`。"
|
||||
},
|
||||
"$count": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列中的元素數。"
|
||||
},
|
||||
"$append": {
|
||||
"args": "array, array",
|
||||
"desc": "將兩個陣列連接。"
|
||||
},
|
||||
"$sort": {
|
||||
"args": "array [, function]",
|
||||
"desc": "輸出排序後的陣列`array`。\n\n如果使用了比較函數`function`,則下述兩個參數需要被指定。\n\n`function(left, right)`\n\n該比較函數是為了比較left和right兩個值而被排序演算法調用的。如果使用者希望left的值被置於right的值之後,那麼該函數必須輸出布林值`true`來表示位置交換。而在不需要位置交換時函數必須輸出`false`。"
|
||||
},
|
||||
"$reverse": {
|
||||
"args": "array",
|
||||
"desc": "輸出倒序後的陣列`array`。"
|
||||
},
|
||||
"$shuffle": {
|
||||
"args": "array",
|
||||
"desc": "輸出隨機排序後的陣列 `array`。"
|
||||
},
|
||||
"$zip": {
|
||||
"args": "array, ...",
|
||||
"desc": "將陣列中的值按索引順序打包後輸出。"
|
||||
},
|
||||
"$keys": {
|
||||
"args": "object",
|
||||
"desc": "輸出由物件內的鍵組成的陣列。如果參數是物件的陣列則輸出由所有物件中的鍵去重後組成的佇列。"
|
||||
},
|
||||
"$lookup": {
|
||||
"args": "object, key",
|
||||
"desc": "輸出對象中與參數`key`對應的值。如果第一個參數`object`是陣列,那麼陣列中所有的物件都將被搜索並輸出這些物件中與參數`key`對應的值。"
|
||||
},
|
||||
"$spread": {
|
||||
"args": "object",
|
||||
"desc": "將物件中的鍵值對分隔成每個要素中只含有一個鍵值對的陣列。如果參數`object`是陣列,那麼返回值的陣列中包含所有物件中的鍵值對。"
|
||||
},
|
||||
"$merge": {
|
||||
"args": "array<object>",
|
||||
"desc": "將輸入陣列`objects`中所有的鍵值對合併到一個`object`中並返回。如果輸入陣列的要素中含有重複的鍵,則返回的`object`中將只包含陣列中最後出現要素的值。如果輸入陣列中包括物件以外的元素,則拋出錯誤。"
|
||||
},
|
||||
"$sift": {
|
||||
"args": "object, function",
|
||||
"desc": "輸出參數`object`中符合`function`的鍵值對。\n\n`function`必須含有下述參數。\n\n`function(value [, key [, object]])`"
|
||||
},
|
||||
"$each": {
|
||||
"args": "object, function",
|
||||
"desc": "將函數`function`應用於`object`中的所有鍵值對並輸出由所有返回值組成的陣列。"
|
||||
},
|
||||
"$map": {
|
||||
"args": "array, function",
|
||||
"desc": "將函數`function`應用於陣列`array`中所有的值並輸出由返回值組成的陣列。\n\n`function`中必須含有下述參數。\n\n`function(value [, index [, array]])`"
|
||||
},
|
||||
"$filter": {
|
||||
"args": "array, function",
|
||||
"desc": "輸出陣列`array`中符合函數`function`條件的值組成的陣列。\n\n`function`必須包括下述參數。\n\n`function(value [, index [, array]])`"
|
||||
},
|
||||
"$reduce": {
|
||||
"args": "array, function [, init]",
|
||||
"desc": "將`function`依次應用於陣列中的各要素值。 其中,前一個要素值的計算結果將參與到下一次的函數運算中。。\n\n函數`function`接受兩個參數並作為中綴標記法中的操作符。\n\n可省略的參數`init`將作為運算的初始值。"
|
||||
},
|
||||
"$flowContext": {
|
||||
"args": "string",
|
||||
"desc": "獲取流上下文(流等級的上下文,可以讓所有節點共用)的屬性。"
|
||||
},
|
||||
"$globalContext": {
|
||||
"args": "string",
|
||||
"desc": "獲取全域上下文的屬性。"
|
||||
},
|
||||
"$pad": {
|
||||
"args": "string, width [, char]",
|
||||
"desc": "根據需要,向字串`string`的副本中填充文字使該字串的字數達到`width`的絕對值並返回填充文字後的字串。\n\n如果`width`的值為正,則向字串`string`的右側填充文字,如果`width`為負,則向字串`string`的左側填充文字。\n\n可選參數`char`用來指定填充的文字。如果未指定該參數,則填充空白文字。"
|
||||
},
|
||||
"$fromMillis": {
|
||||
"args": "number",
|
||||
"desc": "將表示從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數的數值轉換成ISO 8601形式時間戳記的字串。"
|
||||
},
|
||||
"$formatNumber": {
|
||||
"args": "number, picture [, options]",
|
||||
"desc": "將`number`轉換成具有`picture`所指定的數值格式的字串。\n\n此函數的功能與XPath F&O 3.1規格中定義的XPath/XQuery函數的fn:format-number功能相一致。參數`picture`用於指定數值的轉換格式,其語法與fn:format-number中的定義一致。\n\n可選的第三參數`options`用來覆蓋預設的局部環境格式,如小數點分隔符號。如果指定該參數,那麼該參數必須是包含name/value對的物件,並且name/value對必須符合XPath F&O 3.1規格中記述的數值格式。"
|
||||
},
|
||||
"$formatBase": {
|
||||
"args": "number [, radix]",
|
||||
"desc": "將`number`變換為以參數`radix`的值為基數形式的字串。如果不指定`radix`的值,則默認基數為10。指定的`radix`值必須在2~36之間,否則拋出錯誤。"
|
||||
},
|
||||
"$toMillis": {
|
||||
"args": "timestamp",
|
||||
"desc": "將ISO 8601格式的字串`timestamp`轉換為從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數。如果該字串的格式不正確,則拋出錯誤。"
|
||||
},
|
||||
"$env": {
|
||||
"args": "arg",
|
||||
"desc": "返回環境變量的值。\n\n這是Node-RED定義的函數。"
|
||||
},
|
||||
"$eval": {
|
||||
"args": "expr [, context]",
|
||||
"desc": "使用當前上下文來作為評估依據,分析並評估字符串`expr`,其中包含文字JSON或JSONata表達式。"
|
||||
},
|
||||
"$formatInteger": {
|
||||
"args": "number, picture",
|
||||
"desc": "將“數字”轉換為字符串,並將其格式化為“圖片”字符串指定的整數表示形式。圖片字符串參數定義了數字的格式,並具有與XPath F&O 3.1 規範中的fn:format-integer相同的語法。"
|
||||
},
|
||||
"$parseInteger": {
|
||||
"args": "string, picture",
|
||||
"desc": "使用“圖片”字符串指定的格式將“字符串”參數的內容解析為整數(作為JSON數字)。圖片字符串參數與$formatInteger格式相同。."
|
||||
},
|
||||
"$error": {
|
||||
"args": "[str]",
|
||||
"desc": "引發錯誤並顯示一條消息。 可選的`str`將替代$error()函數評估的默認消息。"
|
||||
},
|
||||
"$assert": {
|
||||
"args": "arg, str",
|
||||
"desc": "如果`arg`為真,則該函數返回。 如果arg為假,則拋出帶有str的異常作為異常消息。"
|
||||
},
|
||||
"$single": {
|
||||
"args": "array, function",
|
||||
"desc": "返回滿足參數function謂語的array參數中的唯一值 (比如:傳遞值時,函數返回布林值“true”)。如果匹配值的數量不唯一時,則拋出異常。\n\n應在以下簽名中提供函數:`function(value [,index [,array []]])`其中value是數組的每個輸入,index是該值的位置,整個數組作為第三個參數傳遞。"
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)組件進行編碼。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)進行編碼。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "解碼以前由encodeUrlComponent創建的統一資源定位器(URL)組件。 \n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||
},
|
||||
"$decodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "解碼先前由encodeUrl創建的統一資源定位符(URL)。 \n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||
},
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "返回一個數組,其中重復的值已從`數組`中刪除"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "以字符串形式返回`值`的類型。 如果該`值`未定義,則將返回`未定義`"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/editor-client",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.3",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText='# Prototype\nsnippet proto\n ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n ${4:// body...}\n };\n# Function\nsnippet fun\n function ${1?:function_name}(${2:argument}) {\n ${3:// body...}\n }\n# Anonymous Function\nregex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\nsnippet f\n function${M1?: ${1:functionName}}($2) {\n ${0:$TM_SELECTED_TEXT}\n }${M2?;}${M3?,}${M4?)}\n# Immediate function\ntrigger \\(?f\\(\nendTrigger \\)?\nsnippet f(\n (function(${1}) {\n ${0:${TM_SELECTED_TEXT:/* code */}}\n }(${1}));\n# if\nsnippet if\n if (${1:true}) {\n ${0}\n }\n# if ... else\nsnippet ife\n if (${1:true}) {\n ${2}\n } else {\n ${0}\n }\n# tertiary conditional\nsnippet ter\n ${1:/* condition */} ? ${2:a} : ${3:b}\n# switch\nsnippet switch\n switch (${1:expression}) {\n case \'${3:case}\':\n ${4:// code}\n break;\n ${5}\n default:\n ${2:// code}\n }\n# case\nsnippet case\n case \'${1:case}\':\n ${2:// code}\n break;\n ${3}\n\n# while (...) {...}\nsnippet wh\n while (${1:/* condition */}) {\n ${0:/* code */}\n }\n# try\nsnippet try\n try {\n ${0:/* code */}\n } catch (e) {}\n# do...while\nsnippet do\n do {\n ${2:/* code */}\n } while (${1:/* condition */});\n# Object Method\nsnippet :f\nregex /([,{[])|^\\s*/:f/\n ${1:method_name}: function(${2:attribute}) {\n ${0}\n }${3:,}\n# setTimeout function\nsnippet setTimeout\nregex /\\b/st|timeout|setTimeo?u?t?/\n setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n# console.log (Firebug)\nsnippet cl\n console.log(${1});\n# return\nsnippet ret\n return ${1:result}\n# for (property in object ) { ... }\nsnippet fori\n for (var ${1:prop} in ${2:Things}) {\n ${0:$2[$1]}\n }\n# hasOwnProperty\nsnippet has\n hasOwnProperty(${1})\n# docstring\nsnippet /**\n /**\n * ${1:description}\n *\n */\nsnippet @par\nregex /^\\s*\\*\\s*/@(para?m?)?/\n @param {${1:type}} ${2:name} ${3:description}\nsnippet @ret\n @return {${1:type}} ${2:description}\n# JSON.parse\nsnippet jsonp\n JSON.parse(${1:jstr});\n# JSON.stringify\nsnippet jsons\n JSON.stringify(${1:object});\n# self-defining function\nsnippet sdf\n var ${1:function_name} = function(${2:argument}) {\n ${3:// initial code ...}\n\n $1 = function($2) {\n ${4:// main code}\n };\n }\n# \nsnippet for-\n for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n ${0:${2:Things}[${1:i}];}\n }\n# for (...) {...}\nsnippet for\n for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n ${3:$2[$1]}$0\n }\n# for (...) {...} (Improved Native For-Loop)\nsnippet forr\n for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n ${3:$2[$1]}$0\n }\n# Node-RED Specific Funcs\nsnippet nodes\n node.send(${1:msg})\nsnippet clone\n RED.util.cloneMessage(${1:msg})\nsnippet nodel\n node.log($1)\nsnippet nodew\n node.warn($1)\nsnippet nodee\n node.error($1)\nsnippet noded\n node.debug($1)\nsnippet done\n node.done($1)\nsnippet flowg\n flow.get($1)\nsnippet flows\n flow.set($1, $2)\nsnippet globalg\n global.get($1)\nsnippet globals\n global.set($1, $2)\n',t.scope="nrjavascript"});
|
||||
ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="nrjavascript"});
|
||||
(function() {
|
||||
ace.require(["ace/snippets/nrjavascript"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
@@ -6,3 +6,4 @@ ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippet
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
@@ -1109,7 +1109,7 @@ RED.nodes = (function() {
|
||||
defaults: {},
|
||||
label: "unknown: "+n.type,
|
||||
labelStyle: "red-ui-flow-node-label-italic",
|
||||
outputs: n.outputs|| (n.wires && n.wires.length) || 0,
|
||||
outputs: n.outputs||n.wires.length,
|
||||
set: registry.getNodeSet("node-red/unknown")
|
||||
}
|
||||
} else {
|
||||
@@ -1434,9 +1434,6 @@ RED.nodes = (function() {
|
||||
delete configNodes[n.id];
|
||||
} else {
|
||||
nodes.splice(nodes.indexOf(n),1);
|
||||
if (nodeTabMap[n.z]) {
|
||||
delete nodeTabMap[n.z][n.id];
|
||||
}
|
||||
}
|
||||
reimportList.push(convertNode(n));
|
||||
});
|
||||
|
||||
@@ -431,7 +431,7 @@ var RED = (function() {
|
||||
'<img width="50px" src="red/images/node-red-icon.svg" />'+
|
||||
'</div>';
|
||||
|
||||
RED.sidebar.info.set(aboutHeader+RED.utils.renderMarkdown(data));
|
||||
RED.sidebar.info.set(aboutHeader+marked(data));
|
||||
RED.sidebar.info.show();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -38,10 +38,7 @@
|
||||
this.element.addClass("red-ui-searchBox-input");
|
||||
this.uiContainer = this.element.wrap("<div>").parent();
|
||||
this.uiContainer.addClass("red-ui-searchBox-container");
|
||||
if (this.element.parents("form").length === 0) {
|
||||
var form = this.element.wrap("<form>").parent();
|
||||
form.addClass("red-ui-searchBox-form");
|
||||
}
|
||||
|
||||
$('<i class="fa fa-search"></i>').prependTo(this.uiContainer);
|
||||
this.clearButton = $('<a href="#"><i class="fa fa-times"></i></a>').appendTo(this.uiContainer);
|
||||
this.clearButton.on("click",function(e) {
|
||||
|
||||
@@ -488,6 +488,56 @@
|
||||
done(labelWidth);
|
||||
}
|
||||
},
|
||||
_resize: function() {
|
||||
var that = this;
|
||||
if (this.uiWidth !== null) {
|
||||
this.uiSelect.width(this.uiWidth);
|
||||
}
|
||||
var type = this.typeMap[this.propertyType];
|
||||
if (type && type.hasValue === false) {
|
||||
this.selectTrigger.addClass("red-ui-typedInput-full-width");
|
||||
} else {
|
||||
this.selectTrigger.removeClass("red-ui-typedInput-full-width");
|
||||
this._getLabelWidth(this.selectTrigger, function(labelWidth) {
|
||||
that.elementDiv.css('left',labelWidth+"px");
|
||||
that.valueLabelContainer.css('left',labelWidth+"px");
|
||||
if (that.optionExpandButton.shown) {
|
||||
that.elementDiv.css('right',"22px");
|
||||
that.valueLabelContainer.css('right',"22px");
|
||||
} else {
|
||||
that.elementDiv.css('right','0');
|
||||
that.valueLabelContainer.css('right','0');
|
||||
that.input.css({
|
||||
'border-top-right-radius': '4px',
|
||||
'border-bottom-right-radius': '4px'
|
||||
});
|
||||
}
|
||||
if (that.optionSelectTrigger) {
|
||||
if (type && type.options && type.hasValue === true) {
|
||||
that.optionSelectLabel.css({'left':'auto'})
|
||||
that._getLabelWidth(that.optionSelectLabel, function(lw) {
|
||||
that.optionSelectTrigger.css({'width':(23+lw)+"px"});
|
||||
that.elementDiv.css('right',(23+lw)+"px");
|
||||
that.input.css({
|
||||
'border-top-right-radius': 0,
|
||||
'border-bottom-right-radius': 0
|
||||
});
|
||||
});
|
||||
} else {
|
||||
that.optionSelectLabel.css({'left':'0'})
|
||||
that.optionSelectTrigger.css({'width':'calc( 100% - '+labelWidth+'px )'});
|
||||
if (!that.optionExpandButton.shown) {
|
||||
that.elementDiv.css({'right':0});
|
||||
that.input.css({
|
||||
'border-top-right-radius': '4px',
|
||||
'border-bottom-right-radius': '4px'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
_updateOptionSelectLabel: function(o) {
|
||||
var opt = this.typeMap[this.propertyType];
|
||||
this.optionSelectLabel.empty();
|
||||
@@ -515,6 +565,7 @@
|
||||
}
|
||||
if (opt.hasValue) {
|
||||
this.optionValue = o.value;
|
||||
this._resize();
|
||||
this.input.trigger('change',this.propertyType,this.value());
|
||||
}
|
||||
} else {
|
||||
@@ -554,12 +605,11 @@
|
||||
this.propertyType = null;
|
||||
this.type(currentType);
|
||||
}
|
||||
setTimeout(function() {that._resize();},0);
|
||||
},
|
||||
width: function(desiredWidth) {
|
||||
this.uiWidth = desiredWidth;
|
||||
if (this.uiWidth !== null) {
|
||||
this.uiSelect.width(this.uiWidth);
|
||||
}
|
||||
this._resize();
|
||||
},
|
||||
value: function(value) {
|
||||
var that = this;
|
||||
@@ -630,6 +680,8 @@
|
||||
}
|
||||
else if (opt.icon.indexOf("/") !== -1) {
|
||||
image = new Image();
|
||||
image.onload = function() { that._resize(); }
|
||||
image.onerror = function() { that._resize(); }
|
||||
image.name = opt.icon;
|
||||
image.src = mapDeprecatedIcon(opt.icon);
|
||||
$('<img>',{src:mapDeprecatedIcon(opt.icon),style:"margin-right: 4px;height: 18px;"}).prependTo(this.selectLabel);
|
||||
@@ -641,12 +693,6 @@
|
||||
if (opt.hasValue === false || (opt.showLabel !== false && !opt.icon)) {
|
||||
this.selectLabel.text(opt.label);
|
||||
}
|
||||
if (opt.hasValue === false) {
|
||||
this.selectTrigger.addClass("red-ui-typedInput-full-width");
|
||||
} else {
|
||||
this.selectTrigger.removeClass("red-ui-typedInput-full-width");
|
||||
}
|
||||
|
||||
if (this.optionMenu) {
|
||||
this.optionMenu.remove();
|
||||
this.optionMenu = null;
|
||||
@@ -657,13 +703,11 @@
|
||||
this.optionExpandButton.shown = false;
|
||||
}
|
||||
if (this.optionSelectTrigger) {
|
||||
this.optionSelectTrigger.css({"display":"inline-flex"});
|
||||
this.optionSelectTrigger.show();
|
||||
if (!opt.hasValue) {
|
||||
this.optionSelectTrigger.css({"flex-grow":1})
|
||||
this.elementDiv.hide();
|
||||
this.valueLabelContainer.hide();
|
||||
} else {
|
||||
this.optionSelectTrigger.css({"flex-grow":0})
|
||||
this.elementDiv.show();
|
||||
this.valueLabelContainer.hide();
|
||||
}
|
||||
@@ -837,6 +881,9 @@
|
||||
this._trigger("typechange",null,this.propertyType);
|
||||
this.input.trigger('change',this.propertyType,this.value());
|
||||
}
|
||||
if (!image) {
|
||||
this._resize();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -863,6 +910,7 @@
|
||||
},
|
||||
show: function() {
|
||||
this.uiSelect.show();
|
||||
this._resize();
|
||||
},
|
||||
hide: function() {
|
||||
this.uiSelect.hide();
|
||||
|
||||
@@ -334,7 +334,8 @@ RED.deploy = (function() {
|
||||
var invalidNodes = [];
|
||||
|
||||
RED.nodes.eachNode(function(node) {
|
||||
if (!node.valid && !node.d) {
|
||||
hasInvalid = hasInvalid || !node.valid;
|
||||
if (!node.valid) {
|
||||
invalidNodes.push(getNodeInfo(node));
|
||||
}
|
||||
if (node.type === "unknown") {
|
||||
@@ -344,7 +345,6 @@ RED.deploy = (function() {
|
||||
}
|
||||
});
|
||||
hasUnknown = unknownNodes.length > 0;
|
||||
hasInvalid = invalidNodes.length > 0;
|
||||
|
||||
var unusedConfigNodes = [];
|
||||
RED.nodes.eachConfig(function(node) {
|
||||
|
||||
@@ -582,12 +582,11 @@ RED.editor = (function() {
|
||||
|
||||
// Add dummy fields to prevent 'Enter' submitting the form in some
|
||||
// cases, and also prevent browser auto-fill of password
|
||||
// - the elements cannot be hidden otherwise Chrome will ignore them.
|
||||
// - the elements need to have id's that imply password/username
|
||||
$('<span style="position: absolute; top: -2000px;"><input id="red-ui-trap-password" type="password"/></span>').prependTo(dialogForm);
|
||||
$('<span style="position: absolute; top: -2000px;"><input id="red-ui-trap-username" type="text"/></span>').prependTo(dialogForm);
|
||||
// Add in reverse order as they are prepended...
|
||||
$('<input type="password" style="display: none;" />').prependTo(dialogForm);
|
||||
$('<input type="text" style="display: none;" />').prependTo(dialogForm);
|
||||
dialogForm.on("submit", function(e) { e.preventDefault();});
|
||||
dialogForm.find('input').attr("autocomplete","off");
|
||||
dialogForm.find('input').attr("autocomplete","disable");
|
||||
return dialogForm;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
var f = $(this).val();
|
||||
var args = RED._('jsonata:'+f+".args",{defaultValue:''});
|
||||
var title = "<h5>"+f+"("+args+")</h5>";
|
||||
var body = RED.utils.renderMarkdown(RED._('jsonata:'+f+'.desc',{defaultValue:''}));
|
||||
var body = marked(RED._('jsonata:'+f+'.desc',{defaultValue:''}));
|
||||
$("#red-ui-editor-type-expression-help").html(title+"<p>"+body+"</p>");
|
||||
|
||||
})
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
options.push({id:"red-ui-editor-type-json-menu-duplicate", icon:"fa fa-copy", label:RED._("jsonEditor.duplicate"),onselect:function(){
|
||||
var newKey = item.key;
|
||||
if (item.parent.type === 'array') {
|
||||
newKey = item.parent.children.length;
|
||||
newKey = parent.children.length;
|
||||
} else {
|
||||
var m = /^(.*?)(-(\d+))?$/.exec(newKey);
|
||||
var usedKeys = {};
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
clearTimeout(changeTimer);
|
||||
changeTimer = setTimeout(function() {
|
||||
var currentScrollTop = $(".red-ui-editor-type-markdown-panel-preview").scrollTop();
|
||||
$(".red-ui-editor-type-markdown-panel-preview").html(RED.utils.renderMarkdown(expressionEditor.getValue()));
|
||||
$(".red-ui-editor-type-markdown-panel-preview").html(marked(expressionEditor.getValue()));
|
||||
$(".red-ui-editor-type-markdown-panel-preview").scrollTop(currentScrollTop);
|
||||
},200);
|
||||
})
|
||||
@@ -116,7 +116,7 @@
|
||||
}
|
||||
|
||||
if (value) {
|
||||
$(".red-ui-editor-type-markdown-panel-preview").html(RED.utils.renderMarkdown(expressionEditor.getValue()));
|
||||
$(".red-ui-editor-type-markdown-panel-preview").html(marked(expressionEditor.getValue()));
|
||||
}
|
||||
panels = RED.panels.create({
|
||||
id:"red-ui-editor-type-markdown-panels",
|
||||
|
||||
@@ -524,12 +524,12 @@ RED.keyboard = (function() {
|
||||
var pane = $('<div id="red-ui-settings-tab-keyboard"></div>');
|
||||
|
||||
$('<div class="keyboard-shortcut-entry keyboard-shortcut-list-header">'+
|
||||
'<div class="keyboard-shortcut-entry-key keyboard-shortcut-entry-text"><input autocomplete="off" name="keyboard-filter" id="red-ui-settings-tab-keyboard-filter" type="text" data-i18n="[placeholder]keyboard.filterActions"></div>'+
|
||||
'<div class="keyboard-shortcut-entry-key keyboard-shortcut-entry-text"><input id="red-ui-settings-tab-keyboard-filter" type="text" data-i18n="[placeholder]keyboard.filterActions"></div>'+
|
||||
'<div class="keyboard-shortcut-entry-key" data-i18n="keyboard.shortcut"></div>'+
|
||||
'<div class="keyboard-shortcut-entry-scope" data-i18n="keyboard.scope"></div>'+
|
||||
'</div>').appendTo(pane);
|
||||
|
||||
pane.find("#red-ui-settings-tab-keyboard-filter").searchBox({
|
||||
pane.find("input").searchBox({
|
||||
delay: 100,
|
||||
change: function() {
|
||||
var filterValue = $(this).val().trim();
|
||||
|
||||
@@ -220,11 +220,7 @@ RED.palette.editor = (function() {
|
||||
var setElements = nodeEntry.sets[setName];
|
||||
if (set.err) {
|
||||
errorCount++;
|
||||
var errMessage = set.err;
|
||||
if (set.err.message) {
|
||||
errMessage = set.err.message;
|
||||
}
|
||||
$("<li>").text(errMessage).appendTo(nodeEntry.errorList);
|
||||
$("<li>").text(set.err).appendTo(nodeEntry.errorList);
|
||||
}
|
||||
if (set.enabled) {
|
||||
activeTypeCount += set.types.length;
|
||||
@@ -385,7 +381,6 @@ RED.palette.editor = (function() {
|
||||
handleCatalogResponse(null,catalog,index,v);
|
||||
refreshNodeModuleList();
|
||||
}).fail(function(jqxhr, textStatus, error) {
|
||||
console.warn("Error loading catalog",catalog,":",error);
|
||||
handleCatalogResponse(jqxhr,catalog,index);
|
||||
}).always(function() {
|
||||
handled++;
|
||||
|
||||
@@ -92,11 +92,8 @@ RED.palette = (function() {
|
||||
var lineHeight = 20;
|
||||
var portHeight = 10;
|
||||
|
||||
el.attr("data-palette-label",label);
|
||||
|
||||
label = RED.utils.sanitize(label);
|
||||
|
||||
|
||||
var words = label.split(/[ -]/);
|
||||
|
||||
var displayLines = [];
|
||||
@@ -269,7 +266,7 @@ RED.palette = (function() {
|
||||
RED.view.focus();
|
||||
var helpText;
|
||||
if (nt.indexOf("subflow:") === 0) {
|
||||
helpText = RED.utils.renderMarkdown(RED.nodes.subflow(nt.substring(8)).info||"")||('<span class="red-ui-help-info-none">'+RED._("sidebar.info.none")+'</span>');
|
||||
helpText = marked(RED.nodes.subflow(nt.substring(8)).info||"")||('<span class="red-ui-help-info-none">'+RED._("sidebar.info.none")+'</span>');
|
||||
} else {
|
||||
helpText = $("script[data-help-name='"+d.attr("data-palette-type")+"']").html()||('<span class="red-ui-help-info-none">'+RED._("sidebar.info.none")+'</span>');
|
||||
}
|
||||
@@ -370,7 +367,7 @@ RED.palette = (function() {
|
||||
RED.workspaces.show(nt.substring(8));
|
||||
e.preventDefault();
|
||||
});
|
||||
nodeInfo = RED.utils.renderMarkdown(def.info||"");
|
||||
nodeInfo = marked(def.info||"");
|
||||
}
|
||||
setLabel(nt,d,label,nodeInfo);
|
||||
|
||||
@@ -440,7 +437,7 @@ RED.palette = (function() {
|
||||
} else if (portOutput.length !== 0 && sf.out.length === 0) {
|
||||
portOutput.remove();
|
||||
}
|
||||
setLabel(sf.type+":"+sf.id,paletteNode,sf.name,RED.utils.renderMarkdown(sf.info||""));
|
||||
setLabel(sf.type+":"+sf.id,paletteNode,sf.name,marked(sf.info||""));
|
||||
setIcon(paletteNode,sf);
|
||||
|
||||
var currentCategory = paletteNode.data('category');
|
||||
@@ -472,7 +469,7 @@ RED.palette = (function() {
|
||||
function filterChange(val) {
|
||||
var re = new RegExp(val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i');
|
||||
$("#red-ui-palette-container .red-ui-palette-node").each(function(i,el) {
|
||||
var currentLabel = $(el).attr("data-palette-label");
|
||||
var currentLabel = $(el).find(".red-ui-palette-label").text();
|
||||
var type = $(el).attr("data-palette-type");
|
||||
if (val === "" || re.test(type) || re.test(currentLabel)) {
|
||||
$(this).show();
|
||||
|
||||
@@ -158,7 +158,7 @@ RED.projects.settings = (function() {
|
||||
container.empty();
|
||||
var desc;
|
||||
if (activeProject.description) {
|
||||
desc = RED.utils.renderMarkdown(activeProject.description);
|
||||
desc = marked(activeProject.description);
|
||||
} else {
|
||||
desc = '<span class="red-ui-help-info-none">' + RED._("sidebar.project.noDescriptionAvailable") + '</span>';
|
||||
}
|
||||
|
||||
@@ -30,13 +30,13 @@ RED.projects.userSettings = (function() {
|
||||
$('<div class="red-ui-settings-section-description"></div>').appendTo(gitconfigContainer).text(RED._("editor:sidebar.project.userSettings.committerTip"));
|
||||
|
||||
var row = $('<div class="red-ui-settings-row"></div>').appendTo(gitconfigContainer);
|
||||
$('<label for="user-settings-gitconfig-username"></label>').text(RED._("editor:sidebar.project.userSettings.userName")).appendTo(row);
|
||||
gitUsernameInput = $('<input type="text" id="user-settings-gitconfig-username">').appendTo(row);
|
||||
$('<label for=""></label>').text(RED._("editor:sidebar.project.userSettings.userName")).appendTo(row);
|
||||
gitUsernameInput = $('<input type="text">').appendTo(row);
|
||||
gitUsernameInput.val(currentGitSettings.user.name||"");
|
||||
|
||||
row = $('<div class="red-ui-settings-row"></div>').appendTo(gitconfigContainer);
|
||||
$('<label for="user-settings-gitconfig-email"></label>').text(RED._("editor:sidebar.project.userSettings.email")).appendTo(row);
|
||||
gitEmailInput = $('<input type="text" id="user-settings-gitconfig-email">').appendTo(row);
|
||||
$('<label for=""></label>').text(RED._("editor:sidebar.project.userSettings.email")).appendTo(row);
|
||||
gitEmailInput = $('<input type="text">').appendTo(row);
|
||||
gitEmailInput.val(currentGitSettings.user.email||"");
|
||||
}
|
||||
|
||||
|
||||
@@ -1939,121 +1939,100 @@ RED.projects = (function() {
|
||||
}
|
||||
}).fail(function(xhr,textStatus,err) {
|
||||
var responses;
|
||||
|
||||
if (options.responses && options.responses[xhr.status]) {
|
||||
responses = options.responses[xhr.status];
|
||||
if (typeof responses === 'function') {
|
||||
resultCallback = responses;
|
||||
resultCallbackArgs = {error:responses.statusText};
|
||||
return;
|
||||
} else if (options.handleAuthFail !== false && (xhr.responseJSON.code === 'git_auth_failed' || xhr.responseJSON.code === 'git_host_key_verification_failed')) {
|
||||
if (xhr.responseJSON.code === 'git_auth_failed') {
|
||||
var url = activeProject.git.remotes[xhr.responseJSON.remote||options.remote||'origin'].fetch;
|
||||
} else if (options.handleAuthFail !== false && xhr.responseJSON.code === 'git_auth_failed') {
|
||||
var url = activeProject.git.remotes[xhr.responseJSON.remote||options.remote||'origin'].fetch;
|
||||
|
||||
var message = $('<div>'+
|
||||
var message = $('<div>'+
|
||||
'<div class="form-row">'+RED._("projects.send-req.auth-req")+':</div>'+
|
||||
'<div class="form-row"><div style="margin-left: 20px;">'+url+'</div></div>'+
|
||||
'</div>');
|
||||
|
||||
var isSSH = false;
|
||||
if (/^https?:\/\//.test(url)) {
|
||||
$('<div class="form-row"><label for="projects-user-auth-username">'+RED._("projects.send-req.username")+'</label><input id="projects-user-auth-username" type="text"></input></div>'+
|
||||
'<div class="form-row"><label for=projects-user-auth-password">'+RED._("projects.send-req.password")+'</label><input id="projects-user-auth-password" type="password"></input></div>').appendTo(message);
|
||||
} else if (/^(?:ssh|[\d\w\.\-_]+@[\w\.]+):(?:\/\/)?/.test(url)) {
|
||||
isSSH = true;
|
||||
var row = $('<div class="form-row"></div>').appendTo(message);
|
||||
$('<label for="projects-user-auth-key">SSH Key</label>').appendTo(row);
|
||||
var projectRepoSSHKeySelect = $('<select id="projects-user-auth-key">').width('70%').appendTo(row);
|
||||
$.getJSON("settings/user/keys", function(data) {
|
||||
var count = 0;
|
||||
data.keys.forEach(function(key) {
|
||||
projectRepoSSHKeySelect.append($("<option></option>").val(key.name).text(key.name));
|
||||
count++;
|
||||
});
|
||||
if (count === 0) {
|
||||
//TODO: handle no keys yet setup
|
||||
}
|
||||
var isSSH = false;
|
||||
if (/^https?:\/\//.test(url)) {
|
||||
$('<div class="form-row"><label for="projects-user-auth-username">'+RED._("projects.send-req.username")+'</label><input id="projects-user-auth-username" type="text"></input></div>'+
|
||||
'<div class="form-row"><label for=projects-user-auth-password">'+RED._("projects.send-req.password")+'</label><input id="projects-user-auth-password" type="password"></input></div>').appendTo(message);
|
||||
} else if (/^(?:ssh|[\d\w\.\-_]+@[\w\.]+):(?:\/\/)?/.test(url)) {
|
||||
isSSH = true;
|
||||
var row = $('<div class="form-row"></div>').appendTo(message);
|
||||
$('<label for="projects-user-auth-key">SSH Key</label>').appendTo(row);
|
||||
var projectRepoSSHKeySelect = $('<select id="projects-user-auth-key">').width('70%').appendTo(row);
|
||||
$.getJSON("settings/user/keys", function(data) {
|
||||
var count = 0;
|
||||
data.keys.forEach(function(key) {
|
||||
projectRepoSSHKeySelect.append($("<option></option>").val(key.name).text(key.name));
|
||||
count++;
|
||||
});
|
||||
row = $('<div class="form-row"></div>').appendTo(message);
|
||||
$('<label for="projects-user-auth-passphrase">'+RED._("projects.send-req.passphrase")+'</label>').appendTo(row);
|
||||
$('<input id="projects-user-auth-passphrase" type="password"></input>').appendTo(row);
|
||||
}
|
||||
|
||||
var notification = RED.notify(message,{
|
||||
type:"error",
|
||||
fixed: true,
|
||||
modal: true,
|
||||
buttons: [
|
||||
{
|
||||
//id: "node-dialog-delete",
|
||||
//class: 'leftButton',
|
||||
text: RED._("common.label.cancel"),
|
||||
click: function() {
|
||||
notification.close();
|
||||
}
|
||||
},{
|
||||
text: '<span><i class="fa fa-refresh"></i> ' +RED._("projects.send-req.retry") +'</span>',
|
||||
click: function() {
|
||||
body = body || {};
|
||||
var authBody = {};
|
||||
if (isSSH) {
|
||||
authBody.keyFile = $('#projects-user-auth-key').val();
|
||||
authBody.passphrase = $('#projects-user-auth-passphrase').val();
|
||||
} else {
|
||||
authBody.username = $('#projects-user-auth-username').val();
|
||||
authBody.password = $('#projects-user-auth-password').val();
|
||||
}
|
||||
var done = function(err) {
|
||||
if (err) {
|
||||
console.log(RED._("projects.send-req.update-failed"));
|
||||
console.log(err);
|
||||
} else {
|
||||
sendRequest(options,body);
|
||||
notification.close();
|
||||
}
|
||||
|
||||
}
|
||||
sendRequest({
|
||||
url: "projects/"+activeProject.name+"/remotes/"+(xhr.responseJSON.remote||options.remote||'origin'),
|
||||
type: "PUT",
|
||||
responses: {
|
||||
0: function(error) {
|
||||
done(error,null);
|
||||
},
|
||||
200: function(data) {
|
||||
done(null,data);
|
||||
},
|
||||
400: {
|
||||
'unexpected_error': function(error) {
|
||||
done(error,null);
|
||||
}
|
||||
},
|
||||
}
|
||||
},{auth:authBody});
|
||||
}
|
||||
}
|
||||
]
|
||||
if (count === 0) {
|
||||
//TODO: handle no keys yet setup
|
||||
}
|
||||
});
|
||||
return;
|
||||
} else if (xhr.responseJSON.code === 'git_host_key_verification_failed') {
|
||||
var message = $('<div>'+
|
||||
'<div class="form-row">'+RED._("projects.send-req.host-key-verify-failed")+'</div>'+
|
||||
'</div>');
|
||||
var notification = RED.notify(message,{
|
||||
type:"error",
|
||||
fixed: true,
|
||||
modal: true,
|
||||
buttons: [
|
||||
{
|
||||
text: RED._("common.label.close"),
|
||||
click: function() {
|
||||
notification.close();
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
return;
|
||||
row = $('<div class="form-row"></div>').appendTo(message);
|
||||
$('<label for="projects-user-auth-passphrase">'+RED._("projects.send-req.passphrase")+'</label>').appendTo(row);
|
||||
$('<input id="projects-user-auth-passphrase" type="password"></input>').appendTo(row);
|
||||
}
|
||||
|
||||
var notification = RED.notify(message,{
|
||||
type:"error",
|
||||
fixed: true,
|
||||
modal: true,
|
||||
buttons: [
|
||||
{
|
||||
//id: "node-dialog-delete",
|
||||
//class: 'leftButton',
|
||||
text: RED._("common.label.cancel"),
|
||||
click: function() {
|
||||
notification.close();
|
||||
}
|
||||
},{
|
||||
text: '<span><i class="fa fa-refresh"></i> ' +RED._("projects.send-req.retry") +'</span>',
|
||||
click: function() {
|
||||
body = body || {};
|
||||
var authBody = {};
|
||||
if (isSSH) {
|
||||
authBody.keyFile = $('#projects-user-auth-key').val();
|
||||
authBody.passphrase = $('#projects-user-auth-passphrase').val();
|
||||
} else {
|
||||
authBody.username = $('#projects-user-auth-username').val();
|
||||
authBody.password = $('#projects-user-auth-password').val();
|
||||
}
|
||||
var done = function(err) {
|
||||
if (err) {
|
||||
console.log(RED._("projects.send-req.update-failed"));
|
||||
console.log(err);
|
||||
} else {
|
||||
sendRequest(options,body);
|
||||
notification.close();
|
||||
}
|
||||
|
||||
}
|
||||
sendRequest({
|
||||
url: "projects/"+activeProject.name+"/remotes/"+(xhr.responseJSON.remote||options.remote||'origin'),
|
||||
type: "PUT",
|
||||
responses: {
|
||||
0: function(error) {
|
||||
done(error,null);
|
||||
},
|
||||
200: function(data) {
|
||||
done(null,data);
|
||||
},
|
||||
400: {
|
||||
'unexpected_error': function(error) {
|
||||
done(error,null);
|
||||
}
|
||||
},
|
||||
}
|
||||
},{auth:authBody});
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
return;
|
||||
} else if (responses[xhr.responseJSON.code]) {
|
||||
resultCallback = responses[xhr.responseJSON.code];
|
||||
resultCallbackArgs = xhr.responseJSON;
|
||||
|
||||
@@ -336,7 +336,7 @@ RED.sidebar.versionControl = (function() {
|
||||
|
||||
var unstagedContent = $('<div class="red-ui-sidebar-vc-change-container"></div>').appendTo(localChanges.content);
|
||||
var header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.localFiles")+'</div>').appendTo(unstagedContent);
|
||||
stageAllButton = $('<button class="red-ui-button red-ui-button-small" style="position: absolute; right: 5px; top: 5px;"><i class="fa fa-plus"></i> '+RED._("sidebar.project.versionControl.all")+'</button>')
|
||||
stageAllButton = $('<button class="red-ui-button red-ui-button-small" style="float: right"><i class="fa fa-plus"></i> '+RED._("sidebar.project.versionControl.all")+'</button>')
|
||||
.appendTo(header)
|
||||
.on("click", function(evt) {
|
||||
evt.preventDefault();
|
||||
@@ -368,7 +368,7 @@ RED.sidebar.versionControl = (function() {
|
||||
unmergedContent = $('<div class="red-ui-sidebar-vc-change-container"></div>').appendTo(localChanges.content);
|
||||
|
||||
header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.unmergedChanges")+'</div>').appendTo(unmergedContent);
|
||||
bg = $('<div style="position: absolute; right: 5px; top: 5px;"></div>').appendTo(header);
|
||||
bg = $('<div style="float: right"></div>').appendTo(header);
|
||||
var abortMergeButton = $('<button class="red-ui-button red-ui-button-small" style="margin-right: 5px;">'+RED._("sidebar.project.versionControl.abortMerge")+'</button>')
|
||||
.appendTo(bg)
|
||||
.on("click", function(evt) {
|
||||
@@ -433,7 +433,7 @@ RED.sidebar.versionControl = (function() {
|
||||
|
||||
header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.changeToCommit")+'</div>').appendTo(stagedContent);
|
||||
|
||||
bg = $('<div style="position: absolute; right: 5px; top: 5px;"></div>').appendTo(header);
|
||||
bg = $('<div style="float: right"></div>').appendTo(header);
|
||||
var showCommitBox = function() {
|
||||
commitMessage.val("");
|
||||
submitCommitButton.prop("disabled",true);
|
||||
|
||||
@@ -231,8 +231,7 @@ RED.sidebar.context = (function() {
|
||||
RED.utils.createObjectElement(RED.utils.decodeObject(payload,format), {
|
||||
typeHint: data.format,
|
||||
sourceId: id+"."+k,
|
||||
tools: tools,
|
||||
path: ""
|
||||
tools: tools
|
||||
}).appendTo(propRow.children()[1]);
|
||||
}
|
||||
})
|
||||
@@ -276,8 +275,7 @@ RED.sidebar.context = (function() {
|
||||
RED.utils.createObjectElement(RED.utils.decodeObject(payload,format), {
|
||||
typeHint: data.format,
|
||||
sourceId: id+"."+k,
|
||||
tools: tools,
|
||||
path: ""
|
||||
tools: tools
|
||||
}).appendTo(propRow.children()[1]);
|
||||
}
|
||||
});
|
||||
@@ -297,8 +295,7 @@ RED.sidebar.context = (function() {
|
||||
RED.utils.createObjectElement(RED.utils.decodeObject(payload,format), {
|
||||
typeHint: v.format,
|
||||
sourceId: id+"."+k,
|
||||
tools: tools,
|
||||
path: ""
|
||||
tools: tools
|
||||
}).appendTo(propRow.children()[1]);
|
||||
if (contextStores.length > 1) {
|
||||
$("<span>",{class:"red-ui-sidebar-context-property-storename"}).text(v.store).appendTo($(propRow.children()[0]))
|
||||
|
||||
@@ -15,6 +15,17 @@
|
||||
**/
|
||||
RED.sidebar.info = (function() {
|
||||
|
||||
marked.setOptions({
|
||||
renderer: new marked.Renderer(),
|
||||
gfm: true,
|
||||
tables: true,
|
||||
breaks: false,
|
||||
pedantic: false,
|
||||
sanitize: true,
|
||||
smartLists: true,
|
||||
smartypants: false
|
||||
});
|
||||
|
||||
var content;
|
||||
var sections;
|
||||
var propertiesSection;
|
||||
@@ -303,7 +314,7 @@ RED.sidebar.info = (function() {
|
||||
if (subflowNode && node.type !== "subflow") {
|
||||
// Selected a subflow instance node.
|
||||
// - The subflow template info goes into help
|
||||
helpText = (RED.utils.renderMarkdown(subflowNode.info||"")||('<span class="red-ui-help-info-none">'+RED._("sidebar.info.none")+'</span>'));
|
||||
helpText = (marked(subflowNode.info||"")||('<span class="red-ui-help-info-none">'+RED._("sidebar.info.none")+'</span>'));
|
||||
} else {
|
||||
helpText = $("script[data-help-name='"+node.type+"']").html()||('<span class="red-ui-help-info-none">'+RED._("sidebar.info.none")+'</span>');
|
||||
}
|
||||
@@ -315,10 +326,10 @@ RED.sidebar.info = (function() {
|
||||
if (node._def && node._def.info) {
|
||||
var info = node._def.info;
|
||||
var textInfo = (typeof info === "function" ? info.call(node) : info);
|
||||
infoText = infoText + RED.utils.renderMarkdown(textInfo);
|
||||
infoText = infoText + marked(textInfo);
|
||||
}
|
||||
if (node.info) {
|
||||
infoText = infoText + RED.utils.renderMarkdown(node.info || "")
|
||||
infoText = infoText + marked(node.info || "")
|
||||
}
|
||||
setInfoText(infoText, infoSection.content);
|
||||
|
||||
|
||||
@@ -16,28 +16,6 @@
|
||||
|
||||
RED.utils = (function() {
|
||||
|
||||
window._marked = window.marked;
|
||||
window.marked = function(txt) {
|
||||
console.warn("Use of 'marked()' is deprecated. Use RED.utils.renderMarkdown() instead");
|
||||
return renderMarkdown(txt);
|
||||
}
|
||||
|
||||
_marked.setOptions({
|
||||
renderer: new _marked.Renderer(),
|
||||
gfm: true,
|
||||
tables: true,
|
||||
breaks: false,
|
||||
pedantic: false,
|
||||
smartLists: true,
|
||||
smartypants: false
|
||||
});
|
||||
|
||||
function renderMarkdown(txt) {
|
||||
var rendered = _marked(txt);
|
||||
var cleaned = DOMPurify.sanitize(rendered, {SAFE_FOR_JQUERY: true})
|
||||
return cleaned;
|
||||
}
|
||||
|
||||
function formatString(str) {
|
||||
return str.replace(/\r?\n/g,"↵").replace(/\t/g,"→");
|
||||
}
|
||||
@@ -1075,7 +1053,6 @@ RED.utils = (function() {
|
||||
decodeObject: decodeObject,
|
||||
parseContextKey: parseContextKey,
|
||||
createIconElement: createIconElement,
|
||||
sanitize: sanitize,
|
||||
renderMarkdown: renderMarkdown
|
||||
sanitize: sanitize
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -3531,10 +3531,8 @@ RED.view = (function() {
|
||||
if (new_ms.length === 1) {
|
||||
node = new_ms[0];
|
||||
spliceActive = node.n.hasOwnProperty("_def") &&
|
||||
((node.n.hasOwnProperty("inputs") && node.n.inputs > 0) || (!node.n.hasOwnProperty("inputs") && node.n._def.inputs > 0)) &&
|
||||
((node.n.hasOwnProperty("outputs") && node.n.outputs > 0) || (!node.n.hasOwnProperty("outputs") && node.n._def.outputs > 0))
|
||||
|
||||
|
||||
node.n._def.inputs > 0 &&
|
||||
node.n._def.outputs > 0;
|
||||
}
|
||||
}
|
||||
RED.keyboard.add("*","escape",function(){
|
||||
|
||||
@@ -160,7 +160,6 @@
|
||||
.red-ui-debug-msg-element {
|
||||
color: $debug-message-text-color;
|
||||
line-height: 1.3em;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
.red-ui-debug-msg-object-key {
|
||||
color: $debug-message-text-color-object-key;
|
||||
@@ -217,10 +216,6 @@
|
||||
.red-ui-debug-msg-type-number { color: $debug-message-text-color-msg-type-number; };
|
||||
.red-ui-debug-msg-type-number-toggle { cursor: pointer;}
|
||||
|
||||
.red-ui-debug-msg-type-string {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.red-ui-debug-msg-row {
|
||||
display: block;
|
||||
padding: 4px 2px 2px;
|
||||
|
||||
@@ -633,7 +633,7 @@ button.red-ui-toggleButton.toggle {
|
||||
.red-ui-typedInput-value-label,.red-ui-typedInput-option-label {
|
||||
select,.placeholder-input {
|
||||
margin: 3px;
|
||||
height: 24px;
|
||||
height: 26px;
|
||||
width: calc(100% - 10px);
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
@@ -27,22 +27,9 @@
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.red-ui-info-table {
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
table.red-ui-info-table tr:not(.blank) td:first-child {
|
||||
width: 30%;
|
||||
}
|
||||
table.red-ui-info-table tr:not(.blank) td:last-child {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.red-ui-sidebar-context-property {
|
||||
overflow-wrap: break-word;
|
||||
position: relative;
|
||||
.red-ui-debug-msg-tools {
|
||||
right: 0px;
|
||||
|
||||
@@ -32,9 +32,6 @@
|
||||
right: 5px;
|
||||
top: 9px;
|
||||
}
|
||||
form.red-ui-searchBox-form {
|
||||
margin: 0;
|
||||
}
|
||||
input.red-ui-searchBox-input {
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
border: 1px solid $form-input-border-color;
|
||||
border-radius: 4px;
|
||||
height: 34px;
|
||||
display: inline-flex;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
vertical-align: middle;
|
||||
@@ -26,7 +26,12 @@
|
||||
overflow:visible;
|
||||
position: relative;
|
||||
.red-ui-typedInput-input-wrap {
|
||||
flex-grow: 1;
|
||||
position: absolute;
|
||||
left:0;
|
||||
right:0;
|
||||
top:0;
|
||||
bottom:0;
|
||||
outline: red;
|
||||
}
|
||||
input.red-ui-typedInput-input {
|
||||
width: 100%;
|
||||
@@ -44,7 +49,7 @@
|
||||
border-color: $form-input-focus-color !important;
|
||||
}
|
||||
.red-ui-typedInput-value-label {
|
||||
flex-grow: 1;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
height: 32px;
|
||||
box-sizing: border-box;
|
||||
@@ -99,17 +104,18 @@ button.red-ui-typedInput-option-trigger
|
||||
{
|
||||
text-align: left;
|
||||
border: none;
|
||||
flex-basis: auto;
|
||||
position: absolute;
|
||||
box-sizing: border-box;
|
||||
border-top-left-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
padding: 0 1px 0 5px;
|
||||
display:inline-block;
|
||||
background: $form-button-background;
|
||||
height: 32px;
|
||||
line-height: 30px;
|
||||
min-width: 23px;
|
||||
vertical-align: middle;
|
||||
color: $form-text-color;
|
||||
white-space: nowrap;
|
||||
i.red-ui-typedInput-icon {
|
||||
margin-left: 1px;
|
||||
margin-right: 2px;
|
||||
@@ -145,7 +151,7 @@ button.red-ui-typedInput-option-trigger
|
||||
text-decoration: none;
|
||||
}
|
||||
&.red-ui-typedInput-full-width {
|
||||
flex-grow: 1;
|
||||
width: 100%;
|
||||
border-top-right-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
@@ -161,6 +167,7 @@ button.red-ui-typedInput-option-expand {
|
||||
border-bottom-right-radius: 4px;
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
button.red-ui-typedInput-option-trigger {
|
||||
@@ -169,23 +176,27 @@ button.red-ui-typedInput-option-trigger {
|
||||
border-top-right-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
padding: 0 0 0 0;
|
||||
position:relative;
|
||||
flex-grow: 1;
|
||||
line-height: 32px;
|
||||
display: inline-flex;
|
||||
position:absolute;
|
||||
right: 0;
|
||||
.red-ui-typedInput-option-label {
|
||||
background:$form-button-background;
|
||||
color: $form-text-color;
|
||||
flex-grow: 1;
|
||||
padding: 0 0 0 8px;
|
||||
display:inline-block;
|
||||
position:absolute;
|
||||
left:0;
|
||||
right:23px;
|
||||
top: 0;
|
||||
padding: 0 5px 0 8px;
|
||||
i.red-ui-typedInput-icon {
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
.red-ui-typedInput-option-caret {
|
||||
flex-grow: 0;
|
||||
display:inline-block;
|
||||
width: 23px;
|
||||
text-align: center;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
width: 17px;
|
||||
padding-left: 5px;
|
||||
&:before {
|
||||
content:'';
|
||||
display: inline-block;
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
var length = str.length;
|
||||
var start = 0;
|
||||
var inString = false;
|
||||
var inRegex = false;
|
||||
var inBox = false;
|
||||
var quoteChar;
|
||||
var list = [];
|
||||
@@ -25,13 +24,8 @@
|
||||
}
|
||||
for (var i=0;i<length;i++) {
|
||||
var c = str[i];
|
||||
if (!inString && !inRegex) {
|
||||
if (c === "/") {
|
||||
inRegex = true;
|
||||
frame = {type:"regex",pos:i};
|
||||
list.push(frame);
|
||||
stack.push(frame);
|
||||
} else if (c === "'" || c === '"') {
|
||||
if (!inString) {
|
||||
if (c === "'" || c === '"') {
|
||||
inString = true;
|
||||
quoteChar = c;
|
||||
frame = {type:"string",pos:i};
|
||||
@@ -43,9 +37,6 @@
|
||||
} else if (c === ",") {
|
||||
frame = {type:",",pos:i};
|
||||
list.push(frame);
|
||||
} else if (c === "&") {
|
||||
frame = {type:"&",pos:i};
|
||||
list.push(frame);
|
||||
} else if (/[\(\[\{]/.test(c)) {
|
||||
frame = {type:"open-block",char:c,pos:i};
|
||||
list.push(frame);
|
||||
@@ -53,8 +44,7 @@
|
||||
} else if (/[\}\)\]]/.test(c)) {
|
||||
var oldFrame = stack.pop();
|
||||
if (matchingBrackets[oldFrame.char] !== c) {
|
||||
// console.log("Stack frame mismatch",c,"at",i,"expected",matchingBrackets[oldFrame.char],"from",oldFrame.pos);
|
||||
// console.log(list);
|
||||
//console.log("Stack frame mismatch",c,"at",i,"expected",matchingBrackets[oldFrame.char],"from",oldFrame.pos);
|
||||
return str;
|
||||
}
|
||||
//console.log("Closing",c,"at",i,"compare",oldFrame.type,oldFrame.pos);
|
||||
@@ -63,32 +53,19 @@
|
||||
list.push(frame);
|
||||
}
|
||||
} else {
|
||||
if (c === "\\") {
|
||||
// an escaped char - stay in current mode and skip the next char
|
||||
i++;
|
||||
}
|
||||
if (inString) {
|
||||
if (c === quoteChar) {
|
||||
// Next char must be a ]
|
||||
inString = false;
|
||||
var f = stack.pop();
|
||||
f.end = i;
|
||||
}
|
||||
} else if (inRegex) {
|
||||
if (c === "/") {
|
||||
inRegex = false;
|
||||
var f = stack.pop();
|
||||
f.end = i;
|
||||
}
|
||||
if (c === quoteChar) {
|
||||
// Next char must be a ]
|
||||
inString = false;
|
||||
stack.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
// console.log("list",list);
|
||||
|
||||
}
|
||||
// console.log(stack);
|
||||
var result = str;
|
||||
var indent = 0;
|
||||
var offset = 0;
|
||||
var pre,post,indented,hasNewline;
|
||||
var pre,post,indented;
|
||||
var longStack = [];
|
||||
list.forEach(function(f) {
|
||||
if (f.type === ";" || f.type === ",") {
|
||||
@@ -96,51 +73,29 @@
|
||||
pre = result.substring(0,offset+f.pos+1);
|
||||
post = result.substring(offset+f.pos+1);
|
||||
indented = indentLine(post,indent);
|
||||
hasNewline = /\n$/.test(pre);
|
||||
// console.log("A§"+pre+"§\n§"+indented+"§",hasNewline);
|
||||
result = pre+(hasNewline?"":"\n")+indented;
|
||||
offset += indented.length-post.length+(hasNewline?0:1);
|
||||
result = pre+"\n"+indented;
|
||||
offset += indented.length-post.length+1;
|
||||
}
|
||||
} else if (f.type === "&") {
|
||||
pre = result.substring(0,offset+f.pos+1);
|
||||
var lastLineBreak = pre.lastIndexOf("\n");
|
||||
var lineLength = pre.length - lastLineBreak;
|
||||
if (lineLength > 70) {
|
||||
post = result.substring(offset+f.pos+1);
|
||||
if (!/^\n/.test(post)) {
|
||||
indented = indentLine(post,indent);
|
||||
hasNewline = /\n$/.test(pre);
|
||||
result = pre+(hasNewline?"":"\n")+indented;
|
||||
offset += indented.length-post.length+(hasNewline?0:1);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (f.type === "open-block") {
|
||||
if (f.width > 40) {
|
||||
if (f.width > 30) {
|
||||
longStack.push(true);
|
||||
indent += 4;
|
||||
pre = result.substring(0,offset+f.pos+1);
|
||||
post = result.substring(offset+f.pos+1);
|
||||
hasNewline = /\n$/.test(pre);
|
||||
indented = indentLine(post,indent);
|
||||
result = pre+(hasNewline?"":"\n")+indented;
|
||||
offset += indented.length-post.length+(hasNewline?0:1);
|
||||
result = pre+"\n"+indented;
|
||||
offset += indented.length-post.length+1;
|
||||
} else {
|
||||
longStack.push(false);
|
||||
}
|
||||
} else if (f.type === "close-block") {
|
||||
if (f.width > 40) {
|
||||
if (f.width > 30) {
|
||||
indent -= 4;
|
||||
pre = result.substring(0,offset+f.pos);
|
||||
post = result.substring(offset+f.pos);
|
||||
indented = indentLine(post,indent);
|
||||
hasNewline = /\n *$/.test(pre);
|
||||
if (hasNewline) {
|
||||
result = pre + post;
|
||||
} else {
|
||||
result = pre+"\n"+indented;
|
||||
offset += indented.length-post.length+1;
|
||||
}
|
||||
result = pre+"\n"+indented;
|
||||
offset += indented.length-post.length+1;
|
||||
}
|
||||
longStack.pop();
|
||||
}
|
||||
@@ -216,7 +171,6 @@
|
||||
'$sum':{ args:[ 'array' ]},
|
||||
'$toMillis':{args:['timestamp']}, // <-------------
|
||||
'$trim':{ args:[ 'str' ]},
|
||||
'$type':{ args:['value']},
|
||||
'$uppercase':{ args:[ 'str' ]},
|
||||
'$zip':{ args:[ 'array1' ]}
|
||||
}
|
||||
|
||||
@@ -28,11 +28,6 @@ ace.define("ace/mode/jsonata",["require","exports","module","ace/lib/oop","ace/m
|
||||
}, "identifier");
|
||||
this.$rules = {
|
||||
"start" : [
|
||||
{
|
||||
token: "string.regexp",
|
||||
regex: "\\/",
|
||||
next: "regex"
|
||||
},
|
||||
{
|
||||
token : "string",
|
||||
regex : "'(?=.)",
|
||||
@@ -51,35 +46,34 @@ ace.define("ace/mode/jsonata",["require","exports","module","ace/lib/oop","ace/m
|
||||
token : "constant.numeric", // float
|
||||
regex : /[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/
|
||||
},
|
||||
{
|
||||
token: "keyword",
|
||||
regex: /λ/
|
||||
},
|
||||
{
|
||||
token: "keyword",
|
||||
regex: jsonataFunctions
|
||||
},
|
||||
{
|
||||
token : keywordMapper,
|
||||
regex : "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"
|
||||
},
|
||||
{
|
||||
token : "punctuation.operator",
|
||||
regex : /[.](?![.])/
|
||||
},
|
||||
{
|
||||
token : "keyword.operator",
|
||||
regex : /\|\||<=|>=|\.\.|\*\*|!=|:=|[=<>`!$%&*+\-~\/^]/,
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
token : "punctuation.operator",
|
||||
regex : /[?:,;.]/,
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
token : "paren.lparen",
|
||||
regex : /[\[({]/,
|
||||
{ token: "keyword",
|
||||
regex: /λ/
|
||||
},
|
||||
{
|
||||
token: "keyword",
|
||||
regex: jsonataFunctions
|
||||
},
|
||||
{
|
||||
token : keywordMapper,
|
||||
regex : "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"
|
||||
},
|
||||
{
|
||||
token : "punctuation.operator",
|
||||
regex : /[.](?![.])/
|
||||
},
|
||||
{
|
||||
token : "keyword.operator",
|
||||
regex : /\|\||<=|>=|\.\.|\*\*|!=|:=|[=<>`!$%&*+\-~\/^]/,
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
token : "punctuation.operator",
|
||||
regex : /[?:,;.]/,
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
token : "paren.lparen",
|
||||
regex : /[\[({]/,
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
@@ -92,8 +86,7 @@ ace.define("ace/mode/jsonata",["require","exports","module","ace/lib/oop","ace/m
|
||||
token : "string",
|
||||
regex : '"|$',
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
}, {
|
||||
defaultToken: "string"
|
||||
}
|
||||
],
|
||||
@@ -102,24 +95,9 @@ ace.define("ace/mode/jsonata",["require","exports","module","ace/lib/oop","ace/m
|
||||
token : "string",
|
||||
regex : "'|$",
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
}, {
|
||||
defaultToken: "string"
|
||||
}
|
||||
],
|
||||
"regex" : [
|
||||
{
|
||||
token: "string.regexp",
|
||||
regex: "\\\\/"
|
||||
},
|
||||
{
|
||||
token: "string.regexp",
|
||||
regex: "/[sxngimy]*",
|
||||
next: "start"
|
||||
},
|
||||
{
|
||||
defaultToken: "string.regexp"
|
||||
}
|
||||
]
|
||||
};
|
||||
};
|
||||
|
||||
6
packages/node_modules/@node-red/editor-client/src/vendor/marked/marked.min.js
vendored
Normal file
6
packages/node_modules/@node-red/editor-client/src/vendor/marked/marked.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -457,7 +457,7 @@ RED.debug = (function() {
|
||||
var metaRow = $('<div class="red-ui-debug-msg-meta"></div>').appendTo(msg);
|
||||
$('<span class="red-ui-debug-msg-date">'+ getTimestamp()+'</span>').appendTo(metaRow);
|
||||
if (sourceNode) {
|
||||
$('<a>',{href:"#",class:"red-ui-debug-msg-name"}).text('node: '+(o.name||sourceNode.name||sourceNode.id))
|
||||
$('<a>',{href:"#",class:"red-ui-debug-msg-name"}).text('node: '+sanitize(o.name||sourceNode.name||sourceNode.id))
|
||||
.appendTo(metaRow)
|
||||
.on("click", function(evt) {
|
||||
evt.preventDefault();
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
|
||||
<script type="text/html" data-template-name="change">
|
||||
<style>
|
||||
ol#node-input-rule-container .red-ui-typedInput-container {
|
||||
flex:1;
|
||||
}
|
||||
</style>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
@@ -81,6 +76,11 @@
|
||||
var replace = this._("change.action.replace");
|
||||
var regex = this._("change.label.regex");
|
||||
|
||||
function resizeRule(rule) {
|
||||
var newWidth = rule.width();
|
||||
rule.find('.red-ui-typedInput').typedInput("width",newWidth-130);
|
||||
|
||||
}
|
||||
$('#node-input-rule-container').css('min-height','150px').css('min-width','450px').editableList({
|
||||
addItem: function(container,i,opt) {
|
||||
var rule = opt;
|
||||
@@ -106,11 +106,10 @@
|
||||
overflow: 'hidden',
|
||||
whiteSpace: 'nowrap'
|
||||
});
|
||||
let fragment = document.createDocumentFragment();
|
||||
var row1 = $('<div/>',{style:"display:flex;"}).appendTo(fragment);
|
||||
var row2 = $('<div/>',{style:"display:flex;margin-top:8px;"}).appendTo(fragment);
|
||||
var row3 = $('<div/>',{style:"margin-top:8px;"}).appendTo(fragment);
|
||||
var row4 = $('<div/>',{style:"display:flex;margin-top:8px;"}).appendTo(fragment);
|
||||
var row1 = $('<div/>').appendTo(container);
|
||||
var row2 = $('<div/>',{style:"margin-top:8px;"}).appendTo(container);
|
||||
var row3 = $('<div/>',{style:"margin-top:8px;"}).appendTo(container);
|
||||
var row4 = $('<div/>',{style:"margin-top:8px;"}).appendTo(container);
|
||||
|
||||
var selectField = $('<select/>',{class:"node-input-rule-type",style:"width:110px; margin-right:10px;"}).appendTo(row1);
|
||||
var selectOptions = [{v:"set",l:set},{v:"change",l:change},{v:"delete",l:del},{v:"move",l:move}];
|
||||
@@ -125,82 +124,41 @@
|
||||
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
|
||||
.text(to)
|
||||
.appendTo(row2);
|
||||
|
||||
function createPropertyValue() {
|
||||
return $('<input/>',{class:"node-input-rule-property-value",type:"text"})
|
||||
var propertyValue = $('<input/>',{class:"node-input-rule-property-value",type:"text"})
|
||||
.appendTo(row2)
|
||||
.typedInput({default:'str',types:['msg','flow','global','str','num','bool','json','bin','date','jsonata','env']});
|
||||
}
|
||||
|
||||
var row3_1 = $('<div/>', {style:"display:flex;"}).appendTo(row3);
|
||||
var row3_1 = $('<div/>').appendTo(row3);
|
||||
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
|
||||
.text(search)
|
||||
.appendTo(row3_1);
|
||||
|
||||
function createFromValue() {
|
||||
return $('<input/>',{class:"node-input-rule-property-search-value",type:"text"})
|
||||
var fromValue = $('<input/>',{class:"node-input-rule-property-search-value",type:"text"})
|
||||
.appendTo(row3_1)
|
||||
.typedInput({default:'str',types:['msg','flow','global','str','re','num','bool','env']});
|
||||
}
|
||||
|
||||
var row3_2 = $('<div/>',{style:"display:flex;margin-top:8px;"}).appendTo(row3);
|
||||
var row3_2 = $('<div/>',{style:"margin-top:8px;"}).appendTo(row3);
|
||||
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
|
||||
.text(replace)
|
||||
.appendTo(row3_2);
|
||||
|
||||
function createToValue() {
|
||||
return $('<input/>',{class:"node-input-rule-property-replace-value",type:"text"})
|
||||
var toValue = $('<input/>',{class:"node-input-rule-property-replace-value",type:"text"})
|
||||
.appendTo(row3_2)
|
||||
.typedInput({default:'str',types:['msg','flow','global','str','num','bool','json','bin','env']});
|
||||
}
|
||||
|
||||
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
|
||||
.text(to)
|
||||
.appendTo(row4);
|
||||
|
||||
function createMoveValue() {
|
||||
return $('<input/>',{class:"node-input-rule-property-move-value",type:"text"})
|
||||
var moveValue = $('<input/>',{class:"node-input-rule-property-move-value",type:"text"})
|
||||
.appendTo(row4)
|
||||
.typedInput({default:'msg',types:['msg','flow','global']});
|
||||
}
|
||||
|
||||
let propertyValue = null;
|
||||
let fromValue = null;
|
||||
let toValue = null;
|
||||
let moveValue = null;
|
||||
|
||||
selectField.on("change", function() {
|
||||
var width = $("#node-input-rule-container").width();
|
||||
var type = $(this).val();
|
||||
if (propertyValue) {
|
||||
propertyValue.typedInput('hide');
|
||||
}
|
||||
if (fromValue) {
|
||||
fromValue.typedInput('hide');
|
||||
}
|
||||
if (toValue) {
|
||||
toValue.typedInput('hide');
|
||||
}
|
||||
if (moveValue) {
|
||||
moveValue.typedInput('hide');
|
||||
}
|
||||
|
||||
if (type == "set") {
|
||||
if(!propertyValue) {
|
||||
propertyValue = createPropertyValue();
|
||||
}
|
||||
propertyValue.typedInput('show');
|
||||
row2.show();
|
||||
row3.hide();
|
||||
row4.hide();
|
||||
} else if (type == "change") {
|
||||
if(!fromValue) {
|
||||
fromValue = createFromValue();
|
||||
}
|
||||
fromValue.typedInput('show');
|
||||
if(!toValue) {
|
||||
toValue = createToValue();
|
||||
}
|
||||
toValue.typedInput('show');
|
||||
row2.hide();
|
||||
row3.show();
|
||||
row4.hide();
|
||||
@@ -209,48 +167,30 @@
|
||||
row3.hide();
|
||||
row4.hide();
|
||||
} else if (type == "move") {
|
||||
if(!moveValue) {
|
||||
moveValue = createMoveValue();
|
||||
}
|
||||
moveValue.typedInput('show');
|
||||
row2.hide();
|
||||
row3.hide();
|
||||
row4.show();
|
||||
}
|
||||
resizeRule(container);
|
||||
});
|
||||
|
||||
selectField.val(rule.t);
|
||||
propertyName.typedInput('value',rule.p);
|
||||
propertyName.typedInput('type',rule.pt);
|
||||
if (rule.t == "set") {
|
||||
if(!propertyValue) {
|
||||
propertyValue = createPropertyValue();
|
||||
}
|
||||
propertyValue.typedInput('value',rule.to);
|
||||
propertyValue.typedInput('type',rule.tot);
|
||||
}
|
||||
if (rule.t == "move") {
|
||||
if(!moveValue) {
|
||||
moveValue = createMoveValue();
|
||||
}
|
||||
moveValue.typedInput('value',rule.to);
|
||||
moveValue.typedInput('type',rule.tot);
|
||||
}
|
||||
if (rule.t == "change") {
|
||||
if(!fromValue) {
|
||||
fromValue = createFromValue();
|
||||
}
|
||||
fromValue.typedInput('value',rule.from);
|
||||
fromValue.typedInput('type',rule.fromt);
|
||||
if (!toValue) {
|
||||
toValue = createToValue();
|
||||
}
|
||||
toValue.typedInput('value',rule.to);
|
||||
toValue.typedInput('type',rule.tot);
|
||||
}
|
||||
propertyValue.typedInput('value',rule.to);
|
||||
propertyValue.typedInput('type',rule.tot);
|
||||
moveValue.typedInput('value',rule.to);
|
||||
moveValue.typedInput('type',rule.tot);
|
||||
fromValue.typedInput('value',rule.from);
|
||||
fromValue.typedInput('type',rule.fromt);
|
||||
toValue.typedInput('value',rule.to);
|
||||
toValue.typedInput('type',rule.tot);
|
||||
selectField.change();
|
||||
container[0].appendChild(fragment);
|
||||
|
||||
var newWidth = $("#node-input-rule-container").width();
|
||||
resizeRule(container);
|
||||
},
|
||||
resizeItem: resizeRule,
|
||||
removable: true,
|
||||
sortable: true
|
||||
});
|
||||
|
||||
@@ -215,7 +215,9 @@ module.exports = function(RED) {
|
||||
if (rule.t === 'delete') {
|
||||
RED.util.setMessageProperty(msg,property,undefined);
|
||||
} else if (rule.t === 'set') {
|
||||
RED.util.setMessageProperty(msg,property,value);
|
||||
if (!RED.util.setMessageProperty(msg,property,value)) {
|
||||
node.warn(RED._("change.errors.no-override",{prop:property}));
|
||||
}
|
||||
} else if (rule.t === 'change') {
|
||||
current = RED.util.getMessageProperty(msg,property);
|
||||
if (typeof current === 'string') {
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-template-name="trigger">
|
||||
<script type="text/x-red" data-template-name="trigger">
|
||||
<div class="form-row">
|
||||
<label data-i18n="trigger.send" for="node-input-op1"></label>
|
||||
<input type="hidden" id="node-input-op1type">
|
||||
<input style="width:70%" type="text" id="node-input-op1" placeholder="1">
|
||||
<input style="width: 70%" type="text" id="node-input-op1" placeholder="1">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label data-i18n="trigger.then"></label>
|
||||
@@ -40,12 +40,12 @@
|
||||
</div>
|
||||
<div class="form-row node-type-wait">
|
||||
<label></label>
|
||||
<input type="checkbox" id="node-input-extend" style="margin-left:0px; vertical-align:top; width:auto !important;"> <label style="width:auto !important;" for="node-input-extend" data-i18n="trigger.extend"></label>
|
||||
<input type="checkbox" id="node-input-extend" style="margin-left: 0px; vertical-align: top; width: auto !important;"> <label style="width:auto !important;" for="node-input-extend" data-i18n="trigger.extend"></label>
|
||||
</div>
|
||||
<div class="form-row node-type-wait">
|
||||
<label data-i18n="trigger.then-send"></label>
|
||||
<input type="hidden" id="node-input-op2type">
|
||||
<input style="width:70%" type="text" id="node-input-op2" placeholder="0">
|
||||
<input style="width: 70%" type="text" id="node-input-op2" placeholder="0">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label data-i18n="trigger.label.reset" style="width:auto"></label>
|
||||
@@ -109,11 +109,9 @@
|
||||
$(".node-type-duration").hide();
|
||||
}
|
||||
else if ($(this).val() == "loop") {
|
||||
if ($("#node-input-duration").val() == 0) { $("#node-input-duration").val(250); }
|
||||
$(".node-type-wait").hide();
|
||||
$(".node-type-duration").show();
|
||||
} else {
|
||||
if ($("#node-input-duration").val() == 0) { $("#node-input-duration").val(250); }
|
||||
$(".node-type-wait").show();
|
||||
$(".node-type-duration").show();
|
||||
}
|
||||
@@ -177,7 +175,9 @@
|
||||
}
|
||||
if ($("#node-then-type").val() == "loop") {
|
||||
$("#node-input-duration").val($("#node-input-duration").val() * -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -76,7 +76,6 @@ module.exports = function(RED) {
|
||||
var node = this;
|
||||
node.topics = {};
|
||||
|
||||
var npay = {};
|
||||
var pendingMessages = [];
|
||||
var activeMessagePromise = null;
|
||||
var processMessageQueue = function(msg) {
|
||||
@@ -123,10 +122,9 @@ module.exports = function(RED) {
|
||||
node.status({});
|
||||
}
|
||||
else {
|
||||
if (node.op2type === "payl") { npay[topic] = RED.util.cloneMessage(msg); }
|
||||
if (((!node.topics[topic].tout) && (node.topics[topic].tout !== 0)) || (node.loop === true)) {
|
||||
promise = Promise.resolve();
|
||||
if (node.op2type === "pay") { node.topics[topic].m2 = RED.util.cloneMessage(msg.payload); }
|
||||
if (node.op2type === "pay" || node.op2type === "payl") { node.topics[topic].m2 = RED.util.cloneMessage(msg.payload); }
|
||||
else if (node.op2Templated) { node.topics[topic].m2 = mustache.render(node.op2,msg); }
|
||||
else if (node.op2type !== "nul") {
|
||||
promise = new Promise((resolve,reject) => {
|
||||
@@ -188,15 +186,9 @@ module.exports = function(RED) {
|
||||
});
|
||||
}
|
||||
promise.then(() => {
|
||||
if (node.op2type === "payl") {
|
||||
node.send(npay[topic]);
|
||||
delete npay[topic];
|
||||
}
|
||||
else {
|
||||
msg2.payload = node.topics[topic].m2;
|
||||
node.send(msg2);
|
||||
}
|
||||
msg2.payload = node.topics[topic].m2;
|
||||
delete node.topics[topic];
|
||||
node.send(msg2);
|
||||
node.status({});
|
||||
}).catch(err => {
|
||||
node.error(err);
|
||||
@@ -252,6 +244,9 @@ module.exports = function(RED) {
|
||||
});
|
||||
}, node.duration);
|
||||
}
|
||||
else {
|
||||
if (node.op2type === "payl") { node.topics[topic].m2 = RED.util.cloneMessage(msg.payload); }
|
||||
}
|
||||
}
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ module.exports = function(RED) {
|
||||
if (error.signal) { msg3.payload.signal = error.signal; }
|
||||
if (error.code === null) { node.status({fill:"red",shape:"dot",text:"killed"}); }
|
||||
else { node.status({fill:"red",shape:"dot",text:"error:"+error.code}); }
|
||||
if (RED.settings.verbose) { node.log('error:' + error); }
|
||||
node.log('error:' + error);
|
||||
}
|
||||
else if (node.oldrc === "false") {
|
||||
msg3 = RED.util.cloneMessage(msg);
|
||||
|
||||
@@ -153,12 +153,7 @@ module.exports = function(RED) {
|
||||
this.brokerurl="mqtt://";
|
||||
}
|
||||
if (this.broker !== "") {
|
||||
//Check for an IPv6 address
|
||||
if (/(?:^|(?<=\s))(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?=\s|$)/.test(this.broker)) {
|
||||
this.brokerurl = this.brokerurl+"["+this.broker+"]:";
|
||||
} else {
|
||||
this.brokerurl = this.brokerurl+this.broker+":";
|
||||
}
|
||||
this.brokerurl = this.brokerurl+this.broker+":";
|
||||
// port now defaults to 1883 if unset.
|
||||
if (!this.port){
|
||||
this.brokerurl = this.brokerurl+"1883";
|
||||
@@ -469,7 +464,6 @@ module.exports = function(RED) {
|
||||
this.broker = n.broker;
|
||||
this.brokerConn = RED.nodes.getNode(this.broker);
|
||||
var node = this;
|
||||
var chk = /[\+#]/;
|
||||
|
||||
if (this.brokerConn) {
|
||||
this.status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"});
|
||||
@@ -488,7 +482,6 @@ module.exports = function(RED) {
|
||||
}
|
||||
if ( msg.hasOwnProperty("payload")) {
|
||||
if (msg.hasOwnProperty("topic") && (typeof msg.topic === "string") && (msg.topic !== "")) { // topic must exist
|
||||
if (chk.test(msg.topic)) { node.warn(RED._("mqtt.errors.invalid-topic")); }
|
||||
this.brokerConn.publish(msg, done); // send the message
|
||||
} else {
|
||||
node.warn(RED._("mqtt.errors.invalid-topic"));
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<option value="POST">POST</option>
|
||||
<option value="PUT">PUT</option>
|
||||
<option value="DELETE">DELETE</option>
|
||||
<option value="HEAD">HEAD</option>
|
||||
<option value="use" data-i18n="httpin.setby"></option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
if (root === "") {
|
||||
$("#node-config-ws-tip").hide();
|
||||
} else {
|
||||
$("#node-config-ws-path").html(RED._("node-red:websocket.tip.path2", { path: root }));
|
||||
$("#node-config-ws-path").html(root);
|
||||
$("#node-config-ws-tip").show();
|
||||
}
|
||||
}
|
||||
@@ -235,7 +235,7 @@
|
||||
</div>
|
||||
<div class="form-tips">
|
||||
<span data-i18n="[html]websocket.tip.path1"></span>
|
||||
<p id="node-config-ws-tip"><span id="node-config-ws-path"></span></p>
|
||||
<p id="node-config-ws-tip"><span data-i18n="[html]websocket.tip.path2"></span><code><span id="node-config-ws-path"></span></code>.</p>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
|
||||
@@ -170,15 +170,16 @@
|
||||
$("#node-input-port-row").hide();
|
||||
$("#node-input-host-row").hide();
|
||||
$("#node-input-end-row").hide();
|
||||
} else if (sockettype == "client"){
|
||||
$("#node-input-port-row").show();
|
||||
$("#node-input-host-row").show();
|
||||
$("#node-input-end-row").show();
|
||||
} else {
|
||||
$("#node-input-port-row").show();
|
||||
$("#node-input-host-row").hide();
|
||||
$("#node-input-end-row").show();
|
||||
}
|
||||
|
||||
if (sockettype == "client") {
|
||||
$("#node-input-host-row").show();
|
||||
} else {
|
||||
$("#node-input-host-row").hide();
|
||||
}
|
||||
};
|
||||
updateOptions();
|
||||
$("#node-input-beserver").change(updateOptions);
|
||||
|
||||
@@ -180,10 +180,6 @@ module.exports = function(RED) {
|
||||
node.tout = setTimeout(function() {
|
||||
if (udpInputPortsInUse[p]) {
|
||||
sock = udpInputPortsInUse[p];
|
||||
if (node.multicast != "false") {
|
||||
sock.setBroadcast(true);
|
||||
sock.setMulticastLoopback(false);
|
||||
}
|
||||
node.log(RED._("udp.status.re-use",{outport:node.outport,host:node.addr,port:node.port}));
|
||||
if (node.iface) { node.status({text:n.iface+" : "+node.iface}); }
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
<script type="text/x-red" data-template-name="html">
|
||||
<div class="form-row">
|
||||
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="common.label.property"></span></label>
|
||||
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="node-red:common.label.property"></span></label>
|
||||
<input type="text" id="node-input-property" style="width:70%">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
<script type="text/x-red" data-template-name="xml">
|
||||
<div class="form-row">
|
||||
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="common.label.property"></span></label>
|
||||
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="node-red:common.label.property"></span></label>
|
||||
<input type="text" id="node-input-property" style="width:70%;"/>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
<script type="text/x-red" data-template-name="yaml">
|
||||
<div class="form-row">
|
||||
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="common.label.property"></span></label>
|
||||
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="node-red:common.label.property"></span></label>
|
||||
<input type="text" id="node-input-property" style="width:70%;"/>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-template-name="split">
|
||||
<script type="text/x-red" data-template-name="split">
|
||||
<div class="form-row"><span data-i18n="[html]split.intro"></span></div>
|
||||
<div class="form-row"><span data-i18n="[html]split.strBuff"></span></div>
|
||||
<div class="form-row">
|
||||
@@ -113,7 +113,7 @@
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/html" data-template-name="join">
|
||||
<script type="text/x-red" data-template-name="join">
|
||||
<div class="form-row">
|
||||
<label data-i18n="join.mode.mode"></label>
|
||||
<select id="node-input-mode" style="width:200px;">
|
||||
|
||||
@@ -292,6 +292,7 @@ module.exports = function(RED) {
|
||||
reduceMessageGroup(node,msgs,exp,fixup,count,result,done);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
function reduceAndSendGroup(node, group, done) {
|
||||
var is_right = node.reduce_right;
|
||||
@@ -330,7 +331,7 @@ module.exports = function(RED) {
|
||||
var pending_count = node.pending_count;
|
||||
var gid = msg.parts.id;
|
||||
var count;
|
||||
if (!pending.hasOwnProperty(gid)) {
|
||||
if(!pending.hasOwnProperty(gid)) {
|
||||
if(parts.hasOwnProperty('count')) {
|
||||
count = msg.parts.count;
|
||||
}
|
||||
@@ -360,6 +361,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
return done();
|
||||
}
|
||||
|
||||
if (msgs.length === group.count) {
|
||||
delete pending[gid];
|
||||
pending_count -= msgs.length;
|
||||
@@ -406,7 +408,7 @@ module.exports = function(RED) {
|
||||
if (this.joinerType === "str") {
|
||||
this.joiner = this.joiner.replace(/\\n/g,"\n").replace(/\\r/g,"\r").replace(/\\t/g,"\t").replace(/\\e/g,"\e").replace(/\\f/g,"\f").replace(/\\0/g,"\0");
|
||||
} else if (this.joinerType === "bin") {
|
||||
var joinArray = JSON.parse(n.joiner || "[]");
|
||||
var joinArray = JSON.parse(n.joiner)
|
||||
if (Array.isArray(joinArray)) {
|
||||
this.joiner = Buffer.from(joinArray);
|
||||
} else {
|
||||
@@ -427,7 +429,7 @@ module.exports = function(RED) {
|
||||
|
||||
var completeSend = function(partId) {
|
||||
var group = inflight[partId];
|
||||
if (group.timeout) { clearTimeout(group.timeout); }
|
||||
clearTimeout(group.timeout);
|
||||
if ((node.accumulate !== true) || group.msg.hasOwnProperty("complete")) { delete inflight[partId]; }
|
||||
if (group.type === 'array' && group.arrayLen > 1) {
|
||||
var newArray = [];
|
||||
@@ -446,9 +448,6 @@ module.exports = function(RED) {
|
||||
buffers.push(joinBuffer);
|
||||
bufferLen += joinBuffer.length;
|
||||
}
|
||||
if (!Buffer.isBuffer(group.payload[i])) {
|
||||
group.payload[i] = Buffer.from(group.payload[i]);
|
||||
}
|
||||
buffers.push(group.payload[i]);
|
||||
bufferLen += group.payload[i].length;
|
||||
}
|
||||
@@ -630,13 +629,7 @@ module.exports = function(RED) {
|
||||
var group = inflight[partId];
|
||||
if (payloadType === 'buffer') {
|
||||
if (property !== undefined) {
|
||||
if (Buffer.isBuffer(property) || (typeof property === "string") || Array.isArray(property)) {
|
||||
inflight[partId].bufferLen += property.length;
|
||||
}
|
||||
else {
|
||||
node.error(RED._("join.errors.invalid-type",{error:(typeof property)}),msg);
|
||||
return;
|
||||
}
|
||||
inflight[partId].bufferLen += property.length;
|
||||
}
|
||||
}
|
||||
if (payloadType === 'object') {
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]node-red:common.label.name">
|
||||
</div>
|
||||
</script>
|
||||
|
||||
|
||||
@@ -60,8 +60,8 @@
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]node-red:common.label.name">
|
||||
</div>
|
||||
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<script type="text/html" data-template-name="file">
|
||||
<script type="text/x-red" data-template-name="file">
|
||||
<div class="form-row node-input-filename">
|
||||
<label for="node-input-filename"><i class="fa fa-file"></i> <span data-i18n="file.label.filename"></span></label>
|
||||
<input id="node-input-filename" type="text">
|
||||
@@ -34,7 +34,7 @@
|
||||
<div class="form-tips"><span data-i18n="file.tip"></span></div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-template-name="file in">
|
||||
<script type="text/x-red" data-template-name="file in">
|
||||
<div class="form-row">
|
||||
<label for="node-input-filename"><i class="fa fa-file"></i> <span data-i18n="file.label.filename"></span></label>
|
||||
<input id="node-input-filename" type="text" data-i18n="[placeholder]file.label.filename">
|
||||
|
||||
@@ -397,7 +397,7 @@
|
||||
"message" : "gesamte Nachricht",
|
||||
"tip" : {
|
||||
"path1" : "Standardmäßig enthält <code> Nutzdaten </code> die Daten, die über einen Websocket gesendet oder von einem Websocket empfangen werden. Der Listener kann so konfiguriert werden, dass er das gesamte Nachrichtenobjekt als eine JSON-formatierte Zeichenfolge sendet oder empfängt.",
|
||||
"path2" : "Dieser Pfad ist relativ zu <code>__path__</code>.",
|
||||
"path2" : "Dieser Pfad ist relativ zu ",
|
||||
"url1" : "URL sollte ws: / & #47; oder wss: / & #47; Schema verwenden und auf einen vorhandenen Websocket-Listener verweisen.",
|
||||
"url2" : "Standardmäßig enthält <code> Nutzdaten </code> die Daten, die über einen Websocket gesendet oder von einem Websocket empfangen werden. Der Client kann so konfiguriert werden, dass er das gesamte Nachrichtenobjekt als eine JSON-formatierte Zeichenfolge sendet oder empfängt."
|
||||
},
|
||||
|
||||
@@ -37,6 +37,30 @@
|
||||
<p>Dieser Konfigurations-Node erstellt einen WebSocket Server-Endpunkt unter Verwendung des angegebenen Pfades.</p>
|
||||
</script>
|
||||
|
||||
<!-- WebSocket Client configuration node -->
|
||||
<script type="text/x-red" data-template-name="websocket-client">
|
||||
<div class="form-row">
|
||||
<label for="node-config-input-path"><i class="fa fa-bookmark"></i> <span data-i18n="websocket.label.url"></span></label>
|
||||
<input id="node-config-input-path" type="text" placeholder="ws://example.com/ws">
|
||||
</div>
|
||||
<div class="form-row node-config-row-tls hide">
|
||||
<label for="node-config-input-tls" data-i18n="httpin.tls-config"></label>
|
||||
<input type="text" id="node-config-input-tls">
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-config-input-wholemsg" data-i18n="websocket.sendrec"></label>
|
||||
<select type="text" id="node-config-input-wholemsg" style="width: 70%;">
|
||||
<option value="false" data-i18n="websocket.payload"></option>
|
||||
<option value="true" data-i18n="websocket.message"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-tips">
|
||||
<p><span data-i18n="[html]websocket.tip.url1"></span></p>
|
||||
<span data-i18n="[html]websocket.tip.url2"></span>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="websocket-client">
|
||||
<p>Dieser Konfigurations-Node verbindet einen WebSocket-Client mit der angegebenen URL.</p>
|
||||
</script>
|
||||
|
||||
@@ -455,7 +455,7 @@
|
||||
"message": "entire message",
|
||||
"tip": {
|
||||
"path1": "By default, <code>payload</code> will contain the data to be sent over, or received from a websocket. The listener can be configured to send or receive the entire message object as a JSON formatted string.",
|
||||
"path2": "This path will be relative to <code>__path__</code>.",
|
||||
"path2": "This path will be relative to ",
|
||||
"url1": "URL should use ws:// or wss:// scheme and point to an existing websocket listener.",
|
||||
"url2": "By default, <code>payload</code> will contain the data to be sent over, or received from a websocket. The client can be configured to send or receive the entire message object as a JSON formatted string."
|
||||
},
|
||||
@@ -657,7 +657,8 @@
|
||||
"errors": {
|
||||
"invalid-from": "Invalid 'from' property: __error__",
|
||||
"invalid-json": "Invalid 'to' JSON property",
|
||||
"invalid-expr": "Invalid JSONata expression: __error__"
|
||||
"invalid-expr": "Invalid JSONata expression: __error__",
|
||||
"no-override": "Can't overwrite primitive type with object __prop__."
|
||||
}
|
||||
},
|
||||
"range": {
|
||||
@@ -894,8 +895,7 @@
|
||||
"fixup": "Fix-up exp"
|
||||
},
|
||||
"errors": {
|
||||
"invalid-expr": "Invalid JSONata expression: __error__",
|
||||
"invalid-type": "Cannot join __error__ to buffer"
|
||||
"invalid-expr": "Invalid JSONata expression: __error__"
|
||||
}
|
||||
},
|
||||
"sort" : {
|
||||
|
||||
@@ -14,14 +14,14 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-help-name="tcp in">
|
||||
<script type="text/x-red" data-help-name="tcp in">
|
||||
<p>Provides a choice of TCP inputs. Can either connect to a remote TCP port,
|
||||
or accept incoming connections.</p>
|
||||
<p><b>Note: </b>On some systems you may need root or administrator access
|
||||
to access ports below 1024.</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="tcp out">
|
||||
<script type="text/x-red" data-help-name="tcp out">
|
||||
<p>Provides a choice of TCP outputs. Can either connect to a remote TCP port,
|
||||
accept incoming connections, or reply to messages received from a TCP In node.</p>
|
||||
<p>Only the <code>msg.payload</code> is sent.</p>
|
||||
@@ -34,12 +34,12 @@
|
||||
to access ports below 1024.</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="tcp request">
|
||||
<script type="text/x-red" data-help-name="tcp request">
|
||||
<p>A simple TCP request node - sends the <code>msg.payload</code> to a server tcp port and expects a response.</p>
|
||||
<p>Connects, sends the "request", and reads the "response". It can either count a number of
|
||||
returned characters into a fixed buffer, match a specified character before returning,
|
||||
wait a fixed timeout from first reply and then return, sit and wait for data, or send then close the connection
|
||||
immediately, without waiting for a reply.</p>
|
||||
<p>The response will be output in <code>msg.payload</code> as a buffer, so you may want to .toString() it.</p>
|
||||
<p>If you leave tcp host or port blank they must be set by using the <code>msg.host</code> and <code>msg.port</code> properties in every message sent to the node.</p>
|
||||
<p>If you leave tcp host or port blank they must be set by using the <code>msg.host</code> and <code>msg.port</code> properties.</p>
|
||||
</script>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-help-name="split">
|
||||
<script type="text/x-red" data-help-name="split">
|
||||
<p>Splits a message into a sequence of messages.</p>
|
||||
|
||||
<h3>Inputs</h3>
|
||||
@@ -63,7 +63,7 @@
|
||||
means it cannot be used with the <b>join</b> node in its automatic mode</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="join">
|
||||
<script type="text/x-red" data-help-name="join">
|
||||
<p>Joins sequences of messages into a single message.</p>
|
||||
<p>There are three modes available:</p>
|
||||
<dl>
|
||||
@@ -91,8 +91,7 @@
|
||||
</ul>
|
||||
</dd>
|
||||
<dt class="optional">complete</dt>
|
||||
<dd>If set, the node will append the payload, and then send the output message in its current state.
|
||||
If you don't wish to append the payload, delete it from the msg.</dd>
|
||||
<dd>If set, the node will send its output message in its current state.</dd>
|
||||
</dl>
|
||||
<h3>Details</h3>
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-help-name="file">
|
||||
<script type="text/x-red" data-help-name="file">
|
||||
<p>Writes <code>msg.payload</code> to a file, either adding to the end or replacing the existing content.
|
||||
Alternatively, it can delete the file.</p>
|
||||
<h3>Inputs</h3>
|
||||
@@ -36,7 +36,7 @@
|
||||
<p>Alternatively, this node can be configured to delete the file.</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="file in">
|
||||
<script type="text/x-red" data-help-name="file in">
|
||||
<p>Reads the contents of a file as either a string or binary buffer.</p>
|
||||
<h3>Inputs</h3>
|
||||
<dl class="message-properties">
|
||||
@@ -49,6 +49,12 @@
|
||||
<dd>The contents of the file as either a string or binary buffer.</dd>
|
||||
<dt class="optional">filename <span class="property-type">string</span></dt>
|
||||
<dd>If not configured in the node, this optional property sets the name of the file to be read.</dd>
|
||||
<dt class="optional">error <span class="property-type">object</span></dt>
|
||||
<dd><i>deprecated</i>: If enabled in the node, when the node hits an error
|
||||
reading the file, it will send a message with no <code>payload</code>
|
||||
and this <code>error</code> property set to the error details. This
|
||||
mode of behaviour is deprecated and not enabled by default for new
|
||||
instances of the node. See below for more information.</dd>
|
||||
</dl>
|
||||
<h3>Details</h3>
|
||||
<p>The filename should be an absolute path, otherwise it will be relative to
|
||||
@@ -59,5 +65,11 @@
|
||||
<p>When split into multiple messages, each message will have a <code>parts</code>
|
||||
property set, forming a complete message sequence.</p>
|
||||
<p>Encoding of input data can be specified from list of encodings if output format is string.</p>
|
||||
<h4>Legacy error handling</h4>
|
||||
<p>Before Node-RED 0.17, if this node hit an error whilst reading the file, it would
|
||||
send a message with no <code>msg.payload</code> and <code>msg.error</code> set to the
|
||||
details of the error. This is a deprecated mode of behaviour for the node that new
|
||||
instances will not do. If required, this mode can be re-enabled within the node
|
||||
configuration.</p>
|
||||
<p>Errors should be caught and handled using a Catch node.</p>
|
||||
</script>
|
||||
|
||||
@@ -455,7 +455,7 @@
|
||||
"message": "メッセージ全体を送信/受信",
|
||||
"tip": {
|
||||
"path1": "標準では <code>payload</code> がwebsocketから送信、受信されるデータを持ちます。クライアントはJSON形式の文字列としてメッセージ全体を送信、受信するよう設定できます。",
|
||||
"path2": "このパスは <code>__path__</code> の相対パスになります。",
|
||||
"path2": "This path will be relative to ",
|
||||
"url1": "URLには ws:// または wss:// スキーマを使用して、存在するwebsocketリスナを設定してください。",
|
||||
"url2": "標準では <code>payload</code> がwebsocketから送信、受信されるデータを持ちます。クライアントはJSON形式の文字列としてメッセージ全体を送信、受信するよう設定できます。"
|
||||
},
|
||||
@@ -892,8 +892,7 @@
|
||||
"fixup": "最終調整式"
|
||||
},
|
||||
"errors": {
|
||||
"invalid-expr": "JSONata式が不正: __error__",
|
||||
"invalid-type": "__error__ をバッファに連結できません"
|
||||
"invalid-expr": "JSONata式が不正: __error__"
|
||||
}
|
||||
},
|
||||
"sort": {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-help-name="split">
|
||||
<script type="text/x-red" data-help-name="split">
|
||||
<p>メッセージをメッセージ列に分割します。</p>
|
||||
|
||||
<h3>入力</h3>
|
||||
@@ -52,7 +52,8 @@
|
||||
<p>このモードで処理する際には、メッセージ数を予め知ることができないため、<code>msg.parts.count</code>プロパティは設定されません。従って、<b>join</b>ノードの「自動モード」と組み合わせることはできません。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="join">
|
||||
|
||||
<script type="text/x-red" data-help-name="join">
|
||||
<p>メッセージ列を結合して一つのメッセージにします。</p>
|
||||
<p>メッセージの結合には次の3つのモードが利用できます。</p>
|
||||
<dl>
|
||||
@@ -78,7 +79,7 @@
|
||||
</ul>
|
||||
</dd>
|
||||
<dt class="optional">complete</dt>
|
||||
<dd>設定されている場合、本ノードはペイロードを追加し、保持しているメッセージを送信します。ペイロードを追加したくない場合は、msgから削除してください。</dd>
|
||||
<dd>設定されている場合、保持しているメッセージを結合して送信します。</dd>
|
||||
</dl>
|
||||
<h3>詳細</h3>
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/html" data-help-name="file">
|
||||
<script type="text/x-red" data-help-name="file">
|
||||
<p><code>msg.payload</code>をファイルに書き出します。書き出しは、ファイルの最後に追記もしくは既存の内容の置き換えを選択できます。この他、ファイルの削除を行うことも可能です。</p>
|
||||
<h3>入力</h3>
|
||||
<dl class="message-properties">
|
||||
@@ -31,7 +31,7 @@
|
||||
<p>この他、ファイルの削除を行うことも可能です。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="file in">
|
||||
<script type="text/x-red" data-help-name="file in">
|
||||
<p>ファイルの内容を文字列もしくはバイナリバッファとして読み出します。</p>
|
||||
<h3>入力</h3>
|
||||
<dl class="message-properties">
|
||||
@@ -44,6 +44,8 @@
|
||||
<dd>ファイルの内容を文字列もしくはバッファで表現します</dd>
|
||||
<dt class="optional">filename <span class="property-type">文字列</span></dt>
|
||||
<dd>読み出し対象のファイル名をノードに設定していない場合、このプロパティでファイルを指定します</dd>
|
||||
<dt class="optional">error <span class="property-type">オブジェクト</span></dt>
|
||||
<dd><i>非推奨</i>: 設定で有効にした場合、ファイルの読み込み時にエラーが発生すると<code>payload</code>を持たず<code>error</code>プロパティにエラーの詳細情報を設定したメッセージを送信します。この動作モードは非推奨であり、新しいノード実装ではデフォルトでは無効としています。詳細については、以下を参照してください。</dd>
|
||||
</dl>
|
||||
<h3>詳細</h3>
|
||||
<p>ファイルネームは絶対パスでの指定を推奨します。絶対パスを指定しない場合は、Node-REDプロセスのワーキングディレクトリからの相対パスとして扱います。</p>
|
||||
@@ -51,5 +53,7 @@
|
||||
<p>テキストファイルの場合、行毎に分割して各々メッセージを送信することができます。また、バイナリファイルの場合、小さな塊のバッファに分割して送信できます。バッファの分割単位はオペレーティングシステム依存ですが、一般に64k(Linux/Mac)もしくは41k(Windows)です。</p>
|
||||
<p>複数のメッセージに分割する場合、各メッセージには<code>parts</code>プロパティが設定され、メッセージ列を構成します。</p>
|
||||
<p>出力形式が文字列の場合、入力データのエンコーディングをエンコーディングリストから選択できます。</p>
|
||||
<h4>旧式のエラー処理</h4>
|
||||
<p>Node-RED 0.17より前の版では、ファイルの読み込み時にエラーが発生すると<code>payload</code>を持たず<code>error</code>プロパティにエラーの詳細情報を設定したメッセージを送信します。この動作モードは非推奨であり、新しいノード実装ではデフォルトでは無効としています。ノードの設定により、必要に応じてこのモードを有効にできます。</p>
|
||||
<p>エラーはcatchノードで補足して処理することを推奨します。</p>
|
||||
</script>
|
||||
|
||||
@@ -446,7 +446,7 @@
|
||||
"message": "메세지 전체를 송신/수신",
|
||||
"tip": {
|
||||
"path1": "표준으로는 <code>payload</code> 가 websocket에서 송신, 수신된 데이터를 기다립니다. 클라이언트는 JSON형식의 문자열로 메세지전체를 송신, 수신하도록 설정할 수 있습니다.",
|
||||
"path2": "This path will be relative to <code>__path__</code>.",
|
||||
"path2": "This path will be relative to ",
|
||||
"url1": "URL에는 ws:// 또는 wss:// 스키마를 사용하여, 존재하는 websocket리스너를 설정해 주세요.",
|
||||
"url2": "표준으로는 <code>payload</code> 가 websocket에서 송신,수신될 데이터를 기다립니다.클라이언트는 JSON형식의 문자열로 메세지전체를 송신, 수신하도록 설정할 수 있습니다."
|
||||
},
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="inject">
|
||||
<p>手动或定期得将消息注入流中。消息的有效荷载可以为多种类型,包括字符串,JavaScript对象或当前时间。</p>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload<span class="property-type">various</span></dt>
|
||||
<dd>指定的消息的有效荷载。</dd>
|
||||
<dt class="optional">topic <span class="property-type">字符串</span></dt>
|
||||
<dd>可以在节点中配置的可选属性。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>通过使用特定的有效荷载,注入节点可以启动流。默认有效荷载是当前时间的时间戳(以毫秒为单位,自1970年1月1日起)。</p>
|
||||
<p>该节点还支持注入字符串,数字,布尔值,JavaScript对象或流/全局上下文值。</p>
|
||||
<p>默认情况下,节点可以通过在编辑器中单击节点按钮来手动触发。同时也可以被设置为定期或按计划注入。</p>
|
||||
<p>另一个可选的设置是在每次启动流时注入一次。</p>
|
||||
<p>可以指定的最大<i>间隔</i>约为596小时/24天。 但是,如果对于间隔超过一天的那些间隔,建议您使用scheduler节点来应对断电或重启。</p>
|
||||
<p><b>注意</b>:选项<i>“时间间隔” </i>和<i>“特定时间” </i>使用了标准cron系统。这意味着因此“20分钟”并不表示在此之后20分钟,而是每小时的20分钟,40分钟。如果您希望设定为从现在开始的每20分钟,那么请使用<i>“间隔” </i>选项。</p>
|
||||
<p><b>注意</b>: 如果您想在字符串中包含换行符,必须使用“功能”节点创建有效荷载。</p>
|
||||
</script>
|
||||
@@ -1,25 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="debug">
|
||||
<p>在“调试”侧边栏选项卡和运行时日志中显示选定的消息属性。 默认情况下,它会显示<code>msg.payload</code>的值,但您也可以将其设置成显示任意属性,完整消息或JSONata表达式的结果。</p>
|
||||
<h3>详细</h3>
|
||||
<p>调试侧边栏会提供已发消息的结构化视图,方便您查询消息的结构。</p>
|
||||
<p>JavaScript对象和数组可以根据需要来折叠或扩展。缓冲区对象可以显示为原始数据,也可以显示为字符串。</p>
|
||||
<p>对任意条消息,调试侧边栏还会显示接收消息的时间,发送消息的节点以及消息类型等信息。单击源节点ID将在工作区中显示该节点。</p>
|
||||
<p>节点上的按钮可用于启用或禁用其输出。建议禁用或删除所有未使用的调试节点。</p>
|
||||
<p>还可以通过配置节点,将所有消息发送到运行时的日志,或将简短的数据(32个字符内)在调试节点下的状态文本上显示。</p>
|
||||
</script>
|
||||
@@ -1,24 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="complete">
|
||||
<p>当另一个节点完成对消息的处理时触发流。</p>
|
||||
<h3>详细</h3>
|
||||
<p>如果一个节点通知运行时它已完成消息的处理,该节点可用于触发第二个流。</p>
|
||||
<p>这个节点可以与没有输出端口的节点一起使用,例如在使用电子邮件发送节点来发送邮件后触发一个流。</p>
|
||||
<p>此节点只能被设置为处理流中某个所选节点的事件。与Catch节点不同,您不能指定“所有节点”模式并以流中的所有节点为目标。</p>
|
||||
<p>并非所有节点都会触发此事件。这取决于它们是否支持于Node-RED 1.0中引入的此功能。</p>
|
||||
</script>
|
||||
@@ -1,36 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="catch">
|
||||
<p>捕获由同一标签页上的节点引发的错误。</p>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>error.message <span class="property-type">字符串</span></dt>
|
||||
<dd>错误消息。</dd>
|
||||
<dt>error.source.id <span class="property-type">字符串</span></dt>
|
||||
<dd>引发错误的节点的ID。</dd>
|
||||
<dt>error.source.type <span class="property-type">字符串</span></dt>
|
||||
<dd>引发错误的节点的类型。</dd>
|
||||
<dt>error.source.name <span class="property-type">字符串</span></dt>
|
||||
<dd>引发错误的节点的名称。(如果已设置)</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>如果节点在处理消息时抛出错误,则流程通常会停止。该节点可用于捕获那些错误并通过专用流程进行处理。</p>
|
||||
<p>默认情况下,该节点将捕获同一标签页上任何节点抛出的错误。或者,它可以针对特定节点,或配置为仅捕获另一个“目标”捕获节点尚未捕获的错误。</p>
|
||||
<p>当错误发生时,所有匹配的catch节点都会收到错误消息。</p>
|
||||
<p>如果在子流中发送了错误,则该错误将由子流中的任意捕获节点处理。如果子流中不存在捕获节点,则那错误将被传播到子流实例所在的标签页。</p>
|
||||
<p>如果消息已经具有<code>error</code>属性,则将该<code>error</code>复制为<code>_error</code>。</p>
|
||||
</script>
|
||||
@@ -1,33 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="status">
|
||||
<p>获取在同一标签页上的其他节点的状态消息。</p>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>status.text <span class="property-type">字符串</span></dt>
|
||||
<dd>状态文本。</dd>
|
||||
<dt>status.source.type <span class="property-type">字符串</span></dt>
|
||||
<dd>报告状态的节点的类型。</dd>
|
||||
<dt>status.source.id <span class="property-type">字符串</span></dt>
|
||||
<dd>报告状态的节点的ID。</dd>
|
||||
<dt>status.source.name <span class="property-type">字符串</span></dt>
|
||||
<dd>报告状态的节点的名称(如果已设置)。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>该节点不包含<code>有效荷载</code>。</p>
|
||||
<p>默认情况下,节点会获取同一工作空间标签页上报告所有节点的状态。可以通过配置来设定目标节点。</p>
|
||||
</script>
|
||||
@@ -1,31 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="link in">
|
||||
<p>在流之间创建虚拟连线。</p>
|
||||
<h3>详细</h3>
|
||||
<p>该节点可以连接到任何标签页上存在的任何<code>link out</code>节点。连接后,它们的行为就像连接在一起。</p>
|
||||
<p>仅当选择链接节点时,才会显示链接节点之间的链接。如果有指向另一个选项卡的链接,则显示一个虚拟节点。单击该虚拟节点将带您到相应的选项卡。</p>
|
||||
<p><b>注意:</b>无法创建进入或离开子流的链接。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="link out">
|
||||
<p>在流之间创建虚拟连线。</p>
|
||||
<h3>详细</h3>
|
||||
<p>该节点可以连接到任何标签页上存在的任何<code>link in</code>节点。连接后,它们的行为就像连接在一起。</p>
|
||||
<p>仅当选择链接节点时,才会显示链接节点之间的链接。如果有指向另一个选项卡的链接,则显示一个虚拟节点。单击该虚拟节点将带您到相应的选项卡。</p>
|
||||
<p><b>注意:</b>无法创建进入或离开子流的链接。</p>
|
||||
</script>
|
||||
@@ -1,21 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="comment">
|
||||
<p>可用于向流添加注释的节点。</p>
|
||||
<h3>详细</h3>
|
||||
<p>编辑面板接受Markdown语法。输入的文本将在信息侧面板中显示。</p>
|
||||
</script>
|
||||
@@ -1,24 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="unknown">
|
||||
<p>您安装的Node-RED无法识别该节点的类型。</p>
|
||||
<h3>详细</h3>
|
||||
<p><i>如果在此状态下部署节点,其配置会被保存。但是在安装缺少的类型之前,流不会开始。</i></p>
|
||||
<p>使用<code> Menu-Manage Palette </code>选项来搜索并安装节点,或者使用<b>npm install <module></b>来安装所有缺少的节点,并重新启动Node-Red来导入这些节点。</p>
|
||||
<p>另一种可能是,您已经安装了此节点类型,但是缺少必须的依赖项。您应检查Node-RED的启动日志中是否有与缺少节点有关的错误消息。</p>
|
||||
<p>以上方法都不适用时,您可以联系该流的作者以获取缺少的节点类型的副本。</p>
|
||||
</script>
|
||||
@@ -1,51 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="function">
|
||||
<p>定义对接收到的消息进行处理的JavaScript代码(函数的主体)。</p>
|
||||
<p>输入消息在名为<code>msg</code>的JavaScript对象中传递。</p>
|
||||
<p>通常,<code>msg</code>对象将消息正文保留在<code>msg.payload</code>属性中。</p>
|
||||
<p>该函数一般会返回一个消息对象(或多个消息对象),但也可以为了停止流而什么都不返回。</p>
|
||||
<h3>详细</h3>
|
||||
<p>请参见<a target="_blank" href="http://nodered.org/docs/writing-functions.html">在线文档</a>来获得更多有关编写函数的信息。</p>
|
||||
<h4>传送消息</h4>
|
||||
<p>要将消息传递到流中的下一个节点,请返回消息或调用<code>node.send(messages)</code>。</p>
|
||||
<p>它将返回/send:</p>
|
||||
<ul>
|
||||
<li>单个消息对象 - 传递给连接到第一个输出的节点</li>
|
||||
<li>消息对象数组,传递给连接到相应输出的节点</li>
|
||||
</ul>
|
||||
<p>如果数组元素是数组,则将多个消息发送到相应的输出。</p>
|
||||
<p>无论return方法是单个值还是数组元素,如果返回值为null,则不会发送任何消息。</p>
|
||||
<h4>日志输出和错误处理</h4>
|
||||
<p>使用以下功能输出日志信息和输出错误:</p>
|
||||
<ul>
|
||||
<li><code>node.log("Log message")</code></li>
|
||||
<li><code>node.warn("Warning")</code></li>
|
||||
<li><code>node.error("Error")</code></li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>使用catch节点可以进行错误处理。 要由catch节点处理,请将<code>msg</code>作为<code>node.error</code>的第二个参数传递:</p>
|
||||
<pre>node.error("Error",msg);</pre>
|
||||
<h4>访问节点信息</h4>
|
||||
<p>您可以使用以下属性来在代码中引用节点ID和名称:</p>
|
||||
<ul>
|
||||
<li><code>node.id</code> - 节点的ID</li>
|
||||
<li><code>node.name</code> - 节点的名称</li>
|
||||
</ul>
|
||||
<h4>使用环境变量</h4>
|
||||
<p>环境变量可以通过<code>env.get("MY_ENV_VAR")</code>来进行访问。</p>
|
||||
</script>
|
||||
@@ -1,37 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="switch">
|
||||
<p>按属性值来分配消息的传送路线。</p>
|
||||
<h3>详细</h3>
|
||||
<p>根据接收到的消息评估指定的规则,然后将消息发送到与匹配的规则相对应的输出端口。</p>
|
||||
<p>可以将节点设置为一旦发现一个匹配的规则,则停止后续的匹配。</p>
|
||||
<p>对于评估规则,可以使用消息属性,流上下文/全局上下文属性,环境变量和JSONata表达式的评估结果。</p>
|
||||
<h4>规则</h4>
|
||||
<p>有四种规则:</p>
|
||||
<ol>
|
||||
<li><b>值</b>根据配置的属性评估规则</li>
|
||||
<li><b>顺序</b>可用于消息序列的规则,例如由“拆分”节点生成的规则</li>
|
||||
<li><b>JSONata表达式</b>评估整个消息,如果结果为真,则匹配。</li>
|
||||
<li><b>其他</b>上述规则都不匹配时适用</li>
|
||||
</ol>
|
||||
<h4>注释</h4>
|
||||
<p><code>is true/false</code>与<code>is null</code> 规则将对类型进行严格的匹配。匹配之前的类型转化不会发生。</p>
|
||||
<p><code>is empty</code>规则与零字节的字符串,数组,缓冲区或没有属性的对象相匹配。与<code>null</code>或者<code>undefined</code>等不匹配。</p>
|
||||
<h4>处理消息序列</h4>
|
||||
<p>默认情况下,节点不会修改<code>msg.parts</code>属性。</p>
|
||||
<p>可以启用<b>重建消息序列</b>选项来为每条匹配的规则生成新的消息序列。在这种模式下,节点将在发送新序列之前对整个传入序列进行缓存。运行时的设定<code>nodeMessageBufferMaxLength</code>可以用来限制可缓存的消息数目。</p>
|
||||
</script>
|
||||
@@ -1,33 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="change">
|
||||
<p>设置,更改,删除或移动消息,流上下文或全局上下文的属性。</p>
|
||||
<p>如果指定了多个规则,则将按定义的顺序来应用它们。</p>
|
||||
<h3>详细</h3>
|
||||
<p>可用的操作有:</p>
|
||||
<dl class="message-properties">
|
||||
<dt>设置</dt>
|
||||
<dd>设置一个属性。该值可以是多种不同类型,也可以从现有消息或上下文属性中获取。</dd>
|
||||
<dt>置换</dt>
|
||||
<dd>搜索并替换属性。 如果启用了正则表达式,则可以为“replace with”属性指定捕获组,例如<code>$1</code>。 在替换过程中,仅当规则完全匹配时才能更改属性类型。</dd>
|
||||
<dt>删除</dt>
|
||||
<dd>删除一个属性</dd>
|
||||
<dt>移动</dt>
|
||||
<dd>移动或者重命名一个属性</dd>
|
||||
</dl>
|
||||
<p>类型"expression"使用<a href="http://jsonata.org/" target="_new">JSONata</a>语言。</p>
|
||||
</script>
|
||||
@@ -1,40 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="range">
|
||||
<p>将数值映射为另一个区间的数值</p>
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload<span class="property-type">数值</span></dt>
|
||||
<dd>有效荷载<i>一定</i>得是一个数值. 否则则会映射失败。</dd>
|
||||
</dl>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload<span class="property-type">数值</span></dt>
|
||||
<dd>被映射到新区间的数值。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>该节点将线性缩放所接收到的数值。在默认情况下,结果不限于节点中定义的范围。</p>
|
||||
<p><i>缩放并限制到目标范围</i>表示结果永远不会超出目标范围内指定的范围。</p>
|
||||
<p><i>在目标范围内缩放并折叠</i>表示结果将会被限制(折叠)在目标范围内。</p>
|
||||
<p>例如,输入0-10映射到0-100。</p>
|
||||
<table style="outline-width:#888 solid thin">
|
||||
<tr><th width="80px">模式</th><th width="80px">输入</th><th width="80px">输出</th></tr>
|
||||
<tr><td><center>scale</center></td><td><center>12</center></td><td><center>120</center></td></tr>
|
||||
<tr><td><center>limit</center></td><td><center>12</center></td><td><center>100</center></td></tr>
|
||||
<tr><td><center>wrap</center></td><td><center>12</center></td><td><center>20</center></td></tr>
|
||||
</table>
|
||||
</script>
|
||||
@@ -1,46 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="template">
|
||||
<p>根据提供的模板设置属性。</p>
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>msg <span class="property-type">object</span></dt>
|
||||
<dd>一个msg对象,其中包含着用于填充模板的信息。</dd>
|
||||
<dt class="optional">template <span class="property-type">string</span></dt>
|
||||
<dd>由<code>msg.payload</code>填充的模板。如果未在编辑面板中配置,则可以将设为msg的属性。</dd>
|
||||
</dl>
|
||||
<h3>Outputs</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>msg <span class="property-type">object</span></dt>
|
||||
<dd>由来自传入msg的属性来填充已配置的模板后输出的带有属性的msg。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>默认情况下使用<i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>格式。如有需要也可以切换其他格式。</p>
|
||||
<p>例如:
|
||||
<pre>Hello {{payload.name}}. Today is {{date}}</pre>
|
||||
<p>receives a message containing:
|
||||
<pre>{
|
||||
date: "Monday",
|
||||
payload: {
|
||||
name: "Fred"
|
||||
}
|
||||
}</pre>
|
||||
<p>输出的消息将会是:
|
||||
<pre>Hello Fred. Today is Monday</pre>
|
||||
<p>也可以使用流上下文或全局上下文中的属性:<code>{{flow.name}}</code>或者<code>{{global.name}}</code>,或者为了持久储存<code>store</code>,可以使用<code>{{flow[store].name}}</code>或<code>{{global[store].name}}</code>。
|
||||
<p><b>注意:</b>默认情况下,<i>mustache</i>将在其替换的值中转义任何非字母数字或HTML实体。为了防止这种情况,请使用<code>{{{triple}}}</code>大括号。
|
||||
</script>
|
||||
@@ -1,32 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="delay">
|
||||
<p>对通过节点的消息进行延迟发送或限制。</p>
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">delay <span class="property-type">数值</span></dt>
|
||||
<dd>设置要应用于消息的延迟(以毫秒为单位)。仅当节点配置为允许消息去覆盖配置的默认延迟间隔时,此选项才适用。</dd>
|
||||
<dt class="optional">reset</dt>
|
||||
<dd>如果接收到的消息将此属性设置为任何值,则将清空该节点保留的所有的未发送消息。</dd>
|
||||
<dt class="optional">flush</dt>
|
||||
<dd>如果接收到的消息的此属性设置为任何值,则将立即发送该节点保留的所有未发送消息。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>当配置为延迟发送消息时,延迟间隔可以是一个固定值,一个范围内的随机值或为每个消息动态设置。</p>
|
||||
<p>当配置为对消息进行限制时,它们的传递将分散在配置的时间段内。状态显示队列中当前的消息数。可以选择在中间消息到达时丢弃它们。</p>
|
||||
<p>速率限制可以应用于所有消息,也可以根据<code>msg.topic</code>的值来进行分组。分组时,中间消息将会被自动删除。在每个时间间隔,节点可以释放所有主题的最新消息,或释放下一个主题的最新消息。</p>
|
||||
</script>
|
||||
@@ -1,33 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="trigger">
|
||||
<p>触发后,将会发送一条消息。如果被拓展或重置,则可以选择发送第二条消息。</p>
|
||||
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">reset</dt>
|
||||
<dd>如果收到带有此属性的消息,则将清除当前正在进行的任何超时或重复,且不会触发任何消息。</dd>
|
||||
</dl>
|
||||
|
||||
<h3>详细</h3>
|
||||
<p>该节点可用于在流中创建一个超时。 默认情况下,当它收到一条消息时,它将发送一条带有<code>1</code>的有效荷载的消息。然后它将等待250毫秒,再发送第二条消息,其有效荷载为<code>0</code>。这可以用于使连接到Raspberry Pi GPIO引脚的LED闪烁等例子上。</p>
|
||||
<p>可以将发送的每个消息的有效荷载配置为各种值,包括不发送任何内容的选项。例如,将初始消息设置为<i>nothing</i>,然后选择将计时器与每个收到的消息一起扩展的选项,则该节点将充当看门狗计时器;仅在设置的间隔内未收到任何消息时才发送消息。</p>
|
||||
<p>如果设置为<i>字符串</i>类型,则该节点支持<i>mustache</i>模板语法。</p>
|
||||
<p>如果节点收到具有<code>reset</code>属性或与节点中配置的匹配的<code>有效荷载</code>的消息,则将清除当前正在进行的任何超时或重复,并且不会触发任何消息。</p>
|
||||
<p>可以将节点配置为以固定的时间间隔重新发送消息,直到被收到的消息重置为止。</p>
|
||||
<p>(可选)可以将节点配置为将带有<code>msg.topic</code>的消息视为独立的流。</p>
|
||||
</script>
|
||||
@@ -1,74 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="exec">
|
||||
<p>运行系统命令并返回其输出。</p>
|
||||
<p>可以将节点配置为等待命令完成,或者在命令生成时发送其输出。</p>
|
||||
<p>运行的命令可以在节点中配置,也可以由收到的消息提供。</p>
|
||||
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">payload <span class="property-type">字符串</span></dt>
|
||||
<dd>如果这样配置,则将被附加到执行命令中。</dd>
|
||||
<dt class="optional">kill <span class="property-type">字符串</span></dt>
|
||||
<dd>指定发送到现有的exec节点进程的kill信号类型。</dd>
|
||||
<dt class="optional">pid <span class="property-type">数值|字符串</span></dt>
|
||||
<dd>要杀死的现有exec节点进程的进程ID</dd>
|
||||
</dl>
|
||||
|
||||
<h3>输出</h3>
|
||||
<ol class="node-ports">
|
||||
<li>标准输出(stdout)
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">字符串</span></dt>
|
||||
<dd>命令的标准输出。</dd>
|
||||
</dl>
|
||||
<dl class="message-properties">
|
||||
<dt>rc <span class="property-type">object</span></dt>
|
||||
<dd>(仅执行模式)一个返回代码对象的副本(在端口3上也可用)</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li>标准error输出(stderr)
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">字符串</span></dt>
|
||||
<dd>命令的标准错误输出。</dd>
|
||||
</dl>
|
||||
<dl class="message-properties">
|
||||
<dt>rc <span class="property-type">object</span></dt>
|
||||
<dd>(仅执行模式)一个返回代码对象的副本(在端口3上也可用)</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li>返回代码
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">object</span></dt>
|
||||
<dd>一个包含返回代码以及<code>message</code>,<code>signal</code>属性的对象。</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ol>
|
||||
<h3>详细</h3>
|
||||
<p>默认情况下,使用<code>exec</code>系统调用来调用命令,等待命令完成,然后返回输出。例如,成功的命令的返回码应为<code>{code:0}</code>。</p>
|
||||
<p>(可选)可以选择使用<code>spawn</code>代替,它会在命令运行时从stdout和stderr返回输出,通常一次一行。完成后,它将在第三个端口上返回一个对象。例如,成功的命令应返回<code>{code:0}</code>。</p>
|
||||
<p>错误可能会在第三个端口<code>msg.payload</code>上返回额外的信息,例如<code>message</code>字符串,<code>signal</code>字符串。</p>
|
||||
<p>运行的命令是在节点内定义的,带有附加<code>msg.payload</code>的选项和另外一组参数。</p>
|
||||
<p>带空格的命令或参数应该用引号引起来:<code>“这是一个参数”</code></p>
|
||||
<p>返回的<code>有效荷载</code>通常是<i>字符串</i>类型,除非检测到非UTF8字符,在这种情况下,它会是<i>buffer</i>类型。</p>
|
||||
<p>节点处于活动状态时,该节点的状态图标和PID将可见。对此更改可以通过<code>Status</code>节点读取。</p>
|
||||
<h4>杀死进程</h4>
|
||||
<p>发送<code>msg.kill</code>将杀死一个活动进程。<code>msg.kill</code>应该是包含要发送的信号类型的字符串,例如<code>SIGINT</code>,<code>SIGQUIT</code>或<code>SIGHUP</code>。如果设置为空字符串,则默认为<code>SIGTERM</code>。</p>
|
||||
<p>如果节点有多个进程在运行,则还必须设置<code>msg.pid</code>并设置要杀死的PID的值。</p>
|
||||
<p>如果<code>超时</code>字段提供了一个值,则如果在指定的秒数过去后进程尚未完成,则该进程将自动终止。</p>
|
||||
<p>提示:如果运行Python应用程序,则可能需要使用<code>-u</code>参数来停止对输出进行缓存。</p>
|
||||
</script>
|
||||
@@ -6,9 +6,7 @@
|
||||
"name": "名称",
|
||||
"username": "用户名",
|
||||
"password": "密码",
|
||||
"property": "属性",
|
||||
"selectNodes": "选择节点...",
|
||||
"expand": "扩展"
|
||||
"property": "属性"
|
||||
},
|
||||
"status": {
|
||||
"connected": "已连接",
|
||||
@@ -37,22 +35,7 @@
|
||||
"stopped": "停止",
|
||||
"failed": "注入失败: __error__",
|
||||
"label": {
|
||||
"repeat": "重复",
|
||||
"flow": "流上下午",
|
||||
"global": "全局上下文",
|
||||
"str": "字符串",
|
||||
"num": "数值",
|
||||
"bool": "布尔值",
|
||||
"json": "JSON对象",
|
||||
"bin": "buffer",
|
||||
"date": "时间戳",
|
||||
"env": "环境变量",
|
||||
"object": "对象",
|
||||
"string": "字符串",
|
||||
"boolean": "布尔值",
|
||||
"number": "数值",
|
||||
"Array": "数组",
|
||||
"invalid": "无效的JSON对象"
|
||||
"repeat": "重复"
|
||||
},
|
||||
"timestamp": "时间戳",
|
||||
"none": "无",
|
||||
@@ -87,13 +70,15 @@
|
||||
}
|
||||
},
|
||||
"catch": {
|
||||
"catch": "捕获:所有节点",
|
||||
"catchNodes": "捕获:__number__个节点",
|
||||
"catchUncaught": "捕获:未捕获",
|
||||
"catch": "监测所有节点",
|
||||
"catchNodes": "监测__number__个节点",
|
||||
"label": {
|
||||
"source": "捕获范围",
|
||||
"source": "监测范围",
|
||||
"node": "节点",
|
||||
"type": "类型",
|
||||
"selectAll": "全选",
|
||||
"uncaught": "忽略其他捕获节点处理的错误"
|
||||
"sortByLabel": "按名称排序",
|
||||
"sortByType": "按类型排序"
|
||||
},
|
||||
"scope": {
|
||||
"all": "所有节点",
|
||||
@@ -105,6 +90,10 @@
|
||||
"statusNodes": "报告__number__个节点状态",
|
||||
"label": {
|
||||
"source": "报告状态范围",
|
||||
"node": "节点",
|
||||
"type": "类型",
|
||||
"selectAll": "全选",
|
||||
"sortByLabel": "按名称排序",
|
||||
"sortByType": "按类型排序"
|
||||
},
|
||||
"scope": {
|
||||
@@ -112,13 +101,8 @@
|
||||
"selected": "指定节点"
|
||||
}
|
||||
},
|
||||
"complete": {
|
||||
"completeNodes": "完成: __number__个节点"
|
||||
},
|
||||
"debug": {
|
||||
"output": "输出",
|
||||
"none": "None",
|
||||
"invalid-exp": "无效的JSONata表达式: __error__",
|
||||
"msgprop": "信息属性",
|
||||
"msgobj": "完整信息",
|
||||
"to": "目标",
|
||||
@@ -140,11 +124,7 @@
|
||||
"filterCurrent": "当前流程",
|
||||
"debugNodes": "调试节点",
|
||||
"clearLog": "清空日志",
|
||||
"filterLog": "过滤日志",
|
||||
"openWindow": "在新窗口打开",
|
||||
"copyPath": "复制路径",
|
||||
"copyPayload": "复制值",
|
||||
"pinPath": "固定展开"
|
||||
"openWindow": "在新窗口打开"
|
||||
},
|
||||
"messageMenu": {
|
||||
"collapseAll": "折叠所有路径",
|
||||
@@ -166,33 +146,26 @@
|
||||
"key": "私钥",
|
||||
"passphrase": "密码",
|
||||
"ca": "CA证书",
|
||||
"verify-server-cert":"验证服务器证书",
|
||||
"servername": "服务器名"
|
||||
"verify-server-cert":"验证服务器证书"
|
||||
},
|
||||
"placeholder": {
|
||||
"cert":"证书路径 (PEM 格式)",
|
||||
"key":"私钥路径 (PEM 格式)",
|
||||
"ca":"CA证书路径 (PEM 格式)",
|
||||
"passphrase":"私钥密码 (可选)",
|
||||
"servername":"用于SNI"
|
||||
"passphrase":"私钥密码 (可选)"
|
||||
},
|
||||
"error": {
|
||||
"missing-file": "未提供证书/密钥文件"
|
||||
}
|
||||
},
|
||||
"exec": {
|
||||
"exec": "exec",
|
||||
"spawn": "spawn",
|
||||
"label": {
|
||||
"command": "命令",
|
||||
"append": "追加",
|
||||
"timeout": "超时",
|
||||
"timeoutplace": "可选填",
|
||||
"return": "输出",
|
||||
"seconds": "秒",
|
||||
"stdout": "标准输出",
|
||||
"stderr": "标准错误输出",
|
||||
"retcode": "返回码"
|
||||
"seconds": "秒"
|
||||
},
|
||||
"placeholder": {
|
||||
"extraparams": "额外的输入参数"
|
||||
@@ -204,7 +177,6 @@
|
||||
"oldrc": "使用旧式输出 (兼容模式)"
|
||||
},
|
||||
"function": {
|
||||
"function": "函数",
|
||||
"label": {
|
||||
"function": "函数",
|
||||
"outputs": "输出"
|
||||
@@ -215,7 +187,6 @@
|
||||
}
|
||||
},
|
||||
"template": {
|
||||
"template": "模板",
|
||||
"label": {
|
||||
"template": "模版",
|
||||
"property": "属性",
|
||||
@@ -228,7 +199,7 @@
|
||||
"yaml": "YAML",
|
||||
"none": "无"
|
||||
},
|
||||
"templatevalue": "这是有效载荷: {{payload}} !"
|
||||
"templatevalue": "This is the payload: {{payload}} !"
|
||||
},
|
||||
"delay": {
|
||||
"action": "行为设置",
|
||||
@@ -301,9 +272,6 @@
|
||||
"wait-reset": "等待被重置",
|
||||
"wait-for": "等待",
|
||||
"wait-loop": "周期性重发",
|
||||
"for": "处理",
|
||||
"bytopics": "每个msg.topic",
|
||||
"alltopics": "所有消息",
|
||||
"duration": {
|
||||
"ms": "毫秒",
|
||||
"s": "秒",
|
||||
@@ -322,7 +290,6 @@
|
||||
}
|
||||
},
|
||||
"comment": {
|
||||
"comment": "注释"
|
||||
},
|
||||
"unknown": {
|
||||
"label": {
|
||||
@@ -333,10 +300,9 @@
|
||||
"mqtt": {
|
||||
"label": {
|
||||
"broker": "服务端",
|
||||
"example": "比如:本地主机",
|
||||
"example": "e.g. localhost",
|
||||
"output": "输出",
|
||||
"qos": "QoS",
|
||||
"retain": "保持",
|
||||
"clientid": "客户端ID",
|
||||
"port": "端口",
|
||||
"keepalive": "Keepalive计时(秒)",
|
||||
@@ -346,22 +312,17 @@
|
||||
"verify-server-cert":"验证服务器证书",
|
||||
"compatmode": "使用旧式MQTT 3.1支持"
|
||||
},
|
||||
"sections-label":{
|
||||
"birth-message": "连接时发送的消息(出生消息)",
|
||||
"will-message":"意外断开连接时的发送消息(Will消息)",
|
||||
"close-message":"断开连接前发送的消息(关闭消息)"
|
||||
},
|
||||
"tabs-label": {
|
||||
"connection": "连接",
|
||||
"security": "安全",
|
||||
"messages": "消息"
|
||||
"will": "Will信息",
|
||||
"birth": "Birth信息"
|
||||
},
|
||||
"placeholder": {
|
||||
"clientid": "留白则自动生成",
|
||||
"clientid-nonclean":"如非新会话,必须设置客户端ID",
|
||||
"will-topic": "留白将禁止Will信息",
|
||||
"birth-topic": "留白将禁止Birth信息",
|
||||
"close-topic": "留白以禁用关闭消息"
|
||||
"birth-topic": "留白将禁止Birth信息"
|
||||
},
|
||||
"state": {
|
||||
"connected": "已连接到服务端: __broker__",
|
||||
@@ -372,9 +333,7 @@
|
||||
"output": {
|
||||
"buffer": "Buffer",
|
||||
"string": "字符串",
|
||||
"base64": "Base64编码字符串",
|
||||
"auto": "自动检测 (字符串或buffer)",
|
||||
"json": "解析的JSON对象"
|
||||
"base64": "Base64编码字符串"
|
||||
},
|
||||
"true": "是",
|
||||
"false": "否",
|
||||
@@ -383,9 +342,7 @@
|
||||
"not-defined": "主题未设置",
|
||||
"missing-config": "未设置服务端",
|
||||
"invalid-topic": "主题无效",
|
||||
"nonclean-missingclientid": "客户端ID未设定,使用新会话",
|
||||
"invalid-json-string": "无效的JSON字符串",
|
||||
"invalid-json-parse": "无法解析JSON字符串"
|
||||
"nonclean-missingclientid": "客户端ID未设定,使用新会话"
|
||||
}
|
||||
},
|
||||
"httpin": {
|
||||
@@ -396,27 +353,13 @@
|
||||
"return": "返回",
|
||||
"upload": "接受文件上传?",
|
||||
"status": "状态码",
|
||||
"headers": "头",
|
||||
"other": "其他",
|
||||
"paytoqs" : "将msg.payload附加为查询字符串参数",
|
||||
"utf8String": "UTF8格式的字符串",
|
||||
"binaryBuffer": "二进制buffer",
|
||||
"jsonObject": "解析的JSON对象",
|
||||
"authType": "类型",
|
||||
"bearerToken": "Token"
|
||||
"headers": "Header",
|
||||
"other": "其他"
|
||||
},
|
||||
"setby": "- 用 msg.method 设定 -",
|
||||
"basicauth": "基本认证",
|
||||
"use-tls": "使用安全连接 (SSL/TLS) ",
|
||||
"tls-config":"TLS 设置",
|
||||
"basic": "基本认证",
|
||||
"digest": "摘要认证",
|
||||
"bearer": "bearer认证",
|
||||
"use-proxy": "使用代理服务器",
|
||||
"persist": "对连接启用keep-alive",
|
||||
"proxy-config": "代理服务器设置",
|
||||
"use-proxyauth": "使用代理身份验证",
|
||||
"noproxy-hosts": "代理例外",
|
||||
"utf8": "UTF-8 字符串",
|
||||
"binary": "二进制数据",
|
||||
"json": "JSON对象",
|
||||
@@ -433,10 +376,7 @@
|
||||
"json-error": "JSON 解析错误",
|
||||
"no-url": "未设定 URL",
|
||||
"deprecated-call":"__method__方法已弃用",
|
||||
"invalid-transport":"非HTTP传输请求",
|
||||
"timeout-isnan": "超时值不是有效数字,忽略",
|
||||
"timeout-isnegative": "超时值为负,忽略",
|
||||
"invalid-payload": "无效的有效载荷"
|
||||
"invalid-transport":"非HTTP传输请求"
|
||||
},
|
||||
"status": {
|
||||
"requesting": "请求中"
|
||||
@@ -455,23 +395,17 @@
|
||||
"message": "完整信息",
|
||||
"tip": {
|
||||
"path1": "默认情况下,<code>payload</code>将包含要发送或从Websocket接收的数据。侦听器可以配置为以JSON格式的字符串发送或接收整个消息对象.",
|
||||
"path2": "这条路径将相对于 <code>__path__</code>.",
|
||||
"path2": "这条路径将相对于 ",
|
||||
"url1": "URL 应该使用ws://或者wss://方案并指向现有的websocket侦听器.",
|
||||
"url2": "默认情况下,<code>payload</code> 将包含要发送或从Websocket接收的数据。可以将客户端配置为以JSON格式的字符串发送或接收整个消息对象."
|
||||
},
|
||||
"status": {
|
||||
"connected": "连接数 __count__",
|
||||
"connected_plural": "连接数 __count__"
|
||||
},
|
||||
"errors": {
|
||||
"connect-error": "ws连接发生了错误: ",
|
||||
"send-error": "发送时发生了错误: ",
|
||||
"missing-conf": "未设置服务器",
|
||||
"duplicate-path": "同一路径上不能有两个WebSocket侦听器: __path__"
|
||||
"missing-conf": "未设置服务器"
|
||||
}
|
||||
},
|
||||
"watch": {
|
||||
"watch": "watch",
|
||||
"label": {
|
||||
"files": "文件",
|
||||
"recursive": "递归所有子文件夹"
|
||||
@@ -487,7 +421,7 @@
|
||||
"output": "输出",
|
||||
"port": "端口",
|
||||
"host": "主机地址",
|
||||
"payload": "有效载荷",
|
||||
"payload": "的有效载荷",
|
||||
"delimited": "分隔符号",
|
||||
"close-connection": "是否在成功发送每条信息后断开连接?",
|
||||
"decode-base64": "用 Base64 解码信息?",
|
||||
@@ -546,6 +480,7 @@
|
||||
"output": "输出",
|
||||
"group": "组",
|
||||
"interface": "本地IP",
|
||||
"interfaceprompt": "(可选)本地 IP 绑定到",
|
||||
"send": "发送一个",
|
||||
"toport": "到端口",
|
||||
"address": "地址",
|
||||
@@ -553,7 +488,6 @@
|
||||
},
|
||||
"placeholder": {
|
||||
"interface": "(可选)eth0的IP地址",
|
||||
"interfaceprompt": "(可选) 要绑定的本地接口或地址",
|
||||
"address": "目标IP地址"
|
||||
},
|
||||
"udpmsgs": "udp信息",
|
||||
@@ -595,18 +529,15 @@
|
||||
"ip-notset": "udp: IP地址未设定",
|
||||
"port-notset": "udp: 端口未设定",
|
||||
"port-invalid": "udp: 无效端口号码",
|
||||
"alreadyused": "udp: 端口已被占用",
|
||||
"ifnotfound": "udp: 接口 __iface__ 未发现"
|
||||
"alreadyused": "udp: 端口已被占用"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
"switch": "switch",
|
||||
"label": {
|
||||
"property": "属性",
|
||||
"rule": "规则",
|
||||
"repair" : "重建信息队列"
|
||||
},
|
||||
"previous": "先前值",
|
||||
"and": "与",
|
||||
"checkall": "全选所有规则",
|
||||
"stopfirst": "接受第一条匹配信息后停止",
|
||||
@@ -619,15 +550,11 @@
|
||||
"false":"为假",
|
||||
"null":"为空",
|
||||
"nnull":"非空",
|
||||
"istype": "类型是",
|
||||
"empty": "为空",
|
||||
"nempty": "非空",
|
||||
"head":"头",
|
||||
"tail":"尾",
|
||||
"index":"索引在..中间",
|
||||
"head":"head",
|
||||
"tail":"tail",
|
||||
"index":"index between",
|
||||
"exp":"JSONata表达式",
|
||||
"else":"除此以外",
|
||||
"hask": "拥有键"
|
||||
"else":"除此以外"
|
||||
},
|
||||
"errors": {
|
||||
"invalid-expr": "无效的JSONata表达式: __error__",
|
||||
@@ -661,7 +588,6 @@
|
||||
}
|
||||
},
|
||||
"range": {
|
||||
"range": "range",
|
||||
"label": {
|
||||
"action": "操作",
|
||||
"inputrange": "映射输入数据",
|
||||
@@ -697,8 +623,7 @@
|
||||
"firstrow": "第一行包含列名",
|
||||
"output": "输出",
|
||||
"includerow": "包含列名行",
|
||||
"newline": "换行符",
|
||||
"usestrings": "解析数值"
|
||||
"newline": "换行符"
|
||||
},
|
||||
"placeholder": {
|
||||
"columns": "用逗号分割列名"
|
||||
@@ -729,8 +654,7 @@
|
||||
"html": {
|
||||
"label": {
|
||||
"select": "选取项",
|
||||
"output": "输出",
|
||||
"in": "in"
|
||||
"output": "输出"
|
||||
},
|
||||
"output": {
|
||||
"html": "选定元素的html内容",
|
||||
@@ -746,9 +670,7 @@
|
||||
"errors": {
|
||||
"dropped-object": "忽略非对象格式的有效负载",
|
||||
"dropped": "忽略不支持格式的有效负载类型",
|
||||
"dropped-error": "转换有效负载失败",
|
||||
"schema-error": "JSON架构错误",
|
||||
"schema-error-compile": "JSON架构错误: 未能编译架构"
|
||||
"dropped-error": "转换有效负载失败"
|
||||
},
|
||||
"label": {
|
||||
"o2j": "对象至JSON",
|
||||
@@ -791,10 +713,7 @@
|
||||
"breaklines": "分拆成行",
|
||||
"filelabel": "文件",
|
||||
"sendError": "发生错误时发送消息(传统模式)",
|
||||
"deletelabel": "删除 __file__",
|
||||
"encoding": "编码",
|
||||
"utf8String": "UTF8字符串",
|
||||
"binaryBuffer": "二进制buffer"
|
||||
"deletelabel": "删除 __file__"
|
||||
},
|
||||
"action": {
|
||||
"append": "追加至文件",
|
||||
@@ -812,21 +731,6 @@
|
||||
"deletedfile": "删除文件: __file__",
|
||||
"appendedfile": "追加至文件: __file__"
|
||||
},
|
||||
"encoding": {
|
||||
"none": "默认",
|
||||
"native": "Native",
|
||||
"unicode": "Unicode",
|
||||
"japanese": "日本",
|
||||
"chinese": "中国",
|
||||
"korean": "韩国",
|
||||
"taiwan": "台湾/香港",
|
||||
"windows": "Windows代码页",
|
||||
"iso": "ISO代码页",
|
||||
"ibm": "IBM代码页",
|
||||
"mac": "Mac代码页",
|
||||
"koi8": "KOI8代码页",
|
||||
"misc": "其它"
|
||||
},
|
||||
"errors": {
|
||||
"nofilename": "未指定文件名",
|
||||
"invaliddelete": "警告:无效删除。请在配置对话框中使用特定的删除选项",
|
||||
@@ -838,7 +742,6 @@
|
||||
"tip": "提示: 文件名应该是绝对路径,否则它将相对于Node-RED进程的工作目录。"
|
||||
},
|
||||
"split": {
|
||||
"split": "split",
|
||||
"intro":"基于以下类型拆分<code>msg.payload</code>:",
|
||||
"object":"<b>对象</b>",
|
||||
"objectSend":"每个键值对作为单个消息发送",
|
||||
@@ -850,7 +753,6 @@
|
||||
"addname":" 复制键到 "
|
||||
},
|
||||
"join":{
|
||||
"join": "join",
|
||||
"mode":{
|
||||
"mode":"模式",
|
||||
"auto":"自动",
|
||||
@@ -859,7 +761,6 @@
|
||||
"custom":"手动"
|
||||
},
|
||||
"combine":"合并每个",
|
||||
"completeMessage": "完整的消息",
|
||||
"create":"输出为",
|
||||
"type":{
|
||||
"string":"字符串",
|
||||
@@ -898,7 +799,6 @@
|
||||
}
|
||||
},
|
||||
"sort" : {
|
||||
"sort": "排序",
|
||||
"target" : "排序属性",
|
||||
"seq" : "信息队列",
|
||||
"key" : "键值",
|
||||
@@ -907,12 +807,11 @@
|
||||
"ascending" : "升序",
|
||||
"descending" : "降序",
|
||||
"as-number" : "作为数值",
|
||||
"invalid-exp" : "排序节点中存在无效的JSONata表达式",
|
||||
"too-many" : "排序节点中有太多待定信息",
|
||||
"clear" : "清空排序节点中的待定信息"
|
||||
"invalid-exp" : "sort节点中存在无效的JSONata表达式",
|
||||
"too-many" : "sort节点中有太多待定信息",
|
||||
"clear" : "清空sort节点中的待定信息"
|
||||
},
|
||||
"batch" : {
|
||||
"batch": "batch",
|
||||
"mode": {
|
||||
"label" : "模式",
|
||||
"num-msgs" : "按指定数量分组",
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="tls-config">
|
||||
<p>TLS连接的配置选项。</p>
|
||||
</script>
|
||||
@@ -1,22 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="http proxy">
|
||||
<p>HTTP代理的配置选项。</p>
|
||||
|
||||
<h3>详细</h3>
|
||||
<p>访问代理例外列表中的主机时,将不使用任何代理。</p>
|
||||
</script>
|
||||
@@ -1,71 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="mqtt in">
|
||||
<p>连接到MQTT代理并订阅来自指定主题的消息。</p>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">字符串 | buffer</span></dt>
|
||||
<dd>如果不是二进制buffer的话就是字符串</dd>
|
||||
<dt>topic <span class="property-type">字符串</span></dt>
|
||||
<dd>MQTT主题,使用<code>/</code>作为层次结构分隔符。</dd>
|
||||
<dt>qos <span class="property-type">数值</span> </dt>
|
||||
<dd>QoS服务质量:0, 最多一次; 1, 最少一次; 2, 只一次。</dd>
|
||||
<dt>retain <span class="property-type">布尔值</span></dt>
|
||||
<dd>值为true时表示消息已保留且可能是旧的。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>订阅主题可以包括MQTT通配符(+:一个级别,#:多个级别)。</p>
|
||||
<p>使用该节点您首先需要建立与MQTT代理的连接。通过单击铅笔图标来进行配置。</p>
|
||||
<p>如有需要,几个MQTT节点(输入或输出)可以共享相同的代理连接。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="mqtt out">
|
||||
<p>连接到MQTT代理并发布消息。</p>
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">字符串 | buffer</span></dt>
|
||||
<dd>要发布的有效负载。如果未设置此属性,则不会发送任何消息。要发送空白消息,请将此属性设置为空字符串。</dd>
|
||||
|
||||
<dt class="optional">topic <span class="property-type">字符串</span></dt>
|
||||
<dd>要发布的MQTT主题。</dd>
|
||||
|
||||
<dt class="optional">qos <span class="property-type">number</span></dt>
|
||||
<dd>QoS服务质量:0, 最多一次; 1, 最少一次; 2, 只一次。默认值为0。</dd>
|
||||
|
||||
<dt class="optional">retain <span class="property-type">布尔值</span></dt>
|
||||
<dd>设置为<code>true</code>来将消息保留在代理上。默认值为<code>false</code>。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p><code>msg.payload</code>用作已发布消息的有效载荷。如果包含Object,则会在发送之前将其转换为JSON字符串。如果它包含二进制buffer,则消息将按原样发布。</p>
|
||||
<p>可以在节点中配置所使用的主题,或者如果留为空白,则可以通过<code>msg.topic</code>进行设置。</p>
|
||||
<p>同样,可以在节点中配置QoS和保留值,或者如果保留空白,则分别由<code>msg.qos</code>和<code>msg.retain</code>设置。要清除先前存储在代理中的主题,请设置保留标志并向该主题发布空消息。</p>
|
||||
<p>该节点需要与要配置的MQTT代理的连接。通过单击铅笔图标进行配置。</p>
|
||||
<p>如果需要,几个MQTT节点(输入或输出)可以共享相同的代理连接。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="mqtt-broker">
|
||||
<p>与MQTT代理的连接设置。</p>
|
||||
<p>创建与代理的连接设置。可以在<code>MQTT In</code>和<code>MQTT Out</code>节点中重复利用这些设置。</p>
|
||||
<p>如果未为该节点设置客户端ID,并且设置了会话初始化,则将生成一个随机客户端ID。设置客户端ID时,请确保它对于连接目标处的代理是唯一的。</p>
|
||||
<h4>Birth Message</h4>
|
||||
<p>建立连接后发布在以配置主题中的消息。</p>
|
||||
<h4>Close Message</h4>
|
||||
<p>在连接正常结束之前重新部署或者关闭了节点时,发布在以配置主题中的消息。</p>
|
||||
<h4>Will Message</h4>
|
||||
<p>当节点意外丢失连接时由代理发布的消息</p>
|
||||
<h4>WebSockets</h4>
|
||||
<p>可以将节点配置成使用WebSocket连接。使用WebSocket时,请在服务器字段中以完整格式描述连接目标的URI。 例如:</p>
|
||||
<pre>ws://example.com:4000/mqtt</pre>
|
||||
|
||||
</script>
|
||||
@@ -1,81 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="http in">
|
||||
<p>创建用于创建Web服务的HTTP端点。</p>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload</dt>
|
||||
<dd>GET请求包含任何查询字符串参数的对象。或者包含HTTP请求正文。</dd>
|
||||
<dt>req<span class="property-type">object</span></dt>
|
||||
<dd>HTTP请求对象。该对象包含有关请求信息的多个属性。
|
||||
<ul>
|
||||
<li><code>body</code> - 传入请求的正文。格式将取决于请求。</li>
|
||||
<li><code>headers</code> - 包含HTTP请求标头的对象。</li>
|
||||
<li><code>query</code> - 包含任何查询字符串参数的对象。</li>
|
||||
<li><code>params</code> - 包含任何路由参数的对象。</li>
|
||||
<li><code>cookies</code> - 包含请求cookie的对象。</li>
|
||||
<li><code>files</code> - 如果节点启用了文件上传,则为包含了上传的文件的对象。</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt>res<span class="property-type">object</span></dt>
|
||||
<dd>HTTP响应对象。此属性不应直接使用;<code>HTTP Response</code>节点记录了如何响应请求。该属性必须保留在传递给响应节点的消息上。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>节点将在配置的路径上监听特定类型的请求。路径可以完全指定,例如<code>/user</code>,或包括可以接受任何值的命名参数,例如<code>/user/:name</code>。 使用命名参数时,可以在<code>msg.req.params</code>下访问其在请求中的实际值。</p>
|
||||
<p>对于包含正文的请求(例如POST或PUT),请求的内容将作为<code>msg.payload</code>提供。</p>
|
||||
<p>如果可以确定请求的内容类型,则正文将被解析为任何适当的类型。例如,<code>application/json</code>将被解析为其JavaScript对象表示。</p>
|
||||
<p><b>注意:</b>该节点不发送对请求的任何响应。该流必须包含HTTP响应节点才能完成请求。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="http response">
|
||||
<p>将响应发送回从HTTP输入节点接收的请求。</p>
|
||||
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">string</span></dt>
|
||||
<dd>响应的正文。</dd>
|
||||
<dt class="optional">statusCode <span class="property-type">数值</span></dt>
|
||||
<dd>如果设置,则用作响应状态代码。默认值:200。</dd>
|
||||
<dt class="optional">headers <span class="property-type">object</span></dt>
|
||||
<dd>如果设置,则提供HTTP头以包含在响应中。</dd>
|
||||
<dt class="optional">cookies <span class="property-type">object</span></dt>
|
||||
<dd>如果设置,则可用于设置或删除cookie。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>还可以在节点本身内设置<code>statusCode</code>和<code>headers</code>。如果在节点内设置了属性,则不能被相应的message属性覆盖。</p>
|
||||
<h4>Cookie处理</h4>
|
||||
<p><code>cookies</code>属性必须是名称/值对的对象。该值可以是使用默认选项设置cookie值的字符串,也可以是options对象。<p>
|
||||
<p>下面的示例设置两个cookie-一个名为<code>name</code>的值为<code>nick</code>,另一个名为<code>session</code>的值为<code>1234</code>,并且有效期设置为15分钟。</p>
|
||||
<pre>
|
||||
msg.cookies = {
|
||||
name: 'nick',
|
||||
session: {
|
||||
value: '1234',
|
||||
maxAge: 900000
|
||||
}
|
||||
}</pre>
|
||||
<p>有效选项包括:</p>
|
||||
<ul>
|
||||
<li><code>domain</code> - (字符串) Cookie的域名</li>
|
||||
<li><code>expires</code> - (日期) GMT标准时间的到期日。如果未指定或设置为0,则创建会话cookie</li>
|
||||
<li><code>maxAge</code> - (字符串) 相对于当前时间的到期日期(以毫秒为单位)</li>
|
||||
<li><code>path</code> - (字符串) Cookie的路径。默认为/</li>
|
||||
<li><code>value</code> - (字符串) Cookie使用的值</li>
|
||||
</ul>
|
||||
<p>要删除Cookie,请将其<code>value</code>设置为<code>null</code>。</p>
|
||||
|
||||
</script>
|
||||
@@ -1,78 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="http request">
|
||||
<p>发送HTTP请求并返回响应。</p>
|
||||
|
||||
<h3>输入</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">url <span class="property-type">字符串</span></dt>
|
||||
<dd>如果未在节点中配置,则此可选属性设置请求的url。</dd>
|
||||
<dt class="optional">method <span class="property-type">字符串</span></dt>
|
||||
<dd>如果未在节点中配置,则此可选属性设置请求的HTTP方法。必须是<code>GET</code>,<code>PUT</code>,<code>POST</code>,<code>PATCH</code>或<code>DELETE</code>之一。</dd>
|
||||
<dt class="optional">headers <span class="property-type">object</span></dt>
|
||||
<dd>设置请求的HTTP头。</dd>
|
||||
<dt class="optional">cookies <span class="property-type">object</span></dt>
|
||||
<dd>如果设置,则可用于发送带有请求的cookie。</dd>
|
||||
<dt class="optional">payload</dt>
|
||||
<dd>发送为请求的正文。</dd>
|
||||
<dt class="optional">rejectUnauthorized</dt>
|
||||
<dd>如果设置为<code>false</code>,则允许对使用自签名证书的https站点进行请求。</dd>
|
||||
<dt class="optional">followRedirects</dt>
|
||||
<dd>如果设置为<code>false</code>,则阻止遵循重定向(HTTP 301)。默认情况下为<code>true</code></dd>
|
||||
<dt class="optional">requestTimeout</dt>
|
||||
<dd>如果设置为正数毫秒,将覆盖全局设置的<code>httpRequestTimeout</code>参数。</dd>
|
||||
</dl>
|
||||
<h3>输出</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">字符串 | object | buffer</span></dt>
|
||||
<dd>响应的正文。可以将节点配置为以字符串形式返回主体,尝试将其解析为JSON字符串或将其保留为二进制buffer。</dd>
|
||||
<dt>statusCode <span class="property-type">数值</span></dt>
|
||||
<dd>响应的状态码,如果请求无法完成,则返回错误码。</dd>
|
||||
<dt>headers <span class="property-type">object</span></dt>
|
||||
<dd>包含响应头的对象。</dd>
|
||||
<dt>responseUrl <span class="property-type">字符串</span></dt>
|
||||
<dd>如果在处理请求时发生任何重定向,则此属性为最终重定向的URL。否则则为原始请求的URL。</dd>
|
||||
<dt>responseCookies <span class="property-type">object</span></dt>
|
||||
<dd>如果响应包含cookie,则此属性是每个cookie的‘名称/值’键值对的对象。</dd>
|
||||
<dt>redirectList <span class="property-type">数组</span></dt>
|
||||
<dd>如果请求被重定向了一次或多次,则累积的信息将被添加到此属性。“location”是下一个重定向目标。cookie是从重定向源返回的cookie。</dd>
|
||||
</dl>
|
||||
<h3>详细</h3>
|
||||
<p>在节点内配置后,URL属性可以包含<a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache样式</a>标签。 这些标签允许使用传入消息的值来构造url。例如,如果url设置为<code>example.com/{{{{topic}}}</code>,它将自动插入<code>msg.topic</code>的值。使用{{{...}}}可以防止mustache转义/ &等字符。</p>
|
||||
<p>节点可以选择自动将<code>msg.payload</code>编码为GET请求的查询字符串参数,在这种情况下,<code>msg.payload</code>必须是一个对象。</p>
|
||||
<p><b>注意:</b>如果使用了代理,则应设置<code>http_proxy=...</code>环境变量并重新启动Node-RED,或使用“代理配置”。如果设置了代理配置,则配置优先于环境变量。</p>
|
||||
<h4>使用多个HTTP请求节点</h4>
|
||||
<p>为了在一个流程中多次使用该节点,必须要注意<code>msg.headers</code>属性的处理。通常在第一个节点在响应头中设置此属性,而不期望在下一个节点的请求头中使用此属性。如果节点之间的<code>msg.headers</code>属性保持不变,则第二个节点将忽略它。要设置自定义标题,首先应删除<code>msg.headers</code>或将其重置为空对象:<code>{}</code>。</p>
|
||||
<h4>Cookie处理</h4>
|
||||
<p>传递给节点的<code>cookies</code>属性必须是‘名称/值’键值对的对象。该值可以是设置cookie值的字符串,也可以是具有单个<code>value</code>属性的对象。</p>
|
||||
<p>请求返回的所有cookie都将在<code>responseCookies</code>属性下传递回去。</p>
|
||||
<h4>内容类型处理</h4>
|
||||
<p>如果<code>msg.payload</code>是一个对象,则节点将自动将请求的内容类型设置为<code>application/json</code>并对其进行编码。</p>
|
||||
<p>要将请求编码为表单数据,应将<code>msg.headers[“content-type”]</code>设置为<code>application/x-www-form-urlencoded</code>。</p>
|
||||
<h4>文件上传</h4>
|
||||
<p>要执行文件上传,应将<code>msg.headers["content-type"]</code>设置为<code>multipart/form-data</code>和<code>msg.payload</code>传递给节点的必须是具有以下结构的对象:</p>
|
||||
<pre><code>{
|
||||
"KEY": {
|
||||
"value": FILE_CONTENTS,
|
||||
"options": {
|
||||
"filename": "FILENAME"
|
||||
}
|
||||
}
|
||||
}</code></pre>
|
||||
<p><code>KEY</code>,<code>FILE_CONTENTS</code>和<code>FILENAME</code>的值应设置为适当的值。</p>
|
||||
|
||||
</script>
|
||||
@@ -1,35 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="websocket in">
|
||||
<p>WebSocket输入节点。</p>
|
||||
<p>默认情况下,从WebSocket接收的数据将位于<code>msg.payload</code>中。可以将套接字配置为期望格式正确的JSON字符串,在这种情况下,它将解析JSON并将结果对象作为整个消息发送。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="websocket out">
|
||||
<p>WebSocket输出节点。</p>
|
||||
<p>默认情况下,<code>msg.payload</code>将通过WebSocket发送。可以将套接字配置为将整个<code>msg</code>对象编码为JSON字符串,然后通过WebSocket发送。</p>
|
||||
<p>如果到达此节点的消息是从WebSocket In节点开始的,则该消息将发送回触发流程的客户端。否则,消息将广播给所有连接的客户端。</p>
|
||||
<p>如果要广播从“WebSocket输入”节点开始的消息,则可以应该删除流中的<code>msg._session</code>属性。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="websocket-listener">
|
||||
<p>此配置节点使用指定的路径创建WebSocket服务器端点。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="websocket-client">
|
||||
<p>此配置节点将WebSocket客户端连接到指定的URL。</p>
|
||||
</script>
|
||||
@@ -1,35 +0,0 @@
|
||||
<!--
|
||||
Copyright JS Foundation and other contributors, http://js.foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-help-name="tcp in">
|
||||
<p>提供TCP输入选择。可以连接到远程TCP端口,或接受传入连接。</p>
|
||||
<p><b>注意:</b>在某些系统上,您可能需要root或管理员权限来访问低于1024的端口。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="tcp out">
|
||||
<p>提供TCP输出的选择。可以连接到远程TCP端口,接受传入的连接,或回复从TCP In节点收到的消息。</p>
|
||||
<p>仅发送<code>msg.payload</code>。</p>
|
||||
<p>如果<code>msg.payload</code>是包含二进制数据的Base64编码的字符串,则Base64解码选项将导致它在发送之前先转换回二进制。</p>
|
||||
<p>如果不存在<code>msg._session</code>,则有效负载将发送到<b>所有</b>连接的客户端。</p>
|
||||
<p><b>注意:</b>在某些系统上,您可能需要root或管理员权限来访问低于1024的端口。</p>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="tcp request">
|
||||
<p>一个简单的TCP请求节点。将<code>msg.payload</code>发送到服务器tcp端口,并期望得到响应。</p>
|
||||
<p>连接到服务器,发送“请求”并接收“响应”。 可以从固定数量的字符,与指定字符匹配的字符中选择操作,从第一个答复到达起等待指定的时间,等待数据到达,发送数据并立即取消连接而无需等待答复等操作中进行选择。</p>
|
||||
<p>响应将在<code>msg.payload</code>中作为buffer输出,因此您可能需要对它进行<code>.toString()</code>操作。</p>
|
||||
<p>如果将tcp主机或端口留空,则必须使用<code>msg.host</code>和<code>msg.port</code>属性进行设置。</p>
|
||||
</script>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user