diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 000000000..a93502ffe --- /dev/null +++ b/.vale.ini @@ -0,0 +1,5 @@ +StylesPath = "styles" +MinAlertLevel = warning +Vocab = default +[*.md] +BasedOnStyles = alex, write-good, Microsoft, n8n-styles \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3e2786d8a..04f94f926 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,12 @@ # Contributing -## Overview - -If you want to contribute to this repository - thank you! Beforehand, we encourage you to have a look at the existing documentation to get an idea of the structure and writing conventions we use. In writing your documentation, please follow the guidelines described below, in order to ensure quality and consistency with our style. +If you want to contribute to this repository - thank you! Before you start, have a look at the existing documentation to get an idea of the structure and writing conventions n8n uses. In writing your documentation, please follow the guidelines described below, to ensure quality and consistency with n8n styles. ## Documenting nodes -* **Nodes and trigger nodes:** Create a directory with the name of the node at `docs/integrations/nodes/` or `docs/integrations/trigger-nodes` containing: - - A text file named `n8n-nodes-base..md` describing the functionality of the relevant node. -* **Credentials:** Create a directory with the name of the node at `docs/integrations/credentials/` containing: +* **Nodes and trigger nodes:** Create a directory with the name of the node at `docs/integrations/nodes/` or `docs/integrations/trigger-nodes/` containing: + - A text file named `n8n-nodes-base..md` describing the functionality of the relevant node. +* **Credentials:** Create a document with the name of the node at `docs/integrations/credentials/` containing: - A text file with the node name describing how to obtain credentials for the relevant node. A standard node doc includes the following parts: @@ -18,6 +16,7 @@ A standard node doc includes the following parts: - Enter the resources and operations exactly as they are named in the nodes. In the credentials doc: + * If there is more than one authentication method, list OAuth first. * If possible, avoid documenting external products. Instead, provide links to the relevant product documentation. For example, for guidance on getting credentials (such as how to get an API token for a service), provide a link to the product's API authentication docs. @@ -26,30 +25,7 @@ In the credentials doc: n8n uses the [Microsoft Writing Style Guide](https://docs.microsoft.com/en-us/style-guide/welcome/). -Some quick tips: - -* Plain language: - * Clearly explain each step of the process you are documenting. - * Use present tense, active voice, and "you"-form to address the readers. - * Keep your writing as concise as possible. [Hemingway](https://hemingwayapp.com/) is a free browser app to measure language complexity. There is no fixed rule about what grade to aim for, but the lower the reading grade, the better. -* Formatting: - * Make sure you match brand names precisely. For example: "GitHub", not "Github". - * Headings should be sentence case - * Use bold when referring to UI elements. For example, "Click **Save** to proceed." -* Add commit messages in [this](https://gist.github.com/parmentf/035de27d6ed1dce0b36a) format. - -### Screenshots - -If your contribution includes screenshots, please make sure that they meet the following criteria: - -- Only the Editor UI appears in the screenshot. Anything else, like the browser frame, tabs, and so on, should be omitted. -- After zooming in once, the Editor UI is 23 boxes wide and 9 boxes tall. -- The nodes have a distance of two boxes between them. -- The nodes fit inside the boxes (as much as they can). -- The workflow is centered in the Editor canvas. -- If the workflow uses a Trigger node, the Start node doesn't appear in the Editor canvas. -- In recorded GIFs, the cursor movements in the GIF are slow and easy to follow. A good rule of thumb is that the speed should be about 75% of your regular speed. In any case, make sure that GIFs capture every step of the process at a steady pace. - +Refer to [Styles](https://github.com/n8n-io/n8n-docs/wiki/Styles/) for a quickstart, and guidance on style linting. ## General checklist diff --git a/docs/_images/courses/level-two/chapter-five/workflow1.png b/docs/_images/courses/level-two/chapter-five/workflow1.png new file mode 100644 index 000000000..ddaab03a6 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow1.png differ diff --git a/docs/_images/courses/level-two/chapter-five/workflow2.png b/docs/_images/courses/level-two/chapter-five/workflow2.png new file mode 100644 index 000000000..08c24cda6 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow2.png differ diff --git a/docs/_images/courses/level-two/chapter-five/workflow2_1.png b/docs/_images/courses/level-two/chapter-five/workflow2_1.png new file mode 100644 index 000000000..09c67e41c Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow2_1.png differ diff --git a/docs/_images/courses/level-two/chapter-five/workflow2_2.png b/docs/_images/courses/level-two/chapter-five/workflow2_2.png new file mode 100644 index 000000000..a2b2d91ed Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow2_2.png differ diff --git a/docs/_images/courses/level-two/chapter-five/workflow2_3.png b/docs/_images/courses/level-two/chapter-five/workflow2_3.png new file mode 100644 index 000000000..957318513 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow2_3.png differ diff --git a/docs/_images/courses/level-two/chapter-five/workflow3.png b/docs/_images/courses/level-two/chapter-five/workflow3.png new file mode 100644 index 000000000..37b391b3b Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow3.png differ diff --git a/docs/_images/courses/level-two/chapter-five/workflow_airtableTemplate.png b/docs/_images/courses/level-two/chapter-five/workflow_airtableTemplate.png new file mode 100644 index 000000000..4950bd429 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-five/workflow_airtableTemplate.png differ diff --git a/docs/_images/courses/level-two/chapter-four/exercise_errors_errorTriggerNode_workflow.png b/docs/_images/courses/level-two/chapter-four/exercise_errors_errorTriggerNode_workflow.png new file mode 100644 index 000000000..c1f52c077 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-four/exercise_errors_errorTriggerNode_workflow.png differ diff --git a/docs/_images/courses/level-two/chapter-four/exercise_errors_stopAndError.png b/docs/_images/courses/level-two/chapter-four/exercise_errors_stopAndError.png new file mode 100644 index 000000000..ebe54c804 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-four/exercise_errors_stopAndError.png differ diff --git a/docs/_images/courses/level-two/chapter-four/explanation_workflowExecutions.png b/docs/_images/courses/level-two/chapter-four/explanation_workflowExecutions.png new file mode 100644 index 000000000..bd7d7fb9d Binary files /dev/null and b/docs/_images/courses/level-two/chapter-four/explanation_workflowExecutions.png differ diff --git a/docs/_images/courses/level-two/chapter-four/explanation_workflowExecutions_readonly.png b/docs/_images/courses/level-two/chapter-four/explanation_workflowExecutions_readonly.png new file mode 100644 index 000000000..c1b546f39 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-four/explanation_workflowExecutions_readonly.png differ diff --git a/docs/_images/courses/level-two/chapter-one/exercise_function.png b/docs/_images/courses/level-two/chapter-one/exercise_function.png new file mode 100644 index 000000000..57c3070f5 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/exercise_function.png differ diff --git a/docs/_images/courses/level-two/chapter-one/exercise_function_notNested.png b/docs/_images/courses/level-two/chapter-one/exercise_function_notNested.png new file mode 100644 index 000000000..2409c4043 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/exercise_function_notNested.png differ diff --git a/docs/_images/courses/level-two/chapter-one/exercise_function_reference.png b/docs/_images/courses/level-two/chapter-one/exercise_function_reference.png new file mode 100644 index 000000000..7751bfb52 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/exercise_function_reference.png differ diff --git a/docs/_images/courses/level-two/chapter-one/exercise_transforming_function.png b/docs/_images/courses/level-two/chapter-one/exercise_transforming_function.png new file mode 100644 index 000000000..808d8220b Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/exercise_transforming_function.png differ diff --git a/docs/_images/courses/level-two/chapter-one/exercise_transforming_noSplitItems.png b/docs/_images/courses/level-two/chapter-one/exercise_transforming_noSplitItems.png new file mode 100644 index 000000000..08ffc9645 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/exercise_transforming_noSplitItems.png differ diff --git a/docs/_images/courses/level-two/chapter-one/exercise_transforming_splitItems.png b/docs/_images/courses/level-two/chapter-one/exercise_transforming_splitItems.png new file mode 100644 index 000000000..57c895d51 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/exercise_transforming_splitItems.png differ diff --git a/docs/_images/courses/level-two/chapter-one/explanation_dataStructure.png b/docs/_images/courses/level-two/chapter-one/explanation_dataStructure.png new file mode 100644 index 000000000..fbcfe8f68 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/explanation_dataStructure.png differ diff --git a/docs/_images/courses/level-two/chapter-one/explanation_items.png b/docs/_images/courses/level-two/chapter-one/explanation_items.png new file mode 100644 index 000000000..f4d91f01c Binary files /dev/null and b/docs/_images/courses/level-two/chapter-one/explanation_items.png differ diff --git a/docs/_images/courses/level-two/chapter-three/exercise_merge.png b/docs/_images/courses/level-two/chapter-three/exercise_merge.png new file mode 100644 index 000000000..dab70aef0 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-three/exercise_merge.png differ diff --git a/docs/_images/courses/level-two/chapter-three/exercise_merge_kkm.png b/docs/_images/courses/level-two/chapter-three/exercise_merge_kkm.png new file mode 100644 index 000000000..52ab5a9ec Binary files /dev/null and b/docs/_images/courses/level-two/chapter-three/exercise_merge_kkm.png differ diff --git a/docs/_images/courses/level-two/chapter-three/exercise_splitInBatches.png b/docs/_images/courses/level-two/chapter-three/exercise_splitInBatches.png new file mode 100644 index 000000000..bd25ae0ba Binary files /dev/null and b/docs/_images/courses/level-two/chapter-three/exercise_splitInBatches.png differ diff --git a/docs/_images/courses/level-two/chapter-three/explanation_mergePropertyInput.png b/docs/_images/courses/level-two/chapter-three/explanation_mergePropertyInput.png new file mode 100644 index 000000000..62a7bd600 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-three/explanation_mergePropertyInput.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_binaryData.png b/docs/_images/courses/level-two/chapter-two/exercise_binaryData.png new file mode 100644 index 000000000..b6220f924 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_binaryData.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_binaryData_httpRequest_file.png b/docs/_images/courses/level-two/chapter-two/exercise_binaryData_httpRequest_file.png new file mode 100644 index 000000000..c67bd6a97 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_binaryData_httpRequest_file.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_binaryData_moveData_btoj.png b/docs/_images/courses/level-two/chapter-two/exercise_binaryData_moveData_btoj.png new file mode 100644 index 000000000..89ec868c8 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_binaryData_moveData_btoj.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_dateTime.png b/docs/_images/courses/level-two/chapter-two/exercise_dateTime.png new file mode 100644 index 000000000..7be7a0f1b Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_dateTime.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_html_htmlExtractNode.png b/docs/_images/courses/level-two/chapter-two/exercise_html_htmlExtractNode.png new file mode 100644 index 000000000..4e415292c Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_html_htmlExtractNode.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_html_httpRequestNode.png b/docs/_images/courses/level-two/chapter-two/exercise_html_httpRequestNode.png new file mode 100644 index 000000000..5df66a2df Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_html_httpRequestNode.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_html_xmlNode_json.png b/docs/_images/courses/level-two/chapter-two/exercise_html_xmlNode_json.png new file mode 100644 index 000000000..da82d160a Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_html_xmlNode_json.png differ diff --git a/docs/_images/courses/level-two/chapter-two/exercise_html_xmlNode_table.png b/docs/_images/courses/level-two/chapter-two/exercise_html_xmlNode_table.png new file mode 100644 index 000000000..b35996780 Binary files /dev/null and b/docs/_images/courses/level-two/chapter-two/exercise_html_xmlNode_table.png differ diff --git a/docs/_redirects b/docs/_redirects index c2a22f3c3..5e274c06c 100644 --- a/docs/_redirects +++ b/docs/_redirects @@ -1,5 +1,5 @@ # Weird ones after IA launch -/integrations/nodes/core-nodes/n8n-nodes-base.function/ /integrations/core-nodes/n8n-nodes-base.function/ + # Updated during IA work /getting-started/key-components/ /workflows/ @@ -27,12 +27,24 @@ /reference/telemetry.html /reference/data-collection/ /reference/troubleshooting.html /hosting/installation/npm/ /reference/contributing.html /contributing/ -/reference/release-notes.html /reference/release-notes/ +/reference/release-notes.html /reference/release-notes/ +/reference/server-setup.html /hosting/server-setups/ # The nodes library . . . may the odds be ever in your favour /credentials/* /integrations/credentials/:splat -/nodes/creating-nodes/* /integrations/creating-nodes/code/:splat +/nodes/creating-nodes/ /integrations/creating-nodes/ +/nodes/creating-nodes/general-guidelines.html /integrations/creating-nodes/code/standards/ +/nodes/creating-nodes/create-node.html /integrations/creating-nodes/code/create-first-node/ +/nodes/creating-nodes/create-n8n-nodes-module.html /integrations/creating-nodes/code/create-n8n-nodes-module/ +/nodes/creating-nodes/create-trigger-node.html /integrations/creating-nodes/code/create-trigger-node/ +/nodes/creating-nodes/node-dev-cli.html /integrations/creating-nodes/code/node-dev-cli/ +/nodes/creating-nodes/node-elements.html /integrations/creating-nodes/code/ui-elements/ +/nodes/creating-nodes/making-http-requests.html /integrations/creating-nodes/code/http-helpers/ +/nodes/creating-nodes/node-linter.html /integrations/creating-nodes/code/node-linter/ +/nodes/creating-nodes/node-review-checklist.html /integrations/creating-nodes/code/review-checklist/ +/nodes/creating-nodes/troubleshooting.html /integrations/creating-nodes/code/troubleshooting-node-development/ + /nodes/expressions/* /code-examples/expressions/:splat @@ -40,35 +52,59 @@ /nodes/creating-nodes/ /integrations/creating-nodes/ /nodes/credentials/ /integrations/credentials/ /nodes/n8n-nodes-base.actionNetwork/ /integrations/nodes/n8n-nodes-base.actionNetwork/ +/nodes/n8n-nodes-base.actionnetwork/ /integrations/nodes/n8n-nodes-base.actionNetwork/ /nodes/n8n-nodes-base.activationTrigger/ /integrations/core-nodes/n8n-nodes-base.activationTrigger/ +/nodes/n8n-nodes-base.activationtrigger/ /integrations/core-nodes/n8n-nodes-base.activationTrigger/ /nodes/n8n-nodes-base.activeCampaign/ /integrations/nodes/n8n-nodes-base.activeCampaign/ +/nodes/n8n-nodes-base.activecampaign/ /integrations/nodes/n8n-nodes-base.activeCampaign/ /nodes/n8n-nodes-base.activeCampaignTrigger/ /integrations/trigger-nodes/n8n-nodes-base.activeCampaignTrigger/ +/nodes/n8n-nodes-base.activecampaigntrigger/ /integrations/trigger-nodes/n8n-nodes-base.activeCampaignTrigger/ /nodes/n8n-nodes-base.acuitySchedulingTrigger/ /integrations/trigger-nodes/n8n-nodes-base.acuitySchedulingTrigger/ +/nodes/n8n-nodes-base.acuityschedulingtrigger/ /integrations/trigger-nodes/n8n-nodes-base.acuitySchedulingTrigger/ /nodes/n8n-nodes-base.affinity/ /integrations/nodes/n8n-nodes-base.affinity/ /nodes/n8n-nodes-base.affinityTrigger/ /integrations/trigger-nodes/n8n-nodes-base.affinityTrigger/ +/nodes/n8n-nodes-base.affinitytrigger/ /integrations/trigger-nodes/n8n-nodes-base.affinityTrigger/ /nodes/n8n-nodes-base.agileCrm/ /integrations/nodes/n8n-nodes-base.agileCrm/ +/nodes/n8n-nodes-base.agilecrm/ /integrations/nodes/n8n-nodes-base.agileCrm/ /nodes/n8n-nodes-base.airtable/ /integrations/nodes/n8n-nodes-base.airtable/ /nodes/n8n-nodes-base.airtableTrigger/ /integrations/trigger-nodes/n8n-nodes-base.airtableTrigger/ +/nodes/n8n-nodes-base.airtabletrigger/ /integrations/trigger-nodes/n8n-nodes-base.airtableTrigger/ /nodes/n8n-nodes-base.amqp/ /integrations/nodes/n8n-nodes-base.amqp/ /nodes/n8n-nodes-base.amqpTrigger/ /integrations/trigger-nodes/n8n-nodes-base.amqpTrigger/ +/nodes/n8n-nodes-base.amqptrigger/ /integrations/trigger-nodes/n8n-nodes-base.amqpTrigger/ /nodes/n8n-nodes-base.apiTemplateIo/ /integrations/nodes/n8n-nodes-base.apiTemplateIo/ +/nodes/n8n-nodes-base.apitemplateio/ /integrations/nodes/n8n-nodes-base.apiTemplateIo/ /nodes/n8n-nodes-base.asana/ /integrations/nodes/n8n-nodes-base.asana/ /nodes/n8n-nodes-base.asanaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.asanaTrigger/ +/nodes/n8n-nodes-base.asanatrigger/ /integrations/trigger-nodes/n8n-nodes-base.asanaTrigger/ /nodes/n8n-nodes-base.automizy/ /integrations/nodes/n8n-nodes-base.automizy/ /nodes/n8n-nodes-base.autopilot/ /integrations/nodes/n8n-nodes-base.autopilot/ /nodes/n8n-nodes-base.autopilotTrigger/ /integrations/trigger-nodes/n8n-nodes-base.autopilotTrigger/ +/nodes/n8n-nodes-base.autopilottrigger/ /integrations/trigger-nodes/n8n-nodes-base.autopilotTrigger/ /nodes/n8n-nodes-base.awsComprehend/ /integrations/nodes/n8n-nodes-base.awsComprehend/ +/nodes/n8n-nodes-base.awscomprehend/ /integrations/nodes/n8n-nodes-base.awsComprehend/ /nodes/n8n-nodes-base.awsDynamoDb/ /integrations/nodes/n8n-nodes-base.awsDynamoDb/ +/nodes/n8n-nodes-base.awsdynamodb/ /integrations/nodes/n8n-nodes-base.awsDynamoDb/ /nodes/n8n-nodes-base.awsLambda/ /integrations/nodes/n8n-nodes-base.awsLambda/ +/nodes/n8n-nodes-base.awslambda/ /integrations/nodes/n8n-nodes-base.awsLambda/ /nodes/n8n-nodes-base.awsRekognition/ /integrations/nodes/n8n-nodes-base.awsRekognition/ +/nodes/n8n-nodes-base.awsrekognition/ /integrations/nodes/n8n-nodes-base.awsRekognition/ /nodes/n8n-nodes-base.awsS3/ /integrations/nodes/n8n-nodes-base.awsS3/ +/nodes/n8n-nodes-base.aws3/ /integrations/nodes/n8n-nodes-base.awsS3/ /nodes/n8n-nodes-base.awsSes/ /integrations/nodes/n8n-nodes-base.awsSes/ +/nodes/n8n-nodes-base.awsses/ /integrations/nodes/n8n-nodes-base.awsSes/ /nodes/n8n-nodes-base.awsSns/ /integrations/nodes/n8n-nodes-base.awsSns/ +/nodes/n8n-nodes-base.awssns/ /integrations/nodes/n8n-nodes-base.awsSns/ /nodes/n8n-nodes-base.awsSnsTrigger/ /integrations/trigger-nodes/n8n-nodes-base.awsSnsTrigger/ +/nodes/n8n-nodes-base.awssnstrigger/ /integrations/trigger-nodes/n8n-nodes-base.awsSnsTrigger/ /nodes/n8n-nodes-base.awsSqs/ /integrations/nodes/n8n-nodes-base.awsSqs/ +/nodes/n8n-nodes-base.awssqs/ /integrations/nodes/n8n-nodes-base.awsSqs/ /nodes/n8n-nodes-base.awsTextract/ /integrations/nodes/n8n-nodes-base.awsTextract/ +/nodes/n8n-nodes-base.awstextract/ /integrations/nodes/n8n-nodes-base.awsTextract/ /nodes/n8n-nodes-base.awsTranscribe/ /integrations/nodes/n8n-nodes-base.awsTranscribe/ +/nodes/n8n-nodes-base.awstranscribe/ /integrations/nodes/n8n-nodes-base.awsTranscribe/ /nodes/n8n-nodes-base.bambooHr/ /integrations/nodes/n8n-nodes-base.bambooHr/ +/nodes/n8n-nodes-base.bamboohr/ /integrations/nodes/n8n-nodes-base.bambooHr/ /nodes/n8n-nodes-base.bannerbear/ /integrations/nodes/n8n-nodes-base.bannerbear/ /nodes/n8n-nodes-base.baserow/ /integrations/nodes/n8n-nodes-base.baserow/ /nodes/n8n-nodes-base.beeminder/ /integrations/nodes/n8n-nodes-base.beeminder/ @@ -93,7 +129,7 @@ /nodes/n8n-nodes-base.cockpit/ /integrations/nodes/n8n-nodes-base.cockpit/ /nodes/n8n-nodes-base.coda/ /integrations/nodes/n8n-nodes-base.coda/ /nodes/n8n-nodes-base.coinGecko/ /integrations/nodes/n8n-nodes-base.coinGecko/ -/nodes/n8n-nodes-base.compression/ /integrations/nodes/core-nodes/n8n-nodes-base.compression/ +/nodes/n8n-nodes-base.compression/ /integrations/core-nodes/n8n-nodes-base.compression/ /nodes/n8n-nodes-base.contentful/ /integrations/nodes/n8n-nodes-base.contentful/ /nodes/n8n-nodes-base.convertKit/ /integrations/nodes/n8n-nodes-base.convertKit/ /nodes/n8n-nodes-base.convertKitTrigger/ /integrations/trigger-nodes/n8n-nodes-base.convertKitTrigger/ @@ -101,11 +137,12 @@ /nodes/n8n-nodes-base.copperTrigger/ /integrations/trigger-nodes/n8n-nodes-base.copperTrigger/ /nodes/n8n-nodes-base.cortex/ /integrations/nodes/n8n-nodes-base.cortex/ /nodes/n8n-nodes-base.crateDb/ /integrations/nodes/n8n-nodes-base.crateDb/ -/nodes/n8n-nodes-base.cron/ /integrations/nodes/core-nodes/n8n-nodes-base.cron/ -/nodes/n8n-nodes-base.crypto/ /integrations/nodes/core-nodes/n8n-nodes-base.crypto/ +/nodes/n8n-nodes-base.cron/ /integrations/core-nodes/n8n-nodes-base.cron/ +/nodes/n8n-nodes-base.crypto/ /integrations/core-nodes/n8n-nodes-base.crypto/ /nodes/n8n-nodes-base.customerIo/ /integrations/nodes/n8n-nodes-base.customerIo/ /nodes/n8n-nodes-base.customerIoTrigger/ /integrations/trigger-nodes/n8n-nodes-base.customerIoTrigger/ -/nodes/n8n-nodes-base.dateTime/ /integrations/nodes/core-nodes/n8n-nodes-base.dateTime/ +/nodes/n8n-nodes-base.dateTime/ /integrations/core-nodes/n8n-nodes-base.dateTime/ +/nodes/n8n-nodes-base.datetime/ /integrations/nodes/n8n-nodes-base.dateTime/ /nodes/n8n-nodes-base.deepL/ /integrations/nodes/n8n-nodes-base.deepL/ /nodes/n8n-nodes-base.demio/ /integrations/nodes/n8n-nodes-base.demio/ /nodes/n8n-nodes-base.dhl/ /integrations/nodes/n8n-nodes-base.dhl/ @@ -115,19 +152,21 @@ /nodes/n8n-nodes-base.drift/ /integrations/nodes/n8n-nodes-base.drift/ /nodes/n8n-nodes-base.dropbox/ /integrations/nodes/n8n-nodes-base.dropbox/ /nodes/n8n-nodes-base.dropcontact/ /integrations/nodes/n8n-nodes-base.dropcontact/ -/nodes/n8n-nodes-base.editImage/ /integrations/nodes/core-nodes/n8n-nodes-base.editImage/ +/nodes/n8n-nodes-base.editImage/ /integrations/core-nodes/n8n-nodes-base.editImage/ /nodes/n8n-nodes-base.egoi/ /integrations/nodes/n8n-nodes-base.egoi/ /nodes/n8n-nodes-base.elasticsearch/ /integrations/nodes/n8n-nodes-base.elasticsearch/ /nodes/n8n-nodes-base.elasticSecurity/ /integrations/nodes/n8n-nodes-base.elasticSecurity/ /nodes/n8n-nodes-base.emailReadImap/ /integrations/core-nodes/n8n-nodes-base.imapEmail/ /nodes/n8n-nodes-base.emailSend/ /integrations/core-nodes/n8n-nodes-base.sendEmail/ +/nodes/n8n-nodes-base.emailsend/ /integrations/core-nodes/n8n-nodes-base.sendEmail/ /nodes/n8n-nodes-base.emelia/ /integrations/nodes/n8n-nodes-base.emelia/ /nodes/n8n-nodes-base.emeliaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.emeliaTrigger/ /nodes/n8n-nodes-base.erpNext/ /integrations/nodes/n8n-nodes-base.erpNext/ /nodes/n8n-nodes-base.errorTrigger/ /integrations/core-nodes/n8n-nodes-base.errorTrigger/ /nodes/n8n-nodes-base.eventbriteTrigger/ /integrations/trigger-nodes/n8n-nodes-base.eventbriteTrigger/ -/nodes/n8n-nodes-base.executeCommand/ /integrations/nodes/core-nodes/n8n-nodes-base.executeCommand/ -/nodes/n8n-nodes-base.executeWorkflow/ /integrations/nodes/core-nodes/n8n-nodes-base.executeWorkflow/ +/nodes/n8n-nodes-base.executeCommand/ /integrations/core-nodes/n8n-nodes-base.executeCommand/ +/nodes/n8n-nodes-base.executecommand/ /integrations/core-nodes/n8n-nodes-base.executeCommand/ +/nodes/n8n-nodes-base.executeWorkflow/ /integrations/core-nodes/n8n-nodes-base.executeWorkflow/ /nodes/n8n-nodes-base.facebookGraphApi/ /integrations/nodes/n8n-nodes-base.facebookGraphAPI/ /nodes/n8n-nodes-base.facebookTrigger/ /integrations/trigger-nodes/n8n-nodes-base.facebookTrigger/ /nodes/n8n-nodes-base.figmaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.figmaTrigger/ @@ -139,9 +178,10 @@ /nodes/n8n-nodes-base.freshdesk/ /integrations/nodes/n8n-nodes-base.freshdesk/ /nodes/n8n-nodes-base.freshservice/ /integrations/nodes/n8n-nodes-base.freshservice/ /nodes/n8n-nodes-base.freshworksCrm/ /integrations/nodes/n8n-nodes-base.freshworksCrm/ -/nodes/n8n-nodes-base.ftp/ /integrations/nodes/core-nodes/n8n-nodes-base.ftp/ -/nodes/n8n-nodes-base.function/ /integrations/nodes/core-nodes/n8n-nodes-base.function/ -/nodes/n8n-nodes-base.functionItem/ /integrations/nodes/core-nodes/n8n-nodes-base.functionItem/ +/nodes/n8n-nodes-base.ftp/ /integrations/core-nodes/n8n-nodes-base.ftp/ +/nodes/n8n-nodes-base.function/ /integrations/core-nodes/n8n-nodes-base.function/ +/nodes/n8n-nodes-base.functionItem/ /integrations/core-nodes/n8n-nodes-base.functionItem/ +/nodes/n8n-nodes-base.functionitem/ /integrations/core-nodes/n8n-nodes-base.functionItem/ /nodes/n8n-nodes-base.getResponse/ /integrations/nodes/n8n-nodes-base.getResponse/ /nodes/n8n-nodes-base.getResponseTrigger/ /integrations/trigger-nodes/n8n-nodes-base.getResponseTrigger/ /nodes/n8n-nodes-base.ghost/ /integrations/nodes/n8n-nodes-base.ghost/ @@ -165,7 +205,8 @@ /nodes/n8n-nodes-base.googleFirebaseCloudFirestore/ /integrations/nodes/n8n-nodes-base.googleFirebaseCloudFirestore/ /nodes/n8n-nodes-base.googleFirebaseRealtimeDatabase/ /integrations/nodes/n8n-nodes-base.googleFirebaseRealtimeDatabase/ /nodes/n8n-nodes-base.googlePerspective/ /integrations/nodes/n8n-nodes-base.googlePerspective/ -/nodes/n8n-nodes-base.googleSheets/ /integrations/nodes/n8n-nodes-base.googleSheets/ +/nodes/n8n-nodes-base.googleSheets/ /integrations/nodes/n8n-nodes-base.googleSheets/ +/nodes/n8n-nodes-base.googlesheets/ /integrations/nodes/n8n-nodes-base.googleSheets/ /nodes/n8n-nodes-base.googleSlides/ /integrations/nodes/n8n-nodes-base.googleSlides/ /nodes/n8n-nodes-base.googleTasks/ /integrations/nodes/n8n-nodes-base.googleTasks/ /nodes/n8n-nodes-base.googleTranslate/ /integrations/nodes/n8n-nodes-base.googleTranslate/ @@ -195,8 +236,8 @@ /nodes/n8n-nodes-base.interval/ /integrations/core-nodes/n8n-nodes-base.interval/ /nodes/n8n-nodes-base.invoiceNinja/ /integrations/nodes/n8n-nodes-base.invoiceNinja/ /nodes/n8n-nodes-base.invoiceNinjaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.invoiceNinjaTrigger/ -/nodes/n8n-nodes-base.itemLists/ /integrations/core-core-nodes/n8n-nodes-base.itemLists/ -/nodes/n8n-nodes-base.itemlists/ /integrations/core-core-nodes/n8n-nodes-base.itemLists/ +/nodes/n8n-nodes-base.itemLists/ /integrations/core-nodes/n8n-nodes-base.itemLists/ +/nodes/n8n-nodes-base.itemlists/ /integrations/core-nodes/n8n-nodes-base.itemLists/ /nodes/n8n-nodes-base.iterable/ /integrations/nodes/n8n-nodes-base.iterable/ /nodes/n8n-nodes-base.jenkins/ /integrations/nodes/n8n-nodes-base.jenkins/ /nodes/n8n-nodes-base.jira/ /integrations/nodes/n8n-nodes-base.jira/ @@ -224,6 +265,7 @@ /nodes/n8n-nodes-base.mailjet/ /integrations/nodes/n8n-nodes-base.mailjet/ /nodes/n8n-nodes-base.mailjetTrigger/ /integrations/trigger-nodes/n8n-nodes-base.mailjetTrigger/ /nodes/n8n-nodes-base.mandrill/ /integrations/nodes/n8n-nodes-base.mandrill/ +/nodes/n8n-nodes-base.markdown/ /integrations/core-nodes/n8n-nodes-base.markdown/ /nodes/n8n-nodes-base.marketstack/ /integrations/nodes/n8n-nodes-base.marketstack/ /nodes/n8n-nodes-base.matrix/ /integrations/nodes/n8n-nodes-base.matrix/ /nodes/n8n-nodes-base.mattermost/ /integrations/nodes/n8n-nodes-base.mattermost/ @@ -251,7 +293,7 @@ /nodes/n8n-nodes-base.mqttTrigger/ /integrations/trigger-nodes/n8n-nodes-base.mqttTrigger/ /nodes/n8n-nodes-base.msg91/ /integrations/nodes/n8n-nodes-base.msg91/ /nodes/n8n-nodes-base.mySql/ /integrations/nodes/n8n-nodes-base.mySql/ -/nodes/n8n-nodes-base.n8nTrainingCustomeMessenger/ /integrations/nodes/n8n-nodes-base.n8nTrainingCustomeMessenger/ +/nodes/n8n-nodes-base.n8nTrainingCustomerMessenger/ /integrations/nodes/n8n-nodes-base.n8nTrainingCustomerMessenger/ /nodes/n8n-nodes-base.n8nTrainingCustomerDatastore/ /integrations/nodes/n8n-nodes-base.n8nTrainingCustomerDatastore/ /nodes/n8n-nodes-base.n8nTrigger/ /integrations/core-nodes/n8n-nodes-base.n8nTrigger/ /nodes/n8n-nodes-base.nasa/ /integrations/nodes/n8n-nodes-base.nasa/ @@ -324,6 +366,7 @@ /nodes/n8n-nodes-base.sms77/ /integrations/nodes/n8n-nodes-base.sms77/ /nodes/n8n-nodes-base.snowflake/ /integrations/nodes/n8n-nodes-base.snowflake/ /nodes/n8n-nodes-base.splitInBatches/ /integrations/core-nodes/n8n-nodes-base.splitInBatches/ +/nodes/n8n-nodes-base.splitinbatches/ /integrations/core-nodes/n8n-nodes-base.splitInBatches/ /nodes/n8n-nodes-base.splunk/ /integrations/nodes/n8n-nodes-base.splunk/ /nodes/n8n-nodes-base.spontit/ /integrations/nodes/n8n-nodes-base.spontit/ /nodes/n8n-nodes-base.spotify/ /integrations/nodes/n8n-nodes-base.spotify/ @@ -348,6 +391,7 @@ /nodes/n8n-nodes-base.tapfiliate/ /integrations/nodes/n8n-nodes-base.tapfiliate/ /nodes/n8n-nodes-base.telegram/ /integrations/nodes/n8n-nodes-base.telegram/ /nodes/n8n-nodes-base.telegramTrigger/ /integrations/trigger-nodes/n8n-nodes-base.telegramTrigger/ +/nodes/n8n-nodes-base.telegramtrigger/ /integrations/trigger-nodes/n8n-nodes-base.telegramTrigger/ /nodes/n8n-nodes-base.theHive/ /integrations/nodes/n8n-nodes-base.theHive/ /nodes/n8n-nodes-base.theHiveTrigger/ /integrations/trigger-nodes/n8n-nodes-base.theHiveTrigger/ /nodes/n8n-nodes-base.timescaleDb/ /integrations/nodes/n8n-nodes-base.timescaleDb/ diff --git a/docs/contributing.md b/docs/contributing.md index 2a41f31aa..442db7756 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -96,6 +96,6 @@ Do you know someone who would be a great fit for one of our [open positions](htt Here's how this works: 1. **Search**: Have a look at the description and requirements of each role, and consider if someone you know would be a great fit. -2. **Referral**: Once you’ve identified a potential candidate, send an email to [Leoni](mailto:leoni@n8n.io) with the subject line *Employee referral - [job title]* and a short description of the person you’re referring (and the reason why). Also, tell your referral to apply for the job through our [careers page](https://n8n.io/careers). +2. **Referral**: Once you’ve identified a potential candidate, send an email to [Jobs at n8n](mailto:jobs@n8n.io) with the subject line *Employee referral - [job title]* and a short description of the person you’re referring (and the reason why). Also, tell your referral to apply for the job through our [careers page](https://n8n.io/careers). 3. **Evaluation**: We'll screen the application and inform you about the next steps of the hiring process. 4. **Reward**: As soon as your referral has successfully finished the probationary period, we'll reward you for your efforts by transferring the €1,000 to your bank account. diff --git a/docs/courses/index.md b/docs/courses/index.md index 07a0f59d8..779af931f 100644 --- a/docs/courses/index.md +++ b/docs/courses/index.md @@ -8,4 +8,5 @@ These tasks can and should be automated! And you don't need advanced technical k ## Available courses -- [Level 1: Beginners' course](/courses/level-one/) +- [Level 1: Beginner course](/courses/level-one/) +- [Level 2: Intermediate course](/courses/level-two/) diff --git a/docs/courses/level-one/chapter-7.md b/docs/courses/level-one/chapter-7.md index 43b49d070..de62688f7 100644 --- a/docs/courses/level-one/chapter-7.md +++ b/docs/courses/level-one/chapter-7.md @@ -1,16 +1,14 @@ -# Take the Quiz and Get Your Certificate +# Test your knowledge -Congratulations – you finished the n8n Course Level I! You were able to help Nathan build a business use case workflow, saving him hours of tedious work and making him more productive. You’ve come a long way throughout this course and learned a lot about workflow automation. +Congratulations – you finished the n8n Course Level 1! You helped Nathan build a business use case workflow, saving him hours of tedious work and making him more productive. -## Certification quiz +You’ve come a long way throughout this course and learned a lot about workflow automation. Here’s what you can do next: -You're almost there! The last step before earning your certificate - after [signing-up](https://n8n-community.typeform.com/to/PDEMrevI) and completing the [course milestones](/courses/level-one/#do-i-get-a-certificate) - is passing the quiz. +* Test your knowledge of everything you've learned in this course with a **quiz**. The quiz consists of questions about the theoretical concepts and workflows covered in this course. -The quiz consists of two parts: theory and practice. Remember: - -- You need to have at least 80% correct answers in each part. -- There is no time limit. -- You can take the quiz as many times as you want. + - You need to have at least 80% correct answers in each part. + - You can take the quiz as many times as you want. + - There is no time limit on answering the quiz questions.
@@ -18,10 +16,5 @@ The quiz consists of two parts: theory and practice. Remember:
-## What's next? - -So, where do you go from here? Here’s what you can do next: - * Create new workflows for your work or personal use and share them with us. Don’t have any ideas? Find inspiration on our [blog](https://n8n.io/blog/), [YouTube channel](https://www.youtube.com/c/n8n-io), [community forum](https://community.n8n.io), and [Discord server](https://discord.gg/vWwMVThRta). -* Dive deeper into n8n’s settings by reading the docs. -* Take the n8n Level II course. [Subscribe](https://n8n.io/blog/#subscribe) to our newsletter to find out when it’s released. +* Take the n8n [Course Level 2](/courses/level-two/). diff --git a/docs/courses/level-one/index.md b/docs/courses/level-one/index.md index 59cf10c79..d967d59f0 100644 --- a/docs/courses/level-one/index.md +++ b/docs/courses/level-one/index.md @@ -1,6 +1,6 @@ # Introduction -Welcome to the n8n Certification Course Level I! +Welcome to the n8n Certification Course Level 1! ## Is this course right for me? @@ -47,14 +47,12 @@ Completing the course should take around two hours. You do not have to complete ## Do I get a certificate? -Absolutely! We believe all good works deserve recognition. To get your certificate, you need to complete the following milestones: +We believe all good works deserve recognition. If you successfully complete the course, we will email you a **recognition badge** that you can share with your peers to showcase your n8n skills. To get your n8n badge, you need to complete the following milestones: -✅ [Sign up](https://n8n-community.typeform.com/to/PDEMrevI) for the course to get your unique ID and webhook URL
-✅ [Make an HTTP request](/courses/level-one/chapter-5/chapter-5.1/)
-✅ [Send the workflow results as a message via Discord](/courses/level-one/chapter-5/chapter-5.6/)
-✅ Pass the quiz (theory and practice) at the end of the course
- -
Certificate
+- [x] [Sign up](https://n8n-community.typeform.com/to/PDEMrevI) for the course to get your unique ID and webhook URL +- [x] [Make an HTTP request](/courses/level-one/chapter-5/chapter-5.1/) +- [x] [Send the workflow results as a message via Discord](/courses/level-one/chapter-5/chapter-5.6/) +- [x] Pass the quiz (theory and practice) at the end of the course
diff --git a/docs/courses/level-two/chapter-1.md b/docs/courses/level-two/chapter-1.md new file mode 100644 index 000000000..3fa5774b0 --- /dev/null +++ b/docs/courses/level-two/chapter-1.md @@ -0,0 +1,225 @@ +# Understanding the data structure + +In this chapter, you will learn about the data structure of n8n and how to use the [Function node](/integrations/nodes/n8n-nodes-base.function/) to transform data and simulate node outputs. + + +## Data structure of n8n + +In a basic sense, n8n nodes function as an Extract, Transform, Load (ETL) tool. The nodes allow you to access (extract) data from multiple disparate sources, modify (transform) that data in a particular way, and pass (load) it along to where it needs to be. + +The data that moves along from node to node in your workflow must be in a format (structure) that can be recognized and interpreted by each node. In n8n, this required structure is an array of objects. + +!!! note "What is an array of objects?" + + An array is a list of values. The array can be empty or contain several elements. Each element is stored at a position (index) in the list, starting at 0, and can be referenced by the index number. For example, in the array `["Leonardo", "Michelangelo", "Donatello", "Raphael"];` the element `Donatello` is stored at index 2. + + An object stores key-value pairs, instead of values at numbered indexes as in arrays. The order of the pairs is not important, as the values can be accessed by referencing the key name. For example, the object below contains two properties (`name` and `color`): + + ```json + { + name: 'Michelangelo', + color: 'blue', + } + ``` + + An array of objects is an array that contains one or more objects. For example, the array `turtles` below contains four objects: + + ```javascript + var turtles = [ + { + name: 'Michelangelo', + color: 'orange', + }, + { + name: 'Donatello', + color: 'purple', + }, + { + name: 'Raphael', + color: 'red', + }, + { + name: 'Leonardo', + color: 'blue', + } + ]; + ``` + + You can access the properties of an object using dot notation with the syntax `object.property`. For example, `turtles[1].color` gets the color of the second turtle. + +Data sent from one node to another is sent as an array of JSON objects. The elements in this collection are called [Items](/getting-started/key-concepts/#item). + +
Items
+ +An n8n node performs its action on each item of incoming data. + +
Items in the Customer Datastore node
+ + +## Creating data sets with the Function node + +Now that you are familiar with the n8n data structure, you can use it to create your own data sets or simulate node outputs. To do this, use the Function node to write JavaScript code defining your array of objects with the following structure: + +```javascript +return [ + { + json: { + key: 'value', + } + } + ]; +``` + +For example, the array of objects representing the Ninja turtles would look like this in the Function node: + +
Array of objects in the Function node
+ +!!! warning "JSON objects" + + Notice that this array of objects contains an extra key: `json`. n8n expects you to wrap each object in an array in another object, with the key `json`. + +
Illustration of data structure in n8n
+ + It's good practice to pass the data in the right structure used by n8n. But don't worry if you forget to add the `json` key to an item, n8n (version 0.166.0 and above) adds it automatically. + + +You can also have nested pairs, for example if you want to define a primary and a secondary color. In this case, you need to further wrap the key-value pairs in curly braces `{}`. + +!!! note "n8n data structure video" + [This talk](https://www.youtube.com/watch?v=mQHT3Unn4tY) offers a more detailed explanation of data structure in n8n. + + + +### Exercise + +In a Function node, create an array of objects named `myContacts` that contains the properties `name` and `email`, and the `email` property is further split into `personal` and `work`. + +??? note "Show me the solution" + + In the Function node, in the JavaScript Code field you have to write the following code: + + ```js + var myContacts = [ + { + json: { + name: 'Alice', + email: { + personal: 'alice@home.com', + work: 'alice@wonderland.org' + }, + } + }, + { + json: { + name: 'Bob', + email: { + personal: 'bob@mail.com', + work: 'contact@thebuilder.com' + }, + } + }, + ]; + + return myContacts; + ``` + + When you execute the Function node, the result should look like this: + +
Result of Function node
+ + + +## Referencing node data with the Function node + +Just like you can use [expressions](/code-examples/expressions/) to reference data from other nodes, you can also use some [methods](/code-examples/expressions/methods/) and [variables](/code-examples/expressions/variables/) in the Function node. + +### Exercise + +Let's build on the previous exercise, in which you used the Function node to create a data set of two contacts with their names and emails. Now, connect a second Function node to the first one. In the new node, write code to create a new column named `workEmail` that references the work email of the first contact. + +??? note "Show me the solution" + In the Function node, in the JavaScript Code field you have to write the following code: + + + items[0].json.workEmail = items[0].json.email['work']; + return items; + + + When you execute the Function node, the result should look like this: + +
Function node reference
+ + +## Transforming data + +The incoming data from some nodes may have a different data structure than the one used in n8n. In this case, you need to [transform the data](/data/transforming-data/), so that each item can be processed individually. + +The two most common operations for data transformation are: + +- Creating multiple items from one item +- Creating a single item from multiple items + +There are several ways to transform data for the purposes mentioned above: + +- With the HTTP Request node, you can toggle the option `Split Into Items` to create multiple items from a single item. This is the easiest way to transform incoming web data with one click. +- With the [Item Lists node](/integrations/core-nodes/n8n-nodes-base.itemLists), you can `Split Out Items` or `Aggregate Items`. This node is the easy way to modify the structure of incoming data that contain lists (arrays), without needing to use JavaScript code in the Function node. +- With the Function node, you can write JavaScript functions to modify the data structure of incoming data: + + To create multiple items from a single item, you can use this JavaScript code: + + ```js + return items[0].json.map(item => { + return { + json: item + } + }); + ``` + + To create a single item from multiple items, you can use this JavaScript code: + + ```js + return [ + { + json: { + data_object: items.map(item => item.json) + } + } + ]; + ``` + +### Exercise + +Use the HTTP Request node to make a GET request to the Poemist API `https://www.poemist.com/api/v1/randompoems`. Transform the incoming data with the `Split Into Items` option and with the Function node. + + +??? note "Show me the solution" + + To get the poems from the Poemist API, execute the *HTTP Request node* with the following parameters: + + - Authentication: None + - Request Method: GET + - URL: https://www.poemist.com/api/v1/randompoems + + The result should look like this: + +
HTTP Request node without split items
+ + + To transform the data from the HTTP Request node, toggle the switch `Split Into Items`. The result should look like this: + +
HTTP Request node with split items
+ + To transform the data with the Function node, connect this node to the *HTTP Request node* (without the toggle for splitting data) and write the following code in the JavaScript Code field: + + ```js + return items[0].json.map(item => { + return { + json: item + } + }); + ``` + + The result should look like this: + +
Function node with code to transform items
+ diff --git a/docs/courses/level-two/chapter-2.md b/docs/courses/level-two/chapter-2.md new file mode 100644 index 000000000..4b71fb9aa --- /dev/null +++ b/docs/courses/level-two/chapter-2.md @@ -0,0 +1,454 @@ +# Processing different data types + +In this chapter, you will learn how to process different types of data using [n8n core nodes](/workflows/nodes/). + + +## HTML and XML data + +You're most likely familiar with HTML and XML. + +!!! note "HTML vs. XML" + + HTML is a markup language used to describe the structure and semantics of a web page. XML looks similar to HTML, but the tag names are different, as they describe the kind of data they hold. + +If you need to process HTML or XML data in your n8n workflows, use the [HTML Extract node](/integrations/core-nodes/n8n-nodes-base.htmlExtract/) or [XML node](/integrations/core-nodes/n8n-nodes-base.xml/). + +The HTML Extract node allows you to extract HTML content of a webpage, by referencing CSS selectors. This is useful if you want to collect structured information from a website (web-scraping). + +### Exercise + +Use the HTTP Request node to make a GET request to the URL `https://www.daysoftheyear.com/days/mar/2022/`. Then, connect an HTML Extract node and configure it to extract the date of the returned events. + +??? note "Show me the solution" + + Configure the HTTP Request node with the following parameters: + + - Authentication: None + - Request Method: GET + - URL: https://www.daysoftheyear.com/days/mar/2022/ + + The result should look like this: + +
Result of HTTP Request node
+ + Connect an *HTML Extract node* to the HTTP Request node and configure the former's parameters: + + - Source Data: JSON + - JSON Property: data + - Extraction Values: + - Key: event + - CSS Selector: .js-link-target + - Return Value: HTML + + You can add more values to extract more data. + + The result should look like this: + +
Result of HTML Extract node
+ + + +The XML node allows you to convert XML to JSON and JSON to XML. This operation is useful if you work with different web services that use either XML or JSON, and need to get and submit data between them in the two formats. + +### Exercise + +In a previous exercise, you used an HTTP Request node to make a request to an API. Now, use the XML node to convert the JSON output to XML. + +??? note "Show me the solution" + + Get data from the Poemist API using the HTTP Request node and connect an XML node to it with the following parameters: + + - Mode: **JSON to XML** + - Property name: **data** + + The result should look like this: + +
XML node (JSON to XML) – JSON View
+ +
XML node (JSON to XML) – Table View
+ + To transform data the other way around, select the mode **XML to JSON**. + + +## Date, time, and interval data + +Date and time data types include `DATE`, `TIME`, `DATETIME`, `TIMESTAMP`, and `YEAR`. The dates and times can be passed in different formats, for example: + +- `DATE`: March 29 2022, 29-03-2022, 2022/03/29 +- `TIME`: 08:30:00, 8:30, 20:30 +- `DATETIME`: 2022/03/29 08:30:00 +- `TIMESTAMP`: 1616108400 (Unix timestamp), 1616108400000 (Unix ms timestamp) +- `YEAR`: 2022, 22 + +If you need to convert date and time data to different formats, and calculate dates, use the [Date & Time node](/integrations/core-nodes/n8n-nodes-base.dateTime/). + +You can also schedule workflows to run at a specific time, interval, or duration, using the two trigger nodes: + +- [Cron node](/integrations/core-nodes/n8n-nodes-base.cron/) triggers the workflow at fixed dates and/or times (for example, every Monday at 9am). +- [Interval node](/integrations/core-nodes/n8n-nodes-base.interval/) triggers the workflow in regular intervals of time (for example, every 10 minutes). + +In some cases, you might need to pause the workflow execution. This might be necessary, for example, if you know that a service doesn't process the data instantly or it is generally slower, so you don't want the incomplete data to be passed to the next node. In this case, you can use the [Wait node](/integrations/core-nodes/n8n-nodes-base.wait/) after the node that you want to delay. The Wait node pauses the workflow execution and resumes it at a specific time, after a time interval, or on a webhook call. + + +### Exercise + +Build a workflow that adds five days to an input date. Then, if the calculated date occurred after today, the workflow waits 1 minute before [setting](/integrations/core-nodes/n8n-nodes-base.set/) the calculated date as a value. The workflow should be triggered every 30 minutes. + +??? note "Show me the solution" + + You can build this workflow using the data from the *Customer Datastore node*, the three nodes for managing date and time, an *IF node* for conditional routing, and a *Set node* for setting the new calculated date. The workflow looks like this: + +
Workflow for transforming dates
+ + To check the configuration of each node, you can copy the JSON code of this workflow and paste it in your Editor UI. + + ```json + { + "nodes": [ + { + "parameters": { + "action": "calculate", + "value": "={{$json[\"created\"]}}", + "duration": 5, + "options": {} + }, + "name": "Date & Time", + "type": "n8n-nodes-base.dateTime", + "typeVersion": 1, + "position": [ + 880, + 1500 + ] + }, + { + "parameters": { + "unit": "hours" + }, + "name": "Interval", + "type": "n8n-nodes-base.interval", + "typeVersion": 1, + "position": [ + 520, + 1500 + ] + }, + { + "parameters": { + "unit": "minutes" + }, + "name": "Wait", + "type": "n8n-nodes-base.wait", + "typeVersion": 1, + "position": [ + 1240, + 1500 + ], + "webhookId": "d17effb8-ad90-4a74-bb88-daa3d3d18583" + }, + { + "parameters": { + "conditions": { + "dateTime": [ + { + "value1": "={{$json[\"data\"]}}", + "value2": "2022-02-03T11:45:38.932Z" + } + ] + } + }, + "name": "IF", + "type": "n8n-nodes-base.if", + "typeVersion": 1, + "position": [ + 1060, + 1500 + ] + }, + { + "parameters": { + "values": { + "string": [ + { + "value": "={{$node[\"IF\"].json[\"data\"]}}" + } + ] + }, + "options": {} + }, + "name": "Set", + "type": "n8n-nodes-base.set", + "typeVersion": 1, + "position": [ + 1420, + 1500 + ] + }, + { + "parameters": { + "operation": "getAllPeople", + "returnAll": true + }, + "name": "Customer Datastore", + "type": "n8n-nodes-base.n8nTrainingCustomerDatastore", + "typeVersion": 1, + "position": [ + 700, + 1500 + ] + } + ], + "connections": { + "Date & Time": { + "main": [ + [ + { + "node": "IF", + "type": "main", + "index": 0 + } + ] + ] + }, + "Interval": { + "main": [ + [ + { + "node": "Customer Datastore", + "type": "main", + "index": 0 + } + ] + ] + }, + "Wait": { + "main": [ + [ + { + "node": "Set", + "type": "main", + "index": 0 + } + ] + ] + }, + "IF": { + "main": [ + [ + { + "node": "Wait", + "type": "main", + "index": 0 + } + ] + ] + }, + "Customer Datastore": { + "main": [ + [ + { + "node": "Date & Time", + "type": "main", + "index": 0 + } + ] + ] + } + } + } + ``` + + +## Binary data + +So far, you have mainly worked with text data. But what if you want to process data that is not text? For example, images or PDF files. This is binary data, as it is represented in the binary numeral system. In this form, binary data doesn't offer you useful information, so it needs to be converted into a readable form. + +In n8n, you can process binary data with the following nodes: + +- [Move Binary Data node](/integrations/core-nodes/n8n-nodes-base.moveBinaryData/) to move data between binary and JSON properties. +- [Read Binary File node](/integrations/core-nodes/n8n-nodes-base.readBinaryFile/) to read a file from the host machine that runs n8n. +- [Read Binary Files](/integrations/core-nodes/n8n-nodes-base.readBinaryFiles/) to read multiple files from the host machine that runs n8n. +- [Write Binary File](/integrations/core-nodes/n8n-nodes-base.writeBinaryFile/) to write a file to the host machine that runs n8n. +- [Spreadsheet File node](/integrations/core-nodes/n8n-nodes-base.spreadsheetFile/) to read from or write to spreadsheet files of different formats (for example, CSV, XLSX). + +To read or write a binary file, you need to write the path (location) of the file in the node's `File Name` parameter. + +!!! warning "Naming the right path" + + The file path looks slightly different on n8n cloud compared to desktop or self-hosted: + + - n8n desktop and self-hosted: `./Documents/my_file.json` + - n8n cloud: `/home/node/.n8n/my_file.json` + + +### Exercise + +Make an HTTP request to get this PDF file: `https://media.kaspersky.com/pdf/Kaspersky_Lab_Whitepaper_Anti_blocker.pdf.` Then, use the Move Binary Data node to convert the file from binary to JSON, with [base64](https://developer.mozilla.org/en-US/docs/Glossary/Base64) encoding. + +??? note "Show me the solution" + + In the HTTP Request node, you should see the PDF file in JSON, Table, and Binary view, like this: + +
HTTP Request node to get PDF
+ + When you convert the PDF from binary to JSON with base64 encoding using the *Move Binary Data node*, the result should look like this: + +
Move Binary Data node (Binary to JSON) with base64 encoding
+ + To check the configuration of the nodes, you can copy-paste the JSON code of the workflow: + + ```json + { + "nodes": [ + { + "parameters": { + "url": "https://media.kaspersky.com/pdf/Kaspersky_Lab_Whitepaper_Anti_blocker.pdf", + "responseFormat": "file", + "options": {} + }, + "name": "HTTP Request", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 1, + "position": [ + 1340, + 1080 + ] + }, + { + "parameters": { + "setAllData": false, + "options": { + "encoding": "base64" + } + }, + "name": "Move Binary Data", + "type": "n8n-nodes-base.moveBinaryData", + "typeVersion": 1, + "position": [ + 1600, + 1080 + ] + } + ], + "connections": { + "HTTP Request": { + "main": [ + [ + { + "node": "Move Binary Data", + "type": "main", + "index": 0 + } + ] + ] + } + } + } + ``` + + + +### Exercise + +Make an HTTP request to the Poemist API `https://www.poemist.com/api/v1/randompoems` and move the returned data from JSON to binary. Then, write the new binary data to a file. Finally, to check that it worked out, read the generated binary file referencing it with an expression in the node. + +??? note "Show me the solution" + + The workflow for this exercise looks like this: + +
Workflow for moving JSON to binary data
+ + To check the configuration of the nodes, you can copy-paste the JSON code of the workflow: + + ```json + { + "nodes": [ + { + "parameters": { + "filePath": "={{$json[\"fileName\"]}}" + }, + "name": "Read Binary File", + "type": "n8n-nodes-base.readBinaryFile", + "typeVersion": 1, + "position": [ + 1060, + 500 + ] + }, + { + "parameters": { + "url": "https://www.poemist.com/api/v1/randompoems", + "options": { + "splitIntoItems": true + } + }, + "name": "HTTP Request", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 1, + "position": [ + 520, + 500 + ] + }, + { + "parameters": { + "fileName": "/home/node/.n8n/poemist.json" + }, + "name": "Write Binary File", + "type": "n8n-nodes-base.writeBinaryFile", + "position": [ + 880, + 500 + ], + "typeVersion": 1 + }, + { + "parameters": { + "mode": "jsonToBinary", + "options": {} + }, + "name": "Move Binary Data", + "type": "n8n-nodes-base.moveBinaryData", + "position": [ + 700, + 500 + ], + "typeVersion": 1 + } + ], + "connections": { + "HTTP Request": { + "main": [ + [ + { + "node": "Move Binary Data", + "type": "main", + "index": 0 + } + ] + ] + }, + "Write Binary File": { + "main": [ + [ + { + "node": "Read Binary File", + "type": "main", + "index": 0 + } + ] + ] + }, + "Move Binary Data": { + "main": [ + [ + { + "node": "Write Binary File", + "type": "main", + "index": 0 + } + ] + ] + } + } + } + ``` diff --git a/docs/courses/level-two/chapter-3.md b/docs/courses/level-two/chapter-3.md new file mode 100644 index 000000000..64fc7333b --- /dev/null +++ b/docs/courses/level-two/chapter-3.md @@ -0,0 +1,175 @@ +# Merging and splitting data + +In this chapter, you will learn how to merge and split data, and in what cases it might be useful to perform these operations. + + +## Merging data + +In some cases, you might need to merge (combine) and process data from different sources. + +Merging data can involve: + +- Creating one data set from multiple sources. +- Synchronizing data between multiple systems. For example, removing duplicate data, or updating data in one system when it changes in another. + +!!! note "One-way vs. two-way sync" + + In a one-way sync, data is synchronized in one direction. One system serves as the single source of truth. When information changes in that main system, it automatically changes in the secondary system; but if information changes in the secondary system, the changes are not reflected in the main system. + + In a two-way sync, data is synchronized in both directions (between both systems). When information changes in either of the two systems, it automatically changes in the other one as well. + + [This blog tutorial](https://n8n.io/blog/how-to-sync-data-between-two-systems/) explains how to sync data one-way and two-way between two CRMs. + +In n8n, you can merge data from two different nodes using the [Merge node](/integrations/core-nodes/n8n-nodes-base.merge/), which provides several merging modes: + +- Append +- Keep Key Matches +- Merge By Index +- Merge By Key +- Multiples +- Pass-through +- Remove Key Matches +- Wait + +Notice that three of these modes require a key (Merge By Key, Keep Key Matches, Remove Key Matches). This key represents a common property between the two data sources, based on which the data can be merged. In the Merge node, they are called `Property Input 1` and `Property Input 2`. + +
Property Input fields in the Merge node
+ +!!! warning "Property Input in dot notation" + + If you want to reference nested values in the *Merge node* parameters `Property Input 1` and `Property Input 2`, you need to enter the property key in dot-notation format (as text, not as an expression). + + +### Exercise + +Build a workflow that merges data from the Customer Datastore node and Function node. + +* Add a Merge node that takes Input 1 from a Customer Datastore node and Input 2 from a Function node. +* In the Customer Datastore node, run the operation Get All People. +* In the Function node, create an array of two objects with three properties: `name`, `language`, and `country`, where the property `country` has two sub-properties `code` and `name`. Fill out the values of these properties with the information of two characters from the Customer Database. For example, Jay Gatsby's language would be English and country name would be United States. +* In the Merge node, try out different merge modes. + +??? note "Show me the solution" + + The workflow for this exercise looks like this: + +
Workflow exercise for merging data
+ + If you merge data with the option *Keep Key Matches* using the country code as the common key, the result should look like this: + +
Output of Merge node with option to keep key matches
+ + + +## Looping + +In some cases, you might need to perform the same operation on each element of an array / each data item (for example sending a message to every contact in your address book). In technical terms, you need to iterate through the data (with loops). + + +n8n handles this repetitive processing automatically, as the nodes run once for each item, so you don't need to build loops into your workflows. However, there are some [exceptions of nodes and operations](/flow-logic/looping/#node-exceptions) for which you need to build a loop into your workflow. + +To [create a loop in an n8n workflow](/flow-logic/looping/#using-loops-in-n8n), you need to connect the output of one node to the input of a previous node, and add an IF node to check when to stop the loop. + +## Splitting data in batches + +If you need to process large incoming data, execute the Function node multiple times, or avoid API rate limits, it's best to split the data into batches (groups) and process these batches. You can do this with the [Split in Batches node](/integrations/core-nodes/n8n-nodes-base.splitInBatches/). This node splits input data into a specified batch size and, with each iteration, returns a predefined amount of data. + +!!! warning "Execution of Split in Batches node" + + The Split In Batches node stops executing after all the incoming items get divided into batches and passed on to the next node in the workflow, so it is not necessary to add an IF node to stop the loop. + + +### Exercise + +Build a workflow that reads the RSS feed from Medium and dev.to. The workflow should consist of three nodes: + +- A Function node that returns the URLs of the RSS feeds of Medium (`https://medium.com/feed/n8n-io`) and dev.to (`https://dev.to/feed/n8n`) +- A Split In Batches node with `Batch Size: 1`, that takes in the inputs from the Function node and RSS node and iterates over the items. +- An RSS Read node that gets the URL of the Medium RSS feed, passed as an expression: `{{$node["SplitInBatches"].json["url"]}}`. The RSS Read node is one of the exception nodes which processes only the first item it receives, so the Split in Batches node is necessary for iterating over multiple items. + +??? note "Show me the solution" + + The workflow for this exercise looks like this: + +
Workflow for getting RSS feeds from two blogs
+ + To check the configuration of the nodes, you can copy-paste the JSON code of the workflow: + + ```json + { + "nodes": [ + { + "parameters": { + "functionCode": "return [\n {\n json: {\n url: 'https://medium.com/feed/n8n-io',\n }\n },\n {\n json: {\n url: 'https://dev.to/feed/n8n',\n }\n }\n];" + }, + "name": "Function", + "type": "n8n-nodes-base.function", + "position": [ + 480, + 1880 + ], + "typeVersion": 1 + }, + { + "parameters": { + "url": "={{$node[\"SplitInBatches\"].json[\"url\"]}}" + }, + "name": "RSS Feed Read", + "type": "n8n-nodes-base.rssFeedRead", + "position": [ + 880, + 1880 + ], + "typeVersion": 1 + }, + { + "parameters": { + "batchSize": 1, + "options": {} + }, + "name": "SplitInBatches", + "type": "n8n-nodes-base.splitInBatches", + "position": [ + 680, + 1880 + ], + "typeVersion": 1 + } + ], + "connections": { + "Function": { + "main": [ + [ + { + "node": "SplitInBatches", + "type": "main", + "index": 0 + } + ] + ] + }, + "RSS Feed Read": { + "main": [ + [ + { + "node": "SplitInBatches", + "type": "main", + "index": 0 + } + ] + ] + }, + "SplitInBatches": { + "main": [ + [ + { + "node": "RSS Feed Read", + "type": "main", + "index": 0 + } + ] + ] + } + } + } + ``` diff --git a/docs/courses/level-two/chapter-4.md b/docs/courses/level-two/chapter-4.md new file mode 100644 index 000000000..8038e0f42 --- /dev/null +++ b/docs/courses/level-two/chapter-4.md @@ -0,0 +1,117 @@ +# Dealing with errors in workflows + +Sometimes it can happen that you're building a nice workflow, but when you try to execute it, it fails. There are many reasons why workflows executions may fail (some more or less mysterious), for example when a node is not configured correctly or a third-party service that you're trying to connect to is not working properly. + +But don't panic. We will show you some ways in which you can troubleshoot the issue, so you can get your workflow up and running as soon as possible. + + +## Checking failed workflows + +When one of your workflows fails, it's helpful to check the execution log by clicking on [**Executions**](/editor-ui/#executions) in the left-side panel. The executions log shows you a list of the latest execution time, status, mode, and running time of your saved workflows. + +To investigate a specific workflow from the list, click on the folder icon on the row of the respective workflow. + +
Workflow Executions window
+ + +This will open the workflow in read-only mode, where you can see the execution of each node. This representation can help you identify at what point the workflow ran into issues. + +
Workflow execution view
+ +## Catching erroring workflows + +To catch failed workflows, create a separate [Error Workflow](/workflows/workflows/#failed-workflows) with the [Error Trigger node](/integrations/core-nodes/n8n-nodes-base.errorTrigger/), which gets executed if the main execution fails. + +Then, you can take further actions by connecting other nodes, for example sending notifications via email or Slack about the failed workflow and its errors. To receive error messages for a failed workflow, you need to select the option `Error Workflow` in the [Workflow Settings](/courses/level-one/chapter-5/chapter-5.8/) of the respective workflow. + +The only difference between a regular workflow and an Error Workflow is that the latter contains an Error Trigger node. Make sure to create this node before you set a workflow as Error Workflow. + +!!! note "Error workflows" + + - You don't need to activate workflows that use the Error Workflow node. + - A workflow that uses the *Error Trigger node* uses itself as the error workflow. + - The Error Trigger node is designed to get triggered only when the monitored workflow gets executed automatically. This means you can’t test this (to see the result of) an error workflow while executing the monitored workflow manually. + - You can set the same Error Workflow for multiple workflows. + + +### Exercise + +In the previous chapters, you've built several small workflows. Now, pick one of them that you want to monitor. Create an Error Workflow that sends a message to a communication platform (for example, Slack, Discord, Telegram, or even email) if that workflow fails. Don't forget to set this Error Workflow in the settings of the monitored workflow. + +??? note "Show me the solution" + + The workflow for this exercise looks like this: + +
Error workflow
+ + To check the configuration of the nodes, you can copy-paste the JSON code of the workflow: + + ```json + { + "nodes": [ + { + "parameters": {}, + "name": "Error Trigger", + "type": "n8n-nodes-base.errorTrigger", + "typeVersion": 1, + "position": [ + 720, + -380 + ] + }, + { + "parameters": { + "channel": "channelname", + "text": "=This workflow {{$node[\"Error Trigger\"].json[\"workflow\"][\"name\"]}}failed.\nHave a look at it here: {{$node[\"Error Trigger\"].json[\"execution\"][\"url\"]}}", + "attachments": [], + "otherOptions": {} + }, + "name": "Slack", + "type": "n8n-nodes-base.slack", + "position": [ + 900, + -380 + ], + "typeVersion": 1, + "credentials": { + "slackApi": { + "id": "17", + "name": "slack_credentials" + } + } + } + ], + "connections": { + "Error Trigger": { + "main": [ + [ + { + "node": "Slack", + "type": "main", + "index": 0 + } + ] + ] + } + } + } + ``` + + + +## Throwing exceptions in workflows + +Another way of troubleshooting workflows is to include a [Stop and Error node](/integrations/core-nodes/n8n-nodes-base.stopAndError/) in your workflow. This node throws an error, which can be set to one of two error types: an error message or an error object. The error message returns a custom message about the error, while the error object returns the type of error. + +The Stop and Error node can only be added as the last node in a workflow. + +!!! note "When to throw errors" + + Throwing exceptions with the Stop and Error node is useful for verifying the data (or assumptions about the data) from a node and returning custom error messages. + + If you are working with data from a third-party service, you may come across problems such as: wrongly formatted JSON output, data with the wrong type (for example, numeric data that has a non-numeric value), missing values, or errors from remote servers. + + Though this kind of invalid data might not cause the workflow to fail right away, it could cause problems later on, and then it can become difficult to track the source error. This is why it is better to throw an error at the time you know there might be a problem. + + +
Stop and Error node with error message
diff --git a/docs/courses/level-two/chapter-5/chapter-5.0.md b/docs/courses/level-two/chapter-5/chapter-5.0.md new file mode 100644 index 000000000..9d5bb6028 --- /dev/null +++ b/docs/courses/level-two/chapter-5/chapter-5.0.md @@ -0,0 +1,34 @@ +# Automating a business workflow + +Remember [our friend Nathan](/courses/level-one/chapter-3)? + +**Nathan 🙋:** Hello, it's me again. My manager was so impressed with my first workflow automation solution, that she entrusted me with more responsibility.
+**You 👩‍🔧:** More work and responsibility. Congratulations, I guess. What do you need to do now?
+**Nathan 🙋:** I got access to all sales data and am responsible for creating two reports: one for regional sales and one for orders prices. They are based on data from different sources and come in different formats.
+**You 👩‍🔧:** Sounds like a lot of manual work–but the kind that can be automated. So let's do it! + + +## Workflow design + +Now that we have an idea of what Nathan wants to automate, let’s list the steps he needs to take to achieve this: + +1. Get and combine data from all necessary sources. +2. Sort the data and format the dates. +3. Write binary files. +4. Send notifications via email and Discord. + +n8n provides core nodes for all these steps. This use case is somewhat complex and it will be made up of three separate workflows: + +1. A workflow that merges the company data with external information. +2. A workflow that generates the reports. +3. A workflow that monitors errors in the second workflow. + +## Workflow prerequisites + +To build the workflows, you will need the following: + +* An [Airtable](https://airtable.com/) account and [credentials](/integrations/credentials/airtable/). +* A [Google](https://www.google.com/account/about/) account and [credentials](/integrations/credentials/google/) to access Gmail. +* A [Discord](https://discord.com/) account and webhook URL (you receive this via email when you sign up for this course). + +Next, you will build these three workflows with step-by-step instructions. diff --git a/docs/courses/level-two/chapter-5/chapter-5.1.md b/docs/courses/level-two/chapter-5/chapter-5.1.md new file mode 100644 index 000000000..4ae0b3065 --- /dev/null +++ b/docs/courses/level-two/chapter-5/chapter-5.1.md @@ -0,0 +1,26 @@ +# Workflow 1 – Merging data + +The company's customer data is stored in Airtable. It contains information about the customers' ID, country, email, and join date, but lacks data about their respective region and subregion. You need to fill in these last two fields in order to create the reports for regional sales. + +To accomplish this task, you first need to make a copy of this [customers table](https://airtable.com/shrZBXHXWvQ57LHuX) in your Airtable account. + + + +Next, you have to build a small workflow that merges data from Airtable and a REST API. + +1. Use the [Airtable node](/integrations/nodes/n8n-nodes-base.airtable/) to list the data in the Airtable table named `customers`. +2. use the [HTTP Request node](/integrations/core-nodes/n8n-nodes-base.httpRequest/) to get data from the REST Countries API: `https://restcountries.com/v3.1/all`. This will return data about world countries. Note that the incoming data needs to be split into items. +3. Use the [Merge node](/integrations/core-nodes/n8n-nodes-base.merge/) to merge data from Airtable and the Countries API by country name (the common key), represented as `customerCountry` in Airtable and `name.common` in the Countries API, respectively. +4. Use the Airtable node to update the fields `region` and `subregion` in Airtable with the data from the Countries API. + +The workflow should look like this: + +
Workflow 1 for merging data from Airtable and the Countries API
+ + +!!! question "Quiz questions" + + * How many items does the HTTP Request node return? + * How many items does the Merge node return? + * How many unique regions are assigned in the customers table? + * What is the subregion assigned to the customerID 10? diff --git a/docs/courses/level-two/chapter-5/chapter-5.2.md b/docs/courses/level-two/chapter-5/chapter-5.2.md new file mode 100644 index 000000000..793fd1469 --- /dev/null +++ b/docs/courses/level-two/chapter-5/chapter-5.2.md @@ -0,0 +1,72 @@ +# Workflow 2 – Generating reports + +In this workflow, you will merge data from different sources, transform binary data, generate files, and send notifications about them. The final workflow should look like this: + +
Workflow 2 for aggregating data and generating files
+ +To make things easier, let's split the workflow into three parts. + +## Part 1 – Getting data from different sources + +The first part of the workflow consists of five nodes: + +
Workflow 1 – Getting data from different sources
+ +1. Use the [HTTP Request node](/integrations/core-nodes/n8n-nodes-base.httpRequest/) to get data from the API endpoint that stores company data. Configure the following node parameters: + + * **Authentication**: Header Auth + * **URL**: The Dataset URL you received in the email when you signed up for this course. + * **Options > Add Option > Split Into Items**: toggle to true. + * **Headers > Add Header**: + * **Name**: unique_id + * **Value**: The unique ID you received in the email when you signed up for this course. + +2. Use the [Airtable node](/integrations/nodes/n8n-nodes-base.airtable/) to list data from the `customers` table (where you updated the fields `region` and `subregion`). +3. Use the [Merge node](/integrations/core-nodes/n8n-nodes-base.merge/) to merge data from the Airtable and HTTP Request node, based on the common key `customer ID`. +4. Use the [Item Lists node](/integrations/core-nodes/n8n-nodes-base.itemLists/) to sort data by orderPrice in descending order. + +!!! question "Quiz questions" + + * What is the name of the employee assigned to customer 1? + * What is the order status of customer 6? + * What is the highest order price? + +## Part 2 – Generating file for regional sales + +The second part of the workflow consists of five nodes: + +
Workflow 2 – Generating file for regional sales
+ +1. Use the [IF node](/integrations/core-nodes/n8n-nodes-base.if/) to filter order from the region Americas. +2. Use the [Move Binary Data node](/integrations/core-nodes/n8n-nodes-base.moveBinaryData/) to transform the incoming data from JSON to binary format. Note that you need to convert all data. +3. Use the [Write Binary File node](/integrations/core-nodes/n8n-nodes-base.writeBinaryFile/) to create and store files with the orders information. In the File Name field, use an expression to include the oder id in the file name, like this: `report_orderID{oder_id}.json` (you need to replace the `{order id}` with the reference the Move Binary Data node). +4. Use the [Gmail node](/integrations/nodes/n8n-nodes-base.gmail/) (or another email node) to send the files via email to an address you have access to. Note that you need to add an attachment with the data property. +5. Use the [Discord node](/integrations/nodes/n8n-nodes-base.discord/) to send a message in the n8n Discord channel `#course-level-two`. In the node, configure the following parameters: + * Webhook URL: The webhook URL you received in the email when you signed up for this course. + * Text: "I sent the file via email with the label ID `{label ID}` and wrote the binary file `{file name}`. My ID: " followed by your ID.
Note that you need to replace the text in curly braces `{}` with expressions that reference the data from the nodes. + +!!! question "Quiz questions" + + * How many orders are assigned to the region Americas? + * What is the total price of the orders in the region Americas? + * How many items are returned by the *Write Binary File node*? + +## Part 3 – Generating files for total sales + +The third part of the workflow consists of seven nodes: + +
Workflow 3 – Generating files for total sales
+ +1. Use the [Split In Batches node](/integrations/core-nodes/n8n-nodes-base.splitInBatches/) to split data from the Item Lists node into batches of 5. +2. Use the [Set node](/integrations/core-nodes/n8n-nodes-base.set/) to set four values, referenced with expressions from the previous node: `customerEmail`, `customerRegion`, `customerSince`, and `orderPrice`. +3. Use the [Date & Time node](/integrations/core-nodes/n8n-nodes-base.dateTime/) to change the date format of the field `customerSince` to the format MM/DD/YYYY. +4. Use the [Spreadsheet File node](/integrations/core-nodes/n8n-nodes-base.spreadsheetFile/) to create a CSV spreadsheet with the file name set as the expression: `{{$runIndex > 0 ? 'file_low_orders':'file_high_orders'}}`. +5. Use the [Discord node](/integrations/nodes/n8n-nodes-base.discord/) to send a message in the n8n Discord channel `#course-level-two`. In the node, configure the following parameters: + * Webhook URL: The webhook URL you received in the email when you signed up for this course. + * Text: "I created the spreadsheet `{file name}`. My ID:" followed by your ID.
The `{file name}` should be an expression that references data from the Spreadsheet File node.
+ +!!! question "Quiz questions" + + * What is the lowest order price in the first batch of items? + * What is the formatted date of customer 7? + * How many items are returned by the *Spreadsheet File node*? diff --git a/docs/courses/level-two/chapter-5/chapter-5.3.md b/docs/courses/level-two/chapter-5/chapter-5.3.md new file mode 100644 index 000000000..ce04a3b3c --- /dev/null +++ b/docs/courses/level-two/chapter-5/chapter-5.3.md @@ -0,0 +1,25 @@ +# Workflow 3 – Monitoring workflow errors + +To accomplish this task, you have to create an Error workflow that monitors the main workflow. + +1. Add an Error Trigger node (and execute it as a test). +2. To the Error Trigger node, connect a Discord node and configure the fields:
+ + * Webhook URL: The URL that you received in the email from n8n when you signed up for this course. + * Text: The workflow `{workflow name}` failed, with the error message: `{execution error message}`. Last node executed: `{name of the last executed node}`. Check this workflow execution here: `{execution URL}`. + + Note that you need to replace the text in curly brackets `{}` with expressions that take the respective information from the Error Trigger node.
+ +3. Execute the Discord node. +4. Set the newly created workflow as Error Workflow for the main workflow. + +The workflow should look like this: + +
Workflow 3 for monitoring workflow errors
+ +!!! question "Quiz questions" + + * What fields does the Error Trigger node return? + * What information about the execution does the Error Trigger node return? + * What information about the workflow does the Error Trigger node return? + * What is the expression to reference the workflow name? diff --git a/docs/courses/level-two/chapter-6.md b/docs/courses/level-two/chapter-6.md new file mode 100644 index 000000000..55bc68c8b --- /dev/null +++ b/docs/courses/level-two/chapter-6.md @@ -0,0 +1,18 @@ +# Test your knowledge + +Congratulations – you finished the n8n Course Level 2! You helped Nathan build a business workflow automation, saving him hours of tedious work and making him more productive. + +You’ve come a long way throughout this course and learned a lot about workflow automation. Here’s what you can do next: + +* Test your knowledge of everything you've learned in this course with a quiz. The quiz consists of questions about the theoretical concepts and workflows covered in this course. + + - You need to have at least 80% correct answers. + - You can take the quiz as many times as you want. + - There is no time limit on answering the quiz questions. + +
+ +
+ +* Create new workflows for your work or personal use and share them with us. Don’t have any ideas? Find inspiration on the [workflows page](https://n8n.io/workflows) and on our [blog](https://n8n.io/blog/). +* Dive deeper into n8n's features by reading the [docs](/). diff --git a/docs/courses/level-two/index.md b/docs/courses/level-two/index.md new file mode 100644 index 000000000..95a5d59a1 --- /dev/null +++ b/docs/courses/level-two/index.md @@ -0,0 +1,42 @@ +# Introduction + +Welcome to the n8n Course Level 2! + +## Is this course right for me? + +This course is for you if you: + +- Want to automate somewhat complex business processes. +- Want to dive deeper into n8n after taking the [Level 1 course](/courses/level-one/). + +## What will I learn? + +The focus in this course is on working with data. You will learn how to: + +- Use the data structure of n8n correctly. +- Process different data types (for example, XML, HTML, date, time, and binary data). +- Merge data from different sources (for example, a database, spreadsheet, or CRM). +- Use functions and JavaScript code in the [Function node](/integrations/core-nodes/n8n-nodes-base.function). +- Deal with error workflows and workflow errors. + +You will learn all this by completing short practical exercises after the theoretical explanations, and building a business workflow with step-by-step instructions. + +## What do I need to get started? + +To follow along this course (at a comfortable pace) you will need the following: + +- [n8n set up](/hosting/options/). This course was developed on n8n version 0.161. +- Basic knowledge of n8n. We strongly recommend taking our Level 1 course prior to this one. + +## How long does it take to complete the course? + +Completing the course should take around two hours. You do not have to complete it in one go, feel free to take breaks and resume whenever you are ready. + +## Do I get a certificate? + +We believe all good works deserve recognition. If you successfully complete the course, you will get a **badge** in your [community forum](http://community.n8n.io/) profile to showcase your n8n skills. To get your n8n badge, you need to complete the following milestones: + +- [x] [Sign up](https://n8n-community.typeform.com/to/HQoQ7nXg) for the course to get your unique ID and other information you will need for the exercises. +- [x] Run an HTTP Request to get the data set. +- [x] Automatically generate binary files and send notifications in Discord. +- [x] Pass the quiz at the end of the course. diff --git a/docs/data/data-structure.md b/docs/data/data-structure.md index a7e213c80..085bf2c4d 100644 --- a/docs/data/data-structure.md +++ b/docs/data/data-structure.md @@ -30,7 +30,7 @@ In n8n, all data passed between nodes is an array of objects. It has the followi ``` !!! note "Skipping the 'json' key and array syntax" - From 0.166.0 onwards, n8n automatically adds the `json` key if it is missing. It also automatically wraps your items in an array (`[]`) if needed. + From 0.166.0 onwards, when using the function node, n8n automatically adds the `json` key if it's missing. It also automatically wraps your items in an array (`[]`) if needed. This is only when using the Function node. When building your own nodes, you must still make sure the node returns data with the `json` key. ## Data flow diff --git a/docs/integrations/core-nodes/n8n-nodes-base.markdown.md b/docs/integrations/core-nodes/n8n-nodes-base.markdown.md new file mode 100644 index 000000000..eb2b968ed --- /dev/null +++ b/docs/integrations/core-nodes/n8n-nodes-base.markdown.md @@ -0,0 +1,70 @@ +# Markdown + +The Markdown node converts between Markdown and HTML formats. + +## Options + +You can configure the node's output using **Options**. Click **Add Option** to view and select your options. + +!!! note "Test out the options" + Some of the options depend on each other, or can interact. We recommend testing out options to check the effects are what you want. + +### Markdown to HTML + +| Option | Description | Default | +| ------ | ----------- | ------- | +| **Add Blank To Links** | Whether to open links a new window (enabled) or not (disabled). | Disabled | +| **Automatic Linking To URLs** | Whether to automatically link to URLs (enabled) or not (disabled). If enabled, n8n converts any string that it identifies as a URL to a link. | Disabled | +| **Backslash Escapes HTML Tags** | Whether to allow backslash escaping of HTML tags (enabled) or not (disabled). When enabled, n8n escapes any `<` or `>` prefaced with `\`. For example, `\` renders as `<div>`. | Disabled | +| **Complete HTML Document** | Whether to output a complete HTML document (enabled) or an HTML fragment (disabled). A complete HTML document includes the `` declaration, `` and `` tags, and the `` element. | Disabled | +| **Customized Header ID** | Whether to support custom heading IDs (enabled) or not (disabled). When enabled, you can add custom heading IDs using `{header ID here}` after the heading text. | Disabled | +| **Emoji Support** | Whether to support emojis (enabled) or not (disabled). | Disabled. | +| **Encode Emails** | Whether to transform ASCII character emails into their equivalent decimal entities (enabled) or not (disabled). | Enabled | +| **Exclude Trailing Punctuation From URLs** | Whether to exclude trailing punctuation from auto-linked URLs (enabled) or not (disabled). For use with **Automatic Linking To URLs**. | Disabled | +| **GitHub Code Blocks** | Whether to enable GitHub Flavored Markdown code blocks (enabled) or not (disabled). | Enabled | +| **GitHub Compatible Header IDs** | Whether to generate GitHub Flavored Markdown heading IDs (enabled) or not (disabled). GitHub Flavored Markdown generates heading IDs with `-` in place of spaces and removes non-alphanumeric characters. | Disabled | +| **GitHub Mention Link** | Change the link used with **GitHub Mentions**. | Disabled | +| **GitHub Mentions** | Whether to support tagging GitHub users with `@` (enabled) or not (disabled). When enabled, n8n replaces `@name` with `https://github.com/name`. | Disabled | +| **GitHub Task Lists** | Whether to support GitHub Flavored Markdown task lists (enabled) or not (disabled). | Disabled | +| **Header Level Start** | Number. Set the start level for headers. For example, changing this field to `2` causes n8n to treat `#` as `

`, `##` as `

`, and so on. | 1 | +| **Mandatory Space Before Header** | Whether to make a space between `#` and heading text required (enabled) or not (disabled). When enabled, n8n renders a heading written as `##Some header text` literally (it does not turn it into a heading element) | Disabled | +| **Middle Word Asterisks** | Whether n8n should treat asterisks in words as Markdown (disabled) or render them as literal asterisks (enabled). | Disabled | +| **Middle Word Underscores** | Whether n8n should treat underscores in words as Markdown (disabled) or render them as literal underscores (enabled). | Disabled | +| **No Header ID** | Disable automatic generation of header IDs (enabled). | Disabled | +| **Parse Image Dimensions** | Support setting maximum image dimensions in Markdown syntaxt (enabled). | Disabled | +| **Prefix Header ID** | Define a prefix to add to header IDs. | None | +| **Raw Header ID** | Whether to remove spaces, `'`, and `"` from header IDs, including prefixes, replacing them with `-` (enabled) or not (disabled). | Disabled | +| **Raw Prefix Header ID** | Whether to prevent n8n from modifying header prefixes (enabled) or not (disabled) | Disabled | +| **Simple Line Breaks** | Whether to create line breaks without a double space at the end of a line (enabled) or not (disabled). | Disabled | +| **Smart Indentation Fix** | Whether to try to smartly fix indentation problems related to ES6 template strings in indented code blocks (enabled) or not (disabled). | Disabled | +| **Spaces Indented Sublists** | Whether to remove the requirement to indent sublists four spaces (enabled) or not (disabled). | Disabled | +| **Split Adjacent Blockquotes** | Whether to split adjacent blockquote blocks (enabled) or not (disabled). If you don't enable this, n8n treats quotes (indicated by `>` at the start of the line) on separate lines as a single blockquote, even when separated by an empty line. | Disabled | +| **Strikethrough** | Whether to support strikethrough syntax (enabled) or not (disabled). When enabled, you can add a ~~strikethrough~~ effect using `~~` around the word or phrase. | Disabled | +| **Tables Header ID** | Whether to add an ID to table header tags (enabled) or not (disabled). | Disabled | +| **Tables Support** | Whether to support tables (enabled) or not (disabled). | Disabled | + +### HTML to Markdown + +| Option | Description | Default | +| ------ | ----------- | ------- | +| **Bullet Marker** | Specify the character to use for unordered lists. | * | +| **Code Block Fence** | Specify the characters to use for code blocks. | ``` | +| **Emphasis Delimiter** | Specify the character ``. | _ | +| **Global Escape Pattern** | Overrides the default character escape settings. You may want to use Text Replacement Pattern instead. | None | +| **Ignored Elements** | Ignore given HTML elements, and their children. | None | +| **Keep Images With Data** | Whether to keep images with data (enabled) or not (disabled). Support files up to 1MB. | Disabled | +| **Line Start Escape Pattern** | Overrides the default character escape settings. You may want to use Text Replacement Pattern instead. | None | +| **Max Consecutive New Lines** | Number. Specify the maximum number of consecutive new lines allowed. | 3 | +| **Place URLs At The Bottom** | Whether to place URLs at the bottom of the page and format using link reference definitions (enabled) or not (disabled). | Disabled | +| **Strong Delimiter** | Specify the characters for ``. | ** | +| **Style For Code Block** | Specify the styling for code blocks. Options are **Fence** and **Indented**. | Fence | +| **Text Replacement Pattern** | Define a text replacement pattern using regex. | None | +| **Treat As Blocks** | Specify HTML elements to treat as blocks (surround with blank lines) | None | + +## Parsers + +n8n uses the following parsers: + +* To convert from HTML to Markdown: [node-html-markdown](https://www.npmjs.com/package/node-html-markdown) +* To convert from Markdown to HTML: [Showdown](https://www.npmjs.com/package/showdown). Some options allow you to extend your Markdown with [GitHub Flavored Markdown](https://github.github.com/gfm/). + diff --git a/docs/integrations/core-nodes/n8n-nodes-base.readBinaryFile.md b/docs/integrations/core-nodes/n8n-nodes-base.readBinaryFile.md index 49292e6ff..ce1248f68 100644 --- a/docs/integrations/core-nodes/n8n-nodes-base.readBinaryFile.md +++ b/docs/integrations/core-nodes/n8n-nodes-base.readBinaryFile.md @@ -4,17 +4,19 @@ The Read Binary File node is used to read a file from the host machine that runs !!! note " Keep in mind" 1. If you are running n8n in Docker, your command will run on the n8n container and not the Docker host. -2. This node will look for files relative to the n8n install path. It is recommended to use absolute file paths to prevent any errors. + + 2. This node will look for files relative to the n8n install path. It is recommended to use absolute file paths to prevent any errors. ## Node Reference -1. *File Path* field: This field specifies the path to the file. -2. *Property Name* field: Name of the binary property to which to write the data of the read file. +1. **File Path** field: This field specifies the path to the file. +2. **Property Name** field: Name of the binary property to which to write the data of the read file. ## Example Usage This workflow allows you to read a file from the host machine using the Read Binary File node. You can also find the [workflow](https://n8n.io/workflows/577) on the website. This example usage workflow would use the following two nodes. + - [Start](/integrations/core-nodes/n8n-nodes-base.start/) - [Read Binary File]() @@ -29,5 +31,5 @@ The start node exists by default when you create a new workflow. ### 2. Read Binary File node -1. Enter the path to the file you want to read in the *File Path* field. -2. Click on *Execute Node* to run the workflow. +1. Enter the path to the file you want to read in the **File Path** field. +2. Click on **Execute Node** to run the workflow. diff --git a/docs/integrations/nodes/n8n-nodes-base.discord.md b/docs/integrations/nodes/n8n-nodes-base.discord.md index b6940557c..f724d08fe 100644 --- a/docs/integrations/nodes/n8n-nodes-base.discord.md +++ b/docs/integrations/nodes/n8n-nodes-base.discord.md @@ -2,7 +2,7 @@ [Discord](https://discord.com/) is a voice, video, and text communications platform for groups. Discord allows users to programmatically send messages using webhooks. -!!! note "🔑 Credentials" +!!! note "Credentials" The Discord node does not require authentication, but you must have access to a channel's settings to use webhooks. You can find out how to create a webhook in Discord [here](/integrations/credentials/discord/). @@ -27,8 +27,8 @@ The start node exists by default when you create a new workflow. ### 2. Discord node 1. First of all, you'll have to create a webhook for the Discord node. You can find out how to do that [here](/integrations/credentials/discord/). -2. Paste your webhook into the ***Webhook URL*** field. -5. Enter your message in the ***Text*** field. -6. Click on ***Execute Node*** to run the workflow. +2. Paste your webhook into the **Webhook URL** field. +5. Enter your message in the **Text** field. +6. Click on **Execute Node** to run the workflow. ![Sending a message to a Discord channel using the Discord node](/_images/integrations/nodes/discord/discord_node.png) diff --git a/docs/reference/release-notes.md b/docs/reference/release-notes.md index 41a544a87..ea8a06b67 100644 --- a/docs/reference/release-notes.md +++ b/docs/reference/release-notes.md @@ -1,5 +1,51 @@ # Release notes +## n8n@0.173.1 + +View the [commits](https://github.com/n8n-io/n8n/compare/n8n@0.173.0...n8n@0.173.1) for this version.
+**Release date:** 2022-04-19 + +Fixes a bug with the Discord node icon name. + +## n8n@0.173.0 + +View the [commits](https://github.com/n8n-io/n8n/compare/n8n@0.172.0...n8n@0.173.0) for this version.
+**Release date:** 2022-04-19 + +### New features and nodes + +[Markdown node](/integrations/core-nodes/n8n-nodes-base.markdown/): added a new Markdown node to convert between Markdown and HTML. + +### Enhancements + +**editor**: you can now drag and drop nodes from the nodes panel onto the canvas. + +### Node enhancements + +* [Discord node](/integrations/nodes/n8n-nodes-base.discord/): additional fields now available when sending a message to Discord. +* [GoogleBigQuery](/integrations/nodes/n8n-nodes-base.googleBigQuery/): added support for service account authentication. +* [Google Cloud Realtime Database node](/integrations/nodes/n8n-nodes-base.googleCloudRealtimeDatabase/): you can now select a region. +* [PagerDuty node](/integrations/nodes/n8n-nodes-base.pagerDuty/): now supports more detail in incidents. +* [Slack node](/integrations/nodes/n8n-nodes-base.slack/): added support for blocks in Slack message update. + +### Bug fixes + +* **core**: make the email for user management case insensitive. +* **core**: add `rawBody` for XML requests. +* **editor**: fix a glitch that caused dropdowns to break after adding expressions. +* **editor**: reset text input value when closed with `Esc`. +* [Discourse node](/integrations/nodes/n8n-nodes-base.discourse/): fix an issue that was causing incomplete results when getting posts. Added a credentials test. +* [Zendesk trigger node](/integrations/trigger-nodes/n8n-nodes-base.zendeskTrigger): remove deprecated targets, replace with webhooks. +* [Zoho node](/integrations/nodes/n8n-nodes-base.zohoCrm): fix pagination issue. + +### Contributors + +[Florian Metz](https://github.com/Timeraa) +[Francesco Pongiluppi](https://github.com/willywongi) +[Mark Steve Samson](https://github.com/marksteve) +[Mike Quinlan](https://github.com/mjquinlan2000) + + ## n8n@0.172.0 View the [commits](https://github.com/n8n-io/n8n/compare/n8n@0.171.1...n8n@0.172.0) for this version.
diff --git a/mkdocs.yml b/mkdocs.yml index 917000c0a..e0888912c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -32,18 +32,25 @@ markdown_extensions: - admonition # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences Superfences is required for several other features. Always enable. - pymdownx.superfences + - pymdownx.details # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences Used for tags, setting unique templates for certain pages, and other custom frontmatter. - meta + # https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/ + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight - pymdownx.highlight: linenums: true + - pymdownx.tasklist: + custom_checkbox: true # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#inlinehilite - pymdownx.inlinehilite # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets - - pymdownx.snippets + - pymdownx.snippets # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tabbed - pymdownx.tabbed: - alternate_style: true + alternate_style: true - tables # https://www.mkdocs.org/user-guide/writing-your-docs/#linking-to-pages - toc: @@ -51,12 +58,12 @@ markdown_extensions: plugins: - search - literate-nav -nav: - - Using n8n: +nav: + - Using n8n: - Welcome: index.md - Try it out: quickstart.md - Editor UI: editor-ui.md - - Understand workflows: + - Understand workflows: - Overview: workflows/index.md - Workflows: workflows/workflows.md - Connections: workflows/connections.md @@ -73,9 +80,9 @@ nav: - Data structure: data/data-structure.md - Transforming data: data/transforming-data.md - Using code: data/code.md - - Code examples: + - Code examples: - Overview: code-examples/index.md - - Expressions: + - Expressions: - Overview: code-examples/expressions/index.md - Methods: code-examples/expressions/methods.md - Variables: code-examples/expressions/variables.md @@ -95,7 +102,7 @@ nav: - Glossary: reference/glossary.md - License: reference/license.md - Data collection: reference/data-collection.md - - Integrations: + - Integrations: - Overview: integrations/index.md - Core nodes: integrations/core-nodes/ - Nodes: integrations/nodes/ @@ -133,8 +140,20 @@ nav: - Scheduling the workflow: courses/level-one/chapter-5/chapter-5.7.md - Activating and examining the workflow: courses/level-one/chapter-5/chapter-5.8.md - Exporting, importing, and sharing workflows: courses/level-one/chapter-6.md - - Take the quiz and get your certificate: courses/level-one/chapter-7.md - - Hosting n8n: + - Test your knowledge: courses/level-one/chapter-7.md + - Level two: + - Overview: courses/level-two/index.md + - Understanding the data structure: courses/level-two/chapter-1.md + - Processing different data types: courses/level-two/chapter-2.md + - Merging and splitting data: courses/level-two/chapter-3.md + - Dealing with errors in workflows: courses/level-two/chapter-4.md + - Automating a business workflow: + - Use case: courses/level-two/chapter-5/chapter-5.0.md + - Workflow 1: courses/level-two/chapter-5/chapter-5.1.md + - Workflow 2: courses/level-two/chapter-5/chapter-5.2.md + - Workflow 3: courses/level-two/chapter-5/chapter-5.3.md + - Test your knowledge: courses/level-two/chapter-6.md + - Hosting n8n: - Overview: hosting/index.md - Installation and hosting options: hosting/options.md - Installation: @@ -167,4 +186,4 @@ nav: - Execution data: hosting/scaling/execution-data.md - Execution modes and processes: hosting/scaling/execution-modes-processes.md - Configuring queue mode: hosting/scaling/queue-mode.md - - Contributing: contributing.md \ No newline at end of file + - Contributing: contributing.md diff --git a/overrides/404.html b/overrides/404.html index f8403a232..838ea045a 100644 --- a/overrides/404.html +++ b/overrides/404.html @@ -22,12 +22,14 @@ "/getting-started/installation/advanced/server-setup.html#docker-compose-example": "/hosting/server-setups/docker-compose/", "/getting-started/installation/advanced/server-setup.html#hosting-with-caddy-server": "/hosting/server-setups/caddy/", "/reference/faq.html#integrations": "/integrations/#requesting-new-integrations-or-integration-features", + "/reference/faq.html": "/reference/license/", "/reference/faq.html#license": "/reference/license/", "/reference/faq.html#n8n-cloud": "/hosting/installation/cloud/", // High traffic anchor tag landing pages (if not covered by the above or by /docs/_redirects) "/#what-is-n8n": "/", "/getting-started/tutorials.html#blogposts": "https://n8n.io/blog/tag/tutorial/", - "/#/server-setup": "/hosting/server-setups/" + "/#/server-setup": "/hosting/server-setups/", + "/code-examples/expressions/expressions.html": "/code-examples/expressions/" diff --git a/styles/Microsoft/AMPM.yml b/styles/Microsoft/AMPM.yml new file mode 100644 index 000000000..8b9fed162 --- /dev/null +++ b/styles/Microsoft/AMPM.yml @@ -0,0 +1,9 @@ +extends: existence +message: Use 'AM' or 'PM' (preceded by a space). +link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms +level: error +nonword: true +tokens: + - '\d{1,2}[AP]M' + - '\d{1,2} ?[ap]m' + - '\d{1,2} ?[aApP]\.[mM]\.' diff --git a/styles/Microsoft/Accessibility.yml b/styles/Microsoft/Accessibility.yml new file mode 100644 index 000000000..05bf92739 --- /dev/null +++ b/styles/Microsoft/Accessibility.yml @@ -0,0 +1,25 @@ +extends: existence +message: "Don't use language (such as '%s') that defines people by their disability." +link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/accessibility-terms +level: suggestion +ignorecase: true +tokens: + - a victim of + - able-bodied + - affected by + - an epileptic + - crippled + - disabled + - dumb + - handicapped + - handicaps + - healthy + - lame + - maimed + - missing a limb + - mute + - normal + - sight-impaired + - stricken with + - suffers from + - vision-impaired diff --git a/styles/Microsoft/Acronyms.yml b/styles/Microsoft/Acronyms.yml new file mode 100644 index 000000000..308ff7c0e --- /dev/null +++ b/styles/Microsoft/Acronyms.yml @@ -0,0 +1,64 @@ +extends: conditional +message: "'%s' has no definition." +link: https://docs.microsoft.com/en-us/style-guide/acronyms +level: suggestion +ignorecase: false +# Ensures that the existence of 'first' implies the existence of 'second'. +first: '\b([A-Z]{3,5})\b' +second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)' +# ... with the exception of these: +exceptions: + - API + - ASP + - CLI + - CPU + - CSS + - CSV + - DEBUG + - DOM + - DPI + - FAQ + - GCC + - GDB + - GET + - GPU + - GTK + - GUI + - HTML + - HTTP + - HTTPS + - IDE + - JAR + - JSON + - JSX + - LESS + - LLDB + - NET + - NOTE + - NVDA + - OSS + - PATH + - PDF + - PHP + - POST + - RAM + - REPL + - RSA + - SCM + - SCSS + - SDK + - SQL + - SSH + - SSL + - SVG + - TBD + - TCP + - TODO + - URI + - URL + - USB + - UTF + - XML + - XSS + - YAML + - ZIP diff --git a/styles/Microsoft/Adverbs.yml b/styles/Microsoft/Adverbs.yml new file mode 100644 index 000000000..07d98d83e --- /dev/null +++ b/styles/Microsoft/Adverbs.yml @@ -0,0 +1,270 @@ +extends: existence +message: "Consider removing '%s'." +link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences +ignorecase: true +level: warning +action: + name: remove +tokens: + - abnormally + - absentmindedly + - accidentally + - adventurously + - anxiously + - arrogantly + - awkwardly + - bashfully + - beautifully + - bitterly + - bleakly + - blindly + - blissfully + - boastfully + - boldly + - bravely + - briefly + - brightly + - briskly + - broadly + - busily + - calmly + - carefully + - carelessly + - cautiously + - cheerfully + - cleverly + - closely + - coaxingly + - colorfully + - continually + - coolly + - courageously + - crossly + - cruelly + - curiously + - daintily + - dearly + - deceivingly + - deeply + - defiantly + - deliberately + - delightfully + - diligently + - dimly + - doubtfully + - dreamily + - easily + - elegantly + - energetically + - enormously + - enthusiastically + - excitedly + - extremely + - fairly + - faithfully + - famously + - ferociously + - fervently + - fiercely + - fondly + - foolishly + - fortunately + - frankly + - frantically + - freely + - frenetically + - frightfully + - furiously + - generally + - generously + - gently + - gladly + - gleefully + - gracefully + - gratefully + - greatly + - greedily + - happily + - hastily + - healthily + - heavily + - helplessly + - honestly + - hopelessly + - hungrily + - innocently + - inquisitively + - intensely + - intently + - interestingly + - inwardly + - irritably + - jaggedly + - jealously + - jovially + - joyfully + - joyously + - jubilantly + - judgmentally + - justly + - keenly + - kiddingly + - kindheartedly + - knavishly + - knowingly + - knowledgeably + - lazily + - lightly + - limply + - lively + - loftily + - longingly + - loosely + - loudly + - lovingly + - loyally + - madly + - majestically + - meaningfully + - mechanically + - merrily + - miserably + - mockingly + - mortally + - mysteriously + - naturally + - nearly + - neatly + - nervously + - nicely + - noisily + - obediently + - obnoxiously + - oddly + - offensively + - optimistically + - overconfidently + - painfully + - partially + - patiently + - perfectly + - playfully + - politely + - poorly + - positively + - potentially + - powerfully + - promptly + - properly + - punctually + - quaintly + - queasily + - queerly + - questionably + - quickly + - quietly + - quirkily + - quizzically + - randomly + - rapidly + - rarely + - readily + - really + - reassuringly + - recklessly + - regularly + - reluctantly + - repeatedly + - reproachfully + - restfully + - righteously + - rightfully + - rigidly + - roughly + - rudely + - safely + - scarcely + - scarily + - searchingly + - sedately + - seemingly + - selfishly + - separately + - seriously + - shakily + - sharply + - sheepishly + - shrilly + - shyly + - silently + - sleepily + - slowly + - smoothly + - softly + - solemnly + - solidly + - speedily + - stealthily + - sternly + - strictly + - suddenly + - supposedly + - surprisingly + - suspiciously + - sweetly + - swiftly + - sympathetically + - tenderly + - tensely + - terribly + - thankfully + - thoroughly + - thoughtfully + - tightly + - tremendously + - triumphantly + - truthfully + - ultimately + - unabashedly + - unaccountably + - unbearably + - unethically + - unexpectedly + - unfortunately + - unimpressively + - unnaturally + - unnecessarily + - urgently + - usefully + - uselessly + - utterly + - vacantly + - vaguely + - vainly + - valiantly + - vastly + - verbally + - very + - viciously + - victoriously + - violently + - vivaciously + - voluntarily + - warmly + - weakly + - wearily + - wetly + - wholly + - wildly + - willfully + - wisely + - woefully + - wonderfully + - worriedly + - yawningly + - yearningly + - yieldingly + - youthfully + - zealously + - zestfully + - zestily diff --git a/styles/Microsoft/Auto.yml b/styles/Microsoft/Auto.yml new file mode 100644 index 000000000..4da439353 --- /dev/null +++ b/styles/Microsoft/Auto.yml @@ -0,0 +1,11 @@ +extends: existence +message: "In general, don't hyphenate '%s'." +link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/auto +ignorecase: true +level: error +action: + name: convert + params: + - simple +tokens: + - 'auto-\w+' diff --git a/styles/Microsoft/Avoid.yml b/styles/Microsoft/Avoid.yml new file mode 100644 index 000000000..dab7822c7 --- /dev/null +++ b/styles/Microsoft/Avoid.yml @@ -0,0 +1,14 @@ +extends: existence +message: "Don't use '%s'. See the A-Z word list for details." +# See the A-Z word list +link: https://docs.microsoft.com/en-us/style-guide +ignorecase: true +level: error +tokens: + - abortion + - and so on + - app(?:lication)?s? (?:developer|program) + - app(?:lication)? file + - backbone + - backend + - contiguous selection diff --git a/styles/Microsoft/ComplexWords.yml b/styles/Microsoft/ComplexWords.yml new file mode 100644 index 000000000..65b7a3472 --- /dev/null +++ b/styles/Microsoft/ComplexWords.yml @@ -0,0 +1,120 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences +ignorecase: true +level: suggestion +action: + name: replace +swap: + "approximate(?:ly)?": about + abundance: plenty + accelerate: speed up + accentuate: stress + accompany: go with + accomplish: carry out|do + accorded: given + accordingly: so + accrue: add + accurate: right|exact + acquiesce: agree + acquire: get|buy + additional: more|extra + address: discuss + addressees: you + adjacent to: next to + adjustment: change + admissible: allowed + advantageous: helpful + advise: tell + aggregate: total + aircraft: plane + alleviate: ease + allocate: assign|divide + alternatively: or + alternatives: choices|options + ameliorate: improve + amend: change + anticipate: expect + apparent: clear|plain + ascertain: discover|find out + assistance: help + attain: meet + attempt: try + authorize: allow + belated: late + bestow: give + cease: stop|end + collaborate: work together + commence: begin + compensate: pay + component: part + comprise: form|include + concept: idea + concerning: about + confer: give|award + consequently: so + consolidate: merge + constitutes: forms + contains: has + convene: meet + demonstrate: show|prove + depart: leave + designate: choose + desire: want|wish + determine: decide|find + detrimental: bad|harmful + disclose: share|tell + discontinue: stop + disseminate: send|give + eliminate: end + elucidate: explain + employ: use + enclosed: inside|included + encounter: meet + endeavor: try + enumerate: count + equitable: fair + equivalent: equal + exclusively: only + expedite: hurry + facilitate: ease + females: women + finalize: complete|finish + frequently: often + identical: same + incorrect: wrong + indication: sign + initiate: start|begin + itemized: listed + jeopardize: risk + liaise: work with|partner with + maintain: keep|support + methodology: method + modify: change + monitor: check|watch + multiple: many + necessitate: cause + notify: tell + numerous: many + objective: aim|goal + obligate: bind|compel + optimum: best|most + permit: let + portion: part + possess: own + previous: earlier + previously: before + prioritize: rank + procure: buy + provide: give|offer + purchase: buy + relocate: move + solicit: request + state-of-the-art: latest + subsequent: later|next + substantial: large + sufficient: enough + terminate: end + transmit: send + utilization: use + utilize: use diff --git a/styles/Microsoft/Contractions.yml b/styles/Microsoft/Contractions.yml new file mode 100644 index 000000000..ded330f79 --- /dev/null +++ b/styles/Microsoft/Contractions.yml @@ -0,0 +1,50 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-contractions +level: error +ignorecase: true +action: + name: replace +swap: + are not: aren't + cannot: can't + could not: couldn't + did not: didn't + do not: don't + does not: doesn't + has not: hasn't + have not: haven't + how is: how's + is not: isn't + + 'it is(?!\.)': it's + 'it''s(?=\.)': it is + + should not: shouldn't + + 'that is(?!\.)': that's + 'that''s(?=\.)': that is + + 'they are(?!\.)': they're + 'they''re(?=\.)': they are + + was not: wasn't + + 'we are(?!\.)': we're + 'we''re(?=\.)': we are + + 'we have(?!\.)': we've + 'we''ve(?=\.)': we have + + were not: weren't + + 'what is(?!\.)': what's + 'what''s(?=\.)': what is + + 'when is(?!\.)': when's + 'when''s(?=\.)': when is + + 'where is(?!\.)': where's + 'where''s(?=\.)': where is + + will not: won't diff --git a/styles/Microsoft/Dashes.yml b/styles/Microsoft/Dashes.yml new file mode 100644 index 000000000..2894cf722 --- /dev/null +++ b/styles/Microsoft/Dashes.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Remove the spaces around '%s'." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/emes +ignorecase: true +nonword: true +level: error +action: + name: edit + params: + - remove + - ' ' +tokens: + - '[—–]\s|\s[—–]' diff --git a/styles/Microsoft/DateFormat.yml b/styles/Microsoft/DateFormat.yml new file mode 100644 index 000000000..196531394 --- /dev/null +++ b/styles/Microsoft/DateFormat.yml @@ -0,0 +1,8 @@ +extends: existence +message: Use 'July 31, 2016' format, not '%s'. +link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms +ignorecase: true +level: error +nonword: true +tokens: + - '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}' diff --git a/styles/Microsoft/DateNumbers.yml b/styles/Microsoft/DateNumbers.yml new file mode 100644 index 000000000..14d46747c --- /dev/null +++ b/styles/Microsoft/DateNumbers.yml @@ -0,0 +1,40 @@ +extends: existence +message: "Don't use ordinal numbers for dates." +link: https://docs.microsoft.com/en-us/style-guide/numbers#numbers-in-dates +level: error +nonword: true +ignorecase: true +raw: + - \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?)\b\s* +tokens: + - first + - second + - third + - fourth + - fifth + - sixth + - seventh + - eighth + - ninth + - tenth + - eleventh + - twelfth + - thirteenth + - fourteenth + - fifteenth + - sixteenth + - seventeenth + - eighteenth + - nineteenth + - twentieth + - twenty-first + - twenty-second + - twenty-third + - twenty-fourth + - twenty-fifth + - twenty-sixth + - twenty-seventh + - twenty-eighth + - twenty-ninth + - thirtieth + - thirty-first diff --git a/styles/Microsoft/DateOrder.yml b/styles/Microsoft/DateOrder.yml new file mode 100644 index 000000000..12d69ba51 --- /dev/null +++ b/styles/Microsoft/DateOrder.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Always spell out the name of the month." +link: https://docs.microsoft.com/en-us/style-guide/numbers#numbers-in-dates +ignorecase: true +level: error +nonword: true +tokens: + - '\b\d{1,2}/\d{1,2}/(?:\d{4}|\d{2})\b' diff --git a/styles/Microsoft/Ellipses.yml b/styles/Microsoft/Ellipses.yml new file mode 100644 index 000000000..320457a8b --- /dev/null +++ b/styles/Microsoft/Ellipses.yml @@ -0,0 +1,9 @@ +extends: existence +message: "In general, don't use an ellipsis." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/ellipses +nonword: true +level: warning +action: + name: remove +tokens: + - '\.\.\.' diff --git a/styles/Microsoft/FirstPerson.yml b/styles/Microsoft/FirstPerson.yml new file mode 100644 index 000000000..77761af88 --- /dev/null +++ b/styles/Microsoft/FirstPerson.yml @@ -0,0 +1,16 @@ +extends: existence +message: "Use first person (such as '%s') sparingly." +link: https://docs.microsoft.com/en-us/style-guide/grammar/person +ignorecase: true +level: warning +nonword: true +tokens: + - (?:^|\s)I\s + - (?:^|\s)I,\s + - \bI'd\b + - \bI'll\b + - \bI'm\b + - \bI've\b + - \bme\b + - \bmy\b + - \bmine\b diff --git a/styles/Microsoft/Foreign.yml b/styles/Microsoft/Foreign.yml new file mode 100644 index 000000000..d37835a5d --- /dev/null +++ b/styles/Microsoft/Foreign.yml @@ -0,0 +1,12 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-us-spelling-avoid-non-english-words +ignorecase: true +level: error +nonword: true +action: + name: replace +swap: + '\b(?:eg|e\.g\.)[\s,]': for example + '\b(?:ie|i\.e\.)[\s,]': that is + diff --git a/styles/Microsoft/Gender.yml b/styles/Microsoft/Gender.yml new file mode 100644 index 000000000..47c080247 --- /dev/null +++ b/styles/Microsoft/Gender.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Don't use '%s'." +link: https://github.com/MicrosoftDocs/microsoft-style-guide/blob/master/styleguide/grammar/nouns-pronouns.md#pronouns-and-gender +level: error +ignorecase: true +tokens: + - he/she + - s/he diff --git a/styles/Microsoft/GenderBias.yml b/styles/Microsoft/GenderBias.yml new file mode 100644 index 000000000..3d873aa31 --- /dev/null +++ b/styles/Microsoft/GenderBias.yml @@ -0,0 +1,44 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +ignorecase: true +level: error +swap: + (?:alumna|alumnus): graduate + (?:alumnae|alumni): graduates + air(?:m[ae]n|wom[ae]n): pilot(s) + anchor(?:m[ae]n|wom[ae]n): anchor(s) + authoress: author + camera(?:m[ae]n|wom[ae]n): camera operator(s) + chair(?:m[ae]n|wom[ae]n): chair(s) + congress(?:m[ae]n|wom[ae]n): member(s) of congress + door(?:m[ae]|wom[ae]n): concierge(s) + draft(?:m[ae]n|wom[ae]n): drafter(s) + fire(?:m[ae]n|wom[ae]n): firefighter(s) + fisher(?:m[ae]n|wom[ae]n): fisher(s) + fresh(?:m[ae]n|wom[ae]n): first-year student(s) + garbage(?:m[ae]n|wom[ae]n): waste collector(s) + lady lawyer: lawyer + ladylike: courteous + landlord: building manager + mail(?:m[ae]n|wom[ae]n): mail carriers + man and wife: husband and wife + man enough: strong enough + mankind: human kind + manmade: manufactured + manpower: personnel + men and girls: men and women + middle(?:m[ae]n|wom[ae]n): intermediary + news(?:m[ae]n|wom[ae]n): journalist(s) + ombuds(?:man|woman): ombuds + oneupmanship: upstaging + poetess: poet + police(?:m[ae]n|wom[ae]n): police officer(s) + repair(?:m[ae]n|wom[ae]n): technician(s) + sales(?:m[ae]n|wom[ae]n): salesperson or sales people + service(?:m[ae]n|wom[ae]n): soldier(s) + steward(?:ess)?: flight attendant + tribes(?:m[ae]n|wom[ae]n): tribe member(s) + waitress: waiter + woman doctor: doctor + woman scientist[s]?: scientist(s) + work(?:m[ae]n|wom[ae]n): worker(s) diff --git a/styles/Microsoft/GeneralURL.yml b/styles/Microsoft/GeneralURL.yml new file mode 100644 index 000000000..dcef503d9 --- /dev/null +++ b/styles/Microsoft/GeneralURL.yml @@ -0,0 +1,11 @@ +extends: existence +message: "For a general audience, use 'address' rather than 'URL'." +link: https://docs.microsoft.com/en-us/style-guide/urls-web-addresses +level: warning +action: + name: replace + params: + - URL + - address +tokens: + - URL diff --git a/styles/Microsoft/HeadingAcronyms.yml b/styles/Microsoft/HeadingAcronyms.yml new file mode 100644 index 000000000..9dc3b6c2d --- /dev/null +++ b/styles/Microsoft/HeadingAcronyms.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid using acronyms in a title or heading." +link: https://docs.microsoft.com/en-us/style-guide/acronyms#be-careful-with-acronyms-in-titles-and-headings +level: warning +scope: heading +tokens: + - '[A-Z]{2,4}' diff --git a/styles/Microsoft/HeadingColons.yml b/styles/Microsoft/HeadingColons.yml new file mode 100644 index 000000000..7013c3914 --- /dev/null +++ b/styles/Microsoft/HeadingColons.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Capitalize '%s'." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/colons +nonword: true +level: error +scope: heading +tokens: + - ':\s[a-z]' diff --git a/styles/Microsoft/HeadingPunctuation.yml b/styles/Microsoft/HeadingPunctuation.yml new file mode 100644 index 000000000..af04b02eb --- /dev/null +++ b/styles/Microsoft/HeadingPunctuation.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Don't use end punctuation in headings." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/periods +nonword: true +level: warning +scope: heading +action: + name: edit + params: + - remove + - '.?!' +tokens: + - '[a-z][.?!](?:\s|$)' diff --git a/styles/Microsoft/Headings.yml b/styles/Microsoft/Headings.yml new file mode 100644 index 000000000..63624edc1 --- /dev/null +++ b/styles/Microsoft/Headings.yml @@ -0,0 +1,28 @@ +extends: capitalization +message: "'%s' should use sentence-style capitalization." +link: https://docs.microsoft.com/en-us/style-guide/capitalization +level: suggestion +scope: heading +match: $sentence +indicators: + - ':' +exceptions: + - Azure + - CLI + - Code + - Cosmos + - Docker + - Emmet + - I + - Kubernetes + - Linux + - macOS + - Marketplace + - MongoDB + - REPL + - Studio + - TypeScript + - URLs + - Visual + - VS + - Windows diff --git a/styles/Microsoft/Hyphens.yml b/styles/Microsoft/Hyphens.yml new file mode 100644 index 000000000..90bbb5def --- /dev/null +++ b/styles/Microsoft/Hyphens.yml @@ -0,0 +1,14 @@ +extends: existence +message: "'%s' doesn't need a hyphen." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/hyphens +level: warning +ignorecase: false +nonword: true +action: + name: edit + params: + - replace + - '-' + - ' ' +tokens: + - '\s[^\s-]+ly-' diff --git a/styles/Microsoft/Negative.yml b/styles/Microsoft/Negative.yml new file mode 100644 index 000000000..d6ff2f224 --- /dev/null +++ b/styles/Microsoft/Negative.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Form a negative number with an en dash, not a hyphen." +link: https://docs.microsoft.com/en-us/style-guide/numbers +nonword: true +level: error +action: + name: edit + params: + - replace + - '-' + - '–' +tokens: + - '\s-\d+\s' diff --git a/styles/Microsoft/Ordinal.yml b/styles/Microsoft/Ordinal.yml new file mode 100644 index 000000000..e3483e380 --- /dev/null +++ b/styles/Microsoft/Ordinal.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Don't add -ly to an ordinal number." +link: https://docs.microsoft.com/en-us/style-guide/numbers +level: error +action: + name: edit + params: + - trim + - ly +tokens: + - firstly + - secondly + - thirdly diff --git a/styles/Microsoft/OxfordComma.yml b/styles/Microsoft/OxfordComma.yml new file mode 100644 index 000000000..493b55c3c --- /dev/null +++ b/styles/Microsoft/OxfordComma.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Use the Oxford comma in '%s'." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/commas +scope: sentence +level: suggestion +nonword: true +tokens: + - '(?:[^\s,]+,){1,} \w+ (?:and|or) \w+[.?!]' diff --git a/styles/Microsoft/Passive.yml b/styles/Microsoft/Passive.yml new file mode 100644 index 000000000..102d377ca --- /dev/null +++ b/styles/Microsoft/Passive.yml @@ -0,0 +1,183 @@ +extends: existence +message: "'%s' looks like passive voice." +ignorecase: true +level: suggestion +raw: + - \b(am|are|were|being|is|been|was|be)\b\s* +tokens: + - '[\w]+ed' + - awoken + - beat + - become + - been + - begun + - bent + - beset + - bet + - bid + - bidden + - bitten + - bled + - blown + - born + - bought + - bound + - bred + - broadcast + - broken + - brought + - built + - burnt + - burst + - cast + - caught + - chosen + - clung + - come + - cost + - crept + - cut + - dealt + - dived + - done + - drawn + - dreamt + - driven + - drunk + - dug + - eaten + - fallen + - fed + - felt + - fit + - fled + - flown + - flung + - forbidden + - foregone + - forgiven + - forgotten + - forsaken + - fought + - found + - frozen + - given + - gone + - gotten + - ground + - grown + - heard + - held + - hidden + - hit + - hung + - hurt + - kept + - knelt + - knit + - known + - laid + - lain + - leapt + - learnt + - led + - left + - lent + - let + - lighted + - lost + - made + - meant + - met + - misspelt + - mistaken + - mown + - overcome + - overdone + - overtaken + - overthrown + - paid + - pled + - proven + - put + - quit + - read + - rid + - ridden + - risen + - run + - rung + - said + - sat + - sawn + - seen + - sent + - set + - sewn + - shaken + - shaven + - shed + - shod + - shone + - shorn + - shot + - shown + - shrunk + - shut + - slain + - slept + - slid + - slit + - slung + - smitten + - sold + - sought + - sown + - sped + - spent + - spilt + - spit + - split + - spoken + - spread + - sprung + - spun + - stolen + - stood + - stridden + - striven + - struck + - strung + - stuck + - stung + - stunk + - sung + - sunk + - swept + - swollen + - sworn + - swum + - swung + - taken + - taught + - thought + - thrived + - thrown + - thrust + - told + - torn + - trodden + - understood + - upheld + - upset + - wed + - wept + - withheld + - withstood + - woken + - won + - worn + - wound + - woven + - written + - wrung diff --git a/styles/Microsoft/Percentages.yml b/styles/Microsoft/Percentages.yml new file mode 100644 index 000000000..b68a7363f --- /dev/null +++ b/styles/Microsoft/Percentages.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Use a numeral plus the units." +link: https://docs.microsoft.com/en-us/style-guide/numbers +nonword: true +level: error +tokens: + - '\b[a-zA-z]+\spercent\b' diff --git a/styles/Microsoft/Quotes.yml b/styles/Microsoft/Quotes.yml new file mode 100644 index 000000000..38f497606 --- /dev/null +++ b/styles/Microsoft/Quotes.yml @@ -0,0 +1,7 @@ +extends: existence +message: 'Punctuation should be inside the quotes.' +link: https://docs.microsoft.com/en-us/style-guide/punctuation/quotation-marks +level: error +nonword: true +tokens: + - '["“][^"”“]+["”][.,]' diff --git a/styles/Microsoft/RangeFormat.yml b/styles/Microsoft/RangeFormat.yml new file mode 100644 index 000000000..f1d736e9d --- /dev/null +++ b/styles/Microsoft/RangeFormat.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Use an en dash in a range of numbers." +link: https://docs.microsoft.com/en-us/style-guide/numbers +nonword: true +level: error +action: + name: edit + params: + - replace + - '-' + - '–' +tokens: + - '\b\d+\s?[-]\s?\d+\b' diff --git a/styles/Microsoft/RangeTime.yml b/styles/Microsoft/RangeTime.yml new file mode 100644 index 000000000..cdd4b3346 --- /dev/null +++ b/styles/Microsoft/RangeTime.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Use 'to' instead of a dash in '%s'." +link: https://docs.microsoft.com/en-us/style-guide/numbers +nonword: true +level: error +action: + name: edit + params: + - replace + - '[-–]' + - 'to' +tokens: + - '\b(?:AM|PM)\s?[-–]\s?.+(?:AM|PM)\b' diff --git a/styles/Microsoft/Ranges.yml b/styles/Microsoft/Ranges.yml new file mode 100644 index 000000000..67d9702b0 --- /dev/null +++ b/styles/Microsoft/Ranges.yml @@ -0,0 +1,7 @@ +extends: existence +message: "In most cases, use 'from' or 'through' to describe a range of numbers." +link: 'https://docs.microsoft.com/en-us/style-guide/numbers' +nonword: true +level: warning +tokens: + - '\b\d+\s?[-–]\s?\d+\b' diff --git a/styles/Microsoft/Semicolon.yml b/styles/Microsoft/Semicolon.yml new file mode 100644 index 000000000..4d905467d --- /dev/null +++ b/styles/Microsoft/Semicolon.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Try to simplify this sentence." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/semicolons +nonword: true +scope: sentence +level: suggestion +tokens: + - ';' diff --git a/styles/Microsoft/SentenceLength.yml b/styles/Microsoft/SentenceLength.yml new file mode 100644 index 000000000..f248cf051 --- /dev/null +++ b/styles/Microsoft/SentenceLength.yml @@ -0,0 +1,7 @@ +extends: occurrence +message: "Try to keep sentences short (< 30 words)." +scope: sentence +level: suggestion +max: 30 +token: \b(\w+)\b + diff --git a/styles/Microsoft/Spacing.yml b/styles/Microsoft/Spacing.yml new file mode 100644 index 000000000..bbd10e51d --- /dev/null +++ b/styles/Microsoft/Spacing.yml @@ -0,0 +1,8 @@ +extends: existence +message: "'%s' should have one space." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/periods +level: error +nonword: true +tokens: + - '[a-z][.?!] {2,}[A-Z]' + - '[a-z][.?!][A-Z]' diff --git a/styles/Microsoft/Suspended.yml b/styles/Microsoft/Suspended.yml new file mode 100644 index 000000000..7282e9c9c --- /dev/null +++ b/styles/Microsoft/Suspended.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Don't use '%s' unless space is limited." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/hyphens +ignorecase: true +level: warning +tokens: + - '\w+- and \w+-' diff --git a/styles/Microsoft/Terms.yml b/styles/Microsoft/Terms.yml new file mode 100644 index 000000000..e41ff74b7 --- /dev/null +++ b/styles/Microsoft/Terms.yml @@ -0,0 +1,43 @@ +extends: substitution +message: "Prefer '%s' over '%s'." +level: warning +ignorecase: true +action: + name: replace +swap: + '(?:agent|virtual assistant|intelligent personal assistant)': personal digital assistant + '(?:drive C:|drive C>|C: drive)': drive C + '(?:internet bot|web robot)s?': bot(s) + '(?:microsoft cloud|the cloud)': cloud + '(?:mobile|smart) ?phone': phone + '24/7': every day + 'audio(?:-| )book': audiobook + 'back(?:-| )light': backlight + 'chat ?bots?': chatbot(s) + adaptor: adapter + administrate: administer + afterwards: afterward + alphabetic: alphabetical + alphanumerical: alphanumeric + anti-aliasing: antialiasing + anti-malware: antimalware + anti-spyware: antispyware + anti-virus: antivirus + appendixes: appendices + artificial intelligence: artificial intelligence + assembler: assembly language + bpp: bpp + bps: bps + caap: CaaP + conversation-as-a-platform: conversation as a platform + eb: EB + gb: GB + gbps: Gbps + kb: KB + keypress: keystroke + mb: MB + pb: PB + tb: TB + zb: ZB + viz: namely + ergo: therefore diff --git a/styles/Microsoft/URLFormat.yml b/styles/Microsoft/URLFormat.yml new file mode 100644 index 000000000..82e702f98 --- /dev/null +++ b/styles/Microsoft/URLFormat.yml @@ -0,0 +1,10 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +ignorecase: true +level: error +action: + name: replace +swap: + URL for: URL of + an URL: a URL + diff --git a/styles/Microsoft/Units.yml b/styles/Microsoft/Units.yml new file mode 100644 index 000000000..f062418ee --- /dev/null +++ b/styles/Microsoft/Units.yml @@ -0,0 +1,16 @@ +extends: existence +message: "Don't spell out the number in '%s'." +link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/units-of-measure-terms +level: error +raw: + - '[a-zA-Z]+\s' +tokens: + - '(?:centi|milli)?meters' + - '(?:kilo)?grams' + - '(?:kilo)?meters' + - '(?:mega)?pixels' + - cm + - inches + - lb + - miles + - pounds diff --git a/styles/Microsoft/Vocab.yml b/styles/Microsoft/Vocab.yml new file mode 100644 index 000000000..eebe97b15 --- /dev/null +++ b/styles/Microsoft/Vocab.yml @@ -0,0 +1,25 @@ +extends: existence +message: "Verify your use of '%s' with the A-Z word list." +link: 'https://docs.microsoft.com/en-us/style-guide' +level: suggestion +ignorecase: true +tokens: + - above + - accessible + - actionable + - against + - alarm + - alert + - alias + - allows? + - and/or + - as well as + - assure + - author + - avg + - beta + - ensure + - he + - insure + - sample + - she diff --git a/styles/Microsoft/We.yml b/styles/Microsoft/We.yml new file mode 100644 index 000000000..97c901c1b --- /dev/null +++ b/styles/Microsoft/We.yml @@ -0,0 +1,11 @@ +extends: existence +message: "Try to avoid using first-person plural like '%s'." +link: https://docs.microsoft.com/en-us/style-guide/grammar/person#avoid-first-person-plural +level: warning +ignorecase: true +tokens: + - we + - we'(?:ve|re) + - ours? + - us + - let's diff --git a/styles/Microsoft/Wordiness.yml b/styles/Microsoft/Wordiness.yml new file mode 100644 index 000000000..22a4c932c --- /dev/null +++ b/styles/Microsoft/Wordiness.yml @@ -0,0 +1,122 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences +ignorecase: true +level: warning +action: + name: replace +swap: + (?:give|gave) rise to: lead to + (?:previous|prior) to: before + a (?:large)? majority of: most + a (?:large)? number of: many + a myriad of: myriad + adversely impact: hurt + all across: across + all of a sudden: suddenly + all of these: these + all of: all + all-time record: record + almost all: most + almost never: seldom + along the lines of: similar to + an adequate number of: enough + an appreciable number of: many + an estimated: about + any and all: all + are in agreement: agree + as a matter of fact: in fact + as a means of: to + as a result of: because of + as of yet: yet + as per: per + at a later date: later + at all times: always + at the present time: now + at this point in time: at this point + based in large part on: based on + based on the fact that: because + basic necessity: necessity + because of the fact that: because + came to a realization: realized + came to an abrupt end: ended abruptly + carry out an evaluation of: evaluate + close down: close + closed down: closed + complete stranger: stranger + completely separate: separate + concerning the matter of: regarding + conduct a review of: review + conduct an investigation: investigate + conduct experiments: experiment + continue on: continue + despite the fact that: although + disappear from sight: disappear + drag and drop: drag + drag-and-drop: drag + doomed to fail: doomed + due to the fact that: because + during the period of: during + during the time that: while + emergency situation: emergency + except when: unless + excessive number: too many + extend an invitation: invite + fall down: fall + fell down: fell + for the duration of: during + gather together: gather + has the ability to: can + has the capacity to: can + has the opportunity to: could + hold a meeting: meet + if this is not the case: if not + in a careful manner: carefully + in a thoughtful manner: thoughtfully + in a timely manner: timely + in an effort to: to + in between: between + in lieu of: instead of + in many cases: often + in most cases: usually + in order to: to + in some cases: sometimes + in spite of the fact that: although + in spite of: despite + in the (?:very)? near future: soon + in the event that: if + in the neighborhood of: roughly + in the vicinity of: close to + it would appear that: apparently + lift up: lift + made reference to: referred to + make reference to: refer to + mix together: mix + none at all: none + not in a position to: unable + not possible: impossible + of major importance: important + perform an assessment of: assess + pertaining to: about + place an order: order + plays a key role in: is essential to + present time: now + readily apparent: apparent + some of the: some + span across: span + subsequent to: after + successfully complete: complete + sufficient number (?:of)?: enough + take action: act + take into account: consider + the question as to whether: whether + there is no doubt but that: doubtless + this day and age: this age + this is a subject that: this subject + time (?:frame|period): time + under the provisions of: under + until such time as: until + used for fuel purposes: used for fuel + whether or not: whether + with regard to: regarding + with the exception of: except for diff --git a/styles/Microsoft/meta.json b/styles/Microsoft/meta.json new file mode 100644 index 000000000..297719bbb --- /dev/null +++ b/styles/Microsoft/meta.json @@ -0,0 +1,4 @@ +{ + "feed": "https://github.com/errata-ai/Microsoft/releases.atom", + "vale_version": ">=1.0.0" +} diff --git a/styles/Vocab/default/accept.txt b/styles/Vocab/default/accept.txt new file mode 100644 index 000000000..deca965f1 --- /dev/null +++ b/styles/Vocab/default/accept.txt @@ -0,0 +1 @@ +n8n \ No newline at end of file diff --git a/styles/Vocab/default/reject.txt b/styles/Vocab/default/reject.txt new file mode 100644 index 000000000..d588a387d --- /dev/null +++ b/styles/Vocab/default/reject.txt @@ -0,0 +1,3 @@ +N8n +n8N +N8N \ No newline at end of file diff --git a/styles/alex/Ablist.yml b/styles/alex/Ablist.yml new file mode 100644 index 000000000..cd6ddb5bd --- /dev/null +++ b/styles/alex/Ablist.yml @@ -0,0 +1,248 @@ +--- +extends: substitution +message: When referring to a person, consider using '%s' instead of '%s'. +ignorecase: true +level: warning +action: + name: replace +swap: + ablebodied: non-disabled + addict: person with a drug addiction|person recovering from a drug addiction + addicts: people with a drug addiction|people recovering from a drug addiction + adhd: disorganized|distracted|energetic|hyperactive|impetuous|impulsive|inattentive|restless|unfocused + afflicted with MD: person who has muscular dystrophy + afflicted with a disability: has a disability|person with a disability|people with + disabilities + afflicted with a intellectual disability: person with an intellectual disability + afflicted with a polio: polio|person who had polio + afflicted with aids: person with AIDS + afflicted with an injury: sustain an injury|receive an injury + afflicted with disabilities: has a disability|person with a disability|people with + disabilities + afflicted with injuries: sustain injuries|receive injuries + afflicted with intellectual disabilities: person with an intellectual disability + afflicted with multiple sclerosis: person who has multiple sclerosis + afflicted with muscular dystrophy: person who has muscular dystrophy + afflicted with polio: polio|person who had polio + afflicted with psychosis: person with a psychotic condition|person with psychosis + afflicted with schizophrenia: person with schizophrenia + aids victim: person with AIDS + alcohol abuser: someone with an alcohol problem + alcoholic: someone with an alcohol problem + amputee: person with an amputation + anorexic: thin|slim + asylum: psychiatric hospital|mental health hospital + barren: empty|sterile|infertile + batshit: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of + mental illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + bedlam: chaos|hectic|pandemonium + binge: enthusiastic|spree + bipolar: fluctuating|person with bipolar disorder + birth defect: has a disability|person with a disability|people with disabilities + blind eye to: careless|heartless|indifferent|insensitive + blind to: careless|heartless|indifferent|insensitive + blinded by: careless|heartless|indifferent|insensitive + bony: thin|slim + bound to a wheelchair: uses a wheelchair + buckteeth: person with prominent teeth|prominent teeth + bucktoothed: person with prominent teeth|prominent teeth + challenged: has a disability|person with a disability|people with disabilities + cleftlipped: person with a cleft-lip and palate + confined to a wheelchair: uses a wheelchair + contard: disagreeable|uneducated|ignorant|naive|inconsiderate + crazy: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + cretin: creep|fool + cripple: person with a limp + crippled: person with a limp + daft: absurd|foolish + deaf and dumb: deaf + deaf ear to: careless|heartless|indifferent|insensitive + deaf to: careless|heartless|indifferent|insensitive + deafened by: careless|heartless|indifferent|insensitive + deafmute: deaf + delirious: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of + mental illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + demented: person with dementia + depressed: sad|blue|bummed out|person with seasonal affective disorder|person with + psychotic depression|person with postpartum depression + detox: treatment + detox center: treatment center + diffability: has a disability|person with a disability|people with disabilities + differently abled: has a disability|person with a disability|people with disabilities + disabled: turned off|has a disability|person with a disability|people with disabilities + downs syndrome: Down Syndrome + dumb: foolish|ludicrous|speechless|silent + dummy: test double|placeholder|fake|stub + dummyobject: test double|placeholder|fake|stub + dummyvalue: test double|placeholder|fake|stub + dummyvariable: test double|placeholder|fake|stub + dwarf: person with dwarfism|little person|little people|LP|person of short stature + dyslexic: person with dyslexia + epileptic: person with epilepsy + family burden: with family support needs + feeble minded: foolish|ludicrous|silly + feebleminded: foolish|ludicrous|silly + fucktard: disagreeable|uneducated|ignorant|naive|inconsiderate + gimp: person with a limp + handicapable: has a disability|person with a disability|people with disabilities + handicapped: person with a handicap|accessible + handicapped parking: accessible parking + hare lip: cleft-lip and palate + harelip: cleft-lip and palate + harelipped: person with a cleft-lip and palate + has intellectual issues: person with an intellectual disability + hearing impaired: hard of hearing|partially deaf|partial hearing loss|deaf + hearing impairment: hard of hearing|partially deaf|partial hearing loss|deaf + idiot: foolish|ludicrous|silly + imbecile: foolish|ludicrous|silly + infantile paralysis: polio|person who had polio + insane: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + insanely: incredibly + insanity: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of + mental illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + insomnia: restlessness|sleeplessness + insomniac: person who has insomnia + insomniacs: people who have insomnia + intellectually disabled: person with an intellectual disability + intellectually disabled people: people with intellectual disabilities + invalid: turned off|has a disability|person with a disability|people with disabilities + junkie: person with a drug addiction|person recovering from a drug addiction + junkies: people with a drug addiction|people recovering from a drug addiction + lame: boring|dull + learning disabled: person with learning disabilities + libtard: disagreeable|uneducated|ignorant|naive|inconsiderate + loony: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + loony bin: chaos|hectic|pandemonium + low iq: foolish|ludicrous|unintelligent + lunacy: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + lunatic: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of + mental illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + madhouse: chaos|hectic|pandemonium + maniac: fanatic|zealot|enthusiast + manic: person with schizophrenia + mental: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + mental case: rude|malicious|mean|disgusting|incredible|vile|person with symptoms + of mental illness|person with mental illness|person with symptoms of a mental + disorder|person with a mental disorder + mental defective: rude|malicious|mean|disgusting|incredible|vile|person with symptoms + of mental illness|person with mental illness|person with symptoms of a mental + disorder|person with a mental disorder + mentally ill: rude|malicious|mean|disgusting|incredible|vile|person with symptoms + of mental illness|person with mental illness|person with symptoms of a mental + disorder|person with a mental disorder + midget: person with dwarfism|little person|little people|LP|person of short stature + mongoloid: person with Down Syndrome + moron: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + moronic: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of + mental illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + multiple sclerosis victim: person who has multiple sclerosis + neurotic: has an anxiety disorder|obsessive|pedantic|niggly|picky + nuts: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + o.c.d: has an anxiety disorder|obsessive|pedantic|niggly|picky + o.c.d.: has an anxiety disorder|obsessive|pedantic|niggly|picky + ocd: has an anxiety disorder|obsessive|pedantic|niggly|picky + panic attack: fit of terror|scare + paraplegic: person with paraplegia + psycho: rude|malicious|mean|disgusting|incredible|vile|person with symptoms of mental + illness|person with mental illness|person with symptoms of a mental disorder|person + with a mental disorder + psychopathology: rude|malicious|mean|disgusting|incredible|vile|person with symptoms + of mental illness|person with mental illness|person with symptoms of a mental + disorder|person with a mental disorder + psychotic: person with a psychotic condition|person with psychosis + quadriplegic: person with quadriplegia + rehab: treatment + rehab center: treatment center + restricted to a wheelchair: uses a wheelchair + retard: silly|dullard|person with Down Syndrome|person with developmental disabilities|delay|hold + back + retarded: silly|dullard|person with Down Syndrome|person with developmental disabilities|delay|hold + back + retards: "sillies|dullards|people with developmental disabilities|people with Down\u2019\ + s Syndrome|delays|holds back" + sane: correct|adequate|sufficient|consistent|valid|coherent|sensible|reasonable + sanity check: check|assertion|validation|smoke test + schizo: person with schizophrenia + schizophrenic: person with schizophrenia + senile: person with dementia + short bus: silly|dullard|person with Down Syndrome|person with developmental disabilities|delay|hold + back + simpleton: foolish|ludicrous|unintelligent + small person: person with dwarfism|little person|little people|LP|person of short + stature + sociopath: person with a personality disorder|person with psychopathic personality + sociopaths: people with psychopathic personalities|people with a personality disorder + spastic: person with cerebral palsy|twitch|flinch + spaz: person with cerebral palsy|twitch|flinch|hectic + special: has a disability|person with a disability|people with disabilities + special needs: has a disability|person with a disability|people with disabilities + special olympians: athletes|Special Olympics athletes + special olympic athletes: athletes|Special Olympics athletes + specially abled: has a disability|person with a disability|people with disabilities + stammering: stuttering|disfluency of speech + stroke victim: individual who has had a stroke + stupid: foolish|ludicrous|unintelligent + stutterer: person who stutters + suffer from aids: person with AIDS + suffer from an injury: sustain an injury|receive an injury + suffer from injuries: sustain injuries|receive injuries + suffering from a disability: has a disability|person with a disability|people with + disabilities + suffering from a polio: polio|person who had polio + suffering from a stroke: individual who has had a stroke + suffering from aids: person with AIDS + suffering from an injury: sustain an injury|receive an injury + suffering from an intellectual disability: person with an intellectual disability + suffering from disabilities: has a disability|person with a disability|people with + disabilities + suffering from injuries: sustain injuries|receive injuries + suffering from intellectual disabilities: person with an intellectual disability + suffering from multiple sclerosis: person who has multiple sclerosis + suffering from polio: polio|person who had polio + suffering from psychosis: person with a psychotic condition|person with psychosis + suffering from schizophrenia: person with schizophrenia + suffers from MD: person who has muscular dystrophy + suffers from aids: person with AIDS + suffers from an injury: sustain an injury|receive an injury + suffers from disabilities: has a disability|person with a disability|people with + disabilities + suffers from injuries: sustain injuries|receive injuries + suffers from intellectual disabilities: person with an intellectual disability + suffers from multiple sclerosis: person who has multiple sclerosis + suffers from muscular dystrophy: person who has muscular dystrophy + suffers from polio: polio|person who had polio + suffers from psychosis: person with a psychotic condition|person with psychosis + suffers from schizophrenia: person with schizophrenia + tourettes disorder: Tourette syndrome + tourettes syndrome: Tourette syndrome + vertically challenged: person with dwarfism|little person|little people|LP|person + of short stature + victim of a stroke: individual who has had a stroke + victim of aids: person with AIDS + victim of an injury: sustain an injury|receive an injury + victim of injuries: sustain injuries|receive injuries + victim of multiple sclerosis: person who has multiple sclerosis + victim of polio: polio|person who had polio + victim of psychosis: person with a psychotic condition|person with psychosis + wacko: foolish|ludicrous|unintelligent + whacko: foolish|ludicrous|unintelligent + wheelchair bound: uses a wheelchair diff --git a/styles/alex/Condescending.yml b/styles/alex/Condescending.yml new file mode 100644 index 000000000..4283a3367 --- /dev/null +++ b/styles/alex/Condescending.yml @@ -0,0 +1,16 @@ +--- +extends: existence +message: Using '%s' may come across as condescending. +link: https://css-tricks.com/words-avoid-educational-writing/ +level: error +ignorecase: true +tokens: + - obvious + - obviously + - simple + - simply + - easy + - easily + - of course + - clearly + - everyone knows diff --git a/styles/alex/Gendered.yml b/styles/alex/Gendered.yml new file mode 100644 index 000000000..f48eaccae --- /dev/null +++ b/styles/alex/Gendered.yml @@ -0,0 +1,108 @@ +--- +extends: substitution +message: "Consider using '%s' instead of '%s'." +ignorecase: true +level: warning +action: + name: replace +swap: + ancient man: ancient civilization|ancient people + authoress: author|writer + average housewife: average consumer|average household|average homemaker + average man: average person + average working man: average wage earner|average taxpayer + aviatrix: aviator + bitch: whine|complain|cry + bitching: whining|complaining|crying + brotherhood of man: the human family + calendar girl: model + call girl: escort|prostitute|sex worker + churchman: cleric|practicing Christian|pillar of the Church + english master: english coordinator|senior teacher of english + englishmen: the english + executrix: executor + father of *: founder of + fellowship: camaraderie|community|organization + founding father: the founders|founding leaders|forebears + frenchmen: french|the french + freshman: first-year student|fresher + freshwoman: first-year student|fresher + housemaid: house worker|domestic help + housewife: homemaker|homeworker + housewives: homemakers|homeworkers + industrial man: industrial civilization|industrial people + lady doctor: doctor + ladylike: courteous|cultured + leading lady: lead + like a man: resolutely|bravely + mad man: fanatic|zealot|enthusiast + mad men: fanatics|zealots|enthusiasts + madman: fanatic|zealot|enthusiast + madmen: fanatics|zealots|enthusiasts + maiden: virgin + maiden flight: first flight + maiden name: birth name + maiden race: first race + maiden speech: first speech + maiden voyage: first voyage + man a desk: staff a desk + man enough: strong enough + man hour: staff hour|hour of work + man hours: staff hours|hours of work|hours of labor|hours + man in the street: ordinary citizen|typical person|average person + man of action: dynamo + man of letters: scholar|writer|literary figure + man of the land: farmer|rural worker|grazier|landowner|rural community|country people|country + folk + man of the world: sophisticate + man sized task: a demanding task|a big job + man the booth: staff the booth + man the phones: answer the phones + manhour: staff hour|hour of work + manhours: staff hours|hours of work|hours of labor|hours + mankind: humankind + manmade: manufactured|artificial|synthetic|machine-made|constructed + manned: staffed|crewed|piloted + manpower: human resources|workforce|personnel|staff|labor|personnel|labor force|staffing|combat + personnel + mans best friend: a faithful dog + mansized task: a demanding task|a big job + master copy: pass key|original + master key: pass key|original + master of ceremonies: emcee|moderator|convenor + master plan: grand scheme|guiding principles + master the art: become skilled + masterful: skilled|authoritative|commanding + mastermind: genius|creator|instigator|oversee|launch|originate + masterpiece: "work of genius|chef d\u2019oeuvre" + masterplan: vision|comprehensive plan + masterstroke: trump card|stroke of genius + men of science: scientists + midwife: birthing nurse + miss.: ms. + moan: whine|complain|cry + moaning: whining|complaining|crying + modern man: modern civilization|modern people + motherly: loving|warm|nurturing + mrs.: ms. + no mans land: unoccupied territory|wasteland|deathtrap + office girls: administrative staff + oneupmanship: upstaging|competitiveness + poetess: poet + railwayman: railway worker + sportsmanlike: fair|sporting + sportsmanship: fairness|good humor|sense of fair play + statesman like: diplomatic + statesmanlike: diplomatic + stockman: cattle worker|farmhand|drover + tax man: tax commissioner|tax office|tax collector + tradesmans entrance: service entrance + unmanned: robotic|automated + usherette: usher + wife beater: tank top|sleeveless undershirt + wifebeater: tank top|sleeveless undershirt + woman lawyer: lawyer + woman painter: painter + working mother: wage or salary earning woman|two-income family + working wife: wage or salary earning woman|two-income family + workmanship: quality construction|expertise diff --git a/styles/alex/LGBTQ.yml b/styles/alex/LGBTQ.yml new file mode 100644 index 000000000..842a9c6f1 --- /dev/null +++ b/styles/alex/LGBTQ.yml @@ -0,0 +1,55 @@ +--- +extends: substitution +message: Consider using '%s' instead of '%s'. +ignorecase: true +level: warning +action: + name: replace +swap: + bathroom bill: non-discrimination law|non-discrimination ordinance + bi: bisexual + biologically female: assigned female at birth|designated female at birth + biologically male: assigned male at birth|designated male at birth + born a man: assigned male at birth|designated male at birth + born a woman: assigned female at birth|designated female at birth + dyke: gay + fag: gay + faggot: gay + gay agenda: gay issues + gay lifestyle: gay lives|gay/lesbian lives + gay rights: equal rights|civil rights for gay people + gender pronoun: pronoun|pronouns + gender pronouns: pronoun|pronouns + genetically female: assigned female at birth|designated female at birth + genetically male: assigned male at birth|designated male at birth + hermaphrodite: person who is intersex|person|intersex person + hermaphroditic: intersex + heshe: transgender person|person + homo: gay + homosexual: gay|gay man|lesbian|gay person/people + homosexual agenda: gay issues + homosexual couple: couple + homosexual lifestyle: gay lives|gay/lesbian lives + homosexual marriage: gay marriage|same-sex marriage + homosexual relations: relationship + homosexual relationship: relationship + preferred pronoun: pronoun|pronouns + preferred pronouns: pronoun|pronouns + pseudo hermaphrodite: person who is intersex|person|intersex person + pseudo hermaphroditic: intersex + pseudohermaphrodite: person who is intersex|person|intersex person + pseudohermaphroditic: intersex + sex change: transition|gender confirmation surgery + sex change operation: sex reassignment surgery|gender confirmation surgery + sexchange: transition|gender confirmation surgery + sexual preference: sexual orientation|orientation + she male: transgender person|person + shehe: transgender person|person + shemale: transgender person|person + sodomite: gay + special rights: equal rights|civil rights for gay people + tranny: transgender + transgendered: transgender + transgenderism: being transgender|the movement for transgender equality + transgenders: transgender people + transvestite: cross-dresser diff --git a/styles/alex/Press.yml b/styles/alex/Press.yml new file mode 100644 index 000000000..06991dbf1 --- /dev/null +++ b/styles/alex/Press.yml @@ -0,0 +1,11 @@ +--- +extends: substitution +message: Consider using '%s' instead of '%s'. +ignorecase: true +level: warning +action: + name: replace +swap: + islamist: muslim|person of Islamic faith|fanatic|zealot|follower of islam|follower + of the islamic faith + islamists: muslims|people of Islamic faith|fanatics|zealots diff --git a/styles/alex/Profanity.yml b/styles/alex/Profanity.yml new file mode 100644 index 000000000..b319fd7f6 --- /dev/null +++ b/styles/alex/Profanity.yml @@ -0,0 +1,1781 @@ +extends: existence +message: Be careful with '%s', it’s profane in some cases. +level: warning +ignorecase: true +tokens: + - abbo + - abeed + - abid + - abo + - abortion + - abuse + - addict + - addicts + - adult + - africa + - african + - africoon + - alla + - allah + - alligator bait + - alligatorbait + - amateur + - american + - anal + - analannie + - analsex + - angie + - angry + - anus + - arab + - arabs + - arabush + - arabushs + - areola + - argie + - armo + - armos + - aroused + - arse + - arsehole + - asian + - ass + - assassin + - assassinate + - assassination + - assault + - assbagger + - assblaster + - assclown + - asscowboy + - asses + - assfuck + - assfucker + - asshat + - asshole + - assholes + - asshore + - assjockey + - asskiss + - asskisser + - assklown + - asslick + - asslicker + - asslover + - assman + - assmonkey + - assmunch + - assmuncher + - asspacker + - asspirate + - asspuppies + - assranger + - asswhore + - asswipe + - athletesfoot + - attack + - australian + - babe + - babies + - backdoor + - backdoorman + - backseat + - badfuck + - balllicker + - balls + - ballsack + - banana + - bananas + - banging + - baptist + - barelylegal + - barf + - barface + - barfface + - bast + - bastard + - bazongas + - bazooms + - beanbag + - beanbags + - beaner + - beaners + - beaney + - beaneys + - beast + - beastality + - beastial + - beastiality + - beatoff + - beatyourmeat + - beaver + - bestial + - bestiality + - bi + - biatch + - bible + - bicurious + - bigass + - bigbastard + - bigbutt + - bigger + - bisexual + - bitch + - bitcher + - bitches + - bitchez + - bitchin + - bitching + - bitchslap + - bitchy + - biteme + - black + - blackman + - blackout + - blacks + - blind + - blow + - blowjob + - bluegum + - bluegums + - boang + - boche + - boches + - bogan + - bohunk + - bollick + - bollock + - bollocks + - bomb + - bombers + - bombing + - bombs + - bomd + - bondage + - boner + - bong + - boob + - boobies + - boobs + - booby + - boody + - boom + - boong + - boonga + - boongas + - boongs + - boonie + - boonies + - bootlip + - bootlips + - booty + - bootycall + - bosch + - bosche + - bosches + - boschs + - "bounty bar" + - "bounty bars" + - bountybar + - bra + - brea5t + - breast + - breastjob + - breastlover + - breastman + - brothel + - brownie + - brownies + - buddhahead + - buddhaheads + - buffies + - buffy + - bugger + - buggered + - buggery + - bule + - bules + - bullcrap + - bulldike + - bulldyke + - bullshit + - bumblefuck + - bumfuck + - bung + - bunga + - bungas + - bunghole + - buried + - burn + - "burr head" + - "burr heads" + - burrhead + - burrheads + - butchbabes + - butchdike + - butchdyke + - butt + - buttbang + - buttface + - buttfuck + - buttfucker + - buttfuckers + - butthead + - buttman + - buttmunch + - buttmuncher + - buttpirate + - buttplug + - buttstain + - byatch + - cacker + - "camel jockey" + - "camel jockeys" + - cameljockey + - cameltoe + - canadian + - cancer + - carpetmuncher + - carruth + - catholic + - catholics + - cemetery + - chav + - "cheese eating surrender monkey" + - "cheese eating surrender monkies" + - "cheeseeating surrender monkey" + - "cheeseeating surrender monkies" + - cheesehead + - cheeseheads + - cherrypopper + - chickslick + - childrens + - chin + - "china swede" + - "china swedes" + - chinaman + - chinamen + - chinaswede + - chinaswedes + - chinese + - "ching chong" + - "ching chongs" + - chingchong + - chingchongs + - chink + - chinks + - chinky + - choad + - chode + - chonkies + - chonky + - chonkys + - christ + - "christ killer" + - "christ killers" + - christian + - chug + - chugs + - chunger + - chungers + - chunkies + - chunky + - chunkys + - church + - cigarette + - cigs + - clamdigger + - clamdiver + - clansman + - clansmen + - clanswoman + - clanswomen + - clit + - clitoris + - clogwog + - cocaine + - cock + - cockblock + - cockblocker + - cockcowboy + - cockfight + - cockhead + - cockknob + - cocklicker + - cocklover + - cocknob + - cockqueen + - cockrider + - cocksman + - cocksmith + - cocksmoker + - cocksucer + - cocksuck + - cocksucked + - cocksucker + - cocksucking + - cocktail + - cocktease + - cocky + - coconut + - coconuts + - cohee + - coitus + - color + - colored + - coloured + - commie + - communist + - condom + - conservative + - conspiracy + - coolie + - coolies + - cooly + - coon + - "coon ass" + - "coon asses" + - coonass + - coonasses + - coondog + - coons + - copulate + - cornhole + - corruption + - cra5h + - crabs + - crack + - cracka + - cracker + - crackpipe + - crackwhore + - crap + - crapola + - crapper + - crappy + - crash + - creamy + - crime + - crimes + - criminal + - criminals + - crotch + - crotchjockey + - crotchmonkey + - crotchrot + - cum + - cumbubble + - cumfest + - cumjockey + - cumm + - cummer + - cumming + - cummings + - cumquat + - cumqueen + - cumshot + - cunilingus + - cunillingus + - cunn + - cunnilingus + - cunntt + - cunt + - cunteyed + - cuntfuck + - cuntfucker + - cuntlick + - cuntlicker + - cuntlicking + - cuntsucker + - "curry muncher" + - "curry munchers" + - currymuncher + - currymunchers + - cushi + - cushis + - cybersex + - cyberslimer + - dago + - dagos + - dahmer + - dammit + - damn + - damnation + - damnit + - darkey + - darkeys + - darkie + - darkies + - darky + - datnigga + - dead + - deapthroat + - death + - deepthroat + - defecate + - dego + - degos + - demon + - deposit + - desire + - destroy + - deth + - devil + - devilworshipper + - "diaper head" + - "diaper heads" + - diaperhead + - diaperheads + - dick + - dickbrain + - dickforbrains + - dickhead + - dickless + - dicklick + - dicklicker + - dickman + - dickwad + - dickweed + - diddle + - die + - died + - dies + - dike + - dildo + - dingleberry + - dink + - dinks + - dipshit + - dipstick + - dirty + - disease + - diseases + - disturbed + - dive + - dix + - dixiedike + - dixiedyke + - doggiestyle + - doggystyle + - dong + - doodoo + - doom + - dope + - "dot head" + - "dot heads" + - dothead + - dotheads + - dragqueen + - dragqween + - dripdick + - drug + - drunk + - drunken + - dumb + - dumbass + - dumbbitch + - dumbfuck + - "dune coon" + - "dune coons" + - dyefly + - dyke + - easyslut + - eatballs + - eatme + - eatpussy + - ecstacy + - "eight ball" + - "eight balls" + - ejaculate + - ejaculated + - ejaculating + - ejaculation + - enema + - enemy + - erect + - erection + - ero + - escort + - esqua + - ethiopian + - ethnic + - european + - evl + - excrement + - execute + - executed + - execution + - executioner + - exkwew + - explosion + - facefucker + - faeces + - fag + - fagging + - faggot + - fagot + - failed + - failure + - fairies + - fairy + - faith + - fannyfucker + - fart + - farted + - farting + - farty + - fastfuck + - fat + - fatah + - fatass + - fatfuck + - fatfucker + - fatso + - fckcum + - fear + - feces + - felatio + - felch + - felcher + - felching + - fellatio + - feltch + - feltcher + - feltching + - fetish + - fight + - filipina + - filipino + - fingerfood + - fingerfuck + - fingerfucked + - fingerfucker + - fingerfuckers + - fingerfucking + - fire + - firing + - fister + - fistfuck + - fistfucked + - fistfucker + - fistfucking + - fisting + - flange + - flasher + - flatulence + - floo + - flydie + - flydye + - fok + - fondle + - footaction + - footfuck + - footfucker + - footlicker + - footstar + - fore + - foreskin + - forni + - fornicate + - foursome + - fourtwenty + - fraud + - freakfuck + - freakyfucker + - freefuck + - fruitcake + - fu + - fubar + - fuc + - fucck + - fuck + - fucka + - fuckable + - fuckbag + - fuckbook + - fuckbuddy + - fucked + - fuckedup + - fucker + - fuckers + - fuckface + - fuckfest + - fuckfreak + - fuckfriend + - fuckhead + - fuckher + - fuckin + - fuckina + - fucking + - fuckingbitch + - fuckinnuts + - fuckinright + - fuckit + - fuckknob + - fuckme + - fuckmehard + - fuckmonkey + - fuckoff + - fuckpig + - fucks + - fucktard + - fuckwhore + - fuckyou + - fudgepacker + - fugly + - fuk + - fuks + - funeral + - funfuck + - fungus + - fuuck + - gable + - gables + - gangbang + - gangbanged + - gangbanger + - gangsta + - "gator bait" + - gatorbait + - gay + - gaymuthafuckinwhore + - gaysex + - geez + - geezer + - geni + - genital + - german + - getiton + - gin + - ginzo + - ginzos + - gipp + - gippo + - gippos + - gipps + - girls + - givehead + - glazeddonut + - gob + - god + - godammit + - goddamit + - goddammit + - goddamn + - goddamned + - goddamnes + - goddamnit + - goddamnmuthafucker + - goldenshower + - golliwog + - golliwogs + - gonorrehea + - gonzagas + - gook + - "gook eye" + - "gook eyes" + - gookeye + - gookeyes + - gookies + - gooks + - gooky + - gora + - goras + - gotohell + - goy + - goyim + - greaseball + - greaseballs + - greaser + - greasers + - gringo + - gringos + - groe + - groid + - groids + - gross + - grostulation + - gub + - gubba + - gubbas + - gubs + - guinea + - guineas + - guizi + - gummer + - gun + - gwailo + - gwailos + - gweilo + - gweilos + - gyopo + - gyopos + - gyp + - gyped + - gypo + - gypos + - gypp + - gypped + - gyppie + - gyppies + - gyppo + - gyppos + - gyppy + - gyppys + - gypsies + - gypsy + - gypsys + - hadji + - hadjis + - hairyback + - hairybacks + - haji + - hajis + - hajji + - hajjis + - "half breed" + - "half caste" + - halfbreed + - halfcaste + - hamas + - handjob + - haole + - haoles + - hapa + - harder + - hardon + - harem + - headfuck + - headlights + - hebe + - hebephila + - hebephile + - hebephiles + - hebephilia + - hebephilic + - hebes + - heeb + - heebs + - hell + - henhouse + - heroin + - herpes + - heterosexual + - hijack + - hijacker + - hijacking + - hillbillies + - hillbilly + - hindoo + - hiscock + - hitler + - hitlerism + - hitlerist + - hiv + - ho + - hobo + - hodgie + - hoes + - hole + - holestuffer + - homicide + - homo + - homobangers + - homosexual + - honger + - honk + - honkers + - honkey + - honkeys + - honkie + - honkies + - honky + - hook + - hooker + - hookers + - hooters + - hore + - hori + - horis + - hork + - horn + - horney + - horniest + - horny + - horseshit + - hosejob + - hoser + - hostage + - hotdamn + - hotpussy + - hottotrot + - hummer + - hun + - huns + - husky + - hussy + - hustler + - hymen + - hymie + - hymies + - iblowu + - idiot + - ike + - ikes + - ikey + - ikeymo + - ikeymos + - ikwe + - illegal + - illegals + - incest + - indon + - indons + - injun + - injuns + - insest + - intercourse + - interracial + - intheass + - inthebuff + - israel + - israeli + - israels + - italiano + - itch + - jackass + - jackoff + - jackshit + - jacktheripper + - jade + - jap + - japanese + - japcrap + - japie + - japies + - japs + - jebus + - jeez + - jerkoff + - jerries + - jerry + - jesus + - jesuschrist + - jew + - jewboy + - jewed + - jewess + - jewish + - jig + - jiga + - jigaboo + - jigaboos + - jigarooni + - jigaroonis + - jigg + - jigga + - jiggabo + - jiggabos + - jiggas + - jigger + - jiggers + - jiggs + - jiggy + - jigs + - jihad + - jijjiboo + - jijjiboos + - jimfish + - jism + - jiz + - jizim + - jizjuice + - jizm + - jizz + - jizzim + - jizzum + - joint + - juggalo + - jugs + - "jungle bunnies" + - "jungle bunny" + - junglebunny + - kacap + - kacapas + - kacaps + - kaffer + - kaffir + - kaffre + - kafir + - kanake + - katsap + - katsaps + - khokhol + - khokhols + - kid + - kigger + - kike + - kikes + - kill + - killed + - killer + - killing + - kills + - kimchi + - kimchis + - kink + - kinky + - kissass + - kkk + - klansman + - klansmen + - klanswoman + - klanswomen + - knife + - knockers + - kock + - kondum + - koon + - kotex + - krap + - krappy + - kraut + - krauts + - kuffar + - kum + - kumbubble + - kumbullbe + - kummer + - kumming + - kumquat + - kums + - kunilingus + - kunnilingus + - kunt + - kushi + - kushis + - kwa + - "kwai lo" + - "kwai los" + - ky + - kyke + - kykes + - kyopo + - kyopos + - lactate + - laid + - lapdance + - latin + - lebo + - lebos + - lesbain + - lesbayn + - lesbian + - lesbin + - lesbo + - lez + - lezbe + - lezbefriends + - lezbo + - lezz + - lezzo + - liberal + - libido + - licker + - lickme + - lies + - limey + - limpdick + - limy + - lingerie + - liquor + - livesex + - loadedgun + - lolita + - looser + - loser + - lotion + - lovebone + - lovegoo + - lovegun + - lovejuice + - lovemuscle + - lovepistol + - loverocket + - lowlife + - lsd + - lubejob + - lubra + - lucifer + - luckycammeltoe + - lugan + - lugans + - lynch + - mabuno + - mabunos + - macaca + - macacas + - mad + - mafia + - magicwand + - mahbuno + - mahbunos + - mams + - manhater + - manpaste + - marijuana + - mastabate + - mastabater + - masterbate + - masterblaster + - mastrabator + - masturbate + - masturbating + - mattressprincess + - "mau mau" + - "mau maus" + - maumau + - maumaus + - meatbeatter + - meatrack + - meth + - mexican + - mgger + - mggor + - mick + - mickeyfinn + - mideast + - milf + - minority + - mockey + - mockie + - mocky + - mofo + - moky + - moles + - molest + - molestation + - molester + - molestor + - moneyshot + - "moon cricket" + - "moon crickets" + - mooncricket + - mooncrickets + - mormon + - moron + - moskal + - moskals + - moslem + - mosshead + - mothafuck + - mothafucka + - mothafuckaz + - mothafucked + - mothafucker + - mothafuckin + - mothafucking + - mothafuckings + - motherfuck + - motherfucked + - motherfucker + - motherfuckin + - motherfucking + - motherfuckings + - motherlovebone + - muff + - muffdive + - muffdiver + - muffindiver + - mufflikcer + - mulatto + - muncher + - munt + - murder + - murderer + - muslim + - mzungu + - mzungus + - naked + - narcotic + - nasty + - nastybitch + - nastyho + - nastyslut + - nastywhore + - nazi + - necro + - negres + - negress + - negro + - negroes + - negroid + - negros + - nig + - nigar + - nigars + - niger + - nigerian + - nigerians + - nigers + - nigette + - nigettes + - nigg + - nigga + - niggah + - niggahs + - niggar + - niggaracci + - niggard + - niggarded + - niggarding + - niggardliness + - niggardlinesss + - niggardly + - niggards + - niggars + - niggas + - niggaz + - nigger + - niggerhead + - niggerhole + - niggers + - niggle + - niggled + - niggles + - niggling + - nigglings + - niggor + - niggress + - niggresses + - nigguh + - nigguhs + - niggur + - niggurs + - niglet + - nignog + - nigor + - nigors + - nigr + - nigra + - nigras + - nigre + - nigres + - nigress + - nigs + - nip + - nipple + - nipplering + - nittit + - nlgger + - nlggor + - nofuckingway + - nook + - nookey + - nookie + - noonan + - nooner + - nude + - nudger + - nuke + - nutfucker + - nymph + - ontherag + - oral + - oreo + - oreos + - orga + - orgasim + - orgasm + - orgies + - orgy + - osama + - paddy + - paederastic + - paederasts + - paederasty + - paki + - pakis + - palesimian + - palestinian + - "pancake face" + - "pancake faces" + - pansies + - pansy + - panti + - panties + - payo + - pearlnecklace + - peck + - pecker + - peckerwood + - pederastic + - pederasts + - pederasty + - pedo + - pedophile + - pedophiles + - pedophilia + - pedophilic + - pee + - peehole + - peepee + - peepshow + - peepshpw + - pendy + - penetration + - peni5 + - penile + - penis + - penises + - penthouse + - period + - perv + - phonesex + - phuk + - phuked + - phuking + - phukked + - phukking + - phungky + - phuq + - pi55 + - picaninny + - piccaninny + - pickaninnies + - pickaninny + - piefke + - piefkes + - piker + - pikey + - piky + - pimp + - pimped + - pimper + - pimpjuic + - pimpjuice + - pimpsimp + - pindick + - piss + - pissed + - pisser + - pisses + - pisshead + - pissin + - pissing + - pissoff + - pistol + - pixie + - pixy + - playboy + - playgirl + - pocha + - pochas + - pocho + - pochos + - pocketpool + - pohm + - pohms + - polack + - polacks + - pollock + - pollocks + - pom + - pommie + - "pommie grant" + - "pommie grants" + - pommies + - pommy + - poms + - poo + - poon + - poontang + - poop + - pooper + - pooperscooper + - pooping + - poorwhitetrash + - popimp + - "porch monkey" + - "porch monkies" + - porchmonkey + - porn + - pornflick + - pornking + - porno + - pornography + - pornprincess + - pot + - poverty + - "prairie nigger" + - "prairie niggers" + - premature + - pric + - prick + - prickhead + - primetime + - propaganda + - pros + - prostitute + - protestant + - pu55i + - pu55y + - pube + - pubic + - pubiclice + - pud + - pudboy + - pudd + - puddboy + - puke + - puntang + - purinapricness + - puss + - pussie + - pussies + - pussy + - pussycat + - pussyeater + - pussyfucker + - pussylicker + - pussylips + - pussylover + - pussypounder + - pusy + - quashie + - que + - queef + - queer + - quickie + - quim + - ra8s + - rabbi + - racial + - racist + - radical + - radicals + - raghead + - ragheads + - randy + - rape + - raped + - raper + - rapist + - rearend + - rearentry + - rectum + - redleg + - redlegs + - redlight + - redneck + - rednecks + - redskin + - redskins + - reefer + - reestie + - refugee + - reject + - remains + - rentafuck + - republican + - rere + - retard + - retarded + - ribbed + - rigger + - rimjob + - rimming + - roach + - robber + - "round eyes" + - roundeye + - rump + - russki + - russkie + - sadis + - sadom + - sambo + - sambos + - samckdaddy + - "sand nigger" + - "sand niggers" + - sandm + - sandnigger + - satan + - scag + - scallywag + - scat + - schlong + - schvartse + - schvartsen + - schwartze + - schwartzen + - screw + - screwyou + - scrotum + - scum + - semen + - seppo + - seppos + - septic + - septics + - servant + - sex + - sexed + - sexfarm + - sexhound + - sexhouse + - sexing + - sexkitten + - sexpot + - sexslave + - sextogo + - sextoy + - sextoys + - sexual + - sexually + - sexwhore + - sexy + - sexymoma + - sexyslim + - shag + - shaggin + - shagging + - shat + - shav + - shawtypimp + - sheeney + - shhit + - shiksa + - shinola + - shit + - shitcan + - shitdick + - shite + - shiteater + - shited + - shitface + - shitfaced + - shitfit + - shitforbrains + - shitfuck + - shitfucker + - shitfull + - shithapens + - shithappens + - shithead + - shithouse + - shiting + - shitlist + - shitola + - shitoutofluck + - shits + - shitstain + - shitted + - shitter + - shitting + - shitty + - shoot + - shooting + - shortfuck + - showtime + - shylock + - shylocks + - sick + - sissy + - sixsixsix + - sixtynine + - sixtyniner + - skank + - skankbitch + - skankfuck + - skankwhore + - skanky + - skankybitch + - skankywhore + - skinflute + - skum + - skumbag + - skwa + - skwe + - slant + - slanteye + - slanty + - slapper + - slaughter + - slav + - slave + - slavedriver + - sleezebag + - sleezeball + - slideitin + - slime + - slimeball + - slimebucket + - slope + - slopehead + - slopeheads + - sloper + - slopers + - slopes + - slopey + - slopeys + - slopies + - slopy + - slut + - sluts + - slutt + - slutting + - slutty + - slutwear + - slutwhore + - smack + - smackthemonkey + - smut + - snatch + - snatchpatch + - snigger + - sniggered + - sniggering + - sniggers + - sniper + - snot + - snowback + - snownigger + - sob + - sodom + - sodomise + - sodomite + - sodomize + - sodomy + - sonofabitch + - sonofbitch + - sooties + - sooty + - sos + - soviet + - spa + - spade + - spades + - spaghettibender + - spaghettinigger + - spank + - spankthemonkey + - spearchucker + - spearchuckers + - sperm + - spermacide + - spermbag + - spermhearder + - spermherder + - spic + - spick + - spicks + - spics + - spig + - spigotty + - spik + - spit + - spitter + - splittail + - spooge + - spreadeagle + - spunk + - spunky + - sqeh + - squa + - squarehead + - squareheads + - squaw + - squinty + - stagg + - stiffy + - strapon + - stringer + - stripclub + - stroke + - stroking + - stuinties + - stupid + - stupidfuck + - stupidfucker + - suck + - suckdick + - sucker + - suckme + - suckmyass + - suckmydick + - suckmytit + - suckoff + - suicide + - swallow + - swallower + - swalow + - "swamp guinea" + - "swamp guineas" + - swastika + - sweetness + - syphilis + - taboo + - tacohead + - tacoheads + - taff + - tampon + - tang + - tantra + - "tar babies" + - "tar baby" + - tarbaby + - tard + - teat + - terror + - terrorist + - teste + - testicle + - testicles + - thicklip + - thicklips + - thirdeye + - thirdleg + - threesome + - threeway + - "timber nigger" + - "timber niggers" + - timbernigger + - tinker + - tinkers + - tinkle + - tit + - titbitnipply + - titfuck + - titfucker + - titfuckin + - titjob + - titlicker + - titlover + - tits + - tittie + - titties + - titty + - tnt + - toilet + - tongethruster + - tongue + - tonguethrust + - tonguetramp + - tortur + - torture + - tosser + - "towel head" + - "towel heads" + - towelhead + - trailertrash + - tramp + - trannie + - tranny + - transexual + - transsexual + - transvestite + - trap + - triplex + - trisexual + - trojan + - trots + - tuckahoe + - tunneloflove + - turd + - turnon + - twat + - twink + - twinkie + - twobitwhore + - uck + - uk + - ukrop + - "uncle tom" + - unfuckable + - upskirt + - uptheass + - upthebutt + - urinary + - urinate + - urine + - usama + - uterus + - vagina + - vaginal + - vatican + - vibr + - vibrater + - vibrator + - vietcong + - violence + - virgin + - virginbreaker + - vomit + - vulva + - wab + - wank + - wanker + - wanking + - waysted + - weapon + - weenie + - weewee + - welcher + - welfare + - wetb + - wetback + - wetbacks + - wetspot + - whacker + - whash + - whigger + - whiggers + - whiskey + - whiskeydick + - whiskydick + - whit + - "white trash" + - whitenigger + - whites + - whitetrash + - whitey + - whiteys + - whities + - whiz + - whop + - whore + - whorefucker + - whorehouse + - wigga + - wiggas + - wigger + - wiggers + - willie + - williewanker + - willy + - wn + - wog + - wogs + - womens + - wop + - wtf + - wuss + - wuzzie + - xkwe + - xtc + - xxx + - yank + - yankee + - yankees + - yanks + - yarpie + - yarpies + - yellowman + - yid + - yids + - zigabo + - zigabos + - zipperhead + - zipperheads diff --git a/styles/alex/README.md b/styles/alex/README.md new file mode 100644 index 000000000..0185d0e35 --- /dev/null +++ b/styles/alex/README.md @@ -0,0 +1,27 @@ +Based on [alex](https://github.com/get-alex/alex). + +> Catch insensitive, inconsiderate writing + +``` +(The MIT License) + +Copyright (c) 2015 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` diff --git a/styles/alex/Race.yml b/styles/alex/Race.yml new file mode 100644 index 000000000..9979c0b20 --- /dev/null +++ b/styles/alex/Race.yml @@ -0,0 +1,87 @@ +--- +extends: substitution +message: Consider using '%s' instead of '%s'. +ignorecase: true +level: warning +action: + name: replace +swap: + Gipsy: Nomad|Traveler|Roma|Romani + Indian country: enemy territory + animal spirit: favorite|inspiration|personal interest|personality type + black list: blocklist|wronglist|banlist|deny list + blacklist: blocklist|wronglist|banlist|deny list + blacklisted: blocklisted|wronglisted|banlisted|deny-listed + blacklisting: blocklisting|wronglisting|banlisting|deny-listing + bugreport: bug report|snapshot + circle the wagons: defend + dream catcher: favorite|inspiration|personal interest|personality type + eskimo: Inuit + eskimos: Inuits + ghetto: projects|urban + goy: a person who is not Jewish|not Jewish + goyim: a person who is not Jewish|not Jewish + goyum: a person who is not Jewish|not Jewish + grandfather clause: legacy policy|legacy clause|deprecation policy + grandfather policy: legacy policy|legacy clause|deprecation policy + grandfathered: deprecated + grandfathering: deprecate + gyp: Nomad|Traveler|Roma|Romani + gyppo: Nomad|Traveler|Roma|Romani + gypsy: Nomad|Traveler|Roma|Romani + hymie: Jewish person + indian give: "go back on one\u2019s offer" + indian giver: "go back on one\u2019s offer" + japs: Japanese person|Japanese people + jump the reservation: disobey|endure|object to|oppose|resist + latina: Latinx + latino: Latinx + long time no hear: "I haven\u2019t seen you in a long time|it\u2019s been a long\ + \ time" + long time no see: "I haven\u2019t seen you in a long time|it\u2019s been a long\ + \ time" + master: primary|hub|reference + masters: primaries|hubs|references + mexican: Latinx + natives are becoming restless: dissatisfied|frustrated + natives are getting restless: dissatisfied|frustrated + natives are growing restless: dissatisfied|frustrated + natives are restless: dissatisfied|frustrated + non white: person of color|people of color + nonwhite: person of color|people of color + off reserve: disobey|endure|object to|oppose|resist + off the reservation: disobey|endure|object to|oppose|resist + on the warpath: defend + oriental: Asian person + orientals: Asian people + pinays: Filipinos|Filipino people + pinoys: Filipinos|Filipino people + pocahontas: Native American + pow wow: conference|gathering|meeting + powwow: conference|gathering|meeting + primitive: simple|indigenous|hunter-gatherer + red indian: Native American + red indians: Native American People + redskin: Native American + redskins: Native American People + sand niggers: Arabs|Middle Eastern People + savage: simple|indigenous|hunter-gatherer + shlomo: Jewish person + shyster: Jewish person + sophisticated culture: complex culture + sophisticated technology: complex technology + spade: a Black person + spirit animal: favorite|inspiration|personal interest|personality type + stone age: simple|indigenous|hunter-gatherer + too many chiefs: too many chefs in the kitchen|too many cooks spoil the broth + totem: favorite|inspiration|personal interest|personality type + towel heads: Arabs|Middle Eastern People + tribe: society|community + white list: passlist|alrightlist|safelist|allow list + white space: space|blank + white spaces: space|blank + whitelist: passlist|alrightlist|safelist|allow list + whitelisted: passlisted|alrightlisted|safelisted|allow-listed + whitelisting: passlisting|alrightlisting|safelisting|allow-listing + whitespace: space|blank + whitespaces: space|blank diff --git a/styles/alex/Suicide.yml b/styles/alex/Suicide.yml new file mode 100644 index 000000000..3dfd3e33d --- /dev/null +++ b/styles/alex/Suicide.yml @@ -0,0 +1,24 @@ +--- +extends: substitution +message: When referring to a person, consider using '%s' instead of '%s'. +ignorecase: true +level: warning +action: + name: replace +swap: + commit suicide: die by suicide + committed suicide: died by suicide + complete suicide: die by suicide + completed suicide: died by suicide + epidemic of suicides: rise in suicides + failed attempt: suicide attempt|attempted suicide + failed suicide: suicide attempt|attempted suicide + hang: the app froze|the app stopped responding|the app stopped responding to events|the + app became unresponsive + hanged: the app froze|the app stopped responding|the app stopped responding to events|the + app became unresponsive + successful suicide: die by suicide + suicide epidemic: rise in suicides + suicide failure: suicide attempt|attempted suicide + suicide note: a note from the deceased + suicide pact: rise in suicides diff --git a/styles/alex/meta.json b/styles/alex/meta.json new file mode 100644 index 000000000..3db4c282e --- /dev/null +++ b/styles/alex/meta.json @@ -0,0 +1,4 @@ +{ + "feed": "https://github.com/errata-ai/alex/releases.atom", + "vale_version": ">=1.0.0" +} \ No newline at end of file diff --git a/styles/write-good/Cliches.yml b/styles/write-good/Cliches.yml new file mode 100644 index 000000000..c95314387 --- /dev/null +++ b/styles/write-good/Cliches.yml @@ -0,0 +1,702 @@ +extends: existence +message: "Try to avoid using clichés like '%s'." +ignorecase: true +level: warning +tokens: + - a chip off the old block + - a clean slate + - a dark and stormy night + - a far cry + - a fine kettle of fish + - a loose cannon + - a penny saved is a penny earned + - a tough row to hoe + - a word to the wise + - ace in the hole + - acid test + - add insult to injury + - against all odds + - air your dirty laundry + - all fun and games + - all in a day's work + - all talk, no action + - all thumbs + - all your eggs in one basket + - all's fair in love and war + - all's well that ends well + - almighty dollar + - American as apple pie + - an axe to grind + - another day, another dollar + - armed to the teeth + - as luck would have it + - as old as time + - as the crow flies + - at loose ends + - at my wits end + - avoid like the plague + - babe in the woods + - back against the wall + - back in the saddle + - back to square one + - back to the drawing board + - bad to the bone + - badge of honor + - bald faced liar + - ballpark figure + - banging your head against a brick wall + - baptism by fire + - barking up the wrong tree + - bat out of hell + - be all and end all + - beat a dead horse + - beat around the bush + - been there, done that + - beggars can't be choosers + - behind the eight ball + - bend over backwards + - benefit of the doubt + - bent out of shape + - best thing since sliced bread + - bet your bottom dollar + - better half + - better late than never + - better mousetrap + - better safe than sorry + - between a rock and a hard place + - beyond the pale + - bide your time + - big as life + - big cheese + - big fish in a small pond + - big man on campus + - bigger they are the harder they fall + - bird in the hand + - bird's eye view + - birds and the bees + - birds of a feather flock together + - bit the hand that feeds you + - bite the bullet + - bite the dust + - bitten off more than he can chew + - black as coal + - black as pitch + - black as the ace of spades + - blast from the past + - bleeding heart + - blessing in disguise + - blind ambition + - blind as a bat + - blind leading the blind + - blood is thicker than water + - blood sweat and tears + - blow off steam + - blow your own horn + - blushing bride + - boils down to + - bolt from the blue + - bone to pick + - bored stiff + - bored to tears + - bottomless pit + - boys will be boys + - bright and early + - brings home the bacon + - broad across the beam + - broken record + - brought back to reality + - bull by the horns + - bull in a china shop + - burn the midnight oil + - burning question + - burning the candle at both ends + - burst your bubble + - bury the hatchet + - busy as a bee + - by hook or by crook + - call a spade a spade + - called onto the carpet + - calm before the storm + - can of worms + - can't cut the mustard + - can't hold a candle to + - case of mistaken identity + - cat got your tongue + - cat's meow + - caught in the crossfire + - caught red-handed + - checkered past + - chomping at the bit + - cleanliness is next to godliness + - clear as a bell + - clear as mud + - close to the vest + - cock and bull story + - cold shoulder + - come hell or high water + - cool as a cucumber + - cool, calm, and collected + - cost a king's ransom + - count your blessings + - crack of dawn + - crash course + - creature comforts + - cross that bridge when you come to it + - crushing blow + - cry like a baby + - cry me a river + - cry over spilt milk + - crystal clear + - curiosity killed the cat + - cut and dried + - cut through the red tape + - cut to the chase + - cute as a bugs ear + - cute as a button + - cute as a puppy + - cuts to the quick + - dark before the dawn + - day in, day out + - dead as a doornail + - devil is in the details + - dime a dozen + - divide and conquer + - dog and pony show + - dog days + - dog eat dog + - dog tired + - don't burn your bridges + - don't count your chickens + - don't look a gift horse in the mouth + - don't rock the boat + - don't step on anyone's toes + - don't take any wooden nickels + - down and out + - down at the heels + - down in the dumps + - down the hatch + - down to earth + - draw the line + - dressed to kill + - dressed to the nines + - drives me up the wall + - dull as dishwater + - dyed in the wool + - eagle eye + - ear to the ground + - early bird catches the worm + - easier said than done + - easy as pie + - eat your heart out + - eat your words + - eleventh hour + - even the playing field + - every dog has its day + - every fiber of my being + - everything but the kitchen sink + - eye for an eye + - face the music + - facts of life + - fair weather friend + - fall by the wayside + - fan the flames + - feast or famine + - feather your nest + - feathered friends + - few and far between + - fifteen minutes of fame + - filthy vermin + - fine kettle of fish + - fish out of water + - fishing for a compliment + - fit as a fiddle + - fit the bill + - fit to be tied + - flash in the pan + - flat as a pancake + - flip your lid + - flog a dead horse + - fly by night + - fly the coop + - follow your heart + - for all intents and purposes + - for the birds + - for what it's worth + - force of nature + - force to be reckoned with + - forgive and forget + - fox in the henhouse + - free and easy + - free as a bird + - fresh as a daisy + - full steam ahead + - fun in the sun + - garbage in, garbage out + - gentle as a lamb + - get a kick out of + - get a leg up + - get down and dirty + - get the lead out + - get to the bottom of + - get your feet wet + - gets my goat + - gilding the lily + - give and take + - go against the grain + - go at it tooth and nail + - go for broke + - go him one better + - go the extra mile + - go with the flow + - goes without saying + - good as gold + - good deed for the day + - good things come to those who wait + - good time was had by all + - good times were had by all + - greased lightning + - greek to me + - green thumb + - green-eyed monster + - grist for the mill + - growing like a weed + - hair of the dog + - hand to mouth + - happy as a clam + - happy as a lark + - hasn't a clue + - have a nice day + - have high hopes + - have the last laugh + - haven't got a row to hoe + - head honcho + - head over heels + - hear a pin drop + - heard it through the grapevine + - heart's content + - heavy as lead + - hem and haw + - high and dry + - high and mighty + - high as a kite + - hit paydirt + - hold your head up high + - hold your horses + - hold your own + - hold your tongue + - honest as the day is long + - horns of a dilemma + - horse of a different color + - hot under the collar + - hour of need + - I beg to differ + - icing on the cake + - if the shoe fits + - if the shoe were on the other foot + - in a jam + - in a jiffy + - in a nutshell + - in a pig's eye + - in a pinch + - in a word + - in hot water + - in the gutter + - in the nick of time + - in the thick of it + - in your dreams + - it ain't over till the fat lady sings + - it goes without saying + - it takes all kinds + - it takes one to know one + - it's a small world + - it's only a matter of time + - ivory tower + - Jack of all trades + - jockey for position + - jog your memory + - joined at the hip + - judge a book by its cover + - jump down your throat + - jump in with both feet + - jump on the bandwagon + - jump the gun + - jump to conclusions + - just a hop, skip, and a jump + - just the ticket + - justice is blind + - keep a stiff upper lip + - keep an eye on + - keep it simple, stupid + - keep the home fires burning + - keep up with the Joneses + - keep your chin up + - keep your fingers crossed + - kick the bucket + - kick up your heels + - kick your feet up + - kid in a candy store + - kill two birds with one stone + - kiss of death + - knock it out of the park + - knock on wood + - knock your socks off + - know him from Adam + - know the ropes + - know the score + - knuckle down + - knuckle sandwich + - knuckle under + - labor of love + - ladder of success + - land on your feet + - lap of luxury + - last but not least + - last hurrah + - last-ditch effort + - law of the jungle + - law of the land + - lay down the law + - leaps and bounds + - let sleeping dogs lie + - let the cat out of the bag + - let the good times roll + - let your hair down + - let's talk turkey + - letter perfect + - lick your wounds + - lies like a rug + - life's a bitch + - life's a grind + - light at the end of the tunnel + - lighter than a feather + - lighter than air + - like clockwork + - like father like son + - like taking candy from a baby + - like there's no tomorrow + - lion's share + - live and learn + - live and let live + - long and short of it + - long lost love + - look before you leap + - look down your nose + - look what the cat dragged in + - looking a gift horse in the mouth + - looks like death warmed over + - loose cannon + - lose your head + - lose your temper + - loud as a horn + - lounge lizard + - loved and lost + - low man on the totem pole + - luck of the draw + - luck of the Irish + - make hay while the sun shines + - make money hand over fist + - make my day + - make the best of a bad situation + - make the best of it + - make your blood boil + - man of few words + - man's best friend + - mark my words + - meaningful dialogue + - missed the boat on that one + - moment in the sun + - moment of glory + - moment of truth + - money to burn + - more power to you + - more than one way to skin a cat + - movers and shakers + - moving experience + - naked as a jaybird + - naked truth + - neat as a pin + - needle in a haystack + - needless to say + - neither here nor there + - never look back + - never say never + - nip and tuck + - nip it in the bud + - no guts, no glory + - no love lost + - no pain, no gain + - no skin off my back + - no stone unturned + - no time like the present + - no use crying over spilled milk + - nose to the grindstone + - not a hope in hell + - not a minute's peace + - not in my backyard + - not playing with a full deck + - not the end of the world + - not written in stone + - nothing to sneeze at + - nothing ventured nothing gained + - now we're cooking + - off the top of my head + - off the wagon + - off the wall + - old hat + - older and wiser + - older than dirt + - older than Methuselah + - on a roll + - on cloud nine + - on pins and needles + - on the bandwagon + - on the money + - on the nose + - on the rocks + - on the spot + - on the tip of my tongue + - on the wagon + - on thin ice + - once bitten, twice shy + - one bad apple doesn't spoil the bushel + - one born every minute + - one brick short + - one foot in the grave + - one in a million + - one red cent + - only game in town + - open a can of worms + - open and shut case + - open the flood gates + - opportunity doesn't knock twice + - out of pocket + - out of sight, out of mind + - out of the frying pan into the fire + - out of the woods + - out on a limb + - over a barrel + - over the hump + - pain and suffering + - pain in the + - panic button + - par for the course + - part and parcel + - party pooper + - pass the buck + - patience is a virtue + - pay through the nose + - penny pincher + - perfect storm + - pig in a poke + - pile it on + - pillar of the community + - pin your hopes on + - pitter patter of little feet + - plain as day + - plain as the nose on your face + - play by the rules + - play your cards right + - playing the field + - playing with fire + - pleased as punch + - plenty of fish in the sea + - point with pride + - poor as a church mouse + - pot calling the kettle black + - pretty as a picture + - pull a fast one + - pull your punches + - pulling your leg + - pure as the driven snow + - put it in a nutshell + - put one over on you + - put the cart before the horse + - put the pedal to the metal + - put your best foot forward + - put your foot down + - quick as a bunny + - quick as a lick + - quick as a wink + - quick as lightning + - quiet as a dormouse + - rags to riches + - raining buckets + - raining cats and dogs + - rank and file + - rat race + - reap what you sow + - red as a beet + - red herring + - reinvent the wheel + - rich and famous + - rings a bell + - ripe old age + - ripped me off + - rise and shine + - road to hell is paved with good intentions + - rob Peter to pay Paul + - roll over in the grave + - rub the wrong way + - ruled the roost + - running in circles + - sad but true + - sadder but wiser + - salt of the earth + - scared stiff + - scared to death + - sealed with a kiss + - second to none + - see eye to eye + - seen the light + - seize the day + - set the record straight + - set the world on fire + - set your teeth on edge + - sharp as a tack + - shoot for the moon + - shoot the breeze + - shot in the dark + - shoulder to the wheel + - sick as a dog + - sigh of relief + - signed, sealed, and delivered + - sink or swim + - six of one, half a dozen of another + - skating on thin ice + - slept like a log + - slinging mud + - slippery as an eel + - slow as molasses + - smart as a whip + - smooth as a baby's bottom + - sneaking suspicion + - snug as a bug in a rug + - sow wild oats + - spare the rod, spoil the child + - speak of the devil + - spilled the beans + - spinning your wheels + - spitting image of + - spoke with relish + - spread like wildfire + - spring to life + - squeaky wheel gets the grease + - stands out like a sore thumb + - start from scratch + - stick in the mud + - still waters run deep + - stitch in time + - stop and smell the roses + - straight as an arrow + - straw that broke the camel's back + - strong as an ox + - stubborn as a mule + - stuff that dreams are made of + - stuffed shirt + - sweating blood + - sweating bullets + - take a load off + - take one for the team + - take the bait + - take the bull by the horns + - take the plunge + - takes one to know one + - takes two to tango + - the more the merrier + - the real deal + - the real McCoy + - the red carpet treatment + - the same old story + - there is no accounting for taste + - thick as a brick + - thick as thieves + - thin as a rail + - think outside of the box + - third time's the charm + - this day and age + - this hurts me worse than it hurts you + - this point in time + - three sheets to the wind + - through thick and thin + - throw in the towel + - tie one on + - tighter than a drum + - time and time again + - time is of the essence + - tip of the iceberg + - tired but happy + - to coin a phrase + - to each his own + - to make a long story short + - to the best of my knowledge + - toe the line + - tongue in cheek + - too good to be true + - too hot to handle + - too numerous to mention + - touch with a ten foot pole + - tough as nails + - trial and error + - trials and tribulations + - tried and true + - trip down memory lane + - twist of fate + - two cents worth + - two peas in a pod + - ugly as sin + - under the counter + - under the gun + - under the same roof + - under the weather + - until the cows come home + - unvarnished truth + - up the creek + - uphill battle + - upper crust + - upset the applecart + - vain attempt + - vain effort + - vanquish the enemy + - vested interest + - waiting for the other shoe to drop + - wakeup call + - warm welcome + - watch your p's and q's + - watch your tongue + - watching the clock + - water under the bridge + - weather the storm + - weed them out + - week of Sundays + - went belly up + - wet behind the ears + - what goes around comes around + - what you see is what you get + - when it rains, it pours + - when push comes to shove + - when the cat's away + - when the going gets tough, the tough get going + - white as a sheet + - whole ball of wax + - whole hog + - whole nine yards + - wild goose chase + - will wonders never cease? + - wisdom of the ages + - wise as an owl + - wolf at the door + - words fail me + - work like a dog + - world weary + - worst nightmare + - worth its weight in gold + - wrong side of the bed + - yanking your chain + - yappy as a dog + - years young + - you are what you eat + - you can run but you can't hide + - you only live once + - you're the boss + - young and foolish + - young and vibrant diff --git a/styles/write-good/E-Prime.yml b/styles/write-good/E-Prime.yml new file mode 100644 index 000000000..074a102b2 --- /dev/null +++ b/styles/write-good/E-Prime.yml @@ -0,0 +1,32 @@ +extends: existence +message: "Try to avoid using '%s'." +ignorecase: true +level: suggestion +tokens: + - am + - are + - aren't + - be + - been + - being + - he's + - here's + - here's + - how's + - i'm + - is + - isn't + - it's + - she's + - that's + - there's + - they're + - was + - wasn't + - we're + - were + - weren't + - what's + - where's + - who's + - you're diff --git a/styles/write-good/Illusions.yml b/styles/write-good/Illusions.yml new file mode 100644 index 000000000..b4f132185 --- /dev/null +++ b/styles/write-good/Illusions.yml @@ -0,0 +1,11 @@ +extends: repetition +message: "'%s' is repeated!" +level: warning +alpha: true +action: + name: edit + params: + - truncate + - " " +tokens: + - '[^\s]+' diff --git a/styles/write-good/Passive.yml b/styles/write-good/Passive.yml new file mode 100644 index 000000000..f472cb904 --- /dev/null +++ b/styles/write-good/Passive.yml @@ -0,0 +1,183 @@ +extends: existence +message: "'%s' may be passive voice. Use active voice if you can." +ignorecase: true +level: warning +raw: + - \b(am|are|were|being|is|been|was|be)\b\s* +tokens: + - '[\w]+ed' + - awoken + - beat + - become + - been + - begun + - bent + - beset + - bet + - bid + - bidden + - bitten + - bled + - blown + - born + - bought + - bound + - bred + - broadcast + - broken + - brought + - built + - burnt + - burst + - cast + - caught + - chosen + - clung + - come + - cost + - crept + - cut + - dealt + - dived + - done + - drawn + - dreamt + - driven + - drunk + - dug + - eaten + - fallen + - fed + - felt + - fit + - fled + - flown + - flung + - forbidden + - foregone + - forgiven + - forgotten + - forsaken + - fought + - found + - frozen + - given + - gone + - gotten + - ground + - grown + - heard + - held + - hidden + - hit + - hung + - hurt + - kept + - knelt + - knit + - known + - laid + - lain + - leapt + - learnt + - led + - left + - lent + - let + - lighted + - lost + - made + - meant + - met + - misspelt + - mistaken + - mown + - overcome + - overdone + - overtaken + - overthrown + - paid + - pled + - proven + - put + - quit + - read + - rid + - ridden + - risen + - run + - rung + - said + - sat + - sawn + - seen + - sent + - set + - sewn + - shaken + - shaven + - shed + - shod + - shone + - shorn + - shot + - shown + - shrunk + - shut + - slain + - slept + - slid + - slit + - slung + - smitten + - sold + - sought + - sown + - sped + - spent + - spilt + - spit + - split + - spoken + - spread + - sprung + - spun + - stolen + - stood + - stridden + - striven + - struck + - strung + - stuck + - stung + - stunk + - sung + - sunk + - swept + - swollen + - sworn + - swum + - swung + - taken + - taught + - thought + - thrived + - thrown + - thrust + - told + - torn + - trodden + - understood + - upheld + - upset + - wed + - wept + - withheld + - withstood + - woken + - won + - worn + - wound + - woven + - written + - wrung diff --git a/styles/write-good/README.md b/styles/write-good/README.md new file mode 100644 index 000000000..3edcc9b37 --- /dev/null +++ b/styles/write-good/README.md @@ -0,0 +1,27 @@ +Based on [write-good](https://github.com/btford/write-good). + +> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too. + +``` +The MIT License (MIT) + +Copyright (c) 2014 Brian Ford + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` diff --git a/styles/write-good/So.yml b/styles/write-good/So.yml new file mode 100644 index 000000000..e57f099dc --- /dev/null +++ b/styles/write-good/So.yml @@ -0,0 +1,5 @@ +extends: existence +message: "Don't start a sentence with '%s'." +level: error +raw: + - '(?:[;-]\s)so[\s,]|\bSo[\s,]' diff --git a/styles/write-good/ThereIs.yml b/styles/write-good/ThereIs.yml new file mode 100644 index 000000000..8b82e8f6c --- /dev/null +++ b/styles/write-good/ThereIs.yml @@ -0,0 +1,6 @@ +extends: existence +message: "Don't start a sentence with '%s'." +ignorecase: false +level: error +raw: + - '(?:[;-]\s)There\s(is|are)|\bThere\s(is|are)\b' diff --git a/styles/write-good/TooWordy.yml b/styles/write-good/TooWordy.yml new file mode 100644 index 000000000..275701b19 --- /dev/null +++ b/styles/write-good/TooWordy.yml @@ -0,0 +1,221 @@ +extends: existence +message: "'%s' is too wordy." +ignorecase: true +level: warning +tokens: + - a number of + - abundance + - accede to + - accelerate + - accentuate + - accompany + - accomplish + - accorded + - accrue + - acquiesce + - acquire + - additional + - adjacent to + - adjustment + - admissible + - advantageous + - adversely impact + - advise + - aforementioned + - aggregate + - aircraft + - all of + - all things considered + - alleviate + - allocate + - along the lines of + - already existing + - alternatively + - amazing + - ameliorate + - anticipate + - apparent + - appreciable + - as a matter of fact + - as a means of + - as far as I'm concerned + - as of yet + - as to + - as yet + - ascertain + - assistance + - at the present time + - at this time + - attain + - attributable to + - authorize + - because of the fact that + - belated + - benefit from + - bestow + - by means of + - by virtue of + - by virtue of the fact that + - cease + - close proximity + - commence + - comply with + - concerning + - consequently + - consolidate + - constitutes + - demonstrate + - depart + - designate + - discontinue + - due to the fact that + - each and every + - economical + - eliminate + - elucidate + - employ + - endeavor + - enumerate + - equitable + - equivalent + - evaluate + - evidenced + - exclusively + - expedite + - expend + - expiration + - facilitate + - factual evidence + - feasible + - finalize + - first and foremost + - for all intents and purposes + - for the most part + - for the purpose of + - forfeit + - formulate + - have a tendency to + - honest truth + - however + - if and when + - impacted + - implement + - in a manner of speaking + - in a timely manner + - in a very real sense + - in accordance with + - in addition + - in all likelihood + - in an effort to + - in between + - in excess of + - in lieu of + - in light of the fact that + - in many cases + - in my opinion + - in order to + - in regard to + - in some instances + - in terms of + - in the case of + - in the event that + - in the final analysis + - in the nature of + - in the near future + - in the process of + - inception + - incumbent upon + - indicate + - indication + - initiate + - irregardless + - is applicable to + - is authorized to + - is responsible for + - it is + - it is essential + - it seems that + - it was + - magnitude + - maximum + - methodology + - minimize + - minimum + - modify + - monitor + - multiple + - necessitate + - nevertheless + - not certain + - not many + - not often + - not unless + - not unlike + - notwithstanding + - null and void + - numerous + - objective + - obligate + - obtain + - on the contrary + - on the other hand + - one particular + - optimum + - overall + - owing to the fact that + - participate + - particulars + - pass away + - pertaining to + - point in time + - portion + - possess + - preclude + - previously + - prior to + - prioritize + - procure + - proficiency + - provided that + - purchase + - put simply + - readily apparent + - refer back + - regarding + - relocate + - remainder + - remuneration + - requirement + - reside + - residence + - retain + - satisfy + - shall + - should you wish + - similar to + - solicit + - span across + - strategize + - subsequent + - substantial + - successfully complete + - sufficient + - terminate + - the month of + - the point I am trying to make + - therefore + - time period + - took advantage of + - transmit + - transpire + - type of + - until such time as + - utilization + - utilize + - validate + - various different + - what I mean to say is + - whether or not + - with respect to + - with the exception of + - witnessed diff --git a/styles/write-good/Weasel.yml b/styles/write-good/Weasel.yml new file mode 100644 index 000000000..e29391444 --- /dev/null +++ b/styles/write-good/Weasel.yml @@ -0,0 +1,207 @@ +extends: existence +message: "'%s' is a weasel word!" +ignorecase: true +level: warning +tokens: + - absolutely + - accidentally + - additionally + - allegedly + - alternatively + - angrily + - anxiously + - approximately + - awkwardly + - badly + - barely + - beautifully + - blindly + - boldly + - bravely + - brightly + - briskly + - bristly + - bubbly + - busily + - calmly + - carefully + - carelessly + - cautiously + - cheerfully + - clearly + - closely + - coldly + - completely + - consequently + - correctly + - courageously + - crinkly + - cruelly + - crumbly + - cuddly + - currently + - daily + - daringly + - deadly + - definitely + - deliberately + - doubtfully + - dumbly + - eagerly + - early + - easily + - elegantly + - enormously + - enthusiastically + - equally + - especially + - eventually + - exactly + - exceedingly + - exclusively + - extremely + - fairly + - faithfully + - fatally + - fiercely + - finally + - fondly + - few + - foolishly + - fortunately + - frankly + - frantically + - generously + - gently + - giggly + - gladly + - gracefully + - greedily + - happily + - hardly + - hastily + - healthily + - heartily + - helpfully + - honestly + - hourly + - hungrily + - hurriedly + - immediately + - impatiently + - inadequately + - ingeniously + - innocently + - inquisitively + - interestingly + - irritably + - jiggly + - joyously + - justly + - kindly + - largely + - lately + - lazily + - likely + - literally + - lonely + - loosely + - loudly + - loudly + - luckily + - madly + - many + - mentally + - mildly + - monthly + - mortally + - mostly + - mysteriously + - neatly + - nervously + - nightly + - noisily + - normally + - obediently + - occasionally + - only + - openly + - painfully + - particularly + - patiently + - perfectly + - politely + - poorly + - powerfully + - presumably + - previously + - promptly + - punctually + - quarterly + - quickly + - quietly + - rapidly + - rarely + - really + - recently + - recklessly + - regularly + - remarkably + - relatively + - reluctantly + - repeatedly + - rightfully + - roughly + - rudely + - sadly + - safely + - selfishly + - sensibly + - seriously + - sharply + - shortly + - shyly + - significantly + - silently + - simply + - sleepily + - slowly + - smartly + - smelly + - smoothly + - softly + - solemnly + - sparkly + - speedily + - stealthily + - sternly + - stupidly + - substantially + - successfully + - suddenly + - surprisingly + - suspiciously + - swiftly + - tenderly + - tensely + - thoughtfully + - tightly + - timely + - truthfully + - unexpectedly + - unfortunately + - usually + - very + - victoriously + - violently + - vivaciously + - warmly + - waverly + - weakly + - wearily + - weekly + - wildly + - wisely + - worldly + - wrinkly + - yearly diff --git a/styles/write-good/meta.json b/styles/write-good/meta.json new file mode 100644 index 000000000..a115d2886 --- /dev/null +++ b/styles/write-good/meta.json @@ -0,0 +1,4 @@ +{ + "feed": "https://github.com/errata-ai/write-good/releases.atom", + "vale_version": ">=1.0.0" +}