From 47ba613cac644a20075a09dfe6445cb65e7377cc Mon Sep 17 00:00:00 2001 From: freddy Date: Thu, 24 Mar 2016 15:59:44 +0100 Subject: [PATCH 01/20] support headers 4 5 and 6 --- src/stateToMarkdown.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/stateToMarkdown.js b/src/stateToMarkdown.js index 1bfe776..8941d41 100644 --- a/src/stateToMarkdown.js +++ b/src/stateToMarkdown.js @@ -63,6 +63,21 @@ class MarkupGenerator { this.output.push('### ' + this.renderBlockContent(block) + '\n'); break; } + case BLOCK_TYPE.HEADER_FOUR: { + this.insertLineBreaks(1); + this.output.push('#### ' + this.renderBlockContent(block) + '\n'); + break; + } + case BLOCK_TYPE.HEADER_FIVE: { + this.insertLineBreaks(1); + this.output.push('##### ' + this.renderBlockContent(block) + '\n'); + break; + } + case BLOCK_TYPE.HEADER_SIX: { + this.insertLineBreaks(1); + this.output.push('###### ' + this.renderBlockContent(block) + '\n'); + break; + } case BLOCK_TYPE.UNORDERED_LIST_ITEM: { let blockDepth = block.getDepth(); let lastBlock = this.getLastBlock(); From 4ff8c227e5b425e80f6fa5a4ba2b2546767c2daf Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Fri, 25 Mar 2016 14:58:52 +0700 Subject: [PATCH 02/20] package.json: update contributers --- package.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/package.json b/package.json index 7017cf1..6fcce2d 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,16 @@ "export-markdown" ], "author": "sstur@me.com", + "contributors": [ + { + "name": "Freddy Harris", + "url": "https://github.com/Freddy03h" + }, + { + "name": "Simon Sturmer", + "url": "https://github.com/sstur" + } + ], "license": "ISC", "bugs": { "url": "https://github.com/sstur/draft-js-export-markdown/issues" From 35d3a340a7026e8de31f01d7fd8bd600905b6e55 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Fri, 25 Mar 2016 14:59:05 +0700 Subject: [PATCH 03/20] 0.1.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6fcce2d..3991530 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "draft-js-export-markdown", - "version": "0.1.2", + "version": "0.1.3", "description": "DraftJS: Export ContentState to Markdown", "main": "lib/main.js", "scripts": { From e624487568d43298292d5df0ded7784b4e3119bb Mon Sep 17 00:00:00 2001 From: Greg Ziegan Date: Sun, 10 Apr 2016 01:37:39 -0700 Subject: [PATCH 04/20] Support image export based on entity attributes Requires Image enum value from `draft-js-utils`. --- src/stateToMarkdown.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/stateToMarkdown.js b/src/stateToMarkdown.js index 8941d41..c2de257 100644 --- a/src/stateToMarkdown.js +++ b/src/stateToMarkdown.js @@ -225,6 +225,11 @@ class MarkupGenerator { let url = data.url || ''; let title = data.title ? ` "${escapeTitle(data.title)}"` : ''; return `[${content}](${encodeURL(url)}${title})`; + } else if (entity != null && entity.getType() === ENTITY_TYPE.IMAGE) { + let data = entity.getData(); + let src = data.src || ''; + let alt = data.alt ? ` "${escapeTitle(data.alt)}"` : ''; + return `![${alt}](${encodeURL(src)})`; } else { return content; } From a764aa6dfdc0824e316212e9aa5db97b0d1d31f1 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Sun, 17 Apr 2016 09:47:50 +0700 Subject: [PATCH 05/20] explicitly pass paths to mocha --- package.json | 2 +- test/mocha.opts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 3991530..fb39fcf 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lint": "eslint --max-warnings 0 .", "prepublish": "npm run build", "test": "npm run lint && npm run test-src", - "test-src": "mocha" + "test-src": "mocha src/__tests__/*.js src/**/__tests__/*.js" }, "dependencies": { "draft-js-tools": "^0.1.2" diff --git a/test/mocha.opts b/test/mocha.opts index 67c5129..ccd1f09 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1,2 +1 @@ --compilers js:babel-core/register -src/__tests__/*.js src/**/__tests__/*.js From e8de2a01497a68f5d26fc5d8852e6892be2a0b13 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Sun, 17 Apr 2016 09:57:23 +0700 Subject: [PATCH 06/20] update deps --- package.json | 26 ++++++++++++++------------ src/stateToMarkdown.js | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index fb39fcf..38c85c1 100644 --- a/package.json +++ b/package.json @@ -11,25 +11,27 @@ "test-src": "mocha src/__tests__/*.js src/**/__tests__/*.js" }, "dependencies": { - "draft-js-tools": "^0.1.2" + "draft-js-utils": "^0.1.4" + }, + "peerDependencies": { + "draft-js": "^0.5.0", + "immutable": "^3.8.0" }, "devDependencies": { - "babel-core": "^6.7.2", - "babel-eslint": "^5.0.0", + "babel-core": "^6.7.6", + "babel-eslint": "^6.0.2", "babel-plugin-transform-class-properties": "^6.6.0", "babel-preset-es2015": "^6.6.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-2": "^6.5.0", - "draft-js": "^0.2.2", - "eslint": "2.2.0", - "eslint-plugin-babel": "^3.1.0", - "eslint-plugin-flow-vars": "^0.2.1", - "eslint-plugin-react": "^4.2.1", - "expect": "^1.15.2", - "immutable": "^3.7.6", + "eslint": "^2.8.0", + "eslint-plugin-babel": "^3.2.0", + "eslint-plugin-flow-vars": "^0.3.0", + "eslint-plugin-react": "^4.3.0", + "expect": "^1.16.0", "mocha": "^2.4.5", - "react": "^0.14.7", - "react-dom": "^0.14.7" + "react": "^15.0.1", + "react-dom": "^15.0.1" }, "repository": { "type": "git", diff --git a/src/stateToMarkdown.js b/src/stateToMarkdown.js index c2de257..c23f3ea 100644 --- a/src/stateToMarkdown.js +++ b/src/stateToMarkdown.js @@ -5,7 +5,7 @@ import { BLOCK_TYPE, ENTITY_TYPE, INLINE_STYLE, -} from 'draft-js-tools'; +} from 'draft-js-utils'; import {Entity} from 'draft-js'; import type {ContentState, ContentBlock} from 'draft-js'; From 31a8b25f5e977626f7ee5ceeb6481e907568399c Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Sun, 17 Apr 2016 10:10:59 +0700 Subject: [PATCH 07/20] add flow, npm run typecheck --- .flowconfig | 1 + package.json | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.flowconfig b/.flowconfig index 6f52e39..0575b6a 100644 --- a/.flowconfig +++ b/.flowconfig @@ -1,6 +1,7 @@ [ignore] .*node_modules/babel.* .*node_modules/fbjs.* +.*node_modules/json5.* [include] diff --git a/package.json b/package.json index 38c85c1..a414370 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ "scripts": { "build": "babel src --ignore '_*' --out-dir lib", "lint": "eslint --max-warnings 0 .", + "typecheck": "flow", "prepublish": "npm run build", - "test": "npm run lint && npm run test-src", + "test": "npm run lint && npm run typecheck && npm run test-src", "test-src": "mocha src/__tests__/*.js src/**/__tests__/*.js" }, "dependencies": { @@ -29,6 +30,7 @@ "eslint-plugin-flow-vars": "^0.3.0", "eslint-plugin-react": "^4.3.0", "expect": "^1.16.0", + "flow-bin": "^0.23.0", "mocha": "^2.4.5", "react": "^15.0.1", "react-dom": "^15.0.1" From 5b4ac350311515b71a326c3868f17869c12e17e6 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Sun, 17 Apr 2016 10:11:38 +0700 Subject: [PATCH 08/20] 0.1.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a414370..fbd3b23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "draft-js-export-markdown", - "version": "0.1.3", + "version": "0.1.4", "description": "DraftJS: Export ContentState to Markdown", "main": "lib/main.js", "scripts": { From 6c1eb926e92dca8af9d83c2c71396fca8f88b1dd Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Thu, 21 Apr 2016 08:05:53 +0700 Subject: [PATCH 09/20] add missing dev dependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index fbd3b23..44b87d5 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "immutable": "^3.8.0" }, "devDependencies": { + "babel-cli": "^6.7.5", "babel-core": "^6.7.6", "babel-eslint": "^6.0.2", "babel-plugin-transform-class-properties": "^6.6.0", From a4367a619690842783561366c2a45e69545ece28 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Thu, 21 Apr 2016 08:05:54 +0700 Subject: [PATCH 10/20] 0.1.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44b87d5..f50f651 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "draft-js-export-markdown", - "version": "0.1.4", + "version": "0.1.5", "description": "DraftJS: Export ContentState to Markdown", "main": "lib/main.js", "scripts": { From b21c4b4090fd9ea6ceffced3d90847504bd8807f Mon Sep 17 00:00:00 2001 From: Jakub Zmudzinski Date: Fri, 13 May 2016 13:47:00 +0200 Subject: [PATCH 11/20] Fixed support for image type entity --- package.json | 2 +- src/stateToMarkdown.js | 2 +- test/test-cases.txt | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f50f651..88be38c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "draft-js-export-markdown", - "version": "0.1.5", + "version": "0.1.6", "description": "DraftJS: Export ContentState to Markdown", "main": "lib/main.js", "scripts": { diff --git a/src/stateToMarkdown.js b/src/stateToMarkdown.js index c23f3ea..bff2e01 100644 --- a/src/stateToMarkdown.js +++ b/src/stateToMarkdown.js @@ -225,7 +225,7 @@ class MarkupGenerator { let url = data.url || ''; let title = data.title ? ` "${escapeTitle(data.title)}"` : ''; return `[${content}](${encodeURL(url)}${title})`; - } else if (entity != null && entity.getType() === ENTITY_TYPE.IMAGE) { + } else if (entity != null && entity.getType().toUpperCase() === ENTITY_TYPE.IMAGE) { let data = entity.getData(); let src = data.src || ''; let alt = data.alt ? ` "${escapeTitle(data.alt)}"` : ''; diff --git a/test/test-cases.txt b/test/test-cases.txt index baca361..00e5151 100644 --- a/test/test-cases.txt +++ b/test/test-cases.txt @@ -14,6 +14,14 @@ _**BoldItalic**_ {"entityMap":{},"blocks":[{"key":"9nc73","text":"BoldItalic","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":4,"length":6,"style":"BOLD"},{"offset":0,"length":4,"style":"ITALIC"}],"entityRanges":[]}]} _Bold_**Italic** +>> Image with alt +{"entityMap":{"0":{"type":"IMAGE","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":"x"}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} +Hello![ "x"](/a.jpg)World. + +>> Image with empty alt +{"entityMap":{"0":{"type":"image","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":""}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} +Hello![](/a.jpg)World. + >> Link without title {"entityMap":{"0":{"type":"LINK","mutability":"MUTABLE","data":{"url":"/a","foo":"x"}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":6,"length":5,"key":0}]}]} Hello [World](/a). From 116c99fe4da57ffff69056904c490035d6de6181 Mon Sep 17 00:00:00 2001 From: Jakub Zmudzinski Date: Fri, 13 May 2016 14:21:26 +0200 Subject: [PATCH 12/20] Better test case name --- test/test-cases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test-cases.txt b/test/test-cases.txt index 00e5151..972f0dd 100644 --- a/test/test-cases.txt +++ b/test/test-cases.txt @@ -18,7 +18,7 @@ _Bold_**Italic** {"entityMap":{"0":{"type":"IMAGE","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":"x"}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} Hello![ "x"](/a.jpg)World. ->> Image with empty alt +>> Image with empty alt and type written in lower case {"entityMap":{"0":{"type":"image","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":""}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} Hello![](/a.jpg)World. From 8fef4cca06ebf1df0ab64f511e71fd8125cc740a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=BBmudzi=C5=84ski?= Date: Fri, 13 May 2016 18:32:07 +0200 Subject: [PATCH 13/20] Removed redundant .toUpperCase() (#8) --- src/stateToMarkdown.js | 2 +- test/test-cases.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/stateToMarkdown.js b/src/stateToMarkdown.js index bff2e01..c23f3ea 100644 --- a/src/stateToMarkdown.js +++ b/src/stateToMarkdown.js @@ -225,7 +225,7 @@ class MarkupGenerator { let url = data.url || ''; let title = data.title ? ` "${escapeTitle(data.title)}"` : ''; return `[${content}](${encodeURL(url)}${title})`; - } else if (entity != null && entity.getType().toUpperCase() === ENTITY_TYPE.IMAGE) { + } else if (entity != null && entity.getType() === ENTITY_TYPE.IMAGE) { let data = entity.getData(); let src = data.src || ''; let alt = data.alt ? ` "${escapeTitle(data.alt)}"` : ''; diff --git a/test/test-cases.txt b/test/test-cases.txt index 972f0dd..799d13a 100644 --- a/test/test-cases.txt +++ b/test/test-cases.txt @@ -18,8 +18,8 @@ _Bold_**Italic** {"entityMap":{"0":{"type":"IMAGE","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":"x"}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} Hello![ "x"](/a.jpg)World. ->> Image with empty alt and type written in lower case -{"entityMap":{"0":{"type":"image","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":""}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} +>> Image with empty alt +{"entityMap":{"0":{"type":"IMAGE","mutability":"MUTABLE","data":{"src":"/a.jpg","alt":""}}},"blocks":[{"key":"f131g","text":"Hello World.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":5,"length":1,"key":0}]}]} Hello![](/a.jpg)World. >> Link without title From 6faa3d325b28bde36c6bd175930da218d02260fb Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Thu, 19 May 2016 08:29:35 -0500 Subject: [PATCH 14/20] peer dependency versions to be less strict --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 88be38c..4c3f06a 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "draft-js-utils": "^0.1.4" }, "peerDependencies": { - "draft-js": "^0.5.0", - "immutable": "^3.8.0" + "draft-js": ">=0.5.0", + "immutable": "3.x.x" }, "devDependencies": { "babel-cli": "^6.7.5", From 6f8f9c59f765d5a19e55e0a9fba845d03f648a75 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Thu, 19 May 2016 08:37:28 -0500 Subject: [PATCH 15/20] update versions of dependencies --- package.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 4c3f06a..b94bc23 100644 --- a/package.json +++ b/package.json @@ -12,29 +12,29 @@ "test-src": "mocha src/__tests__/*.js src/**/__tests__/*.js" }, "dependencies": { - "draft-js-utils": "^0.1.4" + "draft-js-utils": "^0.1.5" }, "peerDependencies": { "draft-js": ">=0.5.0", "immutable": "3.x.x" }, "devDependencies": { - "babel-cli": "^6.7.5", - "babel-core": "^6.7.6", - "babel-eslint": "^6.0.2", - "babel-plugin-transform-class-properties": "^6.6.0", - "babel-preset-es2015": "^6.6.0", + "babel-cli": "^6.9.0", + "babel-core": "^6.9.0", + "babel-eslint": "^6.0.4", + "babel-plugin-transform-class-properties": "^6.9.0", + "babel-preset-es2015": "^6.9.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-2": "^6.5.0", - "eslint": "^2.8.0", + "eslint": "^2.10.2", "eslint-plugin-babel": "^3.2.0", - "eslint-plugin-flow-vars": "^0.3.0", - "eslint-plugin-react": "^4.3.0", - "expect": "^1.16.0", - "flow-bin": "^0.23.0", + "eslint-plugin-flow-vars": "^0.4.0", + "eslint-plugin-react": "^5.1.1", + "expect": "^1.20.1", + "flow-bin": "^0.25.0", "mocha": "^2.4.5", - "react": "^15.0.1", - "react-dom": "^15.0.1" + "react": "^15.0.2", + "react-dom": "^15.0.2" }, "repository": { "type": "git", From 74e07a27a59d81dc37e35f253a15830fede05ad2 Mon Sep 17 00:00:00 2001 From: Simon Sturmer Date: Thu, 19 May 2016 08:38:04 -0500 Subject: [PATCH 16/20] 0.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b94bc23..1ed5b17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "draft-js-export-markdown", - "version": "0.1.6", + "version": "0.2.0", "description": "DraftJS: Export ContentState to Markdown", "main": "lib/main.js", "scripts": { From a4cb949a480d94d7a6a4db0e9f514aec3b86a2a7 Mon Sep 17 00:00:00 2001 From: Waldir Pimenta Date: Thu, 7 Jul 2016 02:05:38 +0100 Subject: [PATCH 17/20] fix license name (#11) per package.json and the contents of the LICENSE file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd2d83c..6fe4451 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,4 @@ This project is still under development. If you want to help out, please open an ## License -This software is [BSD Licensed](/LICENSE). +This software is [ISC Licensed](/LICENSE). From a5bfba721f1319750f31f26fcce027d68b4009b3 Mon Sep 17 00:00:00 2001 From: Waldir Pimenta Date: Thu, 7 Jul 2016 02:09:16 +0100 Subject: [PATCH 18/20] add license title (#12) --- LICENSE | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LICENSE b/LICENSE index 2684d70..9197c59 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,5 @@ +ISC License + Copyright (c) 2016, Simon Sturmer Permission to use, copy, modify, and/or distribute this software for any From e6c76804d5450ac73b44de508a9f6c7f9fa54a6d Mon Sep 17 00:00:00 2001 From: Rose Robertson Date: Fri, 15 Jul 2016 21:31:51 -0700 Subject: [PATCH 19/20] Move text escaping methods to own utility file In the interest of improving regular expression performance, it makes sense to create each regular expression once, instead of re-creating every loop of `map`. These utility regular expressions and the methods that use them seemed better suited to their own file with documentation, so they can be tested individually. --- src/stateToMarkdown.js | 20 +++++--------------- src/utilities.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 src/utilities.js diff --git a/src/stateToMarkdown.js b/src/stateToMarkdown.js index c23f3ea..1c69b20 100644 --- a/src/stateToMarkdown.js +++ b/src/stateToMarkdown.js @@ -7,6 +7,11 @@ import { INLINE_STYLE, } from 'draft-js-utils'; import {Entity} from 'draft-js'; +import { + encodeContent, + encodeURL, + escapeTitle, +} from './utilities'; import type {ContentState, ContentBlock} from 'draft-js'; @@ -247,21 +252,6 @@ function canHaveDepth(blockType: any): boolean { } } -function encodeContent(text) { - return text.replace(/[*_`]/g, '\\$&'); -} - -// Encode chars that would normally be allowed in a URL but would conflict with -// our markdown syntax: `[foo](http://foo/)` -function encodeURL(url) { - return url.replace(/\)/g, '%29'); -} - -// Escape quotes using backslash. -function escapeTitle(text) { - return text.replace(/"/g, '\\"'); -} - export default function stateToMarkdown(content: ContentState): string { return new MarkupGenerator(content).generate(); } diff --git a/src/utilities.js b/src/utilities.js new file mode 100644 index 0000000..7e36c5a --- /dev/null +++ b/src/utilities.js @@ -0,0 +1,32 @@ +/* @flow */ +const BASIC_MARKDOWN_CHARS = /[*_`]/g; +const URL_MARKDOWN_CHARS = /\)/g; +const QUOTATIONS = /"/g; + +/** + * Escape chars (*, _) that have meaning in markdown so that they aren't interpreted as part of the markdown + * @param {string} text - the text to be replaced. + * @returns {string} +*/ +export function encodeContent(text: string) { + return text.replace(BASIC_MARKDOWN_CHARS, '\\$&'); +} + +/** + * Encode chars that would normally be allowed in a URL but would conflict with + * our markdown syntax: `[foo](http://foo/)` + * @param {string} url The url to be encoded. + * @returns {string} +*/ +export function encodeURL(url: string) { + return url.replace(URL_MARKDOWN_CHARS, '%29'); +} + +/** + * Escape quotes using backslash + * @param {string} text The string to be escaped + * @returns {string} +*/ +export function escapeTitle(text: string) { + return text.replace(QUOTATIONS, '\\"'); +} From 99d22f3952ffa5a129c3879e096581cc38441493 Mon Sep 17 00:00:00 2001 From: Rose Robertson Date: Fri, 15 Jul 2016 21:47:01 -0700 Subject: [PATCH 20/20] Add tests for utilities --- src/__tests__/utilities-test.js | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/__tests__/utilities-test.js diff --git a/src/__tests__/utilities-test.js b/src/__tests__/utilities-test.js new file mode 100644 index 0000000..d3e6c2d --- /dev/null +++ b/src/__tests__/utilities-test.js @@ -0,0 +1,46 @@ +/* @flow */ +const {describe, it} = global; +import expect from 'expect'; +import { + encodeContent, + encodeURL, + escapeTitle, +} from '../utilities'; + +describe('utilities', () => { + describe('encodeContent', () => { + it('should escape the * character', () => { + var result = encodeContent('Test * String ** Testing*'); + expect(result).toEqual('Test \\* String \\*\\* Testing\\*'); + }); + + it('should escape the _ character', () => { + var result = encodeContent('Test _ String __ Testing_'); + expect(result).toEqual('Test \\_ String \\_\\_ Testing\\_'); + }); + + it('should escape the ` character', () => { + var result = encodeContent('Test ` String `` Testing`'); + expect(result).toEqual('Test \\` String \\`\\` Testing\\`'); + }); + + it('should escape *, _, and ` characters', () => { + var result = encodeContent('Test ` String ** Testing_'); + expect(result).toEqual('Test \\` String \\*\\* Testing\\_'); + }); + }); + + describe('encodeURL', () => { + it('should escape the ) character', () => { + var result = encodeURL('https://google.com/hello)'); + expect(result).toEqual('https://google.com/hello%29'); + }); + }); + + describe('escapeTitle', () => { + it('should escape the " character', () => { + var result = escapeTitle('Test "Hello" Test'); + expect(result).toEqual('Test \\"Hello\\" Test'); + }); + }); +});