Compare commits

...

165 Commits

Author SHA1 Message Date
Nick O'Leary
b73f12cdba Bump for 0.20.6 2019-06-21 13:25:39 +01:00
Nick O'Leary
28fbb61e81 Bump dependencies 2019-06-21 13:25:09 +01:00
Nick O'Leary
c1104d1cd6 Revealing node position needs to account for zoom level
Fixes #2172
2019-06-21 12:53:09 +01:00
Dave Conway-Jones
e346702292 stop join tripping up if last message of buffer is blank. 2019-06-21 12:49:21 +01:00
Nick O'Leary
90887779ea Improve handling of file upload in request node
formData can only be Strings or Buffers - anything else will cause
errors. To help matters, we now look for invalid types and json-encode
them where needed.
2019-06-21 12:48:13 +01:00
Nick O'Leary
a941b1437c Handle subflow internal node wired to a non-existant node
Fixes #2202
2019-06-21 12:47:37 +01:00
Nick O'Leary
04bdcbd490 Do not save subflow env vars with blank names 2019-06-21 12:46:53 +01:00
Nick O'Leary
87a815fd6f Don't allow a link node virtual wire to connect to normal port 2019-06-21 12:45:50 +01:00
Nick O'Leary
46abd0cc42 Clear HTTP Request node authType when auth disabled
Fixes #2215
2019-06-20 22:33:38 +01:00
Nick O'Leary
e315325d91 Fix parsing of content-type header
Fixes #2216

This was broken when we switched from media-typer to content-type
modules for parsing the content-type header.

The content-type header can handle the field with parameters, but
does not do the type/sub-type parsing that media-typer does.

Our code relied on that extra bit of parsing to correctly
identify if the content should be parsed to String or kept as
a buffer.

The fix restores the use of media-typer, but using the result
of the content-type module to make sure it valid
2019-06-20 21:15:20 +01:00
Dave Conway-Jones
f3fc083330 Fix join node reset issue with merging objects
and add tests
to close #2188
2019-06-20 19:47:53 +01:00
Nick O'Leary
8486f4d43a Copy data-i18n attribute on TypedInput
Fixes #2211
2019-06-19 10:10:17 +01:00
Nick O'Leary
ccc3809daa Make 'anything else' template more explicit 2019-06-09 17:32:14 +01:00
Nick O'Leary
e0111d3fe6 Merge pull request #2167 from minzojian/master
update packages\node_modules\@node-red\runtime\lib\index.js
2019-05-24 10:09:21 +01:00
KentWood
87a1f616b0 Update index.js
fixed a error when run node-red with httpAdminRoot=false
https://github.com/node-red/node-red/issues/2166
2019-05-18 17:04:56 +08:00
Nick O'Leary
cc051544f9 Only NLS status text that starts with a letter
Fixes #2128
2019-05-17 16:32:14 +01:00
Nick O'Leary
6a57d25f4a Trigger change evnt on typedInput when type changes and options present
Fixes #2160
2019-05-17 11:45:16 +01:00
Nick O'Leary
91473e731e Merge pull request #2126 from natcl/master
http request node: warn user if msg.requestTimeout == 0
2019-05-17 10:47:37 +01:00
Nick O'Leary
651b1c92c3 Merge pull request #2156 from bernardobelchior/patch-1
Remove unnecessary ternary
2019-05-17 10:45:36 +01:00
Nick O'Leary
77e74eb37b Merge pull request #2159 from hobbyquaker/master
german localization improvements
2019-05-17 10:44:50 +01:00
Nick O'Leary
364175fa9d Merge pull request #2163 from node-red-hitachi/fix-debug-node-memory-leak
Fix possible memory leak of debug sidebar output
2019-05-09 14:51:20 +01:00
Hiroyasu Nishiyama
13cf2b48e1 use jQuery DOM manipulation instead of raw JS 2019-05-09 18:06:10 +09:00
Bernardo Belchior
f0b1585b52 Remove redundant conditional 2019-05-08 18:51:16 +01:00
hobbyquaker
5e7689a151 i18n-german fix typos 2019-05-04 09:47:29 +02:00
hobbyquaker
42845cfcc0 i18n-german subflows https://github.com/jwende/nodered-german/issues/14 2019-05-04 09:36:58 +02:00
hobbyquaker
caad0eca67 i18n-german fix typo 2019-05-04 09:33:54 +02:00
hobbyquaker
69db23f2f6 i18n-german retain https://github.com/jwende/nodered-german/issues/16 2019-05-03 19:59:40 +02:00
hobbyquaker
c3f6bcad56 i18n-german payload https://github.com/jwende/nodered-german/issues/9 2019-05-03 19:58:50 +02:00
hobbyquaker
ab1521bf26 i18n-german topic https://github.com/jwende/nodered-german/issues/8 2019-05-03 19:56:44 +02:00
hobbyquaker
fafe8b88c2 i18n-german number https://github.com/jwende/nodered-german/issues/6 2019-05-03 19:54:45 +02:00
hobbyquaker
9276988ff6 i18n-german buffer https://github.com/jwende/nodered-german/issues/6 2019-05-03 19:52:28 +02:00
hobbyquaker
85179edf1b i18n-german string https://github.com/jwende/nodered-german/issues/6 2019-05-03 19:51:56 +02:00
hobbyquaker
2f1ba6cf1f i18n-german https://github.com/jwende/nodered-german/issues/4 2019-05-03 19:47:30 +02:00
hobbyquaker
93674b4e29 i18n-german https://github.com/jwende/nodered-german/issues/3 2019-05-03 19:22:50 +02:00
hobbyquaker
20851664e8 i18n-german https://github.com/jwende/nodered-german/issues/2 2019-05-03 19:21:50 +02:00
hobbyquaker
38c87a056c i18n-german https://github.com/jwende/nodered-german/issues/1 2019-05-03 19:20:19 +02:00
Bernardo Belchior
12ff3abeda Remove unnecessary ternary 2019-04-30 14:19:51 +01:00
Nick O'Leary
742bf85a89 Bump all dependencies
Fixes #2152
2019-04-29 08:42:37 +01:00
Nick O'Leary
c7587960fb Fix display of link node list within subflow
Fixes #2140
2019-04-25 11:58:59 +01:00
Nick O'Leary
5c962aa899 Merge pull request #2138 from kazuhitoyokoi/master-fixdraggable
Fix node drag and drop animation
2019-04-25 11:54:07 +01:00
Dave Conway-Jones
4588089bd6 hide delay node reset label on deploy
to close #2145
2019-04-21 10:31:36 +01:00
Kazuhito Yokoi
44b75f0b92 Adjust node animation speed 2019-04-16 11:02:51 +09:00
Kazuhito Yokoi
162bd6a8c3 Fix node drag and drop animation 2019-04-16 09:47:08 +09:00
Nick O'Leary
ed2a45e975 Bump for 0.20.5 2019-04-05 13:46:25 +01:00
Nick O'Leary
0fa165c606 Revert error handling in palette manager 2019-04-05 13:45:06 +01:00
Nick O'Leary
fe63ab1242 Bump packages to 0.20.4 2019-04-05 10:21:11 +01:00
Nick O'Leary
faf808da69 Update changelog 2019-04-05 10:13:15 +01:00
Dave Conway-Jones
71709cd662 reduce udp out timeout to be less than default inject at start
to address Issue #2127
2019-04-04 21:59:47 +01:00
Nick O'Leary
d92040b804 Add error message if catalog invalid json 2019-04-04 11:36:12 +01:00
Nick O'Leary
6175fecdd8 Update changelog 2019-04-03 10:12:12 +01:00
Nick O'Leary
fab632da62 Bump for 0.20.4 2019-04-03 10:11:36 +01:00
Nathanaël Lécaudé
c1e3b0d971 http request node: warn user if msg.requestTimeout == 0 2019-04-02 15:00:25 -04:00
Nick O'Leary
7b15ba31ea Merge pull request #2125 from kazuhitoyokoi/master-fixfilenode
Fix encoding menu in file node
2019-04-02 16:50:14 +01:00
Nick O'Leary
f11d4ccd45 Switch media-typer to content-type module
Fixes #2122 #2123
2019-04-02 16:45:30 +01:00
Nick O'Leary
fbec803129 Use userObj.username and not .name for ssh key lookup
Closes #2109
2019-04-02 14:06:37 +01:00
Kazuhito Yokoi
0f57d1a433 Fix encoding menu in file node 2019-04-02 21:35:41 +09:00
Nick O'Leary
63829b6382 Ensure mqtt message handlers are tidied up properly on partial deploy 2019-03-29 10:30:40 +00:00
Nick O'Leary
8ac3899ddc Merge pull request #2100 from node-red-hitachi/master-korean
Add Korean locales files for nodes
2019-03-28 22:38:22 +00:00
Nick O'Leary
92bb9bb3c3 Merge pull request #2116 from aiot-maker/master
Add explanation to the help text on the new feature to build query st…
2019-03-28 22:36:21 +00:00
Nick O'Leary
ea333c19f7 Update package dependencies 2019-03-28 14:46:16 +00:00
Nick O'Leary
28ef879c07 Update ACE to 1.4.3-src-min-noconflict
Fixes #2106
2019-03-28 14:02:09 +00:00
Nick O'Leary
10839abf24 Fix creating missing package.json when existing project imported
Fixes #2115
2019-03-28 13:46:52 +00:00
Nick O'Leary
9832394f8e Allow subflow instance to override env var with falsey values
Fixes #2113
2019-03-28 13:33:54 +00:00
Nick O'Leary
dd89ea3731 Prevent wire from normal node to link virtual port
Fixes #2114
2019-03-28 10:48:48 +00:00
Andrei Ochmat
5d9fd6dc3b Add explanation to the help text on the new feature to build query string from msg.payload 2019-03-27 15:45:28 -03:00
Nick O'Leary
fe2360883f Bump bcrypt to latest 2019-03-20 17:01:58 +00:00
Nick O'Leary
b45ddadb09 Bump for 0.20.3 2019-03-20 15:24:23 +00:00
Nick O'Leary
a3cbe80a36 Do not dynamically add/remove upgrade listener in ws nodes
The way we dynamically added/removed event handlers for the
upgrade event was causing problems with the way sockjs (as
used by the worldmap node) tries to intercept the event.

This fix means the ws nodes won't ever remove the upgrade
listener - it gets added once when the first ws node is
deployed and will then remain until the last ws node is
removed and the runtime restarted.
2019-03-20 14:58:26 +00:00
Nick O'Leary
ee6c6266cc Avoid env var reference loops and support $parent. prefix
Fixes #2099
2019-03-20 13:37:33 +00:00
李赫柱
d6bd35287f Add Korean locales files for nodes 2019-03-20 18:27:04 +09:00
Nick O'Leary
962a29110c Ensure config._flow is non-enumerable so is ignored by JSON.stringify
Fixes  https://github.com/pdmangel/node-red-contrib-openhab2/issues/36
2019-03-18 15:11:56 +00:00
Nick O'Leary
a242475b38 Block loading ACE from cdn 2019-03-18 10:55:12 +00:00
Nick O'Leary
d59bf84470 Update changelog 2019-03-15 19:04:31 +00:00
Nick O'Leary
161ee17f45 Bump for 0.20.2 2019-03-15 19:03:30 +00:00
Nick O'Leary
8aa00b0cfc Filter out duplicate nodes when importing a flow 2019-03-15 19:02:24 +00:00
Nick O'Leary
afe89c3621 Handle node configs with multiple external scripts properly
If the config had multiple scripts, we were calling the done
callback once for each script. This in turn led to duplicate
flows being loaded.
2019-03-15 18:50:58 +00:00
Nick O'Leary
bdf68311b4 Bump for 0.20.1 2019-03-15 11:22:01 +00:00
Nick O'Leary
afa69f4c0e Ensure all subflow instances are stopped when flow stopping
Fixes #2095
2019-03-15 09:13:32 +00:00
Nick O'Leary
6fe2b24592 Merge pull request #2091 from node-red-hitachi/korean
modify name of korean locale folders
2019-03-14 15:25:52 +00:00
李赫柱
7442b356e3 modify name of korean locale forders 2019-03-14 09:53:24 +09:00
Nick O'Leary
1d7be6457f Ensure node names are sanitized before being presented 2019-03-13 16:08:11 +00:00
Nick O'Leary
c9ff05ba80 Subflow status node must pass status to parent flow
Fixes #2087
2019-03-13 13:14:34 +00:00
Nick O'Leary
faae184f1c Merge pull request #2090 from node-red-hitachi/fix-file-node-encoding-menu
Fix problem on displaying option label on Firefox
2019-03-13 10:46:23 +00:00
Hiroyasu Nishiyama
515a8a9bbb fix problem on displaying option label on Firefox 2019-03-13 19:17:32 +09:00
Nick O'Leary
58914e5c5f Bump package to 0.20.0 2019-03-12 14:53:12 +00:00
Nick O'Leary
c944eaab5c Fix max call stack err when getting node from inside subflow 2019-03-12 14:40:47 +00:00
Nick O'Leary
d3d9533493 Search subflows instances when looking for given node id 2019-03-12 14:25:36 +00:00
Nick O'Leary
9c474cc089 Bump for 0.20 2019-03-12 10:59:20 +00:00
Nick O'Leary
3f1b0b986f Handle node name as unsanitized text in debug sidebar 2019-03-12 10:37:24 +00:00
Nick O'Leary
28e08ebaf5 Add envVarExcludes setting to block named env vars 2019-03-07 22:54:20 +00:00
Nick O'Leary
3213c03754 Update settings.js docs on userDir to match reality
Fixes #2082
2019-03-07 19:58:54 +00:00
Nick O'Leary
4447288a4c Merge pull request #2083 from node-red-hitachi/fix-typo-JP-info-httprequest
Fix typo in Japanese info text of httprequest node
2019-03-07 19:58:26 +00:00
Hiroyasu Nishiyama
eee4e83a1e fix minor typo in Japanese info text of httprequest node 2019-03-07 22:50:56 +09:00
Nick O'Leary
a67b492620 Merge pull request #2081 from node-red-hitachi/dev-korean
Add Korean Language
2019-03-07 10:02:42 +00:00
Nick O'Leary
6062ff2748 Merge pull request #2080 from node-red-hitachi/update-JP-info-httprequest
Update info text of httprequest node
2019-03-07 10:02:09 +00:00
Dave Conway-Jones
3b11195caa Add --no-update-notifier flag to npm calls to speedup processing. 2019-03-07 09:03:25 +00:00
李赫柱
9946ea111c Add Korean Language 2019-03-07 10:33:55 +09:00
Hiroyasu Nishiyama
7074d66f8e fix unmatched tag in English info text of httprequest node 2019-03-07 10:06:57 +09:00
Hiroyasu Nishiyama
008b26f329 update JP info text of httprequest node 2019-03-07 10:04:06 +09:00
Dave Conway-Jones
b246f0779f re-fix merge of file nodes 2019-03-06 22:33:20 +00:00
Hiroyasu Nishiyama
dc89218702 add encoding support to file in/out node (#2066)
* add encoding support to file in/out node

* update package.json

* change default encoding label: 'none' -> 'utf8[default]'

* add a missing message catalogue entry

* change default encoding label
2019-03-06 22:28:33 +00:00
Nick O'Leary
3c013b3533 Add file upload test for http request node 2019-03-06 21:21:35 +00:00
Nick O'Leary
fe0d0f08e4 Merge branch 'pr_2078' into dev 2019-03-06 15:51:16 +00:00
Nick O'Leary
38b5063038 Tidy up blockquote css style 2019-03-05 20:56:35 +00:00
Nick Kasten
e55481a454 conditional formData assignment only 2019-03-05 11:12:59 -06:00
Nick Kasten
7063a88513 improved info panel UI 2019-03-05 10:31:25 -06:00
Nick Kasten
a9bf3d0226 add multipart/form-data support to http request node 2019-03-05 09:55:21 -06:00
Nick O'Leary
781b3aff1b Merge branch 'dev' into pr_2076 2019-03-05 14:37:33 +00:00
Nick O'Leary
b011b9203b Keep subflow palette appearance in sync with edits 2019-03-05 14:37:07 +00:00
Nick O'Leary
39344fcae5 Fix background of tab select icon 2019-03-05 13:25:44 +00:00
Nick O'Leary
a046b357da Tidy up registry/loader api used by unit tests
Fixes #2073
2019-03-05 13:25:44 +00:00
Nick O'Leary
d8e4020cec Merge pull request #2075 from kazuhitoyokoi/dev-fixlibrarybug
Fix module name bug in import menu
2019-03-05 13:05:36 +00:00
Kazuhito Yokoi
f80b172022 Add condition to handle existing node 2019-03-05 21:29:03 +09:00
Kazuhito Yokoi
66fc4b536c Automatic placing of node icon 2019-03-05 21:21:23 +09:00
Kazuhito Yokoi
1f97ccdddb Fix module name bug in library 2019-03-05 19:38:56 +09:00
Nick O'Leary
308d6889a7 Update changelog 2019-03-05 10:18:40 +00:00
Nick O'Leary
c3b9982c44 Add --no-audit flag to npm commands to reduce overhead 2019-03-05 10:17:30 +00:00
Nick O'Leary
fab796e4e4 Modify trigger spec timings to reduce false-positive test runs 2019-03-05 09:48:43 +00:00
Nick O'Leary
749db6ba82 Merge pull request #2072 from node-red-hitachi/update-messages-JP
Update Japanese messages
2019-03-05 08:36:24 +00:00
Hiroyasu Nishiyama
12d6c4ddf5 add missing Japanese translation 2019-03-05 11:57:06 +09:00
Hiroyasu Nishiyama
430a03bb14 update JP message catalogue 2019-03-05 11:14:02 +09:00
Nick O'Leary
43f21fc7aa Add list-flows action and button 2019-03-04 22:37:51 +00:00
Nick O'Leary
b27da3d1a0 Update changelog 2019-03-04 16:15:06 +00:00
Nick O'Leary
4463a8e3b2 Add exportGlobalContextKeys to prevent exposing fgc keys 2019-03-04 16:10:39 +00:00
Nick O'Leary
9e74ddac48 Bump dependencies 2019-03-04 12:33:36 +00:00
Nick O'Leary
5f62e41d62 update changelog 2019-03-04 11:17:19 +00:00
Nick O'Leary
19a103d3a0 Add _session and event to WS/TCP Status messages 2019-03-04 11:09:18 +00:00
Nick O'Leary
8fb6bc059e Pass complete status to Status node and filter to editor 2019-03-04 10:23:10 +00:00
Nick O'Leary
8f61a0d258 Fix message catalog formatting 2019-03-03 12:05:20 +00:00
Nick O'Leary
7fa589e430 Merge pull request #2068 from node-red-hitachi/i18n-port-label
Add i18n support for port label
2019-03-03 11:52:20 +00:00
Nick O'Leary
6d8d826764 Merge branch 'dev' into i18n-port-label 2019-03-03 11:52:12 +00:00
Nick O'Leary
a40e84e1f6 Merge pull request #2070 from bartbutenaers/dev
Fix hiding Bearer token
2019-03-03 11:49:48 +00:00
bartbutenaers
4844c2123f Fix hiding Bearer token 2019-03-01 23:18:48 +01:00
Nick O'Leary
236d437430 Add api docs landing content 2019-02-28 22:21:22 +00:00
Hiroyasu Nishiyama
ae726c199b add i18n support for port label of inject/exec/httprequest/file node 2019-02-28 20:22:33 +09:00
Nick O'Leary
e7f54f005c Merge pull request #2060 from jeancarl/dev
Transfer input attributes (placeholder, type) to generated TypedInput field
2019-02-28 10:50:15 +00:00
bartbutenaers
e7b1ec6904 Add Digest and Bearer Auth modes to http request node (#2061)
* Authentication methods

* Authentication methods

* Authentication methods

* Support undefined auth type

* Support undefined auth type

* Apply basic auth on existing nodes

* Use password as bearer token

* Use password as bearer token

* Switch between password/token labels

* Bearer token abbreviation

* Separate token span
2019-02-27 22:15:31 +00:00
Nick O'Leary
f4f664a4a2 Ensure flows wait for all nodes to close before restarting
Fixes #2067
2019-02-27 20:56:58 +00:00
Nick O'Leary
fec52a8151 Merge branch 'master' into dev 2019-02-26 21:44:36 +00:00
Nick O'Leary
d8b4c1e209 Rename issue templates to fix their order 2019-02-26 21:14:25 +00:00
Nick O'Leary
eac853c7dd Update issue templates 2019-02-26 21:12:42 +00:00
Nick O'Leary
a04337a270 Merge branch 'master' into dev 2019-02-25 14:46:25 +00:00
Nick O'Leary
50d7e16365 Bump for 0.19.6 2019-02-25 14:40:08 +00:00
Nick O'Leary
ef7bc931b7 Merge pull request #2051 from node-red-hitachi/fix-multi-byte-output
Fix output of multi-byte string with file node
2019-02-25 10:48:23 +00:00
Nick O'Leary
41de771074 Fix git clone with password protected key 2019-02-21 22:44:56 +00:00
Dave Conway-Jones
2ebdd6c5cb let join node handle merged objects with repeated properties and honour parts
to close issue from slack re repeated {"d":"d","d":"d","d":"d"}  messages
2019-02-20 00:11:31 +00:00
Nick O'Leary
b51cfcc753 Merge pull request #2062 from kazuhitoyokoi/dev-fixtypo
Fix typo and update message catalog
2019-02-19 09:35:35 +00:00
Kazuhito Yokoi
91cc03dd80 Fix typo and update message catalog 2019-02-19 14:24:37 +09:00
Nick O'Leary
9d673a213e Use absolute flow file path in project settings
This ensures the diff logic can recognise the project flow file
and apply merge resolution to paths that git knows
2019-02-17 22:18:40 +00:00
JeanCarl
97e789538e Transfer placeholder and type to generated TypedInput field 2019-02-15 14:40:19 -08:00
Nick O'Leary
e05ff01d57 Allow a project to be located below the root of repo 2019-02-15 22:11:25 +00:00
Dave Conway-Jones
0748dff355 And fix the JSON node test 2019-02-15 17:16:27 +00:00
Dave Conway-Jones
28d4084aa0 ensure JSON node handles single booleans and numbers 2019-02-15 17:07:11 +00:00
Nick O'Leary
afd2ccfb4f Detect the cloning of an empty git repo properly 2019-02-14 14:00:25 +00:00
Nick O'Leary
057127f4de Hitting enter in Comment node name field clicks markdown button
When Enter is pressed in a form, the browser will find the first
submittable element and trigger it. By default <button> elements
have type set to 'submit' which causes them to be targetted by
this behaviour.

Adding `type="button"` prevents this behaviour. This change
targets some main offenders - in particular the markdown toolbar.

There are of lots of other `<button>` elements without this attribute
set, so they need tidying up. Not currently aware of any others that
exist in a <Form> so may be immune from this behaviour.
2019-02-13 20:41:34 +00:00
Dave Conway-Jones
2937b25d6d Shift status text left if no shape specified 2019-02-13 14:36:36 +00:00
Nick O'Leary
419f26db87 Fix use of custom auth strategy plugins 2019-02-12 10:45:38 +00:00
Nick O'Leary
be1b9c0e43 Handle treeList labels as text not html 2019-02-11 16:15:25 +00:00
Nick O'Leary
894d28c60b Remove remnants of when library in git/index
Fixes #2057
2019-02-11 09:01:40 +00:00
Nick O'Leary
06cc08d9f7 Better align node status text to status dot 2019-02-09 21:27:54 +00:00
Nick O'Leary
75393c0b28 Clear subflow status no close 2019-02-09 21:24:31 +00:00
Nick O'Leary
bdc1da70c1 Change subflow edit dialog titles 2019-02-09 21:20:20 +00:00
Nick O'Leary
7cef990ba6 Resize subflow edit dialog properly 2019-02-09 20:44:21 +00:00
Hiroyasu Nishiyama
a713c92530 convert to buffer before write 2019-02-07 22:46:21 +09:00
Hiroyasu Nishiyama
1db1ec7b5e fix encoding of file node from binary to utf8 2019-02-06 21:53:23 +09:00
198 changed files with 6836 additions and 985 deletions

39
.github/ISSUE_TEMPLATE/--bug_report.md vendored Normal file
View File

@@ -0,0 +1,39 @@
---
name: Bug report
about: Reproducable software issues in the core of Node-RED
title: ''
labels: ''
assignees: ''
---
<!--
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
If your issue is:
- a general 'how-to' type question,
- a feature request or suggestion for a change,
- or problems with 3rd party (`node-red-contrib-`) nodes
please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
That way the whole Node-RED user community can help, rather than rely on the core development team.
To help us understand the issue, please fill-in as much of the following information as you can:
-->
### What are the steps to reproduce?
### What happens?
### What do you expect to happen?
### Please tell us about your environment:
- [ ] Node-RED version:
- [ ] node.js version:
- [ ] npm version:
- [ ] Platform/OS:
- [ ] Browser:

View File

@@ -0,0 +1,17 @@
---
name: Anything Else
about: Something that is not a bug report
title: ''
labels: ''
assignees: ''
---
Please DO NOT raise an issue.
We DO NOT use the issue tracker for general support or feature requests. Only bug reports should be raised here using the 'Bug report' template.
For general support, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
That way the whole Node-RED user community can help, rather than rely on the core development team.
For feature requests, please use the Node-RED Forum](https://discourse.nodered.org). Many ideas have already been discussed there and you should search that for your request before starting a new discussion.

15
API.md Normal file
View File

@@ -0,0 +1,15 @@
Node-RED Modules
---
Node-RED provides a set of node modules that implement different parts of the
application.
Module | Description
-------|-------
[node-red](node-red.html) | the main module that pulls together all of the internal modules and provides the executable version of Node-RED
[@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API
[@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED
[@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules
@node-red/registry | the internal node registry
@node-red/nodes | the default set of core nodes
@node-red/editor-client | the client-side resources of the Node-RED editor application

View File

@@ -1,3 +1,98 @@
#### 0.20.6: Maintenance Release
- Revealing node position needs to account for zoom level Fixes #2172
- stop join tripping up if last message of buffer is blank.
- Improve handling of file upload in request node
- Handle subflow internal node wired to a non-existant node Fixes #2202
- Do not save subflow env vars with blank names
- Don't allow a link node virtual wire to connect to normal port
- Clear HTTP Request node authType when auth disabled Fixes #2215
- Fix parsing of content-type header Fixes #2216
- Fix join node reset issue with merging objects
- Copy data-i18n attribute on TypedInput Fixes #2211
#### 0.20.5: Maintenance Release
- Revert error handling in palette manager
#### 0.20.4: Maintenance Release
- Switch media-typer to content-type module Fixes #2122 #2123
- Use userObj.username and not .name for ssh key lookup Closes #2109
- Ensure mqtt message handlers are tidied up properly on partial deploy
- Update package dependencies
- Fix encoding menu in file node #2125
- Update ACE to 1.4.3-src-min-noconflict Fixes #2106
- Fix creating missing package.json when existing project imported Fixes #2115
- Allow subflow instance to override env var with falsey values Fixes #2113
- Prevent wire from normal node to link virtual port Fixes #2114
- Add explanation to the help text on the new feature to build query string from msg.payload #2116
- Bump bcrypt to latest
- Add Korean locales files for nodes #2100
- Add error message if catalog is invalid json
- Reduce udp out timeout to be less than default inject at start #2127
#### 0.20.3: Maintenance Release
- Do not dynamically add/remove upgrade listener in ws nodes
- Avoid env var reference loops and support $parent. prefix Fixes #2099
- Ensure config.\_flow is non-enumerable so is ignored by JSON.stringify
- Block loading ACE from cdn
#### 0.20.2: Maintenance Release
- Filter out duplicate nodes when importing a flow
- Handle node configs with multiple external scripts properly
#### 0.20.1: Maintenance Release
- Ensure all subflow instances are stopped when flow stopping Fixes #2095
- modify name of korean locale forders #2091
- Ensure node names are sanitized before being presented
- Subflow status node must pass status to parent flow Fixes #2087
- fix problem on displaying option label on Firefox #2090
#### 0.20.0: Milestone Release
Runtime
- Pass complete status to Status node and filter to editor
- Ensure flows wait for all nodes to close before restarting Fixes #2067
- Fix git clone with password protected key
- Allow a project to be located below the root of repo
- Detect the cloning of an empty git repo properly
- Fix use of custom auth strategy plugins
- Remove remnants of when library in git/index Fixes #2057
- Clear subflow status on close
- Add exportGlobalContextKeys to prevent exposing functionGlobalContext keys
- Add --no-audit and --no-update-notifier flags to npm commands to reduce workload
- Add envVarExcludes setting to block named env vars
- Update settings.js docs on userDir to match reality Fixes #2082
- Add Korean Language
Editor
- Automatic placing of node icon according to input/output counts
- Transfer placeholder and type to generated TypedInput field
- Hitting enter in Comment node name field clicks markdown button
- Shift status text left if no shape specified
- Better align node status text to status dot
- Handle treeList labels as text not html
- Change subflow edit dialog titles
- Resize subflow edit dialog properly
- Add flow list button to tab bar
- Handle node name as unsanitized text in debug sidebar
Nodes
- HTTP Request: Add Digest and Bearer Auth modes to http request node (#2061)
- HTTP Request: Add multipart/form-data support to http request node (#2076)
- TCP: include session/event info in status events
- WebSocket: include session/event info in status events
- Add i18n support for port label of inject/exec/httprequest/file nodes
- Join node: handle merged objects with repeated properties and honour parts
- JSON node: handle single booleans and numbers
- File node: add encoding support to file in/out node (#2066)
#### 0.20.0-beta.5: Beta Release
Runtime
@@ -194,6 +289,9 @@ Nodes
- Watch: add msg.filename so can feed direct to file in node
- WebSocket: preserve \_session on msg but don't send as part of wholemsg
#### 0.19.6: Maintenance Release
- Fix encoding of file node from binary to utf8 - #2051
#### 0.19.5: Maintenance Release

View File

@@ -438,6 +438,7 @@ module.exports = function(grunt) {
jsdoc : {
modules: {
src: [
'API.md',
'packages/node_modules/node-red/lib/red.js',
'packages/node_modules/@node-red/runtime/lib/index.js',
'packages/node_modules/@node-red/runtime/lib/api/*.js',
@@ -451,7 +452,7 @@ module.exports = function(grunt) {
configure: './jsdoc.json'
}
},
editor: {
_editor: {
src: [
'packages/node_modules/@node-red/editor-client/src/js'
],
@@ -612,5 +613,5 @@ module.exports = function(grunt) {
grunt.registerTask('docs',
'Generates API documentation',
['jsdoc','jsdoc2md']);
['jsdoc']);
};

View File

@@ -1,6 +1,6 @@
{
"name": "node-red",
"version": "0.20.0-beta.5",
"version": "0.20.6",
"description": "A visual tool for wiring the Internet of Things",
"homepage": "http://nodered.org",
"license": "Apache-2.0",
@@ -24,56 +24,58 @@
}
],
"dependencies": {
"ajv": "6.8.1",
"ajv": "6.10.0",
"basic-auth": "2.0.1",
"bcryptjs": "2.4.3",
"body-parser": "1.18.3",
"body-parser": "1.19.0",
"cheerio": "0.22.0",
"clone": "2.1.2",
"cookie": "0.3.1",
"cookie-parser": "1.4.3",
"content-type": "1.0.4",
"cookie": "0.4.0",
"cookie-parser": "1.4.4",
"cors": "2.8.5",
"cron": "1.6.0",
"denque": "1.4.0",
"express": "4.16.4",
"express-session": "1.15.6",
"fs-extra": "7.0.1",
"cron": "1.7.1",
"denque": "1.4.1",
"express": "4.17.1",
"express-session": "1.16.1",
"fs-extra": "8.0.1",
"fs.notify": "0.0.4",
"hash-sum": "1.0.2",
"https-proxy-agent": "2.2.1",
"i18next": "14.1.1",
"i18next": "15.1.0",
"iconv-lite": "0.4.24",
"is-utf8": "0.2.1",
"js-yaml": "3.12.1",
"js-yaml": "3.13.1",
"json-stringify-safe": "5.0.1",
"jsonata": "1.6.4",
"media-typer": "1.0.1",
"memorystore": "1.6.0",
"mime": "2.4.0",
"media-typer": "1.1.0",
"memorystore": "1.6.1",
"mime": "2.4.4",
"mqtt": "2.18.8",
"multer": "1.4.1",
"mustache": "3.0.1",
"node-red-node-email": "1.0.*",
"node-red-node-email": "^1.4.0",
"node-red-node-feedparser": "^0.1.14",
"node-red-node-rbe": "0.2.*",
"node-red-node-sentiment": "^0.1.0",
"node-red-node-rbe": "^0.2.4",
"node-red-node-sentiment": "^0.1.3",
"node-red-node-tail": "^0.0.2",
"node-red-node-twitter": "^1.1.0",
"node-red-node-twitter": "^1.1.4",
"nopt": "4.0.1",
"oauth2orize": "1.11.0",
"on-headers": "1.0.1",
"on-headers": "1.0.2",
"passport": "0.4.0",
"passport-http-bearer": "1.0.1",
"passport-oauth2-client-password": "0.1.2",
"raw-body": "2.3.3",
"raw-body": "2.4.0",
"request": "2.88.0",
"semver": "5.6.0",
"uglify-js": "3.4.9",
"semver": "6.1.1",
"uglify-js": "3.6.0",
"when": "3.7.8",
"ws": "6.1.3",
"ws": "6.2.1",
"xml2js": "0.4.19"
},
"optionalDependencies": {
"bcrypt": "~2.0.0"
"bcrypt": "3.0.6"
},
"devDependencies": {
"grunt": "~1.0.3",
@@ -110,7 +112,7 @@
"wdio-mocha-framework": "^0.6.4",
"wdio-spec-reporter": "^0.1.5",
"webdriverio": "^4.14.1",
"node-red-node-test-helper": "node-red/node-red-node-test-helper",
"node-red-node-test-helper": "^0.2.2",
"jsdoc-nr-template": "node-red/jsdoc-nr-template"
},
"engines": {

View File

@@ -199,7 +199,7 @@ function genericStrategy(adminApp,strategy) {
if (/^post$/i.test(options.callbackMethod)) {
callbackMethodFunc = adminApp.post;
}
callbackMethodFunc('/auth/strategy/callback',
callbackMethodFunc.call(adminApp,'/auth/strategy/callback',
passport.authenticate(strategy.name, {session:false, failureRedirect: settings.httpAdminRoot }),
completeGenerateStrategyAuth
);

View File

@@ -1,6 +1,6 @@
{
"name": "@node-red/editor-api",
"version": "0.20.0-beta.5",
"version": "0.20.6",
"license": "Apache-2.0",
"main": "./lib/index.js",
"repository": {
@@ -16,22 +16,25 @@
}
],
"dependencies": {
"@node-red/util": "0.20.0-beta.5",
"@node-red/editor-client": "0.20.0-beta.5",
"@node-red/util": "0.20.6",
"@node-red/editor-client": "0.20.6",
"bcryptjs": "2.4.3",
"body-parser": "1.18.3",
"body-parser": "1.19.0",
"clone": "2.1.2",
"cors": "2.8.5",
"express-session": "1.15.6",
"express": "4.16.4",
"memorystore": "1.6.0",
"mime": "2.4.0",
"express-session": "1.16.1",
"express": "4.17.1",
"memorystore": "1.6.1",
"mime": "2.4.4",
"mustache": "3.0.1",
"oauth2orize": "1.11.0",
"passport-http-bearer": "1.0.1",
"passport-oauth2-client-password": "0.1.2",
"passport": "0.4.0",
"when": "3.7.8",
"ws": "6.1.3"
"ws": "6.2.1"
},
"optionalDependencies": {
"bcrypt": "3.0.5"
}
}

View File

@@ -48,9 +48,9 @@
},
"settings" : "Einstellungen",
"userSettings" : "Benutzereinstellungen",
"nodes" : "Knoten",
"displayStatus" : "Knotenstatus anzeigen",
"displayConfig" : "Konfigurationsknoten",
"nodes" : "Nodes",
"displayStatus" : "Nodestatus anzeigen",
"displayConfig" : "Konfigurations-Node",
"import" : "Import",
"export" : "Exportieren",
"search" : "Flows durchsuchen",
@@ -87,17 +87,17 @@
"notAuthorized" : "Keine Berechtigung",
"errors" : {
"settings" : "Sie müssen angemeldet sein, um auf die Einstellungen zuzugreifen.",
"deploy" : "Sie müssen angemeldet sein, um Änderungen implementieren zu können.",
"deploy" : "Sie müssen angemeldet sein, um Änderungen anwenden zu können.",
"notAuthorized" : "Sie müssen angemeldet sein, um diese Aktion ausführen zu können."
}
},
"notification" : {
"warning" : "<strong> Warnung </strong>: __message__",
"warnings" : {
"undeployedChanges" : "Knoten hat nicht implementierte Änderungen",
"nodeActionDisabled" : "In Subflow inaktivierte Knotenaktionen",
"missing-types" : "<p> Die Flows wurden aufgrund fehlender Knotentypen gestoppt. </p>",
"restartRequired" : "Knoten-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können",
"undeployedChanges" : "Node hat nicht implementierte Änderungen",
"nodeActionDisabled" : "In Subflow inaktivierte Nodeaktionen",
"missing-types" : "<p> Die Flows wurden aufgrund fehlender Nodetypen gestoppt. </p>",
"restartRequired" : "Node-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können",
"credentials_load_failed" : "<p> Die Flows wurden gestoppt, da die Berechtigungsnachweise nicht entschlüsselt werden konnten. </p> <p> Die Datei mit dem Datenflowberechtigungsnachweis ist verschlüsselt, aber der Verschlüsselungsschlüssel des Projekts fehlt oder ist ungültig. </p>",
"credentials_load_failed_reset" : "<p> Die Berechtigungsnachweise konnten nicht entschlüsselt werden </p> <p> Die Datei mit dem Flow-Berechtigungsnachweis ist verschlüsselt, aber der Chiffrierschlüssel des Projekts fehlt oder ist ungültig. </p> <p> Die Datei des Flow-Berechtigungsnachweises wird bei der nächsten Implementierung zurückgesetzt. Alle vorhandenen Datenflowberechtigungsnachweise werden gelöscht. </p>",
"missing_flow_file" : "<p> Die Projektflowdatei wurde nicht gefunden. </p> <p> Das Projekt ist nicht mit einer Flow-Datei konfiguriert. </p>",
@@ -136,19 +136,19 @@
}
},
"clipboard" : {
"nodes" : "Knoten",
"nodes" : "Nodes",
"selectNodes" : "Wählen Sie den Text oben aus, und kopieren Sie die Datei in die Zwischenablage.",
"pasteNodes" : "Knoten hier einfügen",
"importNodes" : "Knoten importieren",
"exportNodes" : "Knoten in Zwischenablage exportieren",
"pasteNodes" : "Nodes hier einfügen",
"importNodes" : "Nodes importieren",
"exportNodes" : "Nodes in Zwischenablage exportieren",
"importUnrecognised" : "Importierter Typ nicht erkannt:",
"importUnrecognised_plural" : "Importierte Typen nicht erkannt:",
"nodesExported" : "Knoten, die in die Zwischenablage exportiert wurden",
"nodeCopied" : "__count__ Knoten kopiert",
"nodeCopied_plural" : "__count__ Knoten kopiert",
"nodesExported" : "Nodes, die in die Zwischenablage exportiert wurden",
"nodeCopied" : "__count__ Node kopiert",
"nodeCopied_plural" : "__count__ Nodes kopiert",
"invalidFlow" : "Ungültiger Nachrichtenflow: __message__",
"export" : {
"selected" : "Ausgewählte Knoten",
"selected" : "Ausgewählte Nodes",
"current" : "Aktueller Flow",
"all" : "alle Flows",
"compact" : "kompakt",
@@ -164,16 +164,16 @@
"copyMessageValue_truncated" : "Abgeschnittene Wert kopiert"
},
"deploy" : {
"deploy" : "Implementieren",
"deploy" : "deploy",
"full" : "Voll",
"fullDesc" : "Implementiert alles im Arbeitsbereich",
"modifiedFlows" : "Geänderte Flows",
"modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Knoten enthalten.",
"modifiedNodes" : "Geänderte Knoten",
"modifiedNodesDesc" : "Implementiert nur Knoten, die sich geändert haben.",
"modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Nodes enthalten.",
"modifiedNodes" : "Geänderte Nodes",
"modifiedNodesDesc" : "Implementiert nur Nodes, die sich geändert haben.",
"successfulDeploy" : "Erfolgreich implementiert",
"deployFailed" : "Implementieren fehlgeschlagen: __message__",
"unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurationsknoten.",
"deployFailed" : "Deploy fehlgeschlagen: __message__",
"unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurations-Nodes.",
"unusedConfigNodesLink" : "Klicken Sie hier, um sie zu sehen",
"errors" : {
"noResponse" : "Keine Antwort vom Server"
@@ -181,16 +181,16 @@
"confirm" : {
"button" : {
"ignore" : "Ignorieren",
"confirm" : "Implementieren bestätigen",
"confirm" : "Deploy bestätigen",
"review" : "Änderungen prüfen",
"cancel" : "Abbrechen",
"merge" : "Zusammenführen",
"overwrite" : "Ignorieren & implementieren"
"overwrite" : "Ignorieren & deployen"
},
"undeployedChanges" : "Sie haben nicht implementierte Änderungen.\n\nWenn Sie diese Seite verlassen, gehen diese Änderungen verloren.",
"improperlyConfigured" : "Der Arbeitsbereich enthält einige Knoten, die nicht ordnungsgemäß konfiguriert sind:",
"unknown" : "Der Arbeitsbereich enthält einige unbekannte Knotentypen:",
"confirm" : "Sind Sie sicher, dass Sie implementieren möchten?",
"improperlyConfigured" : "Der Arbeitsbereich enthält einige Nodes, die nicht ordnungsgemäß konfiguriert sind:",
"unknown" : "Der Arbeitsbereich enthält einige unbekannte Node-Typen:",
"confirm" : "Sind Sie sicher, dass Sie deployen möchten?",
"doNotWarn" : "warnen Sie nicht noch einmal.",
"conflict" : "Auf dem Server wird eine aktuellere Gruppe von Datenflüssen ausgeführt.",
"backgroundUpdate" : "Die Datenflüsse auf dem Server wurden aktualisiert.",
@@ -203,7 +203,7 @@
"diff" : {
"unresolvedCount" : "__count__ unaufgelöster Konflikt",
"unresolvedCount_plural" : "__count__ unaufgelöste Konflikte",
"globalNodes" : "Globale Knoten",
"globalNodes" : "Globale Nodes",
"flowProperties" : "Flow-Eigenschaften",
"type" : {
"added" : "hinzugefügt",
@@ -215,8 +215,8 @@
"movedTo" : "verschoben zu __id__",
"movedFrom" : "verschoben von __id__"
},
"nodeCount" : "__count__, Knoten",
"nodeCount_plural" : "__count__-Knoten",
"nodeCount" : "__count__, Node",
"nodeCount_plural" : "__count__-Nodes",
"local" : "Lokale Änderungen",
"remote" : "Ferne Änderungen",
"reviewChanges" : "Änderungen prüfen",
@@ -242,7 +242,7 @@
"category" : "Kategorie",
"format" : "Markdown-Format",
"errors" : {
"noNodesSelected" : "<strong> Subflow kann nicht erstellt werden </strong>: Es wurden keine Knoten ausgewählt.",
"noNodesSelected" : "<strong> Subflow kann nicht erstellt werden </strong>: Es wurden keine Nodes ausgewählt.",
"multipleInputsToSelection" : "<strong> Subflow kann nicht erstellt werden </strong>: Mehrere Eingaben zur Auswahl"
}
},
@@ -252,13 +252,13 @@
"configUpdate" : "Aktualisieren",
"configDelete" : "Löschen",
"nodesUse" : "__count__node verwendet diese Konfiguration",
"nodesUse_plural" : "__count__ -Knoten verwenden diese Konfiguration",
"addNewConfig" : "Neuen __type__config-Knoten hinzufügen",
"editNode" : "__type__ Knoten bearbeiten",
"editConfig" : "__type__config-Knoten bearbeiten",
"nodesUse_plural" : "__count__ -Nodes verwenden diese Konfiguration",
"addNewConfig" : "Neuen __type__config-Node hinzufügen",
"editNode" : "__type__ Node bearbeiten",
"editConfig" : "__type__config-Node bearbeiten",
"addNewType" : "Neuen __type__ hinzufügen ...",
"nodeProperties" : "Knoteneigenschaften",
"portLabels" : "Knoteneinstellungen",
"nodeProperties" : "Node-Eigenschaften",
"portLabels" : "Node-Einstellungen",
"labelInputs" : "Eingänge",
"labelOutputs" : "Ausgänge",
"settingIcon" : "Symbol",
@@ -267,7 +267,7 @@
"searchIcons" : "Suchsymbole",
"useDefault" : "Standardwert verwenden",
"errors" : {
"scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Knoten in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein."
"scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Nodes in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein."
}
},
"keyboard" : {
@@ -279,19 +279,19 @@
"unassigned" : "Nicht zugeordnet",
"global" : "global",
"workspace" : "Arbeitsbereich",
"selectAll" : "Alle Knoten auswählen",
"selectAllConnected" : "Alle verbundenen Knoten auswählen",
"addRemoveNode" : "Knoten aus Auswahl hinzufügen/entfernen",
"editSelected" : "Ausgewählten Knoten bearbeiten",
"deleteSelected" : "Ausgewählte Knoten oder ausgewählten Link löschen",
"importNode" : "Knoten importieren",
"exportNode" : "Knoten exportieren",
"nudgeNode" : "Ausgewählte Knoten verschieben (1px)",
"moveNode" : "Ausgewählte Knoten verschieben (20px)",
"selectAll" : "Alle Nodes auswählen",
"selectAllConnected" : "Alle verbundenen Nodes auswählen",
"addRemoveNode" : "Node aus Auswahl hinzufügen/entfernen",
"editSelected" : "Ausgewählten Node bearbeiten",
"deleteSelected" : "Ausgewählte Node oder ausgewählten Link löschen",
"importNode" : "Node importieren",
"exportNode" : "Node exportieren",
"nudgeNode" : "Ausgewählte Nodes verschieben (1px)",
"moveNode" : "Ausgewählte Nodes verschieben (20px)",
"toggleSidebar" : "Seitenleiste ein-/ausschalten",
"copyNode" : "Ausgewählte Knoten kopieren",
"cutNode" : "Ausgewählte Knoten ausschneiden",
"pasteNode" : "Knoten einfügen",
"copyNode" : "Ausgewählte Nodes kopieren",
"cutNode" : "Ausgewählte Nodes ausschneiden",
"pasteNode" : "Node einfügen",
"undoChange" : "Letzte Änderung rückgängig machen",
"searchBox" : "Suchfeld öffnen",
"managePalette" : "Palette verwalten"
@@ -301,10 +301,10 @@
"saveToLibrary" : "In Bibliothek speichern ...",
"typeLibrary" : "__type__, Bibliothek",
"unnamedType" : "Unbenannt __type__",
"exportToLibrary" : "Knoten in Bibliothek exportieren",
"exportToLibrary" : "Node in Bibliothek exportieren",
"dialogSaveOverwrite" : "Ein __libraryType__ mit dem Namen __libraryName__ ist bereits vorhanden. Überschreiben?",
"invalidFilename" : "Ungültiger Dateiname",
"savedNodes" : "Gespeicherte Knoten",
"savedNodes" : "Gespeicherte Nodes",
"savedType" : "Gespeichert __type__",
"saveFailed" : "Speichern fehlgeschlagen: __message__",
"filename" : "Name der Datei",
@@ -316,11 +316,11 @@
},
"palette" : {
"noInfo" : "Keine Informationen verfügbar",
"filter" : "Filterknoten",
"filter" : "Filter Nodes",
"search" : "Suchmodule",
"addCategory" : "Neu hinzufügen ...",
"label" : {
"subflows" : "untergeordnete Nachrichtenflüsse",
"subflows" : "Subflows",
"input" : "Eingabe",
"output" : "Ausgabe",
"function" : "Funktion",
@@ -330,15 +330,15 @@
"advanced" : "fortgeschritten"
},
"event" : {
"nodeAdded" : "Knoten zur Palette hinzugefügt:",
"nodeAdded_plural" : "Die Palette wurde der Palette hinzugefügt.",
"nodeRemoved" : "Knoten aus Palette entfernt:",
"nodeRemoved_plural" : "Knoten aus Palette entfernt:",
"nodeEnabled" : "Knoten aktiviert:",
"nodeEnabled_plural" : "Knoten aktiviert:",
"nodeDisabled" : "Knoten inaktiviert:",
"nodeDisabled_plural" : "Knoten inaktiviert:",
"nodeUpgraded" : "Knotenmodul __module__ aktualisiert auf Version __version__"
"nodeAdded" : "Node zur Palette hinzugefügt:",
"nodeAdded_plural" : "Die Nodes wurde der Palette hinzugefügt.",
"nodeRemoved" : "Node aus Palette entfernt:",
"nodeRemoved_plural" : "Nodes aus Palette entfernt:",
"nodeEnabled" : "Node aktiviert:",
"nodeEnabled_plural" : "Nodes aktiviert:",
"nodeDisabled" : "Node inaktiviert:",
"nodeDisabled_plural" : "Nodes inaktiviert:",
"nodeUpgraded" : "Node-Modul __module__ aktualisiert auf Version __version__"
},
"editor" : {
"title" : "Palette verwalten",
@@ -362,8 +362,8 @@
"yearsMonthsV" : "____ Jahre, __count__ Monat vor",
"yearsMonthsV_plural" : "____ Jahre, __count__ Monaten"
},
"nodeCount" : "__label__, Knoten",
"nodeCount_plural" : "__label__ Knoten",
"nodeCount" : "__label__, Node",
"nodeCount_plural" : "__label__ Nodes",
"moduleCount" : "__count__ Modul verfügbar",
"moduleCount_plural" : "__count__-Module verfügbar",
"inuse" : "im Gebrauch",
@@ -377,14 +377,14 @@
"install" : "installieren",
"installed" : "installiert",
"loading" : "Kataloge werden geladen ...",
"tab-nodes" : "Knoten",
"tab-nodes" : "Nodes",
"tab-install" : "installieren",
"sort" : "Sortierung:",
"sortAZ" : "a-z",
"sortRecent" : "kürzlich",
"more" : "+ __count__ mehr",
"errors" : {
"catalogLoadFailed" : "<p> Fehler beim Laden des Knotenkatalogs. </p> <p> Weitere Informationen finden Sie in der Browserkonsole. </p>",
"catalogLoadFailed" : "<p> Fehler beim Laden des Node-Katalogs. </p> <p> Weitere Informationen finden Sie in der Browserkonsole. </p>",
"installFailed" : "<p> Installation fehlgeschlagen: __module__ </p> <p> __message__ </p> <p> Überprüfen Sie das Protokoll auf weitere Informationen. </p>",
"removeFailed" : "<p> Entfernen fehlgeschlagen: __module__ </p> <p> __message__ </p> <p> Überprüfen Sie das Protokoll auf weitere Informationen. </p>",
"updateFailed" : "<p> Aktualisierung fehlgeschlagen: __module__ </p> <p> __message__ </p> <p> Überprüfen Sie das Protokoll auf weitere Informationen. </p>",
@@ -393,22 +393,22 @@
},
"confirm" : {
"install" : {
"body" : "<p> Installieren von '__module__' </p> <p> Vor der Installation von lesen Sie bitte die Dokumentation des Knotens. Einige Knoten haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern. </p>",
"title" : "Knoten installieren"
"body" : "<p> Installieren von '__module__' </p> <p> Vor der Installation von lesen Sie bitte die Dokumentation des Nodes. Einige Nodes haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern. </p>",
"title" : "Nodes installieren"
},
"remove" : {
"body" : "<p> Entfernen von '__module__' </p> <p>-Der Knoten deinstalliert ihn aus Node-RED. Der Knoten kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird. </p>",
"title" : "Knoten entfernen"
"body" : "<p> Entfernen von '__module__' </p> <p>-Der Node deinstalliert ihn aus Node-RED. Der Node kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird. </p>",
"title" : "Nodes entfernen"
},
"update" : {
"body" : "<p> Aktualisieren von '__module__' </p> <p> Für die Aktualisierung des Knotens ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen. </p>",
"title" : "Knoten aktualisieren"
"body" : "<p> Aktualisieren von '__module__' </p> <p> Für die Aktualisierung des Nodes ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen. </p>",
"title" : "Nodes aktualisieren"
},
"cannotUpdate" : {
"body" : "Es ist eine Aktualisierung für diesen Knoten verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann. <br/> <br/> Weitere Informationen zum Aktualisieren dieses Knotens finden Sie in der Dokumentation."
"body" : "Es ist eine Aktualisierung für diesen Node verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann. <br/> <br/> Weitere Informationen zum Aktualisieren dieses Nodes finden Sie in der Dokumentation."
},
"button" : {
"review" : "Knoteninformationen öffnen",
"review" : "Node-Informationen öffnen",
"install" : "installieren",
"remove" : "Entfernen",
"update" : "Aktualisieren"
@@ -418,10 +418,10 @@
},
"sidebar" : {
"info" : {
"name" : "Knoteninformationen",
"name" : "Node-Informationen",
"tabName" : "Name",
"label" : "info",
"node" : "Knoten",
"node" : "Node",
"type" : "Typ",
"id" : "ID",
"status" : "Status",
@@ -437,16 +437,16 @@
"showLess" : "Weniger anzeigen",
"flow" : "Flow",
"selection" : "Auswahl",
"nodes" : "__count__ Knoten",
"nodes" : "__count__ Nodes",
"flowDesc" : "Beschreibung des Flows",
"subflowDesc" : "Beschreibung des Subflows",
"nodeHelp" : "Knotenhilfe",
"nodeHelp" : "Node-Hilfe",
"none" : "Keine",
"arrayItems" : "__count__ items",
"showTips" : "Sie können die Tipps in der Anzeige \"Einstellungen\" öffnen."
},
"config" : {
"name" : "Konfigurationsknoten",
"name" : "Konfigurations-Node",
"label" : "Konfiguration",
"global" : "Bei allen Flows",
"none" : "keine",
@@ -462,7 +462,7 @@
"none" : "keine ausgewählt",
"refresh" : "Aktualisierung zum Laden",
"empty" : "leer",
"node" : "Knoten",
"node" : "Node",
"flow" : "Flow",
"global" : "Global"
},
@@ -610,13 +610,13 @@
},
"typedInput" : {
"type" : {
"str" : "Zeichenfolge",
"num" : "Anzahl",
"str" : "String",
"num" : "Number",
"re" : "Regulärer Ausdruck",
"bool" : "boolean",
"json" : "JSON",
"bin" : "Puffer",
"date" : "Zeitmarke",
"bin" : "Buffer",
"date" : "timestamp",
"jsonata" : "Ausdruck",
"env" : "env, Variable"
}
@@ -626,7 +626,7 @@
},
"search" : {
"empty" : "Keine Übereinstimmungen gefunden",
"addNode" : "Knoten hinzufügen ..."
"addNode" : "Node hinzufügen ..."
},
"expressionEditor" : {
"functions" : "Funktionen",
@@ -658,10 +658,10 @@
"title" : "Markdown-Editor"
},
"bufferEditor" : {
"title" : "Puffereditor",
"title" : "Buffereditor",
"modeString" : "Als UTF-8-Zeichenfolge bearbeiten",
"modeArray" : "Als JSON-Array bearbeiten",
"modeDesc" : "<h3> Puffereditor </h3> <p> Der Puffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert. </p> <p> Beispiel: Der Wert <code> Hello World </code> wird in das JSON-Array konvertiert: <pre> [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] </pre> </p>"
"modeDesc" : "<h3> Buffereditor </h3> <p> Der Buffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert. </p> <p> Beispiel: Der Wert <code> Hello World </code> wird in das JSON-Array konvertiert: <pre> [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] </pre> </p>"
},
"projects" : {
"config-git" : "Git-Client konfigurieren",

View File

@@ -1,23 +1,23 @@
{
"info" : {
"tip0" : "Sie können die ausgewählten Knoten oder Verbindungen mit {{ core:delete-selection }} entfernen.",
"tip1" : "Suche nach Knoten mit {{ core:search }}",
"tip0" : "Sie können die ausgewählten Nodes oder Verbindungen mit {{ core:delete-selection }} entfernen.",
"tip1" : "Suche nach Nodes mit {{ core:search }}",
"tip2" : "{{ core:toggle-sidebar }} schaltet die Ansicht dieser Seitenleiste ein.",
"tip3" : "Sie können Ihre Palette von Knoten mit {{ core:manage-palette }} verwalten.",
"tip4" : "Ihre Flow-Konfigurationsknoten werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.",
"tip3" : "Sie können Ihre Palette von Nodes mit {{ core:manage-palette }} verwalten.",
"tip4" : "Ihre Flow-Konfigurations-Nodes werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.",
"tip5" : "Aktiviert oder inaktiviert diese Tipps von der Option in den Einstellungen",
"tip6" : "Verschieben Sie die ausgewählten Knoten mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben",
"tip7" : "Wenn Sie einen Knoten auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.",
"tip8" : "Die ausgewählten Knoten exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}",
"tip6" : "Verschieben Sie die ausgewählten Nodes mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben",
"tip7" : "Wenn Sie einen Node auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.",
"tip8" : "Die ausgewählten Nodes exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}",
"tip9" : "Importieren Sie einen Flow, indem Sie sein JSON in den Editor ziehen oder mit {{ core:show-import-dialog }}.",
"tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Knotenanschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.",
"tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Node-Anschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.",
"tip11" : "Die Registerkarte \"Info\" mit {{ core:show-info-tab }} oder der Registerkarte \"Debug\" mit {{ core:show-debug-tab }} anzeigen",
"tip12" : "[ctrl] [Klicken] in den Arbeitsbereich, um den Schnellhinzufügedialog zu öffnen.",
"tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Knotenanschluss klicken, um eine Schnellverbindung zu aktivieren.",
"tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Knoten klicken, um auch alle verbundenen Knoten auszuwählen.",
"tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Knoten klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.",
"tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Node-Anschluss klicken, um eine Schnellverbindung zu aktivieren.",
"tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Node klicken, um auch alle verbundenen Nodes auszuwählen.",
"tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Node klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.",
"tip16" : "Indexzungen wechseln mit {{ core:show-previous-tab }} und {{ core:show-next-tab }}",
"tip17" : "Sie können die Änderungen im Editierrahmen des Knotens mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.",
"tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Knoten in der aktuellen Auswahl bearbeitet."
"tip17" : "Sie können die Änderungen im Editierrahmen des Nodes mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.",
"tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Node in der aktuellen Auswahl bearbeitet."
}
}

View File

@@ -53,7 +53,7 @@
},
"$now" : {
"args" : "",
"desc" : "Generiert eine Zeitmarke im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück."
"desc" : "Generiert einen Zeitstempel im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück."
},
"$base64encode" : {
"args" : "Zeichenfolge",
@@ -201,7 +201,7 @@
},
"$fromMillis" : {
"args" : "Anzahl",
"desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) in eine Zeitmarkenzeichenfolge im ISO 8601-Format darstellt."
"desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) enthält in eine Zeitangabe im ISO 8601-Format."
},
"$formatNumber" : {
"args" : "Zahl, Bild [, Optionen]",
@@ -212,8 +212,8 @@
"desc" : "Transformiere die `Zahl` in eine Zeichenfolge und formatiert sie in eine ganze Zahl, die in der durch das `radix` -Argument angegebenen Zahlenbasis dargestellt wird. Wenn 'radix' nicht angegeben wird, wird standardmäßig die Basis 10 verwendet. 'radix` kann zwischen 2 und 36 liegen, andernfalls wird ein Fehler ausgelöst."
},
"$toMillis" : {
"args" : "Zeitmarke",
"desc" : "Konvertieren Sie eine Zeichenfolge `Zeitmarke' im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat."
"args" : "timestamp",
"desc" : "Konvertieren Sie eine Zeitangabe im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat."
},
"$env" : {
"args" : "arg",

View File

@@ -24,6 +24,7 @@
"delete": "Are you sure you want to delete '__label__'?",
"dropFlowHere": "Drop the flow here",
"addFlow": "Add Flow",
"listFlows": "List Flows",
"status": "Status",
"enabled": "Enabled",
"disabled":"Disabled",
@@ -135,7 +136,12 @@
"updated": "Project '__project__' updated",
"pull": "Project '__project__' reloaded",
"revert": "Project '__project__' reverted",
"merge-complete": "Git merge completed"
"merge-complete": "Git merge completed",
"setupCredentials": "Setup credentials",
"setupProjectFiles": "Setup project files",
"no": "No thanks",
"createDefault": "Create default project files",
"mergeConflict": "Show merge conflicts"
},
"label": {
"manage-project-dep": "Manage project dependencies",
@@ -266,8 +272,9 @@
"newVersionError": "New Version doesn't contain valid JSON:"
},
"subflow": {
"editSubflow": "Edit flow template: __name__",
"edit": "Edit flow template",
"editSubflowInstance": "Edit subflow instance: __name__",
"editSubflow": "Edit subflow template: __name__",
"edit": "Edit subflow template",
"subflowInstances": "There is __count__ instance of this subflow template",
"subflowInstances_plural": "There are __count__ instances of this subflow template",
"editSubflowProperties": "edit properties",
@@ -543,14 +550,19 @@
"removeFromProject": "remove from project",
"addToProject": "add to project",
"files": "Files",
"package": "Package",
"flow": "Flow",
"credentials": "Credentials",
"package":"Package",
"packageCreate":"File will be created when changes are saved",
"fileNotExist":"File does not exist",
"selectFile": "Select File",
"invalidEncryptionKey": "Invalid encryption key",
"encryptionEnabled": "Encryption enabled",
"encryptionDisabled": "Encryption disabled",
"setTheEncryptionKey": "Set the encryption key:",
"resetTheEncryptionKey": "Reset the encryption key:",
"changeTheEncryptionKey": "Change the encryption key:",
"setTheEncryptionKey": "Set the encryption key",
"resetTheEncryptionKey": "Reset the encryption key",
"changeTheEncryptionKey": "Change the encryption key",
"currentKey": "Current key",
"newKey": "New key",
"credentialsAlert": "This will delete all existing credentials",
@@ -749,6 +761,7 @@
"desc2": "If you are not sure, you can skip this for now. You will still be able to create your first project from the 'Projects' menu at any time.",
"create": "Create Project",
"clone": "Clone Repository",
"openExistingProject": "Open existing project",
"not-right-now": "Not right now"
},
"git-config": {

View File

@@ -4,7 +4,7 @@
"tip1" : "Search for nodes using {{core:search}}",
"tip2" : "{{core:toggle-sidebar}} will toggle the view of this sidebar",
"tip3" : "You can manage your palette of nodes with {{core:manage-palette}}",
"tip4" : "Your flow configuration nodes are listed in the sidebar panel. It can been accessed from the menu or with {{core:show-config-tab}}",
"tip4" : "Your flow configuration nodes are listed in the sidebar panel. It can be accessed from the menu or with {{core:show-config-tab}}",
"tip5" : "Enable or disable these tips from the option in the settings",
"tip6" : "Move the selected nodes using the [left] [up] [down] and [right] keys. Hold [shift] to nudge them further",
"tip7" : "Dragging a node onto a wire will splice it into the link",

View File

@@ -24,6 +24,7 @@
"delete": "本当に '__label__' を削除しますか?",
"dropFlowHere": "ここにフローをドロップしてください",
"addFlow": "フローの追加",
"listFlows": "フロー一覧",
"status": "状態",
"enabled": "有効",
"disabled": "無効",
@@ -107,7 +108,7 @@
"undeployedChanges": "ノードの変更をデプロイしていません",
"nodeActionDisabled": "ノードのアクションは無効になっています",
"nodeActionDisabledSubflow": "ノードのアクションは、サブフロー内で無効になっています",
"missing-types": "不明なノードが存在するため、フローを停止しました。詳細はログを確認してください。",
"missing-types": "<p>不明なノードが存在するため、フローを停止しました。</p>",
"safe-mode": "<p>セーフモードでフローを停止しました</p><p>フローを変更し、再起動するために変更をデプロイできます</p>",
"restartRequired": "更新されたモジュールを有効化するため、Node-REDを再起動する必要があります",
"credentials_load_failed": "<p>認証情報を復号できないため、フローを停止しました</p><p>フローの認証情報ファイルは暗号化されています。しかし、プロジェクトの暗号鍵が存在しない、または不正です</p>",
@@ -125,7 +126,7 @@
"lostConnectionTry": "すぐに接続",
"cannotAddSubflowToItself": "サブフロー自身を追加できません",
"cannotAddCircularReference": "循環参照を検出したため、サブフローを追加できません",
"unsupportedVersion": "<p>サポートされていないバージョンのNode.jsを使用しています。</p><p><br/>最新のNode.js LTSに更新してください。</p>",
"unsupportedVersion": "<p>サポートされていないバージョンのNode.jsを使用しています。</p><p>最新のNode.js LTSに更新してください。</p>",
"failedToAppendNode": "<p>'__module__'がロードできませんでした。</p><p>__error__</p>"
},
"project": {
@@ -135,7 +136,12 @@
"updated": "プロジェクト'__project__'を更新しました",
"pull": "プロジェクト'__project__'を再ロードしました",
"revert": "プロジェクト'__project__'を取り消しました",
"merge-complete": "Gitマージが完了しました"
"merge-complete": "Gitマージが完了しました",
"setupCredentials": "認証情報を設定",
"setupProjectFiles": "プロジェクトファイルの設定",
"no": "結構です",
"createDefault": "デフォルトのプロジェクトファイルを作成",
"mergeConflict": "マージの衝突を表示"
},
"label": {
"manage-project-dep": "プロジェクトの依存関係の管理",
@@ -266,8 +272,9 @@
"newVersionError": "新しいバージョンは正しいJSON形式ではありません:"
},
"subflow": {
"editSubflow": "フローのテンプレートを編集: __name__",
"edit": "フローのテンプレートを編集",
"editSubflowInstance": "サブフローインスタンスを編集: __name__",
"editSubflow": "サブフローのテンプレートを編集: __name__",
"edit": "サブフローのテンプレートを編集",
"subflowInstances": "このサブフローのテンプレートのインスタンスが __count__ 個存在します",
"subflowInstances_plural": "このサブフローのテンプレートのインスタンスが __count__ 個存在します",
"editSubflowProperties": "プロパティを編集",
@@ -436,7 +443,7 @@
"more": "+ さらに __count__ 個",
"errors": {
"catalogLoadFailed": "<p>ノードのカタログの読み込みに失敗しました。</p><p>詳細はブラウザのコンソールを確認してください。</p>",
"installFailed": "<p.追加処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
"installFailed": "<p>追加処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
"removeFailed": "<p>削除処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
"updateFailed": "<p>更新処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
"enableFailed": "<p>有効化処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
@@ -543,14 +550,18 @@
"removeFromProject": "プロジェクトから削除",
"addToProject": "プロジェクトへ追加",
"files": "ファイル",
"package": "パッケージ",
"flow": "フロー",
"credentials": "認証情報",
"packageCreate": "変更が保存された時にファイルが作成されます",
"fileNotExist": "ファイルが存在しません",
"selectFile": "ファイルを選択",
"invalidEncryptionKey": "不正な暗号化キー",
"encryptionEnabled": "暗号化が有効になっています",
"encryptionDisabled": "暗号化が無効になっています",
"setTheEncryptionKey": "暗号化キーを設定:",
"resetTheEncryptionKey": "暗号化キーを初期化:",
"changeTheEncryptionKey": "暗号化キーを変更:",
"setTheEncryptionKey": "暗号化キーを設定",
"resetTheEncryptionKey": "暗号化キーを初期化",
"changeTheEncryptionKey": "暗号化キーを変更",
"currentKey": "現在のキー",
"newKey": "新規のキー",
"credentialsAlert": "既存の認証情報は全て削除されます",
@@ -749,6 +760,7 @@
"desc2": "とりあえずこの処理をスキップしてもかまいません。「プロジェクト」メニューから、いつでもプロジェクトの作成を開始できます。",
"create": "プロジェクトの作成",
"clone": "プロジェクトのクローン",
"openExistingProject": "既存のプロジェクトを開く",
"not-right-now": "後にする"
},
"git-config": {

View File

@@ -221,7 +221,7 @@
},
"$eval": {
"args": "expr [, context]",
"desc": "JSONリテラルもしくはJSONata式を表す`expr`を評価します。評価の際には現在のコンテストをコンテストして用います。"
"desc": "JSONリテラルもしくはJSONata式を表す`expr`を評価します。評価の際には現在のコンテストをコンテストして用います。"
},
"$formatInteger": {
"args": "number, picture",

View File

@@ -0,0 +1,907 @@
{
"common": {
"label": {
"name": "이름",
"ok": "확인",
"done": "완료",
"cancel": "취소",
"delete": "삭제",
"close": "닫기",
"load": "열기",
"save": "저장",
"import": "가져오기",
"export": "내보내기",
"back": "뒤로",
"next": "앞으로",
"clone": "프로젝트 복제",
"cont": "계속하기"
}
},
"workspace": {
"defaultName": "플로우 __number__",
"editFlow": "플로우 수정 : __name__",
"confirmDelete": "삭제 확인",
"delete": "정말로 '__label__' 을(를) 삭제하시겠습니까?",
"dropFlowHere": "플로우를 이곳에 가져오세요",
"addFlow": "플로우 추가",
"status": "상태",
"enabled": "사용가능",
"disabled": "사용불가능",
"info": "상세내역"
},
"menu": {
"label": {
"view": {
"view": "창",
"grid": "눈금선",
"showGrid": "눈금선 보이기",
"snapGrid": "노드 배치 보조 켜기",
"gridSize": "눈금선 크기",
"textDir": "텍스트 방향",
"defaultDir": "기본",
"ltr": "왼쪽 -> 오른쪽",
"rtl": "오른쪽 -> 왼쪽",
"auto": "자동배분"
},
"sidebar": {
"show": "우측사이드바 보이기"
},
"palette": {
"show": "팔렛트 보이기"
},
"settings": "설정",
"userSettings": "사용자 설정",
"nodes": "노드설정",
"displayStatus": "노드상태 보이기",
"displayConfig": "설정노드 보기",
"import": "가져오기",
"export": "내보내기",
"search": "플로우 겅색",
"searchInput": "플로우 검색",
"clipboard": "클립보드",
"library": "라이브러리",
"examples": "예시",
"subflows": "보조 플로우",
"createSubflow": "보조 플로우 생성",
"selectionToSubflow": "보조 플로우 선택",
"flows": "플로우",
"add": "추가",
"rename": "이름변경",
"delete": "삭제",
"keyboardShortcuts": "단축키",
"login": "로그인",
"logout": "로그아웃",
"editPalette": "팔렛트 관리",
"other": "기타",
"showTips": "Tip 보기",
"help": "Node-RED 웹사이트",
"projects": "프로젝트",
"projects-new": "신규",
"projects-open": "열기",
"projects-settings": "프로젝트 설정",
"showNodeLabelDefault": "새로 추가된 노드의 라벨 보이기"
}
},
"actions": {
"toggle-navigator": "네비게이터 표시/비표시",
"zoom-out": "축소하기",
"zoom-reset": "확대/축소 초기화",
"zoom-in": "확대하기"
},
"user": {
"loggedInAs": "__name__ 에 로그인됨",
"username": "사용자명",
"password": "비밀번호",
"login": "로그인",
"loginFailed": "로그인 실패",
"notAuthorized": "권한이 없습니다",
"errors": {
"settings": "로그인 후 설정이 가능합니다",
"deploy": "로그인 후 배포가 가능합니다",
"notAuthorized": "이 기능은 로그인 후 사용가능합니다"
}
},
"notification": {
"warning": "<strong>경고</strong>: __message__",
"warnings": {
"undeployedChanges": "변경사항 배포가 취소되었습니다",
"nodeActionDisabled": "노드 실행이 비활성화 되었습니다",
"nodeActionDisabledSubflow": "보조 플로우에서 노드 실행이 비활성화 되었습니다",
"missing-types": "<p>타입이 없는 노드로인해 플로우가 중지되었습니다</p>",
"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>"
},
"error": "<strong>에러</strong>: __message__",
"errors": {
"lostConnection": "서버와 연결이 끊어졌습니다. 재접속을 시도합니다 ...",
"lostConnectionReconnect": "서버와 연결이 끊어졌습니다. __time__ 초 안에 재접속을 시도합니다.",
"lostConnectionTry": "지금 재접속",
"cannotAddSubflowToItself": "서브플로우 자기자신을 추가할 수 없습니다",
"cannotAddCircularReference": "순환참조가 발견되었습니다. 서브플로우를 추가할 수 없습니다",
"unsupportedVersion": "<p>지원하지 않는 Node.js를 사용하고 있습니다</p><p>Node.js LTS 버전을 사용해 주세요</p>",
"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 병합이 완료되었습니다"
},
"label": {
"manage-project-dep": "프로젝트 의존성 관리",
"setup-cred": "인증정보 설정",
"setup-project": "프로젝트 파일 설정",
"create-default-package": "기본 패키지 파일 생성",
"no-thanks": "괜찮습니다",
"create-default-project": "기본 프로젝트 파일 생성",
"show-merge-conflicts": "병합 충돌 보여주기"
}
},
"clipboard": {
"nodes": "노드",
"node": "__count__ 개의 노드",
"node_plural": "__count__ 개의 노드",
"configNode": "__count__ 개의 설정 노드",
"configNode_plural": "__count__ 개의 설정 노드",
"flow": "__count__ 개의 플로우",
"flow_plural": "__count__ 개의 플로우",
"subflow": "__count__ 개의 서브 플로우",
"subflow_plural": "__count__ 개의 서브 플로우",
"selectNodes": "텍스트를 선택하고 클립보드에 복사하세요",
"pasteNodes": "여기에 노드를 붙여넣기 하세요",
"selectFile": "불러올 파일을 선택하세요",
"importNodes": "노드 불러오기",
"exportNodes": "클립보드에 노드 내보내기",
"download": "다운로드",
"importUnrecognised": "알 수 없는 형식 :",
"importUnrecognised_plural": "알 수 없는 형식 :",
"nodesExported": "클립보드에 노드 내보내기",
"nodesImported": "불러오기 : ",
"nodeCopied": "__count__개의 노드가 복사 되었습니다",
"nodeCopied_plural": "__count__개의 노드가 복사 되었습니다",
"invalidFlow": "정상적지 않은 플로우 : __message__",
"export": {
"selected": "선택된 노드",
"current": "현재 플로우",
"all": "모든 플로우",
"compact": "압축형식",
"formatted": "서식유지",
"copy": "클립보드로 내보내기"
},
"import": {
"import": "가져올 위치 : ",
"newFlow": "새로운 플로우",
"errors": {
"notArray": "입력이 JSON 배열이 아닙니다",
"itemNotObject": "입력이 올바른 플로우가 아닙니다 - __index__는 노드 오브젝트가 아닙니다",
"missingId": "입력이 올바른 플로우가 아닙니다 - __index__의 'id' 속성이 없습니다",
"missingType": "입력이 올바른 플로우가 아닙니다 - __index__의 'type' 속성이 없습니다"
}
},
"copyMessagePath": "Path가 복사 되었습니다",
"copyMessageValue": "Value가 복사 되었습니다",
"copyMessageValue_truncated": "Truncated value가 복사 되었습니다"
},
"deploy": {
"deploy": "배포하기",
"full": "전체",
"fullDesc": "작업공간 내 모든 플로우를 배포합니다",
"modifiedFlows": "변경된 플로우",
"modifiedFlowsDesc": "변경사항이 있는 플로우만 배포합니다",
"modifiedNodes": "변경된 노드",
"modifiedNodesDesc": "변경사항이 있는 노드만 배포합니다",
"restartFlows": "플로우 재시작",
"restartFlowsDesc": "현재 배포된 플로우를 재시작합니다",
"successfulDeploy": "배포가 성공했습니다",
"successfulRestart": "플로우 재시작을 성공했습니다",
"deployFailed": "배포 실패 : __message__",
"unusedConfigNodes": "사용되지 않는 설정노드가 있습니다",
"unusedConfigNodesLink": "여기를 클릭하면 볼 수 있습니다",
"errors": {
"noResponse": "서버의 응답이 없습니다"
},
"confirm": {
"button": {
"ignore": "무시",
"confirm": "배포 확인",
"review": "변경사항 보기",
"cancel": "취소",
"merge": "병합",
"overwrite": "무시하고 배포하기"
},
"undeployedChanges": "배포되지 않은 변경사항이 있습니다.\n\n이 페이지를 떠나면 변경사항이 사라집니다",
"improperlyConfigured": "작업공간에 올바르게 구성되지 않은 노드가 있습니다 :",
"unknown": "작업공간에 알려지지 않는 노드타입이 있습니다 :",
"confirm": "배포하시겠습니까?",
"doNotWarn": "이 경고를 무시",
"conflict": "서버가 최신 플로우를 사용중입니다",
"backgroundUpdate": "플로우가 변경되었습니다",
"conflictChecking": "변경사항이 자동으로 병합될 수 있는지 확인",
"conflictAutoMerge": "변경사항에 충돌이 없습니다. 자동병합이 가능합니다",
"conflictManualMerge": "변경사항에 충돌이 있습니다. 배포하기 전에 충돌을 해결하세요",
"plusNMore": "+ __count__ 개 더보기"
}
},
"eventLog": {
"title": "이벤트 로그",
"view": "로그 보기"
},
"diff": {
"unresolvedCount": "__count__개의 충돌이 해결되지 않음",
"unresolvedCount_plural": "__count__개의 충돌이 해결되지 않음",
"globalNodes": "Global 노드",
"flowProperties": "플로우 속성",
"type": {
"added": "추가됨",
"changed": "변경됨",
"unchanged": "변경없음",
"deleted": "삭제됨",
"flowDeleted": "플로우 삭제됨",
"flowAdded": "플로우 추가됨",
"movedTo": "__id__로 이동됨",
"movedFrom": "__id__로 부터 이동됨"
},
"nodeCount": "__count__ 개의 노드",
"nodeCount_plural": "__count__ 개의 노드",
"local": "로컬 변경사항",
"remote": "원격 변경사항",
"reviewChanges": "변경사항 살펴보기",
"noBinaryFileShowed": "바이너리파일 내용을 볼수 없습니다",
"viewCommitDiff": "변경사항 보기",
"compareChanges": "변경사항 비교",
"saveConflict": "충돌 해결내용 저장",
"conflictHeader": "<span>__unresolved__</span> 개 중 <span>__resolved__</span> 충돌이 해결됨",
"commonVersionError": "Common Version의 JSON 형식이 올바르지 않습니다 :",
"oldVersionError": "Old Version의 JSON 형식이 올바르지 않습니다 :",
"newVersionError": "New Version의 JSON 형식이 올바르지 않습니다 :"
},
"subflow": {
"editSubflow": "플로우 템플릿 수정 : __name__",
"edit": "플로우 템플릿 수정",
"subflowInstances": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다",
"subflowInstances_plural": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다",
"editSubflowProperties": "속성 수정",
"input": "입력:",
"output": "출력:",
"deleteSubflow": "서브 플로우 삭제",
"info": "상세내역",
"category": "카테고리",
"format": "Markdown 형식",
"errors": {
"noNodesSelected": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 노드가 선택되지 않았습니다",
"multipleInputsToSelection": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 복수의 입력이 선택되었습니다"
}
},
"editor": {
"configEdit": "수정",
"configAdd": "추가",
"configUpdate": "변경",
"configDelete": "삭제",
"nodesUse": "__count__개의 노드가 이 설정을 사용중입니다",
"nodesUse_plural": "__count__개의 노드가 이 설정을 사용중입니다",
"addNewConfig": "__type__의 설정노드 추가",
"editNode": "__type__의 노드 수정",
"editConfig": "__type__의 설정노드 수정",
"addNewType": "__type__의 노드타입 추가 ...",
"nodeProperties": "노드 속성",
"label": "명칭",
"portLabels": "포트 설정",
"labelInputs": "입력",
"labelOutputs": "출력",
"settingIcon": "아이콘",
"noDefaultLabel": "없음",
"defaultLabel": "기본 명칭",
"searchIcons": "아이콘 조회",
"useDefault": "기본설정 사용",
"description": "상세 내역",
"show": "보이기",
"hide": "숨기기",
"errors": {
"scopeChange": "범위를 변경하게 되면 다른 플로우의 노드가 사용이 불가능해 집니다."
}
},
"keyboard": {
"title": "키보드 단축키",
"keyboard": "키보드",
"filterActions": "필터",
"shortcut": "단축키",
"scope": "범위",
"unassigned": "미할당",
"global": "글로벌",
"workspace": "작업공간",
"selectAll": "모든 노드 선택",
"selectAllConnected": "모든 연결된 노드 선택",
"addRemoveNode": "노드 추가/삭제",
"editSelected": "선택된 노드 수정",
"deleteSelected": "선택된 노드나 링크를 삭제",
"importNode": "노드 불러오기",
"exportNode": "노드 내보내기",
"nudgeNode": "선택된 노드 이동 (1px)",
"moveNode": "선택된 노드 이동 (20px)",
"toggleSidebar": "사이드바 표시/비표시",
"togglePalette": "팔렛트 표시/비표시",
"copyNode": "선택된 노드 복사",
"cutNode": "선택된 노드 잘라내기",
"pasteNode": "노드 붙여넣기",
"undoChange": "마지막 변경 되돌리기",
"searchBox": "검색창 열기",
"managePalette": "팔렛트 관리"
},
"library": {
"openLibrary": "라이브러리 열기...",
"saveToLibrary": "라이브러리로 저장...",
"typeLibrary": "__type__ 라이브러리",
"unnamedType": "이름없는 __type__",
"exportToLibrary": "라이브러리로 노드 내보내기",
"dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?",
"invalidFilename": "파일명이 올바르지 않습니다",
"savedNodes": "저장된 노드",
"savedType": "저장된 __type__",
"saveFailed": "저장 실패 : __message__",
"filename": "파일명",
"folder": "폴더명",
"filenamePlaceholder": "파일",
"fullFilenamePlaceholder": "a/b/file",
"folderPlaceholder": "a/b",
"breadcrumb": "라이브러리"
},
"palette": {
"noInfo": "정보 없음",
"filter": "필터",
"search": "모듈 검색",
"addCategory": "추가 ...",
"label": {
"subflows": "서브 플로우",
"input": "입력",
"output": "출력",
"function": "기능",
"social": "소셜",
"storage": "저장",
"analysis": "분석",
"advanced": "그 외"
},
"actions": {
"collapse-all": "모든 카테고리 접기",
"expand-all": "모든 카테고리 펼치기"
},
"event": {
"nodeAdded": "팔렛트에 노드가 추가되었습니다:",
"nodeAdded_plural": "팔렛트에 노드가 추가되었습니다:",
"nodeRemoved": "팔렛트에서 노드가 삭제되었습니다:",
"nodeRemoved_plural": "팔렛트에서 노드가 삭제되었습니다:",
"nodeEnabled": "노드가 활성화 되었습니다:",
"nodeEnabled_plural": "노드가 활성화 되었습니다:",
"nodeDisabled": "노드가 비활성화 되었습니다:",
"nodeDisabled_plural": "노드가 비활성화 되었습니다:",
"nodeUpgraded": "__module__ 노드모듈이 __version__으로 업그레이드 되었습니다"
},
"editor": {
"title": "팔렛트 관리",
"palette": "팔렛트",
"times": {
"seconds": "몇초 전",
"minutes": "몇분 전",
"minutesV": "__count__분 전",
"hoursV": "__count__시간 전",
"hoursV_plural": "__count__시간 전",
"daysV": "__count__일 전",
"daysV_plural": "__count__일 전",
"weeksV": "__count__주 전",
"weeksV_plural": "__count__주 전",
"monthsV": "__count__달 전",
"monthsV_plural": "__count__달 전",
"yearsV": "__count__년 전",
"yearsV_plural": "__count__년 전",
"yearMonthsV": "__y__년, __count__월 전",
"yearMonthsV_plural": "__y__년, __count__월 전",
"yearsMonthsV": "__y__년, __count__월 전",
"yearsMonthsV_plural": "__y__년, __count__월 전"
},
"nodeCount": "__label__ 개의 노드",
"nodeCount_plural": "__label__ 개의 노드",
"moduleCount": "__count__ 개의 모듈 사용가능",
"moduleCount_plural": "__count__ 개의 모듈 사용가능",
"inuse": "사용중",
"enableall": "모두 활성화",
"disableall": "모두 비활성화",
"enable": "활성화",
"disable": "비활성화",
"remove": "삭제",
"update": "__version__으로 업데이트",
"updated": "업데이트 됨",
"install": "설치",
"installed": "설치됨",
"conflict": "충돌",
"conflictTip": "<p>노드타입이 이미 설치 되어 있습니다.<br/>/p><p>충돌모듈 : <code>__module__</code></p>",
"loading": "카탈로그 여는중...",
"tab-nodes": "설치된 노드",
"tab-install": "설치가능한 노드",
"sort": "정렬:",
"sortAZ": "a-z",
"sortRecent": "최근",
"more": "+ __count__ 개 더 보기",
"errors": {
"catalogLoadFailed": "<p>노드 카탈로그를 설치하지 못했습니다.</p><p>브라우저 콘솔로그를 참고하세요.</p>",
"installFailed": "<p>설치 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
"removeFailed": "<p>삭제 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
"updateFailed": "<p>업데이트 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
"enableFailed": "<p>활성화 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
"disableFailed": "<p>비활성화 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>"
},
"confirm": {
"install": {
"body": "<p>'__module__' 설치중</p><p>설치하기 전 노드 설명서를 읽으세요. 어떤 노드은 의존성이 자동으로 해결되지 않거나, Node-RED의 재시작이 필요할 수 있습니다.</p>",
"title": "노드 설치"
},
"remove": {
"body": "<p>'__module__' 삭제중</p><p>Node-RED에서 노드를 제거합니다. Node-RED가 재시작되기까지 리소스가 계속 사용될 수도 있습니다.</p>",
"title": "노드 삭제"
},
"update": {
"body": "<p>'__module__' 업데이트중</p><p>업데이트 반영을 위해 Node-RED를 수동으로 재시작해야 할 경우도 있습니다.</p>",
"title": "노드 변경"
},
"cannotUpdate": {
"body": "이 노드에 대한 업데이트가 있지만, 팔레트 관리자가 변경할 수 있는 위치에 설치되지 않았습니다.<br/><br/>이 노드를 변경하는 방법은 설명서를 참조하세요"
},
"button": {
"review": "노드정보 열기",
"install": "설치",
"remove": "삭제",
"update": "업데이트"
}
}
}
},
"sidebar": {
"info": {
"name": "노드정보",
"tabName": "이름",
"label": "정보",
"node": "노드",
"type": "타입",
"module": "모듈",
"id": "ID",
"status": "상태",
"enabled": "활성화",
"disabled": "비활성화",
"subflow": "서브 플로우",
"instances": "인스턴스",
"properties": "속성",
"info": "정보",
"desc": "상세 내역",
"blank": "공백",
"null": "null",
"showMore": "더 보기",
"showLess": "간단히",
"flow": "플로우",
"selection": "선택",
"nodes": "__count__ 개의 노드",
"flowDesc": "플로우 상세내역",
"subflowDesc": "서브 플로우 상세내역",
"nodeHelp": "노드 도움말",
"none": "없음",
"arrayItems": "__count__ 개의 항목",
"showTips": "설정에서 도움말을 열 수 있습니다. "
},
"config": {
"name": "노드 설정",
"label": "설정",
"global": "모든 플로우",
"none": "없음",
"subflows": "보조 플로우",
"flows": "플로우",
"filterUnused": "미사용",
"filterAll": "전체",
"filtered": "__count__ 개 숨김"
},
"context": {
"name": "Context 데이터",
"label": "context",
"none": "선택 없음",
"refresh": "새로고침",
"empty": "공백",
"node": "노드",
"flow": "플로우",
"global": "Global",
"deleteConfirm": "정말로 이 아이템을 지우시겠습니까?"
},
"palette": {
"name": "팔레트 관리",
"label": "팔레트"
},
"project": {
"label": "프로젝트",
"name": "프로젝트",
"description": "상세내역",
"dependencies": "의존성",
"settings": "설정",
"noSummaryAvailable": "요약 없음",
"editDescription": "프로젝트 상세내역 수정",
"editDependencies": "프로젝트 의존성 수정",
"editReadme": "README.md 수정",
"showProjectSettings": "프로젝트 설정 보이기",
"projectSettings": {
"title": "프로젝트 설정",
"edit": "수정",
"none": "없음",
"install": "설치",
"removeFromProject": "프로젝트에서 삭제",
"addToProject": "프로젝트에 추가",
"files": "파일",
"flow": "플로우",
"credentials": "인증정보",
"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": "URL안에 사용자아이디/비밀번호를 사용하지 마세요",
"noRemotes": "원격 없음",
"deleteRemoteConfrim": "원격 '__name__'를 정말로 삭제하시겠습니까?",
"deleteRemote": "원격 삭제"
},
"userSettings": {
"committerDetail": "Committer 상세내역",
"committerTip": "시스템 기본값을 사용하려면 비워두세요",
"userName": "사용자명",
"email": "이메일",
"sshKeys": "SSH키",
"sshKeysTip": "원격저장소에 대한 보안연결을 허용합니다",
"add": "키 추가",
"addSshKey": "SSH키 추가",
"addSshKeyTip": "public/private 키쌍을 추가합니다",
"name": "이름",
"nameRule": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
"passphrase": "암호",
"passphraseShort": "암호가 너무 짧습니다",
"optional": "선택항목",
"cancel": "취소",
"generate": "Key 생성",
"noSshKeys": "SSH키 없음",
"copyPublicKey": "클립보드로 public key 복사",
"delete": "키 삭제",
"gitConfig": "Git 설정",
"deleteConfirm": "다시 되돌릴 수 없습니다. __name__의 SSH키를 삭제하시겠습니까?"
},
"versionControl": {
"unstagedChanges": "변경사항을 언스테이징",
"stagedChanges": "스테이징된 변경사항",
"unstageChange": "스테이징 되지않은 변경사항",
"stageChange": "변경사항을 스테이징",
"unstageAllChange": "모든 변경사항 언스테이징",
"stageAllChange": "모든 변경사항 스테이징",
"commitChanges": "변경사항 커밋",
"resolveConflicts": "충돌 해결",
"head": "HEAD",
"staged": "스테이징 됨",
"unstaged": "스테이징 안됨",
"local": "로컬",
"remote": "리모트",
"revert": "다시 복원할 수 없습니다. '__file__'을 되돌리시겠습니까?",
"revertChanges": "변경사항 되돌리기",
"localChanges": "로컬 변경사항",
"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과 병합을 하신 후 push하세요",
"push": "push",
"pull": "pull",
"unablePull": "<p>원격저장소의 변경사항을 가져올 수 없습니다, 당신의 unstaged 로컬 변경사항을 덮어씁니다.</p><p>변경사항을 적용하고 다시 시도하세요</p>",
"showUnstagedChanges": "unstaged 변경사항 보여주기",
"connectionFailed": "원격저장소 연결 불가 : ",
"pullUnrelatedHistory": "<p>원격저장소에 연관없는 커밋 기록이 있습니다.</p><p>모든 변경사항을 로컬 저장소로 가져 오시겠습니까?</p>",
"pullChanges": "Pull 변경사항",
"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__ 커밋이 늦습니다. 이제 pull 할 수 있습니다.",
"commitsBehind_plural": "당신의 저장소가 원격지보다 __count__ 커밋이 늦습니다. 이제 pull 할 수 있습니다.",
"commitsAheadAndBehind1": "당신의 저장소가 __count__ 커밋이 늦고, ",
"commitsAheadAndBehind1_plural": "당신의 저장소가 __count__ 커밋이 늦고 ",
"commitsAheadAndBehind2": "__count__ 커밋이 원격지보다 앞서 있습니다. ",
"commitsAheadAndBehind2_plural": "__count__ 커밋이 원격지보다 앞서 있습니다.",
"commitsAheadAndBehind3": "push하기전에 리모트 저장소에서 pull을 먼저 수행하세요.",
"commitsAheadAndBehind3_plural": "push하기전에 리모트 저장소에서 pull을 먼저 수행하세요.",
"refreshCommitHistory": "커밋 기록 새로고침",
"refreshChanges": "변경사항 새로고침"
}
}
},
"typedInput": {
"type": {
"str": "string",
"num": "number",
"re": "regular expression",
"bool": "boolean",
"json": "JSON",
"bin": "buffer",
"date": "timestamp",
"jsonata": "expression",
"env": "env variable"
}
},
"editableList": {
"add": "추가"
},
"search": {
"empty": "결과 없음",
"addNode": "노드 추가 ..."
},
"expressionEditor": {
"functions": "기능",
"functionReference": "기능 참조",
"insert": "삽입",
"title": "JSONata 형식 에디터",
"test": "테스트",
"data": "예제 메세지",
"result": "결과",
"format": "형식",
"compatMode": "호환모드 사용",
"compatModeDesc": "<h3>JSONata호환 모드</h3><p> 입력된 형식은 <code>msg</code> 를 참조하고 있어, 호환모드로 평가합니다. 이 모드는 후에 폐지될 예정이니, <code>msg</code> 를 사용하지 않도록 해 주시길 바랍니다. </p><p> JSONata를 Node-RED에서 처음 지원했을 때에는 <code>msg</code> 오브젝트의 참조가 필요했습니다. 예를 들어 <code>msg.payload</code> 는 payload를 참고하기 위해 사용되었습니다. </p><p> 직접 메시지에 대하여 식을 평가하도록 되었기에, 이 형식은 사용할 수 없게 됩니다. payload를 참조하려면 단순히 <code>payload</code> 로 지정해 주십시오. </p>",
"noMatch": "결과 없음",
"errors": {
"invalid-expr": "유효하지 않은 JSONata 형식 :\n __message__",
"invalid-msg": "유효하지 않은 예시 JSON 메세지 :\n __message__",
"context-unsupported": "컨텍스트 기능을 테스트 할 수 없습니다.\n $flowContext 또는 $globalContext",
"eval": "형식 오류 :\n __message__"
}
},
"jsEditor": {
"title": "자바스크립트 에디터"
},
"jsonEditor": {
"title": "JSON 에디터",
"format": "JSON 형식"
},
"markdownEditor": {
"title": "Markdown 에디터",
"format": "Markdown 형식",
"heading1": "제목 레벨1",
"heading2": "제목 레벨2",
"heading3": "제목 레벨3",
"bold": "강조",
"italic": "이탤릭",
"code": "코드",
"ordered-list": "번호 목차",
"unordered-list": "목차",
"quote": "인용",
"link": "링크",
"horizontal-rule": "나눔줄",
"toggle-preview": "미리보기 전환"
},
"bufferEditor": {
"title": "Buffer 에디터",
"modeString": "UTF-8 문자열로 처리",
"modeArray": "JSON 배열로 처리",
"modeDesc": "<h3>Buffer 에디터</h3><p>버퍼타입은 byet값의 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 client 설정",
"welcome": {
"hello": "안녕하세요. Node-RED에서 프로젝트 기능을 이용할 수 있게 되었습니다.",
"desc0": "플로우 파일을 관리하는 새로운 방법이며, 버전을 관리할 수 도 있습니다.",
"desc1": "무선 프로젝트를 작성하거나 기존의 Git저장소에서 프로젝트를 복제할 수 있습니다.",
"desc2": "이 기능을 건너뛰어도 상관없습니다. 언제든지 프로젝트 메뉴에서 첫번째 프로젝트를 만들 수 있습니다.",
"create": "프로젝트 생성",
"clone": "프로젝트 복제",
"not-right-now": "나중에"
},
"git-config": {
"setup": "버전관리 클라이언트를 설정합니다",
"desc0": "Node-RED는 오픈소스 Git로 버전관리를 할 수 있습니다. 프로젝트 파일의 변경사항을 추적하고 원격저장소로 push할 수 있습니다.",
"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": "프로젝트가 있는 저장소를 가지고 있다면, 즉시 복제하여 사용할 수 있습니다.",
"already-exists": "프로젝트가 이미 존재합니다",
"must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
"project-name": "프로젝트명",
"no-info-in-url": "URL안에 사용자아이디/비밀번호를 사용하지 마세요",
"git-url": "Git 저장소 URL",
"protocols": "https://, ssh:// 혹은 file://",
"auth-failed": "인증 실패",
"username": "사용자명",
"passwd": "패스워드",
"ssh-key": "SSH키",
"passphrase": "패스워드",
"ssh-key-desc": "저장소를 복제하기 전에 접속을 위해 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, 자격증명파일이 프로젝트로 복사될 것입니다.",
"flow-file": "플로우 파일",
"credentials-file": "자격증명 파일"
},
"encryption-config": {
"setup": "자격인증 파일의 암호화 설정",
"desc0": "플로우의 자격인증 파일 암호화를 통해 내용을 안전하게 유지할 수 있습니다.",
"desc1": "자격증명을 공용 Git저장소에 저장하려면 비밀키 구문을 제공하여 암호화 해야 합니다",
"desc2": "당신의 플로우 자격인증 파일은 암호화 되어 있지 않습니다.",
"desc3": "즉, 암호 및 액세스 토큰과 같은 내용을 파일에 액세스 할 수있는 모든 사람이 열람할 수 있습니다.",
"desc4": "자격증명을 공용 Git저장소에 저장하려면 비밀키 구문을 제공하여 암호화 해야 합니다",
"desc5": "당신의 플로우 자격증명파일은 setting파일의 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": "사이드바의 '이력'탭은 프로젝트의 변경된 파일을 확인하고 커밋할 수 있습니다. 커밋의 전체 기록을 보여주고 변경사항을 원격 저장소에 push할 수 있습니다."
},
"create": {
"projects": "프로젝트",
"already-exists": "프로젝트가 이미 존재합니다",
"must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
"no-info-in-url": "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:// 혹은 file://",
"auth-failed": "인증 실패",
"username": "사용자명",
"password": "패스워드",
"ssh-key": "SSH키",
"passphrase": "패스워드",
"desc2": "저장소를 복제하기 전에 접속을 위해 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": "속성",
"description": "상세 내역",
"appearance": "모양"
}
}

View File

@@ -0,0 +1,23 @@
{
"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] [click] 하고서 드래그하여 선택한 와이어를 이동할 수 있습니다.",
"tip11": "{{core:show-info-tab}}를 사용하여 정보탭을 표시하거나 {{core:show-debug-tab}}를 사용하여 디버그탭을 표시할 수 있습니다.",
"tip12": "작업공간에서 [ctrl] [click]을 사용하여 빠른추가 대회상자를 열 수 있습니다.",
"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}}를 누르면 현재 선택 영역의 첫 번째 노드가 편집됩니다."
}
}

View File

@@ -0,0 +1,222 @@
{
"$string": {
"args": "arg",
"desc": "다음과 같은 규칙을 사용하여 인수 *arg*를 문자열로 변환합니다. \n\n - 문자열은 변경되지 않습니다. \n - 함수는 빈 문자열로 변환됩니다. \n - 무한대와 NaN은 JSON수치로 표현할 수 없기 때문에 오류처리 됩니다. \n - 다른 모든 값은 `JSON.stringify` 함수를 사용하여 JSON 문자열로 변환됩니다."
},
"$length": {
"args": "str",
"desc": "문자열 `str`의 문자 수를 반환합니다. `str`가 문자열이 아닌 경우 에러를 반환합니다."
},
"$substring": {
"args": "str, start[, length]",
"desc": "(zero-offset)의 `start`에서 시작하는 첫번째 인수 `str`의 문자열을 반환합니다. 만약 `length`가 지정된 경우, 부분 문자열은 최대 `length`의 크기를 갖습니다. 만약 `start` 인수가 음수이면 `str`의 끝에서부터의 문자수를 나타냅니다."
},
"$substringBefore": {
"args": "str, chars",
"desc": "`str`에 `chars`문자가 처음으로 나오기 전까지의 부분문자열을 반환합니다. 만약 `chars`가 없으면 `str`을 반환합니다."
},
"$substringAfter": {
"args": "str, chars",
"desc": "`str`에 `chars`문자가 처음으로 나온 이후의 부분문자열을 반환합니다. 만약 `chars`가 없으면 `str`을 반환합니다."
},
"$uppercase": {
"args": "str",
"desc": "`str`의 문자를 대문자로 반환합니다."
},
"$lowercase": {
"args": "str",
"desc": "`str`의 문자를 소문자로 반환합니다."
},
"$trim": {
"args": "str",
"desc": "다음의 순서대로 `str`의 모든 공백을 자르고 정규화 합니다:\n\n - 모든 탭, 캐리지 리턴 및 줄 바꿈은 공백으로 대체됩니다. \n- 연속된 공백은 하나로 줄입니다.\n- 후행 및 선행 공백은 삭제됩니다.\n\n 만일 `str`이 지정되지 않으면 (예: 이 함수를 인수없이 호출), context값을 `str`의 값으로 사용합니다. `str`이 문자열이 아니면 에러가 발생합니다."
},
"$contains": {
"args": "str, pattern",
"desc": "`str`이 `pattern`과 일치하면 `true`를, 일치하지 않으면 `false`를 반환합니다. 만약 `str`이 지정되지 않으면 (예: 이 함수를 인수없이 호출), context값을 `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`를 `number`보다 같거나 작은 정수로 내림하여 반환합니다."
},
"$ceil": {
"args": "number",
"desc": "`number`를 `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 Epoch (1970 년 1 월 1 일 UTC)부터 경과된 밀리 초 수를 숫자로 반환합니다. 평가대상식에 포함되는 $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": "`arg` 값을 다음의 규칙에 의해 Boolean으로 변환합니다::\n\n - `Boolean` : 변환하지 않음\n - `string`: 비어있음 : `false`\n - `string`: 비어있지 않음 : `true`\n - `number`: `0` : `false`\n - `number`: 0이 아님 : `true`\n - `null` : `false`\n - `array`: 비어있음 : `false`\n - `array`: `true`로 변환된 요소를 가짐 : `true`\n - `array`: 모든 요소가 `false`로 변환 : `false`\n - `object`: 비어있음 : `false`\n - `object`: 비어있지 않음 : `true`\n - `function` : `false`"
},
"$not": {
"args": "arg",
"desc": "인수의 부정을 Boolean으로 변환합니다. `arg`는 가장먼저boolean으로 변환됩니다."
},
"$exists": {
"args": "arg",
"desc": "`arg` 식의 평가값이 존재하는 경우 `true`, 식의 평가결과가 미정의인 경우 (예: 존재하지 않는 참조필드로의 경로)는 `false`를 반환합니다."
},
"$count": {
"args": "array",
"desc": "`array`의 요소 갯수를 반환합니다."
},
"$append": {
"args": "array, array",
"desc": "두개의 `array`를 병합합니다."
},
"$sort": {
"args": "array [, function]",
"desc": "배열 `array`의 모든 값을 순서대로 정렬하여 반환합니다. \n\n 비교함수 `function`을 이용하는 경우, 비교함수는 아래와 같은 두개의 인수를 가져야 합니다. \n\n `function(left,right)` \n\n 비교함수는 left와 right의 두개의 값을 비교하기에, 값을 정렬하는 처리에서 호출됩니다. 만약 요구되는 정렬에서 left값을 right값보다 뒤로 두고싶은 경우에는, 비교함수는 치환을 나타내는 Boolean형의 ``true`를, 그렇지 않은 경우에는 `false`를 반환해야 합니다."
},
"$reverse": {
"args": "array",
"desc": "`array`에 포함된 모든 값의 순서를 역순으로 변환하여 반환합니다."
},
"$shuffle": {
"args": "array",
"desc": "`array`에 포함된 모든 값의 순서를 랜덤으로 반환합니다."
},
"$zip": {
"args": "array, ...",
"desc": "배열 `array1` ... arrayN`의 위치 0, 1, 2…. 의 값으로 구성된 convolved (zipped) 배열을 반환합니다."
},
"$keys": {
"args": "object",
"desc": "`object` 키를 포함하는 배열을 반환합니다. 인수가 오브젝트의 배열이면 반환되는 배열은 모든 오브젝트에있는 모든 키의 중복되지 않은 목록이 됩니다."
},
"$lookup": {
"args": "object, key",
"desc": "`object` 내의 `key`가 갖는 값을 반환합니다. 최초의 인수가 객체의 배열 인 경우, 배열 내의 모든 오브젝트를 검색하여, 존재하는 모든 키가 갖는 값을 반환합니다."
},
"$spread": {
"args": "object",
"desc": "`object`의 키/값 쌍별로 각 요소가 하나인 오브젝트 배열로 분할합니다. 만일 오브젝트 배열인 경우, 배열의 결과는 각 오브젝트에서 얻은 키/값 쌍의 오브젝트를 갖습니다."
},
"$merge": {
"args": "array&lt;object&gt;",
"desc": "`object`배열을 하나의 `object`로 병합합니다. 병합결과의 오브젝트는 입력배열내의 각 오브젝트의 키/값 쌍을 포함합니다. 입력 오브젝트가 같은 키를 가질경우, 반환 된 `object`에는 배열 마지막의 오브젝트의 키/값이 격납됩니다. 입력 배열이 오브젝트가 아닌 요소를 포함하는 경우, 에러가 발생합니다."
},
"$sift": {
"args": "object, function",
"desc": "함수 `function`을 충족시키는 `object` 인수 키/값 쌍만 포함하는 오브젝트를 반환합니다. \n\n 함수 `function` 다음과 같은 인수를 가져야 합니다 : \n\n `function(value [, key [, object]])`"
},
"$each": {
"args": "object, function",
"desc": "`object`의 각 키/값 쌍에, 함수`function`을 적용한 값의 배열을 반환합니다."
},
"$map": {
"args": "array, function",
"desc": "`array`의 각 값에 `function`을 적용한 결과로 이루어진 배열을 반환합니다. \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`을 연속적으로 적용하여 얻어지는 집계값을 반환합니다. `function`의 적용에는 직전의 `function`의 적용결과와 요소값이 인수로 주어집니다. \n\n 함수 `function`은 인수를 두개 뽑아, 배열의 각 요소 사이에 배치하는 중치연산자처럼 작용해야 합니다. \n\n 임의의 인수 `init`에는 집약시의 초기값을 설정합니다."
},
"$flowContext": {
"args": "string[, string]",
"desc": "플로우 컨텍스트 속성을 취득합니다."
},
"$globalContext": {
"args": "string[, string]",
"desc": "플로우의 글로벌 컨텍스트 속성을 취득합니다."
},
"$pad": {
"args": "string, width [, char]",
"desc": "문자수가 인수 `width`의 절대값이상이 되도록, 필요한 경우 여분의 패딩을 사용하여 `string`의 복사본을 반환합니다. \n\n `width`가 양수인 경우, 오른쪽으로 채워지고, 음수이면 왼쪽으로 채워집니다. \n\n 임의의 `char`인수에는 이 함수에서 사용할 패딩을 지정합니다. 지정하지 않는 경우에는, 기본값으로 공백을 사용합니다."
},
"$fromMillis": {
"args": "number",
"desc": "Unix Epoch (1970 년 1 월 1 일 UTC) 이후의 밀리 초를 나타내는 숫자를 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 임의의 제3 인수 `option`은 소수점기호와 같은 기본 로케일 고유의 서식설정문자를 덮어쓰는데에 사용됩니다. 이 인수를 지정할 경우, XPath F&O 3.1사양의 수치형식에 기술되어있는 name/value 쌍을 포함하는 오브젝트여야 합니다."
},
"$formatBase": {
"args": "number [, radix]",
"desc": "`number`를 인수 `radix`에 지정한 값을 기수로하는 문자열로 변환합니다. `radix`가 지정되지 않은 경우, 기수 10이 기본값으로 설정됩니다. `radix`에는 2~36의 값을 설정할 수 있고, 그 외의 값의 경우에는 에러가 발생합니다."
},
"$toMillis": {
"args": "timestamp",
"desc": "ISO 8601 형식의 `timestamp`를 Unix Epoch (1970 년 1 월 1 일 UTC) 이후의 밀리 초 수로 변환합니다. 문자열이 올바른 형식이 아닌 경우 에러가 발생합니다."
},
"$env": {
"args": "arg",
"desc": "환경변수를 값으로 반환합니다.\n\n 이 함수는 Node-RED 정의 함수입니다."
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@node-red/editor-client",
"version": "0.20.0-beta.5",
"version": "0.20.6",
"license": "Apache-2.0",
"repository": {
"type": "git",

View File

@@ -2,6 +2,7 @@
"*": {
"ctrl-shift-p":"core:manage-palette",
"ctrl-f": "core:search",
"ctrl-shift-f": "core:list-flows",
"ctrl-=": "core:zoom-in",
"ctrl--": "core:zoom-out",
"ctrl-0": "core:zoom-reset",

View File

@@ -766,6 +766,20 @@ RED.nodes = (function() {
if (!$.isArray(newNodes)) {
newNodes = [newNodes];
}
// Scan for any duplicate nodes and remove them. This is a temporary
// fix to help resolve corrupted flows caused by 0.20.0 where multiple
// copies of the flow would get loaded at the same time.
// If the user hit deploy they would have saved those duplicates.
var seenIds = {};
newNodes = newNodes.filter(function(n) {
if (seenIds[n.id]) {
return false;
}
seenIds[n.id] = true;
return true;
})
var isInitialLoad = false;
if (!initialLoad) {
isInitialLoad = true;

View File

@@ -28,15 +28,33 @@ var RED = (function() {
var hasDeferred = false;
var nodeConfigEls = $("<div>"+nodeConfig+"</div>");
nodeConfigEls.find("script").each(function(i,el) {
var scripts = nodeConfigEls.find("script");
var scriptCount = scripts.length;
scripts.each(function(i,el) {
var srcUrl = $(el).attr('src');
if (srcUrl && !/^\s*(https?:|\/|\.)/.test(srcUrl)) {
$(el).remove();
var newScript = document.createElement("script");
newScript.onload = function() { $("body").append(nodeConfigEls); done() }
newScript.onload = function() {
scriptCount--;
if (scriptCount === 0) {
$("body").append(nodeConfigEls);
done()
}
}
$('body').append(newScript);
newScript.src = RED.settings.apiRootUrl+srcUrl;
hasDeferred = true;
} else {
if (/\/ace.js$/.test(srcUrl) || /\/ext-language_tools.js$/.test(srcUrl)) {
// Block any attempts to load ace.js from a CDN - this will
// break the version of ace included in the editor.
// At the time of commit, the contrib-python nodes did this.
// This is a crude fix until the python nodes are fixed.
console.warn("Blocked attempt to load",srcUrl,"by",moduleId)
$(el).remove();
}
scriptCount--;
}
})
if (!hasDeferred) {
@@ -211,7 +229,7 @@ var RED = (function() {
}
]
} else if (msg.error === "missing-types") {
text+="<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
text+="<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
if (!!RED.projects.getActiveProject()) {
options.buttons = [
{
@@ -239,7 +257,7 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) {
options.buttons = [
{
text: "Setup credentials",
text: RED._("notification.project.setupCredentials"),
click: function() {
persistentNotifications[notificationId].hideNotification();
RED.projects.showCredentialsPrompt();
@@ -250,7 +268,7 @@ var RED = (function() {
} else {
options.buttons = [
{
text: "Close",
text: RED._("common.label.close"),
click: function() {
persistentNotifications[notificationId].hideNotification();
}
@@ -261,7 +279,7 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) {
options.buttons = [
{
text: "Setup project files",
text: RED._("notification.project.setupProjectFiles"),
click: function() {
persistentNotifications[notificationId].hideNotification();
RED.projects.showFilesPrompt();
@@ -273,10 +291,10 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) {
options.buttons = [
{
text: "Create default package file",
text: RED._("notification.project.setupProjectFiles"),
click: function() {
persistentNotifications[notificationId].hideNotification();
RED.projects.createDefaultPackageFile();
RED.projects.showFilesPrompt();
}
}
]
@@ -285,13 +303,13 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) {
options.buttons = [
{
text: "No thanks",
text: RED._("notification.project.no"),
click: function() {
persistentNotifications[notificationId].hideNotification();
}
},
{
text: "Create default project files",
text: RED._("notification.project.createDefault"),
click: function() {
persistentNotifications[notificationId].hideNotification();
RED.projects.createDefaultFileSet();
@@ -305,7 +323,7 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) {
options.buttons = [
{
text: "Show merge conflicts",
text: RED._("notification.project.mergeConflict"),
click: function() {
persistentNotifications[notificationId].hideNotification();
RED.sidebar.versionControl.showLocalChanges();
@@ -329,10 +347,8 @@ var RED = (function() {
var parts = topic.split("/");
var node = RED.nodes.node(parts[1]);
if (node) {
if (msg.hasOwnProperty("text")) {
if (msg.text[0] !== ".") {
msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()});
}
if (msg.hasOwnProperty("text") && /^[a-zA-Z]/.test(msg.text)) {
msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()});
}
node.status = msg;
node.dirty = true;

View File

@@ -15,6 +15,19 @@
**/
(function($) {
/**
* options:
* - minimumLength : the minimum length of text before firing a change event
* - delay : delay, in ms, after a keystroke before firing change event
*
* methods:
* - value([val]) - gets the current value, or, if `val` is provided, sets the value
* - count - sets or clears a sub-label on the input. This can be used to provide
* a feedback on the number of matches, or number of available entries to search
* - change - trigger a change event
*
*/
$.widget( "nodered.searchBox", {
_create: function() {
var that = this;

View File

@@ -36,7 +36,7 @@ RED.tabs = (function() {
}
if (options.addButton) {
wrapper.addClass("red-ui-tabs-add");
var addButton = $('<div class="red-ui-tab-button"><a href="#"><i class="fa fa-plus"></i></a></div>').appendTo(wrapper);
var addButton = $('<div class="red-ui-tab-button red-ui-tabs-add"><a href="#"><i class="fa fa-plus"></i></a></div>').appendTo(wrapper);
addButton.find('a').click(function(evt) {
evt.preventDefault();
if (typeof options.addButton === 'function') {
@@ -69,7 +69,25 @@ RED.tabs = (function() {
RED.actions.invoke(options.addButton,{index:targetIndex});
}
});
}
if (options.searchButton) {
wrapper.addClass("red-ui-tabs-search");
var searchButton = $('<div class="red-ui-tab-button red-ui-tabs-search"><a href="#"><i class="fa fa-list-ul"></i></a></div>').appendTo(wrapper);
searchButton.find('a').click(function(evt) {
evt.preventDefault();
if (typeof options.searchButton === 'function') {
options.searchButton()
} else if (typeof options.searchButton === 'string') {
RED.actions.invoke(options.searchButton);
}
})
if (typeof options.searchButton === 'string') {
var l = options.searchButton;
if (options.searchButtonCaption) {
l = options.searchButtonCaption
}
RED.popover.tooltip(searchButton,l,options.searchButton);
}
}
var scrollLeft;

View File

@@ -148,7 +148,7 @@
if (item.icon) {
$('<span class="red-ui-treeList-icon"><i class="'+item.icon+'" /></span>').appendTo(label);
}
$('<span class="red-ui-treeList-label-text"></span>').html(item.label).appendTo(label);
$('<span class="red-ui-treeList-label-text"></span>').text(item.label).appendTo(label);
if (item.children) {
if (Array.isArray(item.children)) {
that._addChildren(container,item.children,depth);

View File

@@ -160,6 +160,11 @@
that.input.css("margin"+d,0);
});
["type","placeholder","data-i18n"].forEach(function(d) {
var m = that.element.attr(d);
that.input.attr(d,m);
});
this.uiSelect.addClass("red-ui-typedInput-container");
this.element.attr('type','hidden');
@@ -630,6 +635,7 @@
}
}
}
this.input.trigger('change',this.propertyType,this.value());
} else {
if (this.optionSelectTrigger) {
this.optionSelectTrigger.hide();

View File

@@ -498,7 +498,6 @@ RED.editor = (function() {
}
function getEditStackTitle() {
var title = '<ul class="editor-tray-breadcrumbs">';
var label;
for (var i=editStack.length-1;i<editStack.length;i++) {
var node = editStack[i];
@@ -514,29 +513,27 @@ RED.editor = (function() {
} else if (node.type === '_buffer') {
label = RED._("bufferEditor.title");
} else if (node.type === 'subflow') {
label = RED._("subflow.editSubflow",{name:node.name})
label = RED._("subflow.editSubflow",{name:RED.utils.sanitize(node.name)})
} else if (node.type.indexOf("subflow:")===0) {
var subflow = RED.nodes.subflow(node.type.substring(8));
label = RED._("subflow.editSubflow",{name:subflow.name})
label = RED._("subflow.editSubflowInstance",{name:RED.utils.sanitize(subflow.name)})
} else {
if (typeof node._def.paletteLabel !== "undefined") {
try {
label = (typeof node._def.paletteLabel === "function" ? node._def.paletteLabel.call(node._def) : node._def.paletteLabel)||"";
label = RED.utils.sanitize((typeof node._def.paletteLabel === "function" ? node._def.paletteLabel.call(node._def) : node._def.paletteLabel)||"");
} catch(err) {
console.log("Definition error: "+node.type+".paletteLabel",err);
}
}
if (i === editStack.length-1) {
if (RED.nodes.node(node.id)) {
label = RED._("editor.editNode",{type:label});
label = RED._("editor.editNode",{type:RED.utils.sanitize(label)});
} else {
label = RED._("editor.addNewConfig",{type:label});
label = RED._("editor.addNewConfig",{type:RED.utils.sanitize(label)});
}
}
}
title += '<li>'+label+'</li>';
}
title += '</ul>';
return label;
}
@@ -574,13 +571,13 @@ RED.editor = (function() {
});
valueField.typedInput('type', opt.parent?(opt.type||opt.parent.type):opt.type);
valueField.typedInput('value', opt.parent?(opt.value||opt.parent.value):opt.value);
valueField.typedInput('value', opt.parent?((opt.value !== undefined)?opt.value:opt.parent.value):opt.value);
var actionButton = $('<a/>',{href:"#",class:"red-ui-editableList-item-remove editor-button editor-button-small"}).appendTo(container);
$('<i/>',{class:"fa "+(opt.parent?"fa-reply":"fa-remove")}).appendTo(actionButton);
container.parent().addClass("red-ui-editableList-item-removable");
if (opt.parent) {
if (opt.value && (opt.value !== opt.parent.value || opt.type !== opt.parent.type)) {
if ((opt.value !== undefined) && (opt.value !== opt.parent.value || opt.type !== opt.parent.type)) {
actionButton.show();
} else {
actionButton.hide();
@@ -661,17 +658,19 @@ RED.editor = (function() {
list.each(function(i) {
var entry = $(this);
var item = entry.data('data');
var name = item.parent?item.name:entry.find(".node-input-env-name").val();
var valueInput = entry.find(".node-input-env-value");
var value = valueInput.typedInput("value");
var type = valueInput.typedInput("type");
if (!item.parent || (item.parent.value !== value || item.parent.type !== type)) {
var item = {
name: name,
type: type,
value: value
};
env.push(item);
var name = (item.parent?item.name:entry.find(".node-input-env-name").val()).trim();
if (name !== "") {
var valueInput = entry.find(".node-input-env-value");
var value = valueInput.typedInput("value");
var type = valueInput.typedInput("type");
if (!item.parent || (item.parent.value !== value || item.parent.type !== type)) {
var item = {
name: name,
type: type,
value: value
};
env.push(item);
}
}
});
return env;
@@ -840,7 +839,7 @@ RED.editor = (function() {
var id = "node-label-form-"+type+"-"+index;
$('<label>',{for:id}).text((index+1)+".").appendTo(result);
var input = $('<input>',{type:"text",id:id, placeholder: placeHolder}).val(value).appendTo(result);
var clear = $('<button class="editor-button editor-button-small"><i class="fa fa-times"></i></button>').appendTo(result);
var clear = $('<button type="button" class="editor-button editor-button-small"><i class="fa fa-times"></i></button>').appendTo(result);
clear.click(function(evt) {
evt.preventDefault();
input.val("");
@@ -897,7 +896,7 @@ RED.editor = (function() {
var iconList = $('<div class="red-ui-icon-list">').appendTo(picker);
var metaRow = $('<div class="red-ui-icon-meta"></div>').appendTo(picker);
var summary = $('<span>').appendTo(metaRow);
var resetButton = $('<button class="editor-button editor-button-small">'+RED._("editor.useDefault")+'</button>').appendTo(metaRow).click(function(e) {
var resetButton = $('<button type="button" class="editor-button editor-button-small">'+RED._("editor.useDefault")+'</button>').appendTo(metaRow).click(function(e) {
e.preventDefault();
hide();
done(null);
@@ -946,7 +945,7 @@ RED.editor = (function() {
$('<div class="form-row">'+
'<label for="node-input-show-label-btn" data-i18n="editor.label"></label>'+
'<button id="node-input-show-label-btn" class="editor-button" style="min-width: 80px; text-align: left;" type="button"><i id="node-input-show-label-btn-i" class="fa fa-toggle-on"></i> <span id="node-input-show-label-label"></span></button> '+
'<button type="button" id="node-input-show-label-btn" class="editor-button" style="min-width: 80px; text-align: left;" type="button"><i id="node-input-show-label-btn-i" class="fa fa-toggle-on"></i> <span id="node-input-show-label-label"></span></button> '+
'<input type="checkbox" id="node-input-show-label" style="display: none;"/>'+
'</div>').appendTo(dialogForm);
@@ -980,7 +979,7 @@ RED.editor = (function() {
var iconRow = $('<div class="form-row"></div>').appendTo(dialogForm);
$('<label data-i18n="editor.settingIcon">').appendTo(iconRow);
var iconButton = $('<button class="editor-button" id="node-settings-icon-button">').appendTo(iconRow);
var iconButton = $('<button type="button" class="editor-button" id="node-settings-icon-button">').appendTo(iconRow);
var nodeDiv = $('<div>',{class:"red-ui-search-result-node"}).appendTo(iconButton);
var colour = RED.utils.getNodeColor(node.type, node._def);
@@ -1738,7 +1737,7 @@ RED.editor = (function() {
if (nodeUserFlows[ws.id]) {
workspaceLabel = "* "+workspaceLabel;
}
tabSelect.append('<option value="'+ws.id+'"'+(ws.id==editing_config_node.z?" selected":"")+'>'+workspaceLabel+'</option>');
$('<option value="'+ws.id+'"'+(ws.id==editing_config_node.z?" selected":"")+'></option>').text(workspaceLabel).appendTo(tabSelect);
});
tabSelect.append('<option disabled data-i18n="sidebar.config.subflows"></option>');
RED.nodes.eachSubflow(function(ws) {
@@ -1746,7 +1745,7 @@ RED.editor = (function() {
if (nodeUserFlows[ws.id]) {
workspaceLabel = "* "+workspaceLabel;
}
tabSelect.append('<option value="'+ws.id+'"'+(ws.id==editing_config_node.z?" selected":"")+'>'+workspaceLabel+'</option>');
$('<option value="'+ws.id+'"'+(ws.id==editing_config_node.z?" selected":"")+'></option>').text(workspaceLabel).appendTo(tabSelect);
});
if (flowCount > 0) {
tabSelect.on('change',function() {
@@ -2067,7 +2066,7 @@ RED.editor = (function() {
}
configNodes.forEach(function(cn) {
select.append('<option value="'+cn.id+'"'+(value==cn.id?" selected":"")+'>'+RED.text.bidi.enforceTextDirectionWithUCC(cn.__label__)+'</option>');
$('<option value="'+cn.id+'"'+(value==cn.id?" selected":"")+'></option>').text(RED.text.bidi.enforceTextDirectionWithUCC(cn.__label__)).appendTo(select);
delete cn.__label__;
});
@@ -2191,7 +2190,7 @@ RED.editor = (function() {
}
],
resize: function(size) {
// $(".editor-tray-content").height(size.height - 50);
$(".editor-tray-content").height(size.height - 50);
// var form = $(".editor-tray-content form").height(size.height - 50 - 40);
var rows = $("#dialog-form>div:not(.node-input-env-container-row)");
var height = size.height;
@@ -2398,7 +2397,7 @@ RED.editor = (function() {
$(el).addClass("node-text-editor-container-toolbar");
editor.toolbar = customEditTypes['_markdown'].buildToolbar(toolbarRow,editor);
if (options.expandable !== false) {
var expandButton = $('<button class="editor-button" style="float: right;"><i class="fa fa-expand"></i></button>').appendTo(editor.toolbar);
var expandButton = $('<button type="button" class="editor-button" style="float: right;"><i class="fa fa-expand"></i></button>').appendTo(editor.toolbar);
expandButton.click(function(e) {
e.preventDefault();
@@ -2417,7 +2416,7 @@ RED.editor = (function() {
})
});
}
var helpButton = $('<button class="node-text-editor-help editor-button editor-button-small"><i class="fa fa-question"></i></button>').appendTo($(el).parent());
var helpButton = $('<button type="button" class="node-text-editor-help editor-button editor-button-small"><i class="fa fa-question"></i></button>').appendTo($(el).parent());
RED.popover.create({
target: helpButton,
trigger: 'click',

View File

@@ -17,21 +17,21 @@
var toolbarTemplate = '<div style="margin-bottom: 5px">'+
'<span class="button-group">'+
'<button class="editor-button" data-style="h1" style="font-size:1.1em; font-weight: bold">h1</button>'+
'<button class="editor-button" data-style="h2" style="font-size:1.0em; font-weight: bold">h2</button>'+
'<button class="editor-button" data-style="h3" style="font-size:0.9em; font-weight: bold">h3</button>'+
'<button type="button" class="editor-button" data-style="h1" style="font-size:1.1em; font-weight: bold">h1</button>'+
'<button type="button" class="editor-button" data-style="h2" style="font-size:1.0em; font-weight: bold">h2</button>'+
'<button type="button" class="editor-button" data-style="h3" style="font-size:0.9em; font-weight: bold">h3</button>'+
'</span>'+
'<span class="button-group">'+
'<button class="editor-button" data-style="b"><i class="fa fa-bold"></i></button>'+
'<button class="editor-button" data-style="i"><i class="fa fa-italic"></i></button>'+
'<button class="editor-button" data-style="code"><i class="fa fa-code"></i></button>'+
'<button type="button" class="editor-button" data-style="b"><i class="fa fa-bold"></i></button>'+
'<button type="button" class="editor-button" data-style="i"><i class="fa fa-italic"></i></button>'+
'<button type="button" class="editor-button" data-style="code"><i class="fa fa-code"></i></button>'+
'</span>'+
'<span class="button-group">'+
'<button class="editor-button" data-style="ol"><i class="fa fa-list-ol"></i></button>'+
'<button class="editor-button" data-style="ul"><i class="fa fa-list-ul"></i></button>'+
'<button class="editor-button" data-style="bq"><i class="fa fa-quote-left"></i></button>'+
'<button class="editor-button" data-style="hr"><i class="fa fa-minus"></i></button>'+
'<button class="editor-button" data-style="link"><i class="fa fa-link"></i></button>'+
'<button type="button" class="editor-button" data-style="ol"><i class="fa fa-list-ol"></i></button>'+
'<button type="button" class="editor-button" data-style="ul"><i class="fa fa-list-ul"></i></button>'+
'<button type="button" class="editor-button" data-style="bq"><i class="fa fa-quote-left"></i></button>'+
'<button type="button" class="editor-button" data-style="hr"><i class="fa fa-minus"></i></button>'+
'<button type="button" class="editor-button" data-style="link"><i class="fa fa-link"></i></button>'+
'</span>'
'</div>';
@@ -123,7 +123,7 @@
panels.ratio(1);
$('<span class="button-group" style="float:right">'+
'<button id="node-btn-markdown-preview" class="editor-button toggle single"><i class="fa fa-eye"></i></button>'+
'<button type="button" id="node-btn-markdown-preview" class="editor-button toggle single"><i class="fa fa-eye"></i></button>'+
'</span>').appendTo(expressionEditor.toolbar);
$("#node-btn-markdown-preview").click(function(e) {

2
packages/node_modules/@node-red/editor-client/src/js/ui/library.js vendored Normal file → Executable file
View File

@@ -44,7 +44,7 @@ RED.library = (function() {
li.className = "dropdown-submenu pull-left";
a = document.createElement("a");
a.href="#";
var label = i.replace(/^@.*\//,"").replace(/^node-red-contrib-/,"").replace(/^node-red-node-/,"").replace(/-/," ").replace(/_/," ");
var label = i.replace(/^@.*\//,"").replace(/^node-red-contrib-/,"").replace(/^node-red-node-/,"").replace(/-/g," ").replace(/_/g," ");
a.innerText = label;
li.appendChild(a);
li.appendChild(buildMenu(data.d[i],root+(root!==""?"/":"")+i));

33
packages/node_modules/@node-red/editor-client/src/js/ui/palette.js vendored Normal file → Executable file
View File

@@ -78,6 +78,8 @@ RED.palette = (function() {
var lineHeight = 20;
var portHeight = 10;
label = RED.utils.sanitize(label);
var words = label.split(/[ -]/);
var displayLines = [];
@@ -175,13 +177,19 @@ RED.palette = (function() {
}
}
$('<div/>',{class:"palette_label"+(def.align=="right"?" palette_label_right":"")}).appendTo(d);
$('<div/>', {
class: "palette_label"
+ (((!def.align && def.inputs !== 0 && def.outputs === 0) || "right" === def.align) ? " palette_label_right" : "")
}).appendTo(d);
d.className="palette_node";
if (def.icon) {
var icon_url = RED.utils.getNodeIcon(def);
var iconContainer = $('<div/>',{class:"palette_icon_container"+(def.align=="right"?" palette_icon_container_right":"")}).appendTo(d);
var iconContainer = $('<div/>', {
class: "palette_icon_container"
+ (((!def.align && def.inputs !== 0 && def.outputs === 0) || "right" === def.align) ? " palette_icon_container_right" : "")
}).appendTo(d);
RED.utils.createIconElement(icon_url, iconContainer, true);
}
@@ -246,8 +254,8 @@ RED.palette = (function() {
$(d).draggable({
helper: 'clone',
appendTo: 'body',
revert: true,
revertDuration: 50,
revert: 'invalid',
revertDuration: 300,
containment:'#main-container',
start: function() {
paletteWidth = $("#palette").width();
@@ -256,11 +264,7 @@ RED.palette = (function() {
},
stop: function() { d3.select('.link_splice').classed('link_splice',false); if (spliceTimer) { clearTimeout(spliceTimer); spliceTimer = null;}},
drag: function(e,ui) {
// TODO: this is the margin-left of palette node. Hard coding
// it here makes me sad
//console.log(ui.helper.position());
ui.position.left += 17.5;
ui.originalPosition.left = $('#' + e.target.id).offset().left;
if (def.inputs > 0 && def.outputs > 0) {
mouseX = ui.position.left-paletteWidth+(ui.helper.width()/2) - chartOffset.left + chart.scrollLeft();
@@ -382,6 +386,17 @@ RED.palette = (function() {
var portInput = paletteNode.find(".palette_port_input");
var portOutput = paletteNode.find(".palette_port_output");
var paletteLabel = paletteNode.find(".palette_label");
paletteLabel.attr("class","palette_label"
+ (((!sf._def.align && sf.in.length !== 0 && sf.out.length === 0) || "right" === sf._def.align) ? " palette_label_right" : "")
);
var paletteIconContainer = paletteNode.find(".palette_icon_container");
paletteIconContainer.attr("class","palette_icon_container"
+ (((!sf._def.align && sf.in.length !== 0 && sf.out.length === 0) || "right" === sf._def.align) ? " palette_icon_container_right" : "")
);
if (portInput.length === 0 && sf.in.length > 0) {
var portIn = document.createElement("div");
portIn.className = "palette_port palette_port_input";

View File

@@ -526,7 +526,7 @@ RED.projects.settings = (function() {
}
function showProjectFileListing(row,activeProject,current,filter,done) {
function showProjectFileListing(row,activeProject,current,selectFilter,done) {
var dialog;
var dialogBody;
var filesList;
@@ -569,14 +569,15 @@ RED.projects.settings = (function() {
})
return result;
}
var files = sortFiles("",files,"");
createFileSubList(container,files.children,current,filter,done,"height: 175px");
var files = sortFiles("",files,"")
createFileSubList(container,files.children,current,selectFilter,done,"height: 175px");
spinner.remove();
});
return container;
}
function createFileSubList(container, files, current, filter, onselect, style) {
function createFileSubList(container, files, current, selectFilter, onselect, style) {
style = style || "";
var list = $('<ol>',{class:"projects-dialog-file-list", style:style}).appendTo(container).editableList({
addButton: false,
@@ -592,7 +593,7 @@ RED.projects.settings = (function() {
} else {
children.hide();
}
createFileSubList(children,entry.children,current,filter,onselect);
createFileSubList(children,entry.children,current,selectFilter,onselect);
header.addClass("selectable");
header.click(function(e) {
if ($(this).hasClass("expanded")) {
@@ -618,7 +619,7 @@ RED.projects.settings = (function() {
header.addClass("projects-dialog-file-list-entry-file-type-git");
}
$('<span class="projects-dialog-file-list-entry-file"> <i class="fa '+fileIcon+'"></i></span>').appendTo(header);
if (filter.test(entry.name)) {
if (selectFilter(entry)) {
header.addClass("selectable");
if (entry.path === current) {
header.addClass("selected");
@@ -626,7 +627,7 @@ RED.projects.settings = (function() {
header.click(function(e) {
$(".projects-dialog-file-list-entry.selected").removeClass("selected");
$(this).addClass("selected");
onselect(entry.path);
onselect(entry.path,true);
})
header.dblclick(function(e) {
e.preventDefault();
@@ -730,18 +731,27 @@ RED.projects.settings = (function() {
var title = $('<h3></h3>').text(RED._("sidebar.project.projectSettings.files")).appendTo(pane);
var filesContainer = $('<div class="user-settings-section"></div>').appendTo(pane);
if (RED.user.hasPermission("projects.write")) {
var editFilesButton = $('<button class="editor-button editor-button-small" style="float: right;">' + RED._('sidebar.project.projectSettings.edit') + '</button>')
var editFilesButton = $('<button type="button" id="project-settings-tab-settings-file-edit" class="editor-button editor-button-small" style="float: right;">' + RED._('sidebar.project.projectSettings.edit') + '</button>')
.appendTo(title)
.click(function(evt) {
evt.preventDefault();
formButtons.show();
editFilesButton.hide();
// packageFileLabelText.hide();
if (!activeProject.files.package) {
packageFileSubLabel.find(".projects-edit-form-sublabel-text").text(RED._("sidebar.project.projectSettings.packageCreate"));
packageFileSubLabel.show();
}
packageFileInputSearch.show();
// packageFileInputCreate.show();
flowFileLabelText.hide();
flowFileInput.show();
flowFileInputSearch.show();
credFileLabel.hide();
credFileInput.show();
flowFileInput.focus();
flowFileInputResize();
// credentialStateLabel.parent().hide();
credentialStateLabel.addClass("uneditable-input");
$(".user-settings-row-credentials").show();
@@ -752,14 +762,83 @@ RED.projects.settings = (function() {
}
var row;
// Flow files
row = $('<div class="user-settings-row"></div>').appendTo(filesContainer);
$('<label for=""></label>').text(RED._("sidebar.project.projectSettings.package")).appendTo(row);
var packageFileLabel = $('<div class="uneditable-input" style="padding:0">').appendTo(row);
var packageFileLabelText = $('<span style="display:inline-block; padding: 6px">').text(activeProject.files.package||"package.json").appendTo(packageFileLabel);
var packageFileInput = $('<input type="hidden">').val(activeProject.files.package||"package.json").appendTo(packageFileLabel);
var packageFileInputSearch = $('<button type="button" class="editor-button toggle single" style="border-top-right-radius: 4px; border-bottom-right-radius: 4px; width: 36px; height: 34px; position: absolute; top: -1px; right: -1px;"><i class="fa fa-folder-open-o"></i></button>')
.hide()
.appendTo(packageFileLabel)
.click(function(e) {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
packageFileLabel.find('.project-file-listing-container').slideUp(200,function() {
$(this).remove();
packageFileLabel.css('height','');
});
packageFileLabel.css('color','');
} else {
$(this).addClass('selected');
packageFileLabel.css('color','inherit');
var fileList = showProjectFileListing(packageFileLabel,activeProject,packageFileInput.val(),
function(entry) { return entry.children || /package\.json$/.test(entry.path); },
function(result,close) {
if (result) {
packageFileInput.val(result);
packageFileLabelText.text(result);
var rootDir = result.substring(0,result.length - 12);
flowFileLabelPrefixText.text(rootDir);
credFileLabelPrefixText.text(rootDir);
flowFileInputResize();
packageFileSubLabel.hide();
}
if (close) {
$(packageFileInputSearch).click();
}
checkFiles();
});
packageFileLabel.css('height','auto');
setTimeout(function() {
fileList.slideDown(200);
},50);
}
})
RED.popover.tooltip(packageFileInputSearch,RED._("sidebar.project.projectSettings.selectFile"));
var packageFileSubLabel = $('<label style="margin-left: 110px" class="projects-edit-form-sublabel"><small><span class="form-warning"><i class="fa fa-warning"></i> <span class="projects-edit-form-sublabel-text"></span></small></label>').appendTo(row).hide();
if (!activeProject.files.package) {
packageFileSubLabel.find(".projects-edit-form-sublabel-text").text(RED._("sidebar.project.projectSettings.fileNotExist"));
packageFileSubLabel.show();
}
var projectPackage = activeProject.files.package||"package.json";
var projectRoot = projectPackage.substring(0,projectPackage.length - 12);
// Flow files
row = $('<div class="user-settings-row"></div>').appendTo(filesContainer);
$('<label for=""></label>').text(RED._("sidebar.project.projectSettings.flow")).appendTo(row);
var flowFileLabel = $('<div class="uneditable-input" style="padding:0">').appendTo(row);
var flowFileLabelText = $('<span style="display:inline-block; padding: 6px">').text(activeProject.files.flow).appendTo(flowFileLabel);
var flowFileInput = $('<input id="" type="text" style="margin-bottom: 0;width: 100%; border: none;">').val(activeProject.files.flow).hide().appendTo(flowFileLabel);
var flowFileInputSearch = $('<button class="editor-button" style="border-top-right-radius: 4px; border-bottom-right-radius: 4px; width: 36px; height: 34px; position: absolute; top: -1px; right: -1px;"><i class="fa fa-folder-open-o"></i></button>')
var flowFileLabelPrefixText = $('<span style="display:inline-block; padding: 6px 0 6px 6px">').text(projectRoot).appendTo(flowFileLabel);
var flowFileName = "flows.json";
if (activeProject.files.flow) {
if (activeProject.files.flow.indexOf(projectRoot) === 0) {
flowFileName = activeProject.files.flow.substring(projectRoot.length);
} else {
flowFileName = activeProject.files.flow;
}
}
var flowFileLabelText = $('<span style="display:inline-block; padding: 6px 6px 6px 0">').text(flowFileName).appendTo(flowFileLabel);
var flowFileInputResize = function() {
flowFileInput.css({
"width": "calc(100% - "+(flowFileInputSearch.width() + flowFileLabelPrefixText.width())+"px)"
});
}
var flowFileInput = $('<input type="text" style="padding-left:1px; margin-top: -2px; margin-bottom: 0;border: none;">').val(flowFileName).hide().appendTo(flowFileLabel);
var flowFileInputSearch = $('<button type="button" class="editor-button toggle single" style="border-top-right-radius: 4px; border-bottom-right-radius: 4px; width: 36px; height: 34px; position: absolute; top: -1px; right: -1px;"><i class="fa fa-folder-open-o"></i></button>')
.hide()
.appendTo(flowFileLabel)
.click(function(e) {
@@ -773,15 +852,24 @@ RED.projects.settings = (function() {
} else {
$(this).addClass('selected');
flowFileLabel.css('color','inherit');
var fileList = showProjectFileListing(flowFileLabel,activeProject,flowFileInput.val(), /.*\.json$/,function(result,isDblClick) {
if (result) {
flowFileInput.val(result);
}
if (isDblClick) {
$(flowFileInputSearch).click();
}
checkFiles();
});
var packageFile = packageFileInput.val();
var packagePrefix = packageFile.substring(0,packageFile.length - 12);
var re = new RegExp("^"+packagePrefix+".*\.json$");
var fileList = showProjectFileListing(flowFileLabel,
activeProject,
flowFileInput.val(),
function(entry) { return !/package.json$/.test(entry.path) && re.test(entry.path) && !/_cred\.json$/.test(entry.path) },
function(result,isDblClick) {
if (result) {
flowFileInput.val(result.substring(packagePrefix.length));
}
if (isDblClick) {
$(flowFileInputSearch).click();
}
checkFiles();
}
);
flowFileLabel.css('height','auto');
setTimeout(function() {
fileList.slideDown(200);
@@ -789,26 +877,41 @@ RED.projects.settings = (function() {
}
})
RED.popover.tooltip(flowFileInputSearch,RED._("sidebar.project.projectSettings.selectFile"));
row = $('<div class="user-settings-row"></div>').appendTo(filesContainer);
$('<label for=""></label>').text(RED._("sidebar.project.projectSettings.credentials")).appendTo(row);
var credFileLabel = $('<div class="uneditable-input">').text(activeProject.files.credentials).appendTo(row);
var credFileInput = $('<div class="uneditable-input">').text(activeProject.files.credentials).hide().insertAfter(credFileLabel);
var credFileName = "flows_cred.json";
if (activeProject.files.credentials) {
if (activeProject.files.flow.indexOf(projectRoot) === 0) {
credFileName = activeProject.files.credentials.substring(projectRoot.length);
} else {
credFileName = activeProject.files.credentials;
}
}
var credFileLabel = $('<div class="uneditable-input" style="padding:0">').appendTo(row);
var credFileLabelPrefixText = $('<span style="display:inline-block;padding: 6px 0 6px 6px">').text(projectRoot).appendTo(credFileLabel);
var credFileLabelText = $('<span style="display:inline-block; padding: 6px 6px 6px 0">').text(credFileName).appendTo(credFileLabel);
var credFileInput = $('<input type="hidden">').val(credFileName).insertAfter(credFileLabel);
var checkFiles = function() {
var saveDisabled;
var currentFlowValue = flowFileInput.val();
var m = /^(.+?)(\.[^.]*)?$/.exec(currentFlowValue);
if (m) {
credFileInput.text(m[1]+"_cred"+(m[2]||".json"));
credFileLabelText.text(m[1]+"_cred"+(m[2]||".json"));
} else if (currentFlowValue === "") {
credFileInput.text("");
credFileLabelText.text("");
}
credFileInput.val(credFileLabelText.text());
var isFlowInvalid = currentFlowValue==="" ||
/\.\./.test(currentFlowValue) ||
/\/$/.test(currentFlowValue);
saveDisabled = isFlowInvalid || credFileInput.text()==="";
saveDisabled = isFlowInvalid || credFileLabelText.text()==="";
if (credentialSecretExistingInput.is(":visible")) {
credentialSecretExistingInput.toggleClass("input-error", credentialSecretExistingInput.val() === "");
@@ -821,19 +924,22 @@ RED.projects.settings = (function() {
flowFileInput.toggleClass("input-error", isFlowInvalid);
credFileInput.toggleClass("input-error",credFileInput.text()==="");
// credFileInput.toggleClass("input-error",credFileInput.text()==="");
saveButton.toggleClass('disabled',saveDisabled);
saveButton.prop('disabled',saveDisabled);
}
flowFileInput.on("change keyup paste",checkFiles);
if (!activeProject.files.flow) {
$('<span class="form-warning"><i class="fa fa-warning"></i> Missing</span>').appendTo(flowFileLabelText);
}
if (!activeProject.files.credentials) {
$('<span class="form-warning"><i class="fa fa-warning"></i> Missing</span>').appendTo(credFileLabel);
}
// if (!activeProject.files.package) {
// $('<span class="form-warning"><i class="fa fa-warning"></i> Missing</span>').appendTo(packageFileLabelText);
// }
// if (!activeProject.files.flow) {
// $('<span class="form-warning"><i class="fa fa-warning"></i> Missing</span>').appendTo(flowFileLabelText);
// }
// if (!activeProject.files.credentials) {
// $('<span class="form-warning"><i class="fa fa-warning"></i> Missing</span>').appendTo(credFileLabel);
// }
row = $('<div class="user-settings-row"></div>').appendTo(filesContainer);
@@ -844,7 +950,7 @@ RED.projects.settings = (function() {
credentialStateLabel.css('color','#666');
credentialSecretButtons.css('vertical-align','top');
var credentialSecretResetButton = $('<button class="editor-button" style="vertical-align: top; width: 36px; margin-bottom: 10px"><i class="fa fa-trash-o"></i></button>')
var credentialSecretResetButton = $('<button type="button" class="editor-button" style="vertical-align: top; width: 36px; margin-bottom: 10px"><i class="fa fa-trash-o"></i></button>')
.appendTo(credentialSecretButtons)
.click(function(e) {
e.preventDefault();
@@ -866,7 +972,9 @@ RED.projects.settings = (function() {
}
checkFiles();
});
var credentialSecretEditButton = $('<button class="editor-button" style="border-top-right-radius: 4px; border-bottom-right-radius: 4px; vertical-align: top; width: 36px; margin-bottom: 10px"><i class="fa fa-pencil"></i></button>')
RED.popover.tooltip(credentialSecretResetButton,RED._("sidebar.project.projectSettings.resetTheEncryptionKey"));
var credentialSecretEditButton = $('<button type="button" class="editor-button" style="border-top-right-radius: 4px; border-bottom-right-radius: 4px; vertical-align: top; width: 36px; margin-bottom: 10px"><i class="fa fa-pencil"></i></button>')
.appendTo(credentialSecretButtons)
.click(function(e) {
e.preventDefault();
@@ -896,6 +1004,7 @@ RED.projects.settings = (function() {
checkFiles();
})
RED.popover.tooltip(credentialSecretEditButton,RED._("sidebar.project.projectSettings.changeTheEncryptionKey"));
row = $('<div class="user-settings-row user-settings-row-credentials"></div>').hide().appendTo(filesContainer);
@@ -930,11 +1039,13 @@ RED.projects.settings = (function() {
var hideEditForm = function() {
editFilesButton.show();
formButtons.hide();
// packageFileLabelText.show();
packageFileInputSearch.hide();
// packageFileInputCreate.hide();
flowFileLabelText.show();
flowFileInput.hide();
flowFileInputSearch.hide();
credFileLabel.show();
credFileInput.hide();
// credentialStateLabel.parent().show();
credentialStateLabel.removeClass("uneditable-input");
credentialStateLabel.css('height','');
@@ -954,13 +1065,26 @@ RED.projects.settings = (function() {
}
var formButtons = $('<span class="button-row" style="position: relative; float: right; margin-right:0;"></span>').hide().appendTo(filesContainer);
$('<button class="editor-button">' + RED._("common.label.cancel") + '</button>')
$('<button type="button" class="editor-button">' + RED._("common.label.cancel") + '</button>')
.appendTo(formButtons)
.click(function(evt) {
evt.preventDefault();
var projectPackage = activeProject.files.package||"package.json";
var projectRoot = projectPackage.substring(0,projectPackage.length - 12);
flowFileLabelPrefixText.text(projectRoot);
credFileLabelPrefixText.text(projectRoot);
packageFileLabelText.text(activeProject.files.package||"package.json");
if (!activeProject.files.package) {
packageFileSubLabel.find(".projects-edit-form-sublabel-text").text(RED._("sidebar.project.projectSettings.fileNotExist"));
packageFileSubLabel.show();
} else {
packageFileSubLabel.hide();
}
flowFileInput.val(flowFileLabelText.text());
credFileLabelText.text(credFileName);
hideEditForm();
});
var saveButton = $('<button class="editor-button">' + RED._("common.label.save") + '</button>')
var saveButton = $('<button type="button" class="editor-button">' + RED._("common.label.save") + '</button>')
.appendTo(formButtons)
.click(function(evt) {
evt.preventDefault();
@@ -972,13 +1096,17 @@ RED.projects.settings = (function() {
return;
}
flowFileLabelText.text(flowFileInput.val());
credFileLabel.text(credFileInput.text());
credFileLabelText.text(credFileInput.val());
packageFileSubLabel.hide();
hideEditForm();
}
var rootPath = packageFileInput.val();
rootPath = rootPath.substring(0,rootPath.length-12);
var payload = {
files: {
flow: flowFileInput.val(),
credentials: credFileInput.text()
package: packageFileInput.val(),
flow: rootPath+flowFileInput.val(),
credentials: rootPath+credFileInput.val()
}
}
@@ -991,8 +1119,6 @@ RED.projects.settings = (function() {
payload.currentCredentialSecret = credentialSecretExistingInput.val();
}
}
// console.log(JSON.stringify(payload,null,4));
RED.deploy.setDeployInflight(true);
utils.sendRequest({
url: "projects/"+activeProject.name,

View File

@@ -105,7 +105,7 @@ RED.projects = (function() {
buttons: [
{
// id: "clipboard-dialog-cancel",
text: "Open existing project", //RED._("projects.welcome.not-right-now"),
text: RED._("projects.welcome.openExistingProject"),
class: "secondary",
click: function() {
createProjectOptions = {
@@ -666,6 +666,10 @@ RED.projects = (function() {
// This is handled via a runtime notification.
dialog.dialog("close");
},
'missing_package_file': function(error) {
// This is handled via a runtime notification.
dialog.dialog("close");
},
'project_empty': function(error) {
// This is handled via a runtime notification.
dialog.dialog("close");
@@ -1565,6 +1569,10 @@ RED.projects = (function() {
// This is handled via a runtime notification.
dialog.dialog("close");
},
'missing_package_file': function(error) {
// This is handled via a runtime notification.
dialog.dialog("close");
},
'project_empty': function(error) {
// This is handled via a runtime notification.
dialog.dialog("close");
@@ -2053,7 +2061,6 @@ RED.projects = (function() {
console.log(xhr);
console.log(textStatus);
console.log(err);
console.log(stack);
}).always(function() {
var delta = Date.now() - start;
delta = Math.max(0,500-delta);
@@ -2381,6 +2388,9 @@ RED.projects = (function() {
return;
}
RED.projects.settings.show('settings');
setTimeout(function() {
$("#project-settings-tab-settings-file-edit").click();
},200)
},
showProjectDependencies: function() {
RED.projects.settings.show('deps');

View File

@@ -82,9 +82,18 @@ RED.search = (function() {
function search(val) {
searchResults.editableList('empty');
var typeFilter;
var m = /(?:^| )type:([^ ]+)/.exec(val);
if (m) {
val = val.replace(/(?:^| )type:[^ ]+/,"");
typeFilter = m[1];
}
val = val.trim();
selected = -1;
results = [];
if (val.length > 0) {
if (val.length > 0 || typeFilter) {
val = val.toLowerCase();
var i;
var j;
@@ -96,8 +105,10 @@ RED.search = (function() {
if (kpos > -1) {
for (j=0;j<index[key].length;j++) {
var node = index[key][j];
nodes[node.node.id] = nodes[node.node.id] = node;
nodes[node.node.id].index = Math.min(nodes[node.node.id].index||Infinity,kpos);
if (!typeFilter || node.node.type === typeFilter) {
nodes[node.node.id] = nodes[node.node.id] = node;
nodes[node.node.id].index = Math.min(nodes[node.node.id].index||Infinity,kpos);
}
}
}
}

View File

@@ -89,6 +89,7 @@ RED.subflow = (function() {
RED.view.redraw();
$("#workspace-subflow-input-add").addClass("active");
$("#workspace-subflow-input-remove").removeClass("active");
RED.palette.refresh();
}
function removeSubflowInput() {
@@ -110,6 +111,7 @@ RED.subflow = (function() {
$("#workspace-subflow-input-add").removeClass("active");
$("#workspace-subflow-input-remove").addClass("active");
activeSubflow.changed = true;
RED.palette.refresh();
return {subflowInputs: [ removedInput ], links:removedInputLinks};
}
@@ -150,6 +152,7 @@ RED.subflow = (function() {
RED.nodes.dirty(true);
RED.view.redraw();
$("#workspace-subflow-output .spinner-value").text(subflow.out.length);
RED.palette.refresh();
}
function removeSubflowOutput(removedSubflowOutputs) {
@@ -189,7 +192,7 @@ RED.subflow = (function() {
}
}
activeSubflow.changed = true;
RED.palette.refresh();
return {subflowOutputs: removedSubflowOutputs, links: removedLinks}
}

View File

@@ -294,7 +294,7 @@ RED.sidebar.info = (function() {
if (node.type !== 'tab') {
if (m) {
$('<tr class="blank"><th colspan="2">'+RED._("sidebar.info.subflow")+'</th></tr>').appendTo(tableBody);
$('<tr class="node-info-subflow-row"><td>'+RED._("common.label.name")+'</td><td><span class="bidiAware" dir=\"'+RED.text.bidi.resolveBaseTextDir(subflowNode.name)+'">'+subflowNode.name+'</span></td></tr>').appendTo(tableBody);
$('<tr class="node-info-subflow-row"><td>'+RED._("common.label.name")+'</td><td><span class="bidiAware" dir=\"'+RED.text.bidi.resolveBaseTextDir(subflowNode.name)+'">'+RED.utils.sanitize(subflowNode.name)+'</span></td></tr>').appendTo(tableBody);
}
}
}

View File

@@ -967,6 +967,7 @@ RED.utils = (function() {
addSpinnerOverlay: addSpinnerOverlay,
decodeObject: decodeObject,
parseContextKey: parseContextKey,
createIconElement: createIconElement
createIconElement: createIconElement,
sanitize: sanitize
}
})();

69
packages/node_modules/@node-red/editor-client/src/js/ui/view.js vendored Normal file → Executable file
View File

@@ -1331,24 +1331,31 @@ RED.view = (function() {
function zoomIn() {
if (scaleFactor < 2) {
scaleFactor += 0.1;
RED.view.navigator.resize();
redraw();
zoomView(scaleFactor+0.1);
}
}
function zoomOut() {
if (scaleFactor > 0.3) {
scaleFactor -= 0.1;
RED.view.navigator.resize();
redraw();
zoomView(scaleFactor-0.1);
}
}
function zoomZero() {
scaleFactor = 1;
function zoomZero() { zoomView(1); }
function zoomView(factor) {
var screenSize = [chart.width(),chart.height()];
var scrollPos = [chart.scrollLeft(),chart.scrollTop()];
var center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor];
scaleFactor = factor;
var newCenter = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor];
var delta = [(newCenter[0]-center[0])*scaleFactor,(newCenter[1]-center[1])*scaleFactor]
chart.scrollLeft(scrollPos[0]-delta[0]);
chart.scrollTop(scrollPos[1]-delta[1]);
RED.view.navigator.resize();
redraw();
}
function selectAll() {
RED.nodes.eachNode(function(n) {
if (n.z == RED.workspaces.active()) {
@@ -1863,7 +1870,7 @@ RED.view = (function() {
}
var link = {source: src, sourcePort:src_port, target: dst};
if (drag_line.virtualLink) {
if (/^link (in|out)$/.test(src.type) && /^link (in|out)$/.test(dst.type)) {
if (/^link (in|out)$/.test(src.type) && /^link (in|out)$/.test(dst.type) && src.type !== dst.type) {
if (src.links.indexOf(dst.id) === -1 && dst.links.indexOf(src.id) === -1) {
var oldSrcLinks = $.extend(true,{},{v:src.links}).v
var oldDstLinks = $.extend(true,{},{v:dst.links}).v
@@ -1903,10 +1910,18 @@ RED.view = (function() {
}
}
} else {
var existingLink = RED.nodes.filterLinks({source:src,target:dst,sourcePort: src_port}).length !== 0;
if (!existingLink) {
RED.nodes.addLink(link);
addedLinks.push(link);
// This is not a virtualLink - which means it started
// on a regular node port. Need to ensure the this isn't
// connecting to a link node virual port.
if (!(
(d.type === "link out" && portType === PORT_TYPE_OUTPUT) ||
(d.type === "link in" && portType === PORT_TYPE_INPUT)
)) {
var existingLink = RED.nodes.filterLinks({source:src,target:dst,sourcePort: src_port}).length !== 0;
if (!existingLink) {
RED.nodes.addLink(link);
addedLinks.push(link);
}
}
}
}
@@ -2756,7 +2771,7 @@ RED.view = (function() {
.attr("rx",2).attr("ry",2).attr("stroke-width","3");
var statusLabel = status.append("svg:text")
.attr("class","node_status_label")
.attr("x",20).attr("y",9);
.attr("x",20).attr("y",10);
//node.append("circle").attr({"class":"centerDot","cx":0,"cy":0,"r":5});
@@ -2801,6 +2816,15 @@ RED.view = (function() {
//thisNode.selectAll(".node-gradient-top").attr("width",function(d){return d.w});
//thisNode.selectAll(".node-gradient-bottom").attr("width",function(d){return d.w}).attr("y",function(d){return d.h-30});
if ((!d._def.align && d.inputs !== 0 && d.outputs === 0) || "right" === d._def.align) {
thisNode.selectAll(".node_icon_group").classed("node_icon_group_right", true);
thisNode.selectAll(".node_label").classed("node_label_right", true).attr("text-anchor", "end");
} else {
thisNode.selectAll(".node_icon_group").classed("node_icon_group_right", false);
thisNode.selectAll(".node_label").classed("node_label_right", false).attr("text-anchor", "start");
}
thisNode.selectAll(".node_icon_group").attr("transform", function (d) { return "translate(0, 0)"; });
thisNode.selectAll(".node_label").attr("x", function (d) { return 38; });
thisNode.selectAll(".node_icon_group_right").attr("transform", function(d){return "translate("+(d.w-30)+",0)"});
thisNode.selectAll(".node_label_right").attr("x", function(d){return d.w-38});
//thisNode.selectAll(".node_icon_right").attr("x",function(d){return d.w-d3.select(this).attr("width")-1-(d.outputs>0?5:0);});
@@ -2951,7 +2975,9 @@ RED.view = (function() {
thisNode.selectAll(".node_icon").attr("y",function(d){return (d.h-d3.select(this).attr("height"))/2;});
thisNode.selectAll(".node_icon_shade").attr("height",function(d){return d.h;});
thisNode.selectAll(".node_icon_shade_border").attr("d",function(d){ return "M "+(("right" == d._def.align) ?0:30)+" 1 l 0 "+(d.h-2)});
thisNode.selectAll(".node_icon_shade_border").attr("d", function (d) {
return "M " + (((!d._def.align && d.inputs !== 0 && d.outputs === 0) || "right" === d._def.align) ? 0 : 30) + " 1 l 0 " + (d.h - 2);
});
thisNode.selectAll(".fa-lg").attr("y",function(d){return (d.h+13)/2;});
thisNode.selectAll(".node_button").attr("opacity",function(d) {
@@ -3008,11 +3034,12 @@ RED.view = (function() {
if (!showStatus || !d.status) {
thisNode.selectAll(".node_status_group").style("display","none");
} else {
thisNode.selectAll(".node_status_group").style("display","inline").attr("transform","translate(3,"+(d.h+3)+")");
var fill = status_colours[d.status.fill]; // Only allow our colours for now
if (d.status.shape == null && fill == null) {
thisNode.selectAll(".node_status").style("display","none");
thisNode.selectAll(".node_status_group").style("display","inline").attr("transform","translate(-14,"+(d.h+3)+")");
} else {
thisNode.selectAll(".node_status_group").style("display","inline").attr("transform","translate(3,"+(d.h+3)+")");
var style;
if (d.status.shape == null || d.status.shape == "dot") {
style = {
@@ -3510,13 +3537,13 @@ RED.view = (function() {
node.dirty = true;
RED.workspaces.show(node.z);
var screenSize = [$("#chart").width(),$("#chart").height()];
var scrollPos = [$("#chart").scrollLeft(),$("#chart").scrollTop()];
var screenSize = [chart.width()/scaleFactor,chart.height()/scaleFactor];
var scrollPos = [chart.scrollLeft()/scaleFactor,chart.scrollTop()/scaleFactor];
if (node.x < scrollPos[0] || node.y < scrollPos[1] || node.x > screenSize[0]+scrollPos[0] || node.y > screenSize[1]+scrollPos[1]) {
var deltaX = '-='+((scrollPos[0] - node.x) + screenSize[0]/2);
var deltaY = '-='+((scrollPos[1] - node.y) + screenSize[1]/2);
$("#chart").animate({
var deltaX = '-='+(((scrollPos[0] - node.x) + screenSize[0]/2)*scaleFactor);
var deltaY = '-='+(((scrollPos[1] - node.y) + screenSize[1]/2)*scaleFactor);
chart.animate({
scrollLeft: deltaX,
scrollTop: deltaY
},200);

View File

@@ -309,7 +309,9 @@ RED.workspaces = (function() {
minimumActiveTabWidth: 150,
scrollable: true,
addButton: "core:add-flow",
addButtonCaption: RED._("workspace.addFlow")
addButtonCaption: RED._("workspace.addFlow"),
searchButton: "core:list-flows",
searchButtonCaption: RED._("workspace.listFlows")
});
workspaceTabCount = 0;
}
@@ -343,6 +345,10 @@ RED.workspaces = (function() {
RED.actions.add("core:edit-flow",editWorkspace);
RED.actions.add("core:remove-flow",removeWorkspace);
RED.actions.add("core:list-flows",function() {
RED.actions.invoke("core:search","type:tab ");
})
hideWorkspace();
}

View File

@@ -60,7 +60,7 @@
.project-settings-tab-pane {
& * .projects-edit-form-sublabel {
margin-right: 50px;
margin-top: -10px;
margin-top: -10px !important;
margin-bottom: 5px;
}
}

View File

@@ -71,6 +71,7 @@ body {
font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;
padding-top: 100px;
background: $background-color;
color: #333333;
}
#main-container {
@@ -135,3 +136,16 @@ pre code {
.hide {
display: none;
}
blockquote {
padding: 0 0 0 15px;
margin: 0 0 20px;
border-left: 4px solid #ddd;
p {
font-size: 14px;
font-weight: inherit;
line-height: 1.25;
color: #777;
}
}

View File

@@ -111,6 +111,7 @@
font-weight: bold;
.red-ui-tabs-badge-selected {
display: inline;
background: white;
}
.red-ui-tabs-badge-changed {
display: none;
@@ -133,6 +134,10 @@
&.red-ui-tabs-add.red-ui-tabs-scrollable {
padding-right: 59px;
}
&.red-ui-tabs-add.red-ui-tabs-search.red-ui-tabs-scrollable {
padding-right: 95px;
}
&.red-ui-tabs-collapsible {
li:not(.active) {
display: none;
@@ -285,6 +290,14 @@
right: 38px;
}
.red-ui-tabs.red-ui-tabs-add.red-ui-tabs-search .red-ui-tab-scroll-right {
right: 76px;
}
.red-ui-tabs.red-ui-tabs-add.red-ui-tabs-search .red-ui-tabs-add {
right: 38px;
}
img.red-ui-tab-icon {
margin-left: -8px;
margin-right: 3px;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,4 @@
ace.define("ace/mode/properties_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=/\\u[0-9a-fA-F]{4}|\\/;this.$rules={start:[{token:"comment",regex:/[!#].*$/},{token:"keyword",regex:/[=:]$/},{token:"keyword",regex:/[=:]/,next:"value"},{token:"constant.language.escape",regex:e},{defaultToken:"variable"}],value:[{regex:/\\$/,token:"string",next:"value"},{regex:/$/,token:"string",next:"start"},{token:"constant.language.escape",regex:e},{defaultToken:"string"}]}};r.inherits(s,i),t.PropertiesHighlightRules=s}),ace.define("ace/mode/properties",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/properties_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./properties_highlight_rules").PropertiesHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/properties"}.call(o.prototype),t.Mode=o});
(function() {
ace.define("ace/mode/properties_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=/\\u[0-9a-fA-F]{4}|\\/;this.$rules={start:[{token:"comment",regex:/[!#].*$/},{token:"keyword",regex:/[=:]$/},{token:"keyword",regex:/[=:]/,next:"value"},{token:"constant.language.escape",regex:e},{defaultToken:"variable"}],value:[{regex:/\\$/,token:"string",next:"value"},{regex:/$/,token:"string",next:"start"},{token:"constant.language.escape",regex:e},{defaultToken:"string"}]}};r.inherits(s,i),t.PropertiesHighlightRules=s}),ace.define("ace/mode/properties",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/properties_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./properties_highlight_rules").PropertiesHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/properties"}.call(o.prototype),t.Mode=o}); (function() {
ace.require(["ace/mode/properties"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,4 @@
ace.define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|when|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|foreign|not|references|default|null|inner|cross|natural|database|drop|grant",t="true|false",n="avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl",r="int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|money|real|number|integer",i=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t,"storage.type":r},"identifier",!0);this.$rules={start:[{token:"comment",regex:"--.*$"},{token:"comment",start:"/\\*",end:"\\*/"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"},{token:"string",regex:"`.*?`"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:i,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]},this.normalizeRules()};r.inherits(s,i),t.SqlHighlightRules=s}),ace.define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sql_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./sql_highlight_rules").SqlHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="--",this.$id="ace/mode/sql"}.call(o.prototype),t.Mode=o});
(function() {
ace.define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|when|then|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|foreign|not|references|default|null|inner|cross|natural|database|drop|grant",t="true|false",n="avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl",r="int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|money|real|number|integer",i=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t,"storage.type":r},"identifier",!0);this.$rules={start:[{token:"comment",regex:"--.*$"},{token:"comment",start:"/\\*",end:"\\*/"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"},{token:"string",regex:"`.*?`"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:i,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]},this.normalizeRules()};r.inherits(s,i),t.SqlHighlightRules=s}),ace.define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sql_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./sql_highlight_rules").SqlHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="--",this.$id="ace/mode/sql"}.call(o.prototype),t.Mode=o}); (function() {
ace.require(["ace/mode/sql"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
; (function() {
ace.require(["ace/mode/text"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,4 @@
ace.define("ace/mode/yaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"list.markup",regex:/^(?:-{3}|\.{3})\s*(?=#|$)/},{token:"list.markup",regex:/^\s*[\-?](?:$|\s)/},{token:"constant",regex:"!![\\w//]+"},{token:"constant.language",regex:"[&\\*][a-zA-Z0-9-_]+"},{token:["meta.tag","keyword"],regex:/^(\s*\w.*?)(:(?=\s|$))/},{token:["meta.tag","keyword"],regex:/(\w+?)(\s*:(?=\s|$))/},{token:"keyword.operator",regex:"<<\\w*:\\w*"},{token:"keyword.operator",regex:"-\\s*(?=[{])"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:/[|>][-+\d\s]*$/,onMatch:function(e,t,n,r){var i=/^\s*/.exec(r)[0];return n.length<1?n.push(this.next):n[0]="mlString",n.length<2?n.push(i.length):n[1]=i.length,this.token},next:"mlString"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:/(\b|[+\-\.])[\d_]+(?:(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)(?=[^\d-\w]|$)/},{token:"constant.numeric",regex:/[+\-]?\.inf\b|NaN\b|0x[\dA-Fa-f_]+|0b[10_]+/},{token:"constant.language.boolean",regex:"\\b(?:true|false|TRUE|FALSE|True|False|yes|no)\\b"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:/[^\s,:\[\]\{\}]+/}],mlString:[{token:"indent",regex:/^\s*$/},{token:"indent",regex:/^\s*/,onMatch:function(e,t,n){var r=n[1];return r>=e.length?(this.next="start",n.splice(0)):this.next="mlString",this.token},next:"mlString"},{token:"string",regex:".+"}]},this.normalizeRules()};r.inherits(s,i),t.YamlHighlightRules=s}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!="#")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?"start":"","";if(u==-1){if(i==a&&r[i]=="#"&&s[i]=="#")return e.foldWidgets[n-1]="",e.foldWidgets[n+1]="","start"}else if(u==i&&r[i]=="#"&&o[i]=="#"&&e.getLine(n-2).search(/\S/)==-1)return e.foldWidgets[n-1]="start",e.foldWidgets[n+1]="","";return u!=-1&&u<i?e.foldWidgets[n-1]="start":e.foldWidgets[n-1]="",i<a?"start":""}}.call(o.prototype)}),ace.define("ace/mode/yaml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/yaml_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/coffee"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./yaml_highlight_rules").YamlHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./folding/coffee").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u,this.$behaviour=this.$defaultBehaviour};r.inherits(a,i),function(){this.lineCommentStart=["#"],this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/yaml"}.call(a.prototype),t.Mode=a});
(function() {
ace.define("ace/mode/yaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"list.markup",regex:/^(?:-{3}|\.{3})\s*(?=#|$)/},{token:"list.markup",regex:/^\s*[\-?](?:$|\s)/},{token:"constant",regex:"!![\\w//]+"},{token:"constant.language",regex:"[&\\*][a-zA-Z0-9-_]+"},{token:["meta.tag","keyword"],regex:/^(\s*\w.*?)(:(?=\s|$))/},{token:["meta.tag","keyword"],regex:/(\w+?)(\s*:(?=\s|$))/},{token:"keyword.operator",regex:"<<\\w*:\\w*"},{token:"keyword.operator",regex:"-\\s*(?=[{])"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:/[|>][-+\d\s]*$/,onMatch:function(e,t,n,r){var i=/^\s*/.exec(r)[0];return n.length<1?n.push(this.next):n[0]="mlString",n.length<2?n.push(i.length):n[1]=i.length,this.token},next:"mlString"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:/(\b|[+\-\.])[\d_]+(?:(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)(?=[^\d-\w]|$)/},{token:"constant.numeric",regex:/[+\-]?\.inf\b|NaN\b|0x[\dA-Fa-f_]+|0b[10_]+/},{token:"constant.language.boolean",regex:"\\b(?:true|false|TRUE|FALSE|True|False|yes|no)\\b"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:/[^\s,:\[\]\{\}]+/}],mlString:[{token:"indent",regex:/^\s*$/},{token:"indent",regex:/^\s*/,onMatch:function(e,t,n){var r=n[1];return r>=e.length?(this.next="start",n.splice(0)):this.next="mlString",this.token},next:"mlString"},{token:"string",regex:".+"}]},this.normalizeRules()};r.inherits(s,i),t.YamlHighlightRules=s}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!="#")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?"start":"","";if(u==-1){if(i==a&&r[i]=="#"&&s[i]=="#")return e.foldWidgets[n-1]="",e.foldWidgets[n+1]="","start"}else if(u==i&&r[i]=="#"&&o[i]=="#"&&e.getLine(n-2).search(/\S/)==-1)return e.foldWidgets[n-1]="start",e.foldWidgets[n+1]="","";return u!=-1&&u<i?e.foldWidgets[n-1]="start":e.foldWidgets[n-1]="",i<a?"start":""}}.call(o.prototype)}),ace.define("ace/mode/yaml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/yaml_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/coffee"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./yaml_highlight_rules").YamlHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./folding/coffee").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u,this.$behaviour=this.$defaultBehaviour};r.inherits(a,i),function(){this.lineCommentStart=["#"],this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/yaml"}.call(a.prototype),t.Mode=a}); (function() {
ace.require(["ace/mode/yaml"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/handlebars",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="handlebars"});
(function() {
ace.define("ace/snippets/handlebars",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="handlebars"}); (function() {
ace.require(["ace/snippets/handlebars"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/javascript",["require","exports","module"],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# Get Elements\nsnippet gett\n getElementsBy${1:TagName}(\'${2}\')${3}\n# Get Element\nsnippet get\n getElementBy${1:Id}(\'${2}\')${3}\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# singleton\nsnippet sing\n function ${1:Singleton} (${2:argument}) {\n // the cached instance\n var instance;\n\n // rewrite the constructor\n $1 = function $1($2) {\n return instance;\n };\n \n // carry over the prototype properties\n $1.prototype = this;\n\n // the instance\n instance = new $1();\n\n // reset the constructor pointer\n instance.constructor = $1;\n\n ${3:// code ...}\n\n return instance;\n }\n# class\nsnippet class\nregex /^\\s*/clas{0,2}/\n var ${1:class} = function(${20}) {\n $40$0\n };\n \n (function() {\n ${60:this.prop = ""}\n }).call(${1:class}.prototype);\n \n exports.${1:class} = ${1:class};\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\n\n#modules\nsnippet def\n define(function(require, exports, module) {\n "use strict";\n var ${1/.*\\///} = require("${1}");\n \n $TM_SELECTED_TEXT\n });\nsnippet req\nguard ^\\s*\n var ${1/.*\\///} = require("${1}");\n $0\nsnippet requ\nguard ^\\s*\n var ${1/.*\\/(.)/\\u$1/} = require("${1}").${1/.*\\/(.)/\\u$1/};\n $0\n',t.scope="javascript"});
(function() {
ace.define("ace/snippets/javascript",["require","exports","module"],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# Get Elements\nsnippet gett\n getElementsBy${1:TagName}(\'${2}\')${3}\n# Get Element\nsnippet get\n getElementBy${1:Id}(\'${2}\')${3}\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# singleton\nsnippet sing\n function ${1:Singleton} (${2:argument}) {\n // the cached instance\n var instance;\n\n // rewrite the constructor\n $1 = function $1($2) {\n return instance;\n };\n \n // carry over the prototype properties\n $1.prototype = this;\n\n // the instance\n instance = new $1();\n\n // reset the constructor pointer\n instance.constructor = $1;\n\n ${3:// code ...}\n\n return instance;\n }\n# class\nsnippet class\nregex /^\\s*/clas{0,2}/\n var ${1:class} = function(${20}) {\n $40$0\n };\n \n (function() {\n ${60:this.prop = ""}\n }).call(${1:class}.prototype);\n \n exports.${1:class} = ${1:class};\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\n\n#modules\nsnippet def\n define(function(require, exports, module) {\n "use strict";\n var ${1/.*\\///} = require("${1}");\n \n $TM_SELECTED_TEXT\n });\nsnippet req\nguard ^\\s*\n var ${1/.*\\///} = require("${1}");\n $0\nsnippet requ\nguard ^\\s*\n var ${1/.*\\/(.)/\\u$1/} = require("${1}").${1/.*\\/(.)/\\u$1/};\n $0\n',t.scope="javascript"}); (function() {
ace.require(["ace/snippets/javascript"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/json",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="json"});
(function() {
ace.define("ace/snippets/json",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="json"}); (function() {
ace.require(["ace/snippets/json"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/markdown",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# Markdown\n\n# Includes octopress (http://octopress.org/) snippets\n\nsnippet [\n [${1:text}](http://${2:address} "${3:title}")\nsnippet [*\n [${1:link}](${2:`@*`} "${3:title}")${4}\n\nsnippet [:\n [${1:id}]: http://${2:url} "${3:title}"\nsnippet [:*\n [${1:id}]: ${2:`@*`} "${3:title}"\n\nsnippet ![\n ![${1:alttext}](${2:/images/image.jpg} "${3:title}")\nsnippet ![*\n ![${1:alt}](${2:`@*`} "${3:title}")${4}\n\nsnippet ![:\n ![${1:id}]: ${2:url} "${3:title}"\nsnippet ![:*\n ![${1:id}]: ${2:`@*`} "${3:title}"\n\nsnippet ===\nregex /^/=+/=*//\n ${PREV_LINE/./=/g}\n \n ${0}\nsnippet ---\nregex /^/-+/-*//\n ${PREV_LINE/./-/g}\n \n ${0}\nsnippet blockquote\n {% blockquote %}\n ${1:quote}\n {% endblockquote %}\n\nsnippet blockquote-author\n {% blockquote ${1:author}, ${2:title} %}\n ${3:quote}\n {% endblockquote %}\n\nsnippet blockquote-link\n {% blockquote ${1:author} ${2:URL} ${3:link_text} %}\n ${4:quote}\n {% endblockquote %}\n\nsnippet bt-codeblock-short\n ```\n ${1:code_snippet}\n ```\n\nsnippet bt-codeblock-full\n ``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\n ${5:code_snippet}\n ```\n\nsnippet codeblock-short\n {% codeblock %}\n ${1:code_snippet}\n {% endcodeblock %}\n\nsnippet codeblock-full\n {% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\n ${5:code_snippet}\n {% endcodeblock %}\n\nsnippet gist-full\n {% gist ${1:gist_id} ${2:filename} %}\n\nsnippet gist-short\n {% gist ${1:gist_id} %}\n\nsnippet img\n {% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\n\nsnippet youtube\n {% youtube ${1:video_id} %}\n\n# The quote should appear only once in the text. It is inherently part of it.\n# See http://octopress.org/docs/plugins/pullquote/ for more info.\n\nsnippet pullquote\n {% pullquote %}\n ${1:text} {" ${2:quote} "} ${3:text}\n {% endpullquote %}\n',t.scope="markdown"});
(function() {
ace.define("ace/snippets/markdown",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# Markdown\n\n# Includes octopress (http://octopress.org/) snippets\n\nsnippet [\n [${1:text}](http://${2:address} "${3:title}")\nsnippet [*\n [${1:link}](${2:`@*`} "${3:title}")${4}\n\nsnippet [:\n [${1:id}]: http://${2:url} "${3:title}"\nsnippet [:*\n [${1:id}]: ${2:`@*`} "${3:title}"\n\nsnippet ![\n ![${1:alttext}](${2:/images/image.jpg} "${3:title}")\nsnippet ![*\n ![${1:alt}](${2:`@*`} "${3:title}")${4}\n\nsnippet ![:\n ![${1:id}]: ${2:url} "${3:title}"\nsnippet ![:*\n ![${1:id}]: ${2:`@*`} "${3:title}"\n\nsnippet ===\nregex /^/=+/=*//\n ${PREV_LINE/./=/g}\n \n ${0}\nsnippet ---\nregex /^/-+/-*//\n ${PREV_LINE/./-/g}\n \n ${0}\nsnippet blockquote\n {% blockquote %}\n ${1:quote}\n {% endblockquote %}\n\nsnippet blockquote-author\n {% blockquote ${1:author}, ${2:title} %}\n ${3:quote}\n {% endblockquote %}\n\nsnippet blockquote-link\n {% blockquote ${1:author} ${2:URL} ${3:link_text} %}\n ${4:quote}\n {% endblockquote %}\n\nsnippet bt-codeblock-short\n ```\n ${1:code_snippet}\n ```\n\nsnippet bt-codeblock-full\n ``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\n ${5:code_snippet}\n ```\n\nsnippet codeblock-short\n {% codeblock %}\n ${1:code_snippet}\n {% endcodeblock %}\n\nsnippet codeblock-full\n {% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\n ${5:code_snippet}\n {% endcodeblock %}\n\nsnippet gist-full\n {% gist ${1:gist_id} ${2:filename} %}\n\nsnippet gist-short\n {% gist ${1:gist_id} %}\n\nsnippet img\n {% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\n\nsnippet youtube\n {% youtube ${1:video_id} %}\n\n# The quote should appear only once in the text. It is inherently part of it.\n# See http://octopress.org/docs/plugins/pullquote/ for more info.\n\nsnippet pullquote\n {% pullquote %}\n ${1:text} {" ${2:quote} "} ${3:text}\n {% endpullquote %}\n',t.scope="markdown"}); (function() {
ace.require(["ace/snippets/markdown"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/properties",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="properties"});
(function() {
ace.define("ace/snippets/properties",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="properties"}); (function() {
ace.require(["ace/snippets/properties"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/python",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='snippet #!\n #!/usr/bin/env python\nsnippet imp\n import ${1:module}\nsnippet from\n from ${1:package} import ${2:module}\n# Module Docstring\nsnippet docs\n \'\'\'\n File: ${1:FILENAME:file_name}\n Author: ${2:author}\n Description: ${3}\n \'\'\'\nsnippet wh\n while ${1:condition}:\n ${2:# TODO: write code...}\n# dowh - does the same as do...while in other languages\nsnippet dowh\n while True:\n ${1:# TODO: write code...}\n if ${2:condition}:\n break\nsnippet with\n with ${1:expr} as ${2:var}:\n ${3:# TODO: write code...}\n# New Class\nsnippet cl\n class ${1:ClassName}(${2:object}):\n """${3:docstring for $1}"""\n def __init__(self, ${4:arg}):\n ${5:super($1, self).__init__()}\n self.$4 = $4\n ${6}\n# New Function\nsnippet def\n def ${1:fname}(${2:`indent(\'.\') ? \'self\' : \'\'`}):\n """${3:docstring for $1}"""\n ${4:# TODO: write code...}\nsnippet deff\n def ${1:fname}(${2:`indent(\'.\') ? \'self\' : \'\'`}):\n ${3:# TODO: write code...}\n# New Method\nsnippet defs\n def ${1:mname}(self, ${2:arg}):\n ${3:# TODO: write code...}\n# New Property\nsnippet property\n def ${1:foo}():\n doc = "${2:The $1 property.}"\n def fget(self):\n ${3:return self._$1}\n def fset(self, value):\n ${4:self._$1 = value}\n# Ifs\nsnippet if\n if ${1:condition}:\n ${2:# TODO: write code...}\nsnippet el\n else:\n ${1:# TODO: write code...}\nsnippet ei\n elif ${1:condition}:\n ${2:# TODO: write code...}\n# For\nsnippet for\n for ${1:item} in ${2:items}:\n ${3:# TODO: write code...}\n# Encodes\nsnippet cutf8\n # -*- coding: utf-8 -*-\nsnippet clatin1\n # -*- coding: latin-1 -*-\nsnippet cascii\n # -*- coding: ascii -*-\n# Lambda\nsnippet ld\n ${1:var} = lambda ${2:vars} : ${3:action}\nsnippet .\n self.\nsnippet try Try/Except\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\nsnippet try Try/Except/Else\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n else:\n ${5:# TODO: write code...}\nsnippet try Try/Except/Finally\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n finally:\n ${5:# TODO: write code...}\nsnippet try Try/Except/Else/Finally\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n else:\n ${5:# TODO: write code...}\n finally:\n ${6:# TODO: write code...}\n# if __name__ == \'__main__\':\nsnippet ifmain\n if __name__ == \'__main__\':\n ${1:main()}\n# __magic__\nsnippet _\n __${1:init}__${2}\n# python debugger (pdb)\nsnippet pdb\n import pdb; pdb.set_trace()\n# ipython debugger (ipdb)\nsnippet ipdb\n import ipdb; ipdb.set_trace()\n# ipython debugger (pdbbb)\nsnippet pdbbb\n import pdbpp; pdbpp.set_trace()\nsnippet pprint\n import pprint; pprint.pprint(${1})${2}\nsnippet "\n """\n ${1:doc}\n """\n# test function/method\nsnippet test\n def test_${1:description}(${2:self}):\n ${3:# TODO: write code...}\n# test case\nsnippet testcase\n class ${1:ExampleCase}(unittest.TestCase):\n \n def test_${2:description}(self):\n ${3:# TODO: write code...}\nsnippet fut\n from __future__ import ${1}\n#getopt\nsnippet getopt\n try:\n # Short option syntax: "hv:"\n # Long option syntax: "help" or "verbose="\n opts, args = getopt.getopt(sys.argv[1:], "${1:short_options}", [${2:long_options}])\n \n except getopt.GetoptError, err:\n # Print debug info\n print str(err)\n ${3:error_action}\n\n for option, argument in opts:\n if option in ("-h", "--help"):\n ${4}\n elif option in ("-v", "--verbose"):\n verbose = argument\n',t.scope="python"});
(function() {
ace.define("ace/snippets/python",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='snippet #!\n #!/usr/bin/env python\nsnippet imp\n import ${1:module}\nsnippet from\n from ${1:package} import ${2:module}\n# Module Docstring\nsnippet docs\n \'\'\'\n File: ${1:FILENAME:file_name}\n Author: ${2:author}\n Description: ${3}\n \'\'\'\nsnippet wh\n while ${1:condition}:\n ${2:# TODO: write code...}\n# dowh - does the same as do...while in other languages\nsnippet dowh\n while True:\n ${1:# TODO: write code...}\n if ${2:condition}:\n break\nsnippet with\n with ${1:expr} as ${2:var}:\n ${3:# TODO: write code...}\n# New Class\nsnippet cl\n class ${1:ClassName}(${2:object}):\n """${3:docstring for $1}"""\n def __init__(self, ${4:arg}):\n ${5:super($1, self).__init__()}\n self.$4 = $4\n ${6}\n# New Function\nsnippet def\n def ${1:fname}(${2:`indent(\'.\') ? \'self\' : \'\'`}):\n """${3:docstring for $1}"""\n ${4:# TODO: write code...}\nsnippet deff\n def ${1:fname}(${2:`indent(\'.\') ? \'self\' : \'\'`}):\n ${3:# TODO: write code...}\n# New Method\nsnippet defs\n def ${1:mname}(self, ${2:arg}):\n ${3:# TODO: write code...}\n# New Property\nsnippet property\n def ${1:foo}():\n doc = "${2:The $1 property.}"\n def fget(self):\n ${3:return self._$1}\n def fset(self, value):\n ${4:self._$1 = value}\n# Ifs\nsnippet if\n if ${1:condition}:\n ${2:# TODO: write code...}\nsnippet el\n else:\n ${1:# TODO: write code...}\nsnippet ei\n elif ${1:condition}:\n ${2:# TODO: write code...}\n# For\nsnippet for\n for ${1:item} in ${2:items}:\n ${3:# TODO: write code...}\n# Encodes\nsnippet cutf8\n # -*- coding: utf-8 -*-\nsnippet clatin1\n # -*- coding: latin-1 -*-\nsnippet cascii\n # -*- coding: ascii -*-\n# Lambda\nsnippet ld\n ${1:var} = lambda ${2:vars} : ${3:action}\nsnippet .\n self.\nsnippet try Try/Except\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\nsnippet try Try/Except/Else\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n else:\n ${5:# TODO: write code...}\nsnippet try Try/Except/Finally\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n finally:\n ${5:# TODO: write code...}\nsnippet try Try/Except/Else/Finally\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n else:\n ${5:# TODO: write code...}\n finally:\n ${6:# TODO: write code...}\n# if __name__ == \'__main__\':\nsnippet ifmain\n if __name__ == \'__main__\':\n ${1:main()}\n# __magic__\nsnippet _\n __${1:init}__${2}\n# python debugger (pdb)\nsnippet pdb\n import pdb; pdb.set_trace()\n# ipython debugger (ipdb)\nsnippet ipdb\n import ipdb; ipdb.set_trace()\n# ipython debugger (pdbbb)\nsnippet pdbbb\n import pdbpp; pdbpp.set_trace()\nsnippet pprint\n import pprint; pprint.pprint(${1})${2}\nsnippet "\n """\n ${1:doc}\n """\n# test function/method\nsnippet test\n def test_${1:description}(${2:self}):\n ${3:# TODO: write code...}\n# test case\nsnippet testcase\n class ${1:ExampleCase}(unittest.TestCase):\n \n def test_${2:description}(self):\n ${3:# TODO: write code...}\nsnippet fut\n from __future__ import ${1}\n#getopt\nsnippet getopt\n try:\n # Short option syntax: "hv:"\n # Long option syntax: "help" or "verbose="\n opts, args = getopt.getopt(sys.argv[1:], "${1:short_options}", [${2:long_options}])\n \n except getopt.GetoptError, err:\n # Print debug info\n print str(err)\n ${3:error_action}\n\n for option, argument in opts:\n if option in ("-h", "--help"):\n ${4}\n elif option in ("-v", "--verbose"):\n verbose = argument\n',t.scope="python"}); (function() {
ace.require(["ace/snippets/python"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/sql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet tbl\n create table ${1:table} (\n ${2:columns}\n );\nsnippet col\n ${1:name} ${2:type} ${3:default ''} ${4:not null}\nsnippet ccol\n ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\nsnippet ncol\n ${1:name} number ${3:default 0} ${4:not null}\nsnippet dcol\n ${1:name} date ${3:default sysdate} ${4:not null}\nsnippet ind\n create index ${3:$1_$2} on ${1:table}(${2:column});\nsnippet uind\n create unique index ${1:name} on ${2:table}(${3:column});\nsnippet tblcom\n comment on table ${1:table} is '${2:comment}';\nsnippet colcom\n comment on column ${1:table}.${2:column} is '${3:comment}';\nsnippet addcol\n alter table ${1:table} add (${2:column} ${3:type});\nsnippet seq\n create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\nsnippet s*\n select * from ${1:table}\n",t.scope="sql"});
(function() {
ace.define("ace/snippets/sql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet tbl\n create table ${1:table} (\n ${2:columns}\n );\nsnippet col\n ${1:name} ${2:type} ${3:default ''} ${4:not null}\nsnippet ccol\n ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\nsnippet ncol\n ${1:name} number ${3:default 0} ${4:not null}\nsnippet dcol\n ${1:name} date ${3:default sysdate} ${4:not null}\nsnippet ind\n create index ${3:$1_$2} on ${1:table}(${2:column});\nsnippet uind\n create unique index ${1:name} on ${2:table}(${3:column});\nsnippet tblcom\n comment on table ${1:table} is '${2:comment}';\nsnippet colcom\n comment on column ${1:table}.${2:column} is '${3:comment}';\nsnippet addcol\n alter table ${1:table} add (${2:column} ${3:type});\nsnippet seq\n create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\nsnippet s*\n select * from ${1:table}\n",t.scope="sql"}); (function() {
ace.require(["ace/snippets/sql"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/swift",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="swift"});
(function() {
ace.define("ace/snippets/swift",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="swift"}); (function() {
ace.require(["ace/snippets/swift"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="text"});
(function() {
ace.define("ace/snippets/text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="text"}); (function() {
ace.require(["ace/snippets/text"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -0,0 +1,8 @@
ace.define("ace/snippets/xml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="xml"}); (function() {
ace.require(["ace/snippets/xml"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

View File

@@ -1,5 +1,4 @@
ace.define("ace/snippets/yaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="yaml"});
(function() {
ace.define("ace/snippets/yaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="yaml"}); (function() {
ace.require(["ace/snippets/yaml"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-chrome",t.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});
(function() {
ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-chrome",t.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() {
ace.require(["ace/theme/chrome"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

View File

@@ -1,5 +1,4 @@
ace.define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tomorrow",t.cssText=".ace-tomorrow .ace_gutter {background: #f6f6f6;color: #4D4D4C}.ace-tomorrow .ace_print-margin {width: 1px;background: #f6f6f6}.ace-tomorrow {background-color: #FFFFFF;color: #4D4D4C}.ace-tomorrow .ace_cursor {color: #AEAFAD}.ace-tomorrow .ace_marker-layer .ace_selection {background: #D6D6D6}.ace-tomorrow.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;}.ace-tomorrow .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-tomorrow .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #D1D1D1}.ace-tomorrow .ace_marker-layer .ace_active-line {background: #EFEFEF}.ace-tomorrow .ace_gutter-active-line {background-color : #dcdcdc}.ace-tomorrow .ace_marker-layer .ace_selected-word {border: 1px solid #D6D6D6}.ace-tomorrow .ace_invisible {color: #D1D1D1}.ace-tomorrow .ace_keyword,.ace-tomorrow .ace_meta,.ace-tomorrow .ace_storage,.ace-tomorrow .ace_storage.ace_type,.ace-tomorrow .ace_support.ace_type {color: #8959A8}.ace-tomorrow .ace_keyword.ace_operator {color: #3E999F}.ace-tomorrow .ace_constant.ace_character,.ace-tomorrow .ace_constant.ace_language,.ace-tomorrow .ace_constant.ace_numeric,.ace-tomorrow .ace_keyword.ace_other.ace_unit,.ace-tomorrow .ace_support.ace_constant,.ace-tomorrow .ace_variable.ace_parameter {color: #F5871F}.ace-tomorrow .ace_constant.ace_other {color: #666969}.ace-tomorrow .ace_invalid {color: #FFFFFF;background-color: #C82829}.ace-tomorrow .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #8959A8}.ace-tomorrow .ace_fold {background-color: #4271AE;border-color: #4D4D4C}.ace-tomorrow .ace_entity.ace_name.ace_function,.ace-tomorrow .ace_support.ace_function,.ace-tomorrow .ace_variable {color: #4271AE}.ace-tomorrow .ace_support.ace_class,.ace-tomorrow .ace_support.ace_type {color: #C99E00}.ace-tomorrow .ace_heading,.ace-tomorrow .ace_markup.ace_heading,.ace-tomorrow .ace_string {color: #718C00}.ace-tomorrow .ace_entity.ace_name.ace_tag,.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow .ace_meta.ace_tag,.ace-tomorrow .ace_string.ace_regexp,.ace-tomorrow .ace_variable {color: #C82829}.ace-tomorrow .ace_comment {color: #8E908C}.ace-tomorrow .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});
(function() {
ace.define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tomorrow",t.cssText=".ace-tomorrow .ace_gutter {background: #f6f6f6;color: #4D4D4C}.ace-tomorrow .ace_print-margin {width: 1px;background: #f6f6f6}.ace-tomorrow {background-color: #FFFFFF;color: #4D4D4C}.ace-tomorrow .ace_cursor {color: #AEAFAD}.ace-tomorrow .ace_marker-layer .ace_selection {background: #D6D6D6}.ace-tomorrow.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;}.ace-tomorrow .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-tomorrow .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #D1D1D1}.ace-tomorrow .ace_marker-layer .ace_active-line {background: #EFEFEF}.ace-tomorrow .ace_gutter-active-line {background-color : #dcdcdc}.ace-tomorrow .ace_marker-layer .ace_selected-word {border: 1px solid #D6D6D6}.ace-tomorrow .ace_invisible {color: #D1D1D1}.ace-tomorrow .ace_keyword,.ace-tomorrow .ace_meta,.ace-tomorrow .ace_storage,.ace-tomorrow .ace_storage.ace_type,.ace-tomorrow .ace_support.ace_type {color: #8959A8}.ace-tomorrow .ace_keyword.ace_operator {color: #3E999F}.ace-tomorrow .ace_constant.ace_character,.ace-tomorrow .ace_constant.ace_language,.ace-tomorrow .ace_constant.ace_numeric,.ace-tomorrow .ace_keyword.ace_other.ace_unit,.ace-tomorrow .ace_support.ace_constant,.ace-tomorrow .ace_variable.ace_parameter {color: #F5871F}.ace-tomorrow .ace_constant.ace_other {color: #666969}.ace-tomorrow .ace_invalid {color: #FFFFFF;background-color: #C82829}.ace-tomorrow .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #8959A8}.ace-tomorrow .ace_fold {background-color: #4271AE;border-color: #4D4D4C}.ace-tomorrow .ace_entity.ace_name.ace_function,.ace-tomorrow .ace_support.ace_function,.ace-tomorrow .ace_variable {color: #4271AE}.ace-tomorrow .ace_support.ace_class,.ace-tomorrow .ace_support.ace_type {color: #C99E00}.ace-tomorrow .ace_heading,.ace-tomorrow .ace_markup.ace_heading,.ace-tomorrow .ace_string {color: #718C00}.ace-tomorrow .ace_entity.ace_name.ace_tag,.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow .ace_meta.ace_tag,.ace-tomorrow .ace_string.ace_regexp,.ace-tomorrow .ace_variable {color: #C82829}.ace-tomorrow .ace_comment {color: #8E908C}.ace-tomorrow .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() {
ace.require(["ace/theme/tomorrow"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -172,17 +172,23 @@
inputs:0,
outputs:1,
outputLabels: function(index) {
var labels = { str:"string", num:"number", bool:"boolean", json:"object", flow:"flow context", global:"global context" };
var lab = labels[this.payloadType] || this.payloadType;
if (lab === "object") {
var lab = this.payloadType;
if (lab === "json") {
try {
lab = typeof JSON.parse(this.payload);
if (lab === "object") {
if (Array.isArray(JSON.parse(this.payload))) { lab = "Array"; }
}
} catch(e) { lab = "Invalid JSON Object"; }
} catch(e) {
return this._("inject.label.invalid"); }
}
return lab; },
var name = "inject.label."+lab;
var label = this._(name);
if (name !== label) {
return label;
}
return lab;
},
label: function() {
var suffix = "";
// if fire once then add small indication

View File

@@ -54,7 +54,7 @@
flowMap[activeSubflow.id] = {
id: activeSubflow.id,
class: 'palette-header',
label: "Subflow : "+(activeSubflow.name || activeSubflow.id)+(node.z===ws.id ? " *":""),
label: "Subflow : "+(activeSubflow.name || activeSubflow.id),
expanded: true,
children: []
};

View File

@@ -66,7 +66,13 @@
},
inputs:1,
outputs:3,
outputLabels: ["stdout","stderr","return code"],
outputLabels: function(i) {
return [
this._("exec.label.stdout"),
this._("exec.label.stderr"),
this._("exec.label.retcode")
][i];
},
icon: "arrow-in.png",
align: "right",
label: function() {

View File

@@ -27,7 +27,7 @@
name: {value:""},
func: {value:"\nreturn msg;"},
outputs: {value:1},
noerr: {value:0,required:true,validate:function(v) { return ((!v) || (v === 0)) ? true : false; }}
noerr: {value:0,required:true,validate:function(v) { return !v; }}
},
inputs:1,
outputs:1,

View File

@@ -88,10 +88,11 @@ module.exports = function(RED) {
};
}
var clearDelayList = function() {
var clearDelayList = function(s) {
for (var i=0; i<node.idList.length; i++ ) { node.idList[i].clear(); }
node.idList = [];
node.status({text:"reset"});
if (s) { node.status({text:"reset"}); }
else { node.status({}); }
}
var flushDelayList = function() {
@@ -124,7 +125,7 @@ module.exports = function(RED) {
if ((node.timeout > 1000) && (node.idList.length !== 0)) {
node.status({fill:"blue",shape:"dot",text:" "});
}
if (msg.hasOwnProperty("reset")) { clearDelayList(); }
if (msg.hasOwnProperty("reset")) { clearDelayList(true); }
}
});
node.on("close", function() { clearDelayList(); });
@@ -145,7 +146,7 @@ module.exports = function(RED) {
if ((delayvar >= 0) && (node.idList.length !== 0)) {
node.status({fill:"blue",shape:"dot",text:delayvar/1000+"s"});
}
if (msg.hasOwnProperty("reset")) { clearDelayList(); }
if (msg.hasOwnProperty("reset")) { clearDelayList(true); }
if (msg.hasOwnProperty("flush")) { flushDelayList(); }
});
node.on("close", function() { clearDelayList(); });
@@ -267,7 +268,7 @@ module.exports = function(RED) {
if ((node.timeout >= 1000) && (node.idList.length !== 0)) {
node.status({fill:"blue",shape:"dot",text:parseInt(wait/10)/100+"s"});
}
if (msg.hasOwnProperty("reset")) { clearDelayList(); }
if (msg.hasOwnProperty("reset")) { clearDelayList(true); }
if (msg.hasOwnProperty("flush")) { flushDelayList(); }
});
node.on("close", function() { clearDelayList(); });

View File

@@ -400,48 +400,47 @@ RED.debug = (function() {
}
function processDebugMessage(o) {
var msg = document.createElement("div");
var msg = $("<div/>");
var sourceNode = o._source;
msg.onmouseenter = function() {
$(msg).addClass('debug-message-hover');
msg.on("mouseenter", function() {
msg.addClass('debug-message-hover');
if (o._source) {
config.messageMouseEnter(o._source.id);
if (o._source._alias) {
config.messageMouseEnter(o._source._alias);
}
}
};
msg.onmouseleave = function() {
$(msg).removeClass('debug-message-hover');
});
msg.on("mouseleave", function() {
msg.removeClass('debug-message-hover');
if (o._source) {
config.messageMouseLeave(o._source.id);
if (o._source._alias) {
config.messageMouseLeave(o._source._alias);
}
}
};
});
var name = sanitize(((o.name?o.name:o.id)||"").toString());
var topic = sanitize((o.topic||"").toString());
var property = sanitize(o.property?o.property:'');
var payload = o.msg;
var format = sanitize((o.format||"").toString());
msg.className = 'debug-message'+(o.level?(' debug-message-level-'+o.level):'')+
msg.attr("class", 'debug-message'+(o.level?(' debug-message-level-'+o.level):'')+
(sourceNode?(
" debug-message-node-"+sourceNode.id.replace(/\./g,"_")+
(sourceNode.z?" debug-message-flow-"+sourceNode.z.replace(/\./g,"_"):"")
):"");
):""));
if (sourceNode) {
$(msg).data('source',sourceNode.id);
msg.data('source',sourceNode.id);
if (filterType === "filterCurrent" && activeWorkspace) {
if (sourceNode.z && sourceNode.z.replace(/\./g,"_") !== activeWorkspace) {
$(msg).addClass('hide');
msg.addClass('hide');
}
} else if (filterType === 'filterSelected'){
if (!!filteredNodes[sourceNode.id]) {
$(msg).addClass('hide');
msg.addClass('hide');
}
}
}
@@ -449,7 +448,7 @@ RED.debug = (function() {
var metaRow = $('<div class="debug-message-meta"></div>').appendTo(msg);
$('<span class="debug-message-date">'+ getTimestamp()+'</span>').appendTo(metaRow);
if (sourceNode) {
$('<a>',{href:"#",class:"debug-message-name"}).html('node: '+(sourceNode.name||sourceNode.id))
$('<a>',{href:"#",class:"debug-message-name"}).text('node: '+(sourceNode.name||sourceNode.id))
.appendTo(metaRow)
.click(function(evt) {
evt.preventDefault();
@@ -481,7 +480,7 @@ RED.debug = (function() {
errorLvl = 30;
errorLvlType = 'warn';
}
$(msg).addClass('debug-message-level-' + errorLvl);
msg.addClass('debug-message-level-' + errorLvl);
$('<span class="debug-message-topic">function : (' + errorLvlType + ')</span>').appendTo(metaRow);
} else {
var tools = $('<span class="debug-message-tools button-group"></span>').appendTo(metaRow);

View File

@@ -315,7 +315,7 @@ module.exports = function(RED) {
}
};
this.unsubscribe = function (topic, ref) {
this.unsubscribe = function (topic, ref, removed) {
ref = ref||0;
var sub = node.subscriptions[topic];
if (sub) {
@@ -323,10 +323,12 @@ module.exports = function(RED) {
node.client.removeListener('message',sub[ref].handler);
delete sub[ref];
}
if (Object.keys(sub).length === 0) {
delete node.subscriptions[topic];
if (node.connected) {
node.client.unsubscribe(topic);
if (removed) {
if (Object.keys(sub).length === 0) {
delete node.subscriptions[topic];
if (node.connected) {
node.client.unsubscribe(topic);
}
}
}
}
@@ -430,10 +432,7 @@ module.exports = function(RED) {
}
this.on('close', function(removed, done) {
if (node.brokerConn) {
if (removed) {
// This node has been removed so remove any subscriptions
node.brokerConn.unsubscribe(node.topic,node.id);
}
node.brokerConn.unsubscribe(node.topic,node.id, removed);
node.brokerConn.deregister(node,done);
}
});

View File

@@ -22,7 +22,8 @@ module.exports = function(RED) {
var getBody = require('raw-body');
var cors = require('cors');
var onHeaders = require('on-headers');
var typer = require('media-typer');
var typer = require('content-type');
var mediaTyper = require('media-typer');
var isUtf8 = require('is-utf8');
var hashSum = require("hash-sum");
@@ -36,18 +37,22 @@ module.exports = function(RED) {
var checkUTF = false;
if (req.headers['content-type']) {
var parsedType = typer.parse(req.headers['content-type'])
if (parsedType.type === "text") {
isText = true;
} else if (parsedType.subtype === "xml" || parsedType.suffix === "xml") {
isText = true;
} else if (parsedType.type !== "application") {
isText = false;
} else if (parsedType.subtype !== "octet-stream") {
checkUTF = true;
} else {
// applicatino/octet-stream
isText = false;
var contentType = typer.parse(req.headers['content-type'])
if (contentType.type) {
var parsedType = mediaTyper.parse(contentType.type);
if (parsedType.type === "text") {
isText = true;
} else if (parsedType.subtype === "xml" || parsedType.suffix === "xml") {
isText = true;
} else if (parsedType.type !== "application") {
isText = false;
} else if (parsedType.subtype !== "octet-stream") {
checkUTF = true;
} else {
// applicatino/octet-stream
isText = false;
}
}
}

View File

@@ -49,11 +49,20 @@
<label for="node-input-useAuth" style="width: 70%;"><span data-i18n="httpin.basicauth"></span></label>
<div style="margin-left: 20px" class="node-input-useAuth-row hide">
<div class="form-row">
<label for="node-input-authType-select"><i class="fa fa-user-secret "></i> <span data-i18n="httpin.label.authType"></span></label>
<select type="text" id="node-input-authType-select" style="width:70%;">
<option value="basic" data-i18n="httpin.basic"></option>
<option value="digest" data-i18n="httpin.digest"></option>
<option value="bearer" data-i18n="httpin.bearer"></option>
</select>
<input type="hidden" id="node-input-authType">
</div>
<div class="form-row node-input-basic-row">
<label for="node-input-user"><i class="fa fa-user"></i> <span data-i18n="common.label.username"></span></label>
<input type="text" id="node-input-user">
</div>
<div class="form-row">
<label for="node-input-password"><i class="fa fa-lock"></i> <span data-i18n="common.label.password"></span></label>
<label for="node-input-password"> <i class="fa fa-lock"></i> <span data-i18n="common.label.password" id="node-span-password"></span><span data-i18n="httpin.label.bearerToken" id="node-span-token" style="display:none"></span></label>
<input type="password" id="node-input-password">
</div>
</div>
@@ -93,7 +102,8 @@
paytoqs: {value: false},
url:{value:"",validate:function(v) { return (v.trim().length === 0) || (v.indexOf("://") === -1) || (v.trim().indexOf("http") === 0)} },
tls: {type:"tls-config",required: false},
proxy: {type:"http proxy",required: false}
proxy: {type:"http proxy",required: false},
authType: {value: ""}
},
credentials: {
user: {type:"text"},
@@ -102,7 +112,11 @@
inputs:1,
outputs:1,
outputLabels: function(i) {
return ({txt:"UTF8 string", bin:"binary buffer", obj:"parsed JSON object"}[this.ret]);
return ({
txt: this._("httpin.label.utf8String"),
bin: this._("httpin.label.binaryBuffer"),
obj: this._("httpin.label.jsonObject")
}[this.ret]);
},
icon: "white-globe.png",
label: function() {
@@ -115,12 +129,31 @@
$("#node-input-useAuth").change(function() {
if ($(this).is(":checked")) {
$(".node-input-useAuth-row").show();
// Nodes (< version 0.20.x) with credentials but without authentication type, need type 'basic'
if (!$('#node-input-authType').val()) {
$("#node-input-authType-select").val('basic').trigger("change");
}
} else {
$(".node-input-useAuth-row").hide();
$('#node-input-authType').val('');
$('#node-input-user').val('');
$('#node-input-password').val('');
}
});
$("#node-input-authType-select").change(function() {
var val = $(this).val();
$("#node-input-authType").val(val);
if (val === "basic" || val === "digest") {
$(".node-input-basic-row").show();
$('#node-span-password').show();
$('#node-span-token').hide();
} else if (val === "bearer") {
$(".node-input-basic-row").hide();
$('#node-span-password').hide();
$('#node-span-token').show();
$('#node-input-user').val('');
}
});
$("#node-input-method").change(function() {
if ($(this).val() == "GET") {
$(".node-input-paytoqs-row").show();
@@ -128,8 +161,9 @@
$(".node-input-paytoqs-row").hide();
}
});
if (this.credentials.user || this.credentials.has_password) {
if (this.authType) {
$('#node-input-useAuth').prop('checked', true);
$("#node-input-authType-select").val(this.authType);
} else {
$('#node-input-useAuth').prop('checked', false);
}

View File

@@ -33,6 +33,7 @@ module.exports = function(RED) {
var tlsNode = RED.nodes.getNode(n.tls);
}
this.ret = n.ret || "txt";
this.authType = n.authType || "basic";
if (RED.settings.httpRequestTimeout) { this.reqTimeout = parseInt(RED.settings.httpRequestTimeout) || 120000; }
else { this.reqTimeout = 120000; }
@@ -93,10 +94,10 @@ module.exports = function(RED) {
opts.maxRedirects = 21;
opts.jar = request.jar();
opts.proxy = null;
if (msg.requestTimeout) {
if (msg.requestTimeout !== undefined) {
if (isNaN(msg.requestTimeout)) {
node.warn(RED._("httpin.errors.timeout-isnan"));
} else if (msg.requestTimeout < 0) {
} else if (msg.requestTimeout < 1) {
node.warn(RED._("httpin.errors.timeout-isnegative"));
} else {
opts.timeout = msg.requestTimeout;
@@ -175,37 +176,79 @@ module.exports = function(RED) {
}
}
}
if (this.credentials && this.credentials.user) {
opts.auth = {
user: this.credentials.user,
pass: this.credentials.password||""
};
if (this.credentials) {
if (this.authType === "basic") {
if (this.credentials.user) {
opts.auth = {
user: this.credentials.user,
pass: this.credentials.password || ""
};
}
} else if (this.authType === "digest") {
if (this.credentials.user) {
// The first request will be sent without auth information. Based on the 401 response, the library can determine
// which auth type is required by the server. Then the request is resubmitted with the appropriate auth header.
opts.auth = {
user: this.credentials.user,
pass: this.credentials.password || "",
sendImmediately: false
};
}
} else if (this.authType === "bearer") {
opts.auth = {
bearer: this.credentials.password || ""
};
}
}
var payload = null;
if (method !== 'GET' && method !== 'HEAD' && typeof msg.payload !== "undefined") {
if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) {
payload = msg.payload;
} else if (typeof msg.payload == "number") {
payload = msg.payload+"";
} else {
if (opts.headers['content-type'] == 'application/x-www-form-urlencoded') {
payload = querystring.stringify(msg.payload);
} else {
payload = JSON.stringify(msg.payload);
if (opts.headers['content-type'] == null) {
opts.headers[ctSet] = "application/json";
if (opts.headers['content-type'] == 'multipart/form-data' && typeof msg.payload === "object") {
opts.formData = {};
for (var opt in msg.payload) {
if (msg.payload.hasOwnProperty(opt)) {
var val = msg.payload[opt];
if (val !== undefined && val !== null) {
if (typeof val === 'string' || Buffer.isBuffer(val)) {
opts.formData[opt] = val;
} else if (typeof val === 'object' && val.hasOwnProperty('value')) {
// Treat as file to upload - ensure it has an options object
// as request complains if it doesn't
if (!val.hasOwnProperty('options')) {
val.options = {};
}
opts.formData[opt] = val;
} else {
opts.formData[opt] = JSON.stringify(val);
}
}
}
}
}
if (opts.headers['content-length'] == null) {
if (Buffer.isBuffer(payload)) {
opts.headers[clSet] = payload.length;
} else {
if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) {
payload = msg.payload;
} else if (typeof msg.payload == "number") {
payload = msg.payload+"";
} else {
opts.headers[clSet] = Buffer.byteLength(payload);
if (opts.headers['content-type'] == 'application/x-www-form-urlencoded') {
payload = querystring.stringify(msg.payload);
} else {
payload = JSON.stringify(msg.payload);
if (opts.headers['content-type'] == null) {
opts.headers[ctSet] = "application/json";
}
}
}
if (opts.headers['content-length'] == null) {
if (Buffer.isBuffer(payload)) {
opts.headers[clSet] = payload.length;
} else {
opts.headers[clSet] = Buffer.byteLength(payload);
}
}
opts.body = payload;
}
opts.body = payload;
}
if (method == 'GET' && typeof msg.payload !== "undefined" && paytoqs) {

View File

@@ -72,19 +72,19 @@ module.exports = function(RED) {
var id = (1+Math.random()*4294967295).toString(16);
if (node.isServer) {
node._clients[id] = socket;
node.emit('opened',Object.keys(node._clients).length);
node.emit('opened',{count:Object.keys(node._clients).length,id:id});
}
socket.on('open',function() {
if (!node.isServer) {
node.emit('opened','');
node.emit('opened',{count:'',id:id});
}
});
socket.on('close',function() {
if (node.isServer) {
delete node._clients[id];
node.emit('closed',Object.keys(node._clients).length);
node.emit('closed',{count:Object.keys(node._clients).length,id:id});
} else {
node.emit('closed');
node.emit('closed',{count:'',id:id});
}
if (!node.closing && !node.isServer) {
clearTimeout(node.tout);
@@ -95,7 +95,7 @@ module.exports = function(RED) {
node.handleEvent(id,socket,'message',data,flags);
});
socket.on('error', function(err) {
node.emit('erro');
node.emit('erro',{err:err,id:id});
if (!node.closing && !node.isServer) {
clearTimeout(node.tout);
node.tout = setTimeout(function() { startconn(); }, 3000); // try to reconnect every 3 secs... bit fast ?
@@ -141,10 +141,10 @@ module.exports = function(RED) {
node.server.close();
node._inputNodes = [];
activeListenerNodes--;
if (activeListenerNodes === 0 && serverUpgradeAdded) {
RED.server.removeListener('upgrade', handleServerUpgrade);
serverUpgradeAdded = false;
}
// if (activeListenerNodes === 0 && serverUpgradeAdded) {
// RED.server.removeListener('upgrade', handleServerUpgrade);
// serverUpgradeAdded = false;
// }
}
@@ -230,14 +230,30 @@ module.exports = function(RED) {
if (this.serverConfig) {
this.serverConfig.registerInputNode(this);
// TODO: nls
this.serverConfig.on('opened', function(n) { node.status({fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:n})}); });
this.serverConfig.on('erro', function() { node.status({fill:"red",shape:"ring",text:"common.status.error"}); });
this.serverConfig.on('closed', function(n) {
if (n > 0) {
node.status({fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:n})});
this.serverConfig.on('opened', function(event) {
node.status({
fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count}),
event:"connect",
_session: {type:"websocket",id:event.id}
});
});
this.serverConfig.on('erro', function(event) {
node.status({
fill:"red",shape:"ring",text:"common.status.error",
event:"error",
_session: {type:"websocket",id:event.id}
});
});
this.serverConfig.on('closed', function(event) {
var status;
if (event.count > 0) {
status = {fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count})};
} else {
node.status({fill:"red",shape:"ring",text:"common.status.disconnected"});
status = {fill:"red",shape:"ring",text:"common.status.disconnected"};
}
status.event = "disconnect";
status._session = {type:"websocket",id:event.id}
node.status(status);
});
} else {
this.error(RED._("websocket.errors.missing-conf"));
@@ -261,11 +277,30 @@ module.exports = function(RED) {
}
else {
// TODO: nls
this.serverConfig.on('opened', function(n) { node.status({fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:n})}); });
this.serverConfig.on('erro', function() { node.status({fill:"red",shape:"ring",text:"common.status.error"}); });
this.serverConfig.on('closed', function(n) {
if (n > 0) { node.status({fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:n})}); }
else { node.status({fill:"red",shape:"ring",text:"common.status.disconnected"}); }
this.serverConfig.on('opened', function(event) {
node.status({
fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count}),
event:"connect",
_session: {type:"websocket",id:event.id}
});
});
this.serverConfig.on('erro', function(event) {
node.status({
fill:"red",shape:"ring",text:"common.status.error",
event:"error",
_session: {type:"websocket",id:event.id}
})
});
this.serverConfig.on('closed', function(event) {
var status;
if (event.count > 0) {
status = {fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count})};
} else {
status = {fill:"red",shape:"ring",text:"common.status.disconnected"};
}
status.event = "disconnect";
status._session = {type:"websocket",id:event.id}
node.status(status);
});
}
this.on("input", function(msg) {

View File

@@ -158,7 +158,13 @@ module.exports = function(RED) {
var fromp;
connectionPool[id] = socket;
count++;
node.status({text:RED._("tcpin.status.connections",{count:count})});
node.status({
text:RED._("tcpin.status.connections",{count:count}),
event:"connect",
ip:socket.remoteAddress,
port:socket.remotePort,
_session: {type:"tcp",id:id}
});
var buffer = (node.datatype == 'buffer') ? Buffer.alloc(0) : "";
socket.on('data', function (data) {
@@ -209,7 +215,14 @@ module.exports = function(RED) {
socket.on('close', function() {
delete connectionPool[id];
count--;
node.status({text:RED._("tcpin.status.connections",{count:count})});
node.status({
text:RED._("tcpin.status.connections",{count:count}),
event:"disconnect",
ip:socket.remoteAddress,
port:socket.remotePort,
_session: {type:"tcp",id:id}
});
});
socket.on('error',function(err) {
node.log(err);

View File

@@ -251,7 +251,7 @@ module.exports = function(RED) {
}
}
});
}, 150);
}, 75);
node.on("close", function() {
if (node.tout) { clearTimeout(node.tout); }

View File

@@ -572,6 +572,8 @@ module.exports = function(RED) {
}
}
if (msg.hasOwnProperty("reset")) { if (inflight[partId]) { delete inflight[partId] }; return; }
if ((payloadType === 'object') && (propertyKey === null || propertyKey === undefined || propertyKey === "")) {
if (node.mode === "auto") {
node.warn("Message missing 'msg.parts.key' property - cannot add to object");
@@ -590,7 +592,6 @@ module.exports = function(RED) {
return;
}
if (msg.hasOwnProperty("reset")) { if (inflight[partid]) { delete inflight[partId] } return; }
if (!inflight.hasOwnProperty(partId)) {
if (payloadType === 'object' || payloadType === 'merged') {
inflight[partId] = {
@@ -627,12 +628,13 @@ module.exports = function(RED) {
var group = inflight[partId];
if (payloadType === 'buffer') {
inflight[partId].bufferLen += property.length;
if (property !== undefined) {
inflight[partId].bufferLen += property.length;
}
}
if (payloadType === 'object') {
group.payload[propertyKey] = property;
group.currentCount = Object.keys(group.payload).length;
//msg.topic = node.topic || msg.topic;
} else if (payloadType === 'merged') {
if (Array.isArray(property) || typeof property !== 'object') {
if (!msg.hasOwnProperty("complete")) {

View File

@@ -82,7 +82,7 @@ module.exports = function(RED) {
}
}
}
else if (typeof value === "object") {
else if ((typeof value === "object") || (typeof value === "boolean") || (typeof value === "number")) {
if (node.action === "" || node.action === "str") {
if (!Buffer.isBuffer(value)) {
try {

219
packages/node_modules/@node-red/nodes/core/storage/50-file.html vendored Normal file → Executable file
View File

@@ -22,6 +22,11 @@
<input type="checkbox" id="node-input-createDir" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-createDir" style="width: 70%;"><span data-i18n="file.label.createdir"></span></label>
</div>
<div class="form-row form-row-file-encoding">
<label for="node-input-encoding"><i class="fa fa-flag"></i> <span data-i18n="file.label.encoding"></span></label>
<select type="text" id="node-input-encoding" style="width: 250px;">
</select>
</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">
@@ -48,6 +53,11 @@
<input type="checkbox" id="node-input-sendError" style="width:auto">
<label style="width:auto; margin-bottom:0; vertical-align: middle;" for="node-input-sendError" data-i18n="file.label.sendError"></label>
</div>
<div class="form-row" id="encoding-spec">
<label for="node-input-encoding"><i class="fa fa-flag"></i> <span data-i18n="file.label.encoding"></span></label>
<select type="text" id="node-input-encoding" style="width: 250px;">
</select>
</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">
@@ -56,6 +66,132 @@
</script>
<script type="text/javascript">
(function(){
var encodings = [
[ "file.encoding.native",
"utf8",
"ucs2",
"utf-16le",
"ascii",
"binary",
"base64",
"hex"
],
[ "file.encoding.unicode",
"utf-16be",
],
[ "file.encoding.japanese",
"Shift_JIS",
"Windows-31j",
"Windows932",
"EUC-JP"
],
[ "file.encoding.chinese",
"GB2312",
"GBK",
"GB18030",
"Windows936",
"EUC-CN"
],
[ "file.encoding.korean",
"KS_C_5601",
"Windows949",
"EUC-KR"
],
[ "file.encoding.taiwan",
"Big5",
"Big5-HKSCS",
"Windows950"
],
[ "file.encoding.windows",
"cp874",
"cp1250",
"cp1251",
"cp1252",
"cp1253",
"cp1254",
"cp1255",
"cp1256",
"cp1257",
"cp1258"
],
[ "file.encoding.iso",
"ISO-8859-1",
"ISO-8859-2",
"ISO-8859-3",
"ISO-8859-4",
"ISO-8859-5",
"ISO-8859-6",
"ISO-8859-7",
"ISO-8859-8",
"ISO-8859-9",
"ISO-8859-10",
"ISO-8859-11",
"ISO-8859-12",
"ISO-8859-13",
"ISO-8859-14",
"ISO-8859-15",
"ISO-8859-16"
],
[ "file.encoding.ibm",
"cp437",
"cp737",
"cp775",
"cp808",
"cp850",
"cp852",
"cp855",
"cp856",
"cp857",
"cp858",
"cp860",
"cp861",
"cp866",
"cp869",
"cp922",
"cp1046",
"cp1124",
"cp1125",
"cp1129",
"cp1133",
"cp1161",
"cp1162",
"cp1163"
],
[ "file.encoding.mac",
"maccroatian",
"maccyrillic",
"macgreek",
"maciceland",
"macroman",
"macromania",
"macthai",
"macturkish",
"macukraine",
"maccenteuro",
"macintosh"
],
[ "file.encoding.koi8",
"koi8-r",
"koi8-u",
"koi8-ru",
"koi8-t"
],
[ "file.encoding.misc",
"armscii8",
"rk1048",
"tcvn",
"georgianacademy",
"georgianps",
"pt154",
"viscii",
"iso646cn",
"iso646jp",
"hproman8",
"tis620"
]
];
RED.nodes.registerType('file',{
category: 'storage-output',
defaults: {
@@ -63,7 +199,8 @@
filename: {value:""},
appendNewline: {value:true},
createDir: {value:false},
overwriteFile: {value:"false"}
overwriteFile: {value:"false"},
encoding: {value:"none"}
},
color:"BurlyWood",
inputs:1,
@@ -80,9 +217,42 @@
return this.name?"node_label_italic":"";
},
oneditprepare: function() {
var node = this;
var encSel = $("#node-input-encoding");
var label = node._("file.encoding.none");
$("<option/>", {
value: "none",
label: label
}).text(label).appendTo(encSel);
encodings.forEach(function(item) {
if(Array.isArray(item)) {
var group = $("<optgroup/>", {
label: node._(item[0])
}).appendTo(encSel);
for (var i = 1; i < item.length; i++) {
var enc = item[i];
$("<option/>", {
value: enc,
label: enc
}).text(enc).appendTo(group);
}
}
else {
$("<option/>", {
value: item,
label: item
}).text(item).appendTo(encSel);
}
});
encSel.val(node.encoding);
$("#node-input-overwriteFile").on("change",function() {
if (this.value === "delete") { $(".form-row-file-write-options").hide(); }
else { $(".form-row-file-write-options").show(); }
if (this.value === "delete") {
$(".form-row-file-write-options").hide();
$(".form-row-file-encoding").hide();
} else {
$(".form-row-file-write-options").show();
$(".form-row-file-encoding").show();
}
});
}
});
@@ -94,13 +264,14 @@
filename: {value:""},
format: {value:"utf8"},
chunk: {value:false},
sendError: {value: false}
sendError: {value: false},
encoding: {value: "none"}
},
color:"BurlyWood",
inputs:1,
outputs:1,
outputLabels: function(i) {
return (this.format === "utf8") ? "UTF8 string" : "binary buffer";
return (this._((this.format === "utf8") ? "file.label.utf8String" : "file.label.binaryBuffer"));
},
icon: "file-in.png",
label: function() {
@@ -110,19 +281,47 @@
return this.name?"node_label_italic":"";
},
oneditprepare: function() {
var node = this;
var encSel = $("#node-input-encoding");
var label = node._("file.encoding.none");
$("<option/>", {
value: "none",
label: label
}).text(label).appendTo(encSel);
encodings.forEach(function(item) {
if(Array.isArray(item)) {
var group = $("<optgroup/>", {
label: node._(item[0])
}).appendTo(encSel);
for (var i = 1; i < item.length; i++) {
var enc = item[i];
$("<option/>", {
value: enc,
label: enc
}).text(enc).appendTo(group);
}
}
else {
$("<option/>", {
value: item,
label: item
}).text(item).appendTo(encSel);
}
});
encSel.val(node.encoding);
if (this.sendError === undefined) {
$("#node-input-sendError").prop("checked",true);
}
$("#node-input-format").on("change",function() {
if ($("#node-input-format").val() === "utf8") {
$("#buffer-input-type").hide();
$("#line-input-type").show();
var format = $("#node-input-format").val();
if ((format === "utf8") || (format === "lines")) {
$("#encoding-spec").show();
}
else {
$("#buffer-input-type").show();
$("#line-input-type").hide();
$("#encoding-spec").hide();
}
});
}
});
})();
</script>

View File

@@ -19,13 +19,29 @@ module.exports = function(RED) {
var fs = require("fs-extra");
var os = require("os");
var path = require("path");
var iconv = require("iconv-lite")
function encode(data, enc) {
if (enc !== "none") {
return iconv.encode(data, enc);
}
return Buffer.from(data);
}
function decode(data, enc) {
if (enc !== "none") {
return iconv.decode(data, enc);
}
return data.toString();
}
function FileNode(n) {
RED.nodes.createNode(this,n);
this.filename = n.filename;
this.appendNewline = n.appendNewline;
this.overwriteFile = n.overwriteFile.toString();
this.createDir = n.createDir || false;
this.encoding = n.encoding || "none";
var node = this;
node.wstream = null;
node.msgQueue = [];
@@ -75,6 +91,7 @@ module.exports = function(RED) {
if (typeof data === "boolean") { data = data.toString(); }
if (typeof data === "number") { data = data.toString(); }
if ((node.appendNewline) && (!Buffer.isBuffer(data))) { data += os.EOL; }
var buf = encode(data, node.encoding);
if (node.overwriteFile === "true") {
var wstream = fs.createWriteStream(filename, { encoding:'binary', flags:'w', autoClose:true });
node.wstream = wstream;
@@ -83,7 +100,7 @@ module.exports = function(RED) {
done();
});
wstream.on("open", function() {
wstream.end(data, function() {
wstream.end(buf, function() {
node.send(msg);
done();
});
@@ -132,13 +149,13 @@ module.exports = function(RED) {
}
if (node.filename) {
// Static filename - write and reuse the stream next time
node.wstream.write(data, function() {
node.wstream.write(buf, function() {
node.send(msg);
done();
});
} else {
// Dynamic filename - write and close the stream
node.wstream.end(data, function() {
node.wstream.end(buf, function() {
node.send(msg);
delete node.wstream;
delete node.wstreamIno;
@@ -221,6 +238,7 @@ module.exports = function(RED) {
this.filename = n.filename;
this.format = n.format;
this.chunk = false;
this.encoding = n.encoding || "none";
if (n.sendError === undefined) {
this.sendError = true;
} else {
@@ -260,7 +278,7 @@ module.exports = function(RED) {
if (node.chunk === true) {
getout = true;
if (node.format === "lines") {
spare += chunk.toString();
spare += decode(chunk, node.encoding);
var bits = spare.split("\n");
for (var i=0; i < bits.length - 1; i++) {
var m = {
@@ -305,7 +323,9 @@ module.exports = function(RED) {
})
.on('end', function() {
if (node.chunk === false) {
if (node.format === "utf8") { msg.payload = lines.toString(); }
if (node.format === "utf8") {
msg.payload = decode(lines, node.encoding);
}
else { msg.payload = lines; }
node.send(msg);
}

View File

@@ -22,17 +22,17 @@
<dt> Nutzdaten <span class="property-type"> verschiedene Tyoen </span> </dt>
<dd> Die konfigurierten Nutzdaten der Nachricht. </dd>
<dt class="optional"> Topic <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Eine optionale Eigenschaft, die im Knoten konfiguriert werden kann. </dd>
<dd> Eine optionale Eigenschaft, die im Node konfiguriert werden kann. </dd>
</dl>
<h3> Details </h3>
<p> Der Inject-Knoten kann einen Flow mit einem bestimmten Nutzdatenwert starten.
Die Standardnutzlast ist die aktuelle Zeit als Zeitmarke seit dem 1. Januar 1970 in Millisekunden. </p>
<p> Der Knoten unterstützt auch die Injektion von Zeichenfolgen, Zahlen, Boolescher Daten, JavaScript-Objekten oder flow/globalen Kontextwerten. </p>
<p> Der Knoten wird standardmäßig manuell ausgelöst, indem Sie im Editor auf seine Schaltfläche klicken. Er kann auch in regelmäßigen Abständen oder nach einem Zeitplan injizieren. </p>
<p> Der Inject-Node kann einen Flow mit einem bestimmten Nutzdatenwert starten.
Der Standard-Payload ist die aktuelle Zeit als Zeitstempel seit dem 1. Januar 1970 in Millisekunden. </p>
<p> Der Node unterstützt auch die Injektion von Zeichenfolgen, Zahlen, Boolescher Daten, JavaScript-Objekten oder flow/globalen Kontextwerten. </p>
<p> Der Node wird standardmäßig manuell ausgelöst, indem Sie im Editor auf seine Schaltfläche klicken. Er kann auch in regelmäßigen Abständen oder nach einem Zeitplan injizieren. </p>
<p> Er kann auch so konfiguriert werden, dass er jedes Mal, wenn der Flow gestartet wird einen Wert injiziert. </p>
<p> Das maximale <i> Intervall </i> , das angegeben werden kann, beträgt etwa 596 Stunden/24 Tage. Wenn Sie jedoch Intervalle grösser als 24h verwenden wollen, sollten Sie einen Scheduler-Knoten verwenden, der mit Stromausfällen und Neustarts besser umgehen kann. </p>
<p> Das maximale <i> Intervall </i> , das angegeben werden kann, beträgt etwa 596 Stunden/24 Tage. Wenn Sie jedoch Intervalle grösser als 24h verwenden wollen, sollten Sie einen Scheduler-Node verwenden, der mit Stromausfällen und Neustarts besser umgehen kann. </p>
<p> <b> Hinweis </b>: Die Optionen <i> "Intervall zwischen den Zeiten" </i> und <i> "Zu einem bestimmten Zeitpunkt" </i> verwenden das Standardcron-System.
Dies bedeutet, dass 20 Minuten bedeuten, dass der Event in der nächsten Stunde, 20 Minuten nach der Stunde und 40 Minuten nach der Stunde - aber nicht in 20 Minuten Zeit.
Wenn Sie alle 20 Minuten ab sofort verwenden möchten, verwenden Sie die Option <i> "interval" </i> . </p>
<p> <b> Hinweis </b>: Um eine neue Zeile in eine Zeichenfolge einzuschließen, müssen Sie einen Funktionsknoten verwenden, um die Nutzdaten zu erstellen. </p>
<p> <b> Hinweis </b>: Um eine neue Zeile in eine Zeichenfolge einzuschließen, müssen Sie einen Funktions-Node verwenden, um die Nutzdaten zu erstellen. </p>
</script>

View File

@@ -15,26 +15,26 @@
-->
<script type="text/x-red" data-help-name="catch">
<p> Fängt Fehler von Knoten auf derselben Registerkarte. </p>
<p> Fängt Fehler von Nodes auf derselben Registerkarte ab. </p>
<h3> Ausgaben </h3>
<dl class="message-properties">
<dt> error.message <span class="property-type"> Zeichenfolge </span> </dt>
<dd> die Fehlernachricht. </dd>
<dt> error.source.id <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Die ID des Knotens, der den Fehler ausgelöst hat. </dd>
<dd> Die ID des Nodes, der den Fehler ausgelöst hat. </dd>
<dt> error.source.type <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Der Typ des Knotens, der den Fehler ausgelöst hat. </dd>
<dd> Der Typ des Nodes, der den Fehler ausgelöst hat. </dd>
<dt> error.source.name <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Der Name des Knotens (falls festgelegt), der den Fehler ausgelöst hat. </dd>
<dd> Der Name des Nodes (falls festgelegt), der den Fehler ausgelöst hat. </dd>
</dl>
<h3> Details </h3>
<p> Wenn ein Knoten bei der Verarbeitung einer Nachricht einen Fehler auslöst, wird der Flow in der Regel
angehalten. Dieser Knoten kann verwendet werden, um diese Fehler abzufangen und sie mit einem
<p> Wenn ein Node bei der Verarbeitung einer Nachricht einen Fehler auslöst, wird der Flow in der Regel
angehalten. Dieser Node kann verwendet werden, um diese Fehler abzufangen und sie mit einem
dedizierten Flow zu bearbeiten. </p>
<p> Der Knoten fängt standardmäßig Fehler ab, die von einem beliebigen Knoten auf derselben Registerkarte ausgelöst werden. Alternativ
kann er an einen bestimmten Knoten gebunden werden. </p>
<p> Wenn ein Fehler ausgelöst wird, empfangen alle übereinstimmenden Fehlerabfang-Knoten die Nachricht. </p>
<p> Wenn ein Fehler in einem Subflow ausgelöst wird, wird der Fehler von einem Fehlerabfangknoten
<p> Der Node fängt standardmäßig Fehler ab, die von einem beliebigen Node auf derselben Registerkarte ausgelöst werden. Alternativ
kann er an einen bestimmten Node gebunden werden. </p>
<p> Wenn ein Fehler ausgelöst wird, empfangen alle übereinstimmenden Fehlerabfang-Node die Nachricht. </p>
<p> Wenn ein Fehler in einem Subflow ausgelöst wird, wird der Fehler von einem Fehlerabfang-Node
innerhalb des Subflows abgefangen. Wenn keine vorhanden sind, wird zu dem Tab geleitet,
in der sich die Subflow-Instanz befindet. </p>
<p> Wenn die Nachricht bereits über eine Eigenschaft <code>error</code> verfügt, wird sie nach <code>_error</code> kopiert. </p>

View File

@@ -15,20 +15,20 @@
-->
<script type="text/x-red" data-help-name="status">
<p> Berichtet Statusnachrichten von anderen Knoten auf derselben Registerkarte. </p>
<p> Berichtet Statusnachrichten von anderen Node auf derselben Registerkarte. </p>
<h3> Ausgaben </h3>
<dl class="message-properties">
<dt> status.text <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Statustext </dd>
<dt> status.source.type <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Der Typ des Knotens, der den Status gemeldet hat </dd>
<dd> Der Typ des Nodes, der den Status gemeldet hat </dd>
<dt> status.source.id <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Die ID des Knotens, der den Status gemeldet hat. </dd>
<dd> Die ID des Nodes, der den Status gemeldet hat. </dd>
<dt> status.source.name <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Der Name des Knotens (falls gesetzt), der den Status gemeldet hat. </dd>
<dd> Der Name des Nodes (falls gesetzt), der den Status gemeldet hat. </dd>
</dl>
<h3> Details </h3>
<p> Dieser Knoten erzeugt keine <code>Nutzdaten</code>. </p>
<p> Standardmäßig meldet der Knoten den Status für alle Knoten auf derselben Registerkarte.
Er kann so konfiguriert werden, dass der Status für einzelne Knoten selektiv gemeldet wird. </p>
<p> Dieser Node erzeugt keine <code>Nutzdaten</code>. </p>
<p> Standardmäßig meldet der Node den Status für alle Node auf derselben Registerkarte.
Er kann so konfiguriert werden, dass der Status für einzelne Nodes selektiv gemeldet wird. </p>
</script>

View File

@@ -23,10 +23,10 @@
<p> JavaScript-Objekte und -Arrays können nach Bedarf ausgeblendet und eingeblendet werden.
Bufferobjekte können, wenn möglich, als Rohdaten oder als Zeichenfolge angezeigt werden. </p>
<p> Neben jeder Nachricht enthält die Registerkarte "Debug" Informationen über den Zeitpunkt,
zu dem die Nachricht empfangen wurde, den Knoten, der sie gesendet hat, und den Typ der Nachricht.
Wenn Sie auf die ID des Quellenknotens klicken, wird dieser Knoten innerhalb des Arbeitsbereichs angezeigt. </p>
<p> Die Schaltfläche auf dem Knoten kann verwendet werden, um die Ausgabe zu aktivieren oder zu inaktivieren.
Es wird empfohlen, alle Debugknoten, die nicht verwendet werden, zu inaktivieren oder zu entfernen. </p>
<p> Der Knoten kann auch so konfiguriert werden, dass er alle Nachrichten an das Laufzeitprotokoll sendet,
oder dass er kurze (32 Zeichen) an den Statustext unter dem Debugknoten sendet. </p>
zu dem die Nachricht empfangen wurde, den Node, der sie gesendet hat, und den Typ der Nachricht.
Wenn Sie auf die ID des Quellen-Nodes klicken, wird dieser Node innerhalb des Arbeitsbereichs angezeigt. </p>
<p> Die Schaltfläche auf dem Node kann verwendet werden, um die Ausgabe zu aktivieren oder zu inaktivieren.
Es wird empfohlen, alle Debug-Nodes, die nicht verwendet werden, zu inaktivieren oder zu entfernen. </p>
<p> Der Node kann auch so konfiguriert werden, dass er alle Nachrichten an das Laufzeitprotokoll sendet,
oder dass er kurze (32 Zeichen) an den Statustext unter dem Debug-Node sendet. </p>
</script>

View File

@@ -17,10 +17,10 @@
<script type="text/x-red" data-help-name="link in">
<p> Erstellt virtuelle Verbindungen zwischen Flows. </p>
<h3> Details </h3>
<p> Der Knoten kann mit jedem beliebigen <code>Link-out</code> Knoten auf einer beliebigen Registerkarte verbunden werden.
<p> Der Node kann mit jedem beliebigen <code>Link-out</code> Node auf einer beliebigen Registerkarte verbunden werden.
Sobald sie verbunden sind, verhalten sie sich so, als wären sie direkt verbunden. </p>
<p> Die Verbindungen zwischen Verknüpfungsknoten werden nur angezeigt, wenn ein Verknüpfungsknoten ausgewählt ist.
Wenn Verbindungen zu anderen Registerkarten vorhanden sind, wird ein virtueller Knoten angezeigt, auf den geklickt werden kann,
<p> Die Verbindungen zwischen Verknüpfungs-Node werden nur angezeigt, wenn ein Verknüpfungs-Node ausgewählt ist.
Wenn Verbindungen zu anderen Registerkarten vorhanden sind, wird ein virtueller Node angezeigt, auf den geklickt werden kann,
um zur entsprechenden Registerkarte zu springen. </p>
<p> <b> Hinweis: </b> Links können nicht in einem Subflow erstellt oder aus einem Subflow heraus erstellt werden. </p>
</script>
@@ -28,10 +28,10 @@
<script type="text/x-red" data-help-name="link out">
<p> Erstellt virtuelle Verbindungen zwischen Flows. </p>
<h3> Details </h3>
<p> Der Knoten kann mit jedem beliebigen <code>Link-out</code> Knoten auf einer beliebigen Registerkarte verbunden werden.
<p> Der Node kann mit jedem beliebigen <code>Link-out</code> Node auf einer beliebigen Registerkarte verbunden werden.
Sobald sie verbunden sind, verhalten sie sich so, als wären sie direkt verbunden. </p>
<p> Die Verbindungen zwischen Verknüpfungsknoten werden nur angezeigt, wenn ein Verknüpfungsknoten ausgewählt ist.
Wenn Verbindungen zu anderen Registerkarten vorhanden sind, wird ein virtueller Knoten angezeigt, auf den geklickt werden kann,
<p> Die Verbindungen zwischen Verknüpfungs-Node werden nur angezeigt, wenn ein Verknüpfungs-Node ausgewählt ist.
Wenn Verbindungen zu anderen Registerkarten vorhanden sind, wird ein virtueller Node angezeigt, auf den geklickt werden kann,
um zur entsprechenden Registerkarte zu springen. </p>
<p> <b> Hinweis: </b> Links können nicht in einem Subflow erstellt oder aus einem Subflow heraus erstellt werden. </p>
</script>

View File

@@ -16,18 +16,18 @@
<script type="text/x-red" data-help-name="exec">
<p> Führt einen Systembefehl aus und gibt seine Ausgabe zurück. </p>
<p> Der Knoten kann so konfiguriert werden, dass er entweder wartet, bis der Befehl abgeschlossen ist,
<p> Der Node kann so konfiguriert werden, dass er entweder wartet, bis der Befehl abgeschlossen ist,
oder die Ausgabe so sendet wie der Befehl sie generiert. </p>
<p> Der Befehl, der ausgeführt wird, kann im Knoten konfiguriert oder von der empfangenen Nachricht übergeben werden. </p>
<p> Der Befehl, der ausgeführt wird, kann im Node konfiguriert oder von der empfangenen Nachricht übergeben werden. </p>
<h3> Eingaben </h3>
<dl class="message-properties">
<dt class="optional">payload<span class="property-type"> Zeichenfolge </span> </dt>
<dd> wird an den ausgeführten Befehl angehängt </dd>
<dt class="optional"> kill <span class="property-type"> Zeichenfolge </span> </dt>
<dd> Der Typ des Kill-Signals, das einen vorhandenen exec-Knotenprozess gesendet wird. </dd>
<dd> Der Typ des Kill-Signals, das einen vorhandenen exec-Node-Prozess gesendet wird. </dd>
<dt class="optional"> pid <span class="property-type"> Zahl|Zeichenfolge </span> </dt>
<dd> Die Prozess-ID eines vorhandenen exec-Knotenprozesses, der beendet werden soll. </dd>
<dd> Die Prozess-ID eines vorhandenen exec-Node-Prozesses, der beendet werden soll. </dd>
</dl>
<h3> Ausgaben </h3>
@@ -67,17 +67,17 @@
am 3. Port zurück. Ein erfolgreicher Befehl sollte z. B. <code>{ code: 0 }</code> zurückgeben. </p>
<p> Fehler können zusätzliche Informationen über den dritten Port als <code>msg.payload</code> zurückgeben,
z. B. eine <code>message</code> Zeichenfolge oder <code>Signal</code> zeichenfolge. </p>
<p> Der Befehl, der ausgeführt wird, ist innerhalb des Knotens definiert, mit einer Option zum Anhängen von <code> msg.payload </code>
<p> Der Befehl, der ausgeführt wird, ist innerhalb des Nodes definiert, mit einer Option zum Anhängen von <code> msg.payload </code>
und einer weiteren Gruppe von Parametern. </p>
<p> Befehle oder Parameter mit Leerzeichen müssen in Anführungszeichen eingeschlossen werden: <code> "Dies ist ein einzelner Parameter" </code> </p>
<p> Die zurückgegebenen <code>Nutzdaten</code> sind in der Regel ein <i>string</i>, es sei denn, es werden nicht UTF8-Zeichen erkannt, in denen
falls es sich um einen <i>Buffer</i> handelt. </p>
<p> Das Statussymbol und die PID des Knotens werden angezeigt, während der Knoten aktiv ist. Änderungen an dieser Funktion können vom Knoten <code> Status </code> gelesen werden. </p>
<p> Das Statussymbol und die PID des Nodes werden angezeigt, während der Node aktiv ist. Änderungen an dieser Funktion können vom Node <code> Status </code> gelesen werden. </p>
<h4> Prozesse beenden </h4>
<p> Wird <code>msg.kill</code> gesendet, wird ein einzelner aktiver Prozess beendet. <code>msg.kill</code> sollte eine Zeichenfolge sein, die
Der Typ des Signals, der gesendet werden soll, z. B. <code>SIGINT</code>, <code>SIGQUIT</code> oder <code>SIGHUP</code>.
Der Standardwert ist <code>SIGTERM</code> , wenn er auf eine leere Zeichenfolge gesetzt ist. </p>
<p> Wenn der Knoten mehr als einen Prozess ausführt, muss <code>msg.pid</code> ebenfalls mit dem Wert der zu ermordenen PID festgelegt werden. </p>
<p> Wenn der Node mehr als einen Prozess ausführt, muss <code>msg.pid</code> ebenfalls mit dem Wert der zu ermordenen PID festgelegt werden. </p>
<p> Wenn ein Wert im Feld <code>Zeitlimit</code> angegeben wird, wird der Prozess automatisch beendet, wenn der Prozess nicht abgeschlossen ist, wenn die angegebene Anzahl von Sekunden abgelaufen ist. </p>
<p> Tipp: Wenn Sie eine Python-App ausführen, müssen Sie möglicherweise den Parameter <code>-u</code> verwenden, um die Ausgabe zu stoppen, die gepuffert wird. </p>
</script>

Some files were not shown because too many files have changed in this diff Show More