diff --git a/browser/components/CodeEditor.js b/browser/components/CodeEditor.js index 76c7be66..fcea5dd7 100644 --- a/browser/components/CodeEditor.js +++ b/browser/components/CodeEditor.js @@ -14,6 +14,8 @@ import { import TextEditorInterface from 'browser/lib/TextEditorInterface' import eventEmitter from 'browser/main/lib/eventEmitter' import iconv from 'iconv-lite' + +import { isMarkdownTitleURL } from 'browser/lib/utils' import styles from '../components/CodeEditor.styl' const { ipcRenderer, remote, clipboard } = require('electron') import normalizeEditorFontFamily from 'browser/lib/normalizeEditorFontFamily' @@ -861,9 +863,11 @@ export default class CodeEditor extends React.Component { } const pastedTxt = clipboard.readText() - + console.log(pastedTxt); if (isInFencedCodeBlock(editor)) { this.handlePasteText(editor, pastedTxt) + } else if (fetchUrlTitle && isMarkdownTitleURL(pastedTxt) && !isInLinkTag(editor)) { + this.handlePasteUrl(editor, pastedTxt) } else if (fetchUrlTitle && isURL(pastedTxt) && !isInLinkTag(editor)) { this.handlePasteUrl(editor, pastedTxt) } else if (attachmentManagement.isAttachmentLink(pastedTxt)) { @@ -904,8 +908,18 @@ export default class CodeEditor extends React.Component { } } - handlePasteUrl (editor, pastedTxt) { - const taggedUrl = `<${pastedTxt}>` + handlePasteUrl(editor, pastedTxt) { + let taggedUrl = `<${pastedTxt}>` + let urlToFetch = pastedTxt; + let titleMark = ''; + + if (isMarkdownTitleURL(pastedTxt)) { + const pastedTxtSplitted = pastedTxt.split(' ') + titleMark = `${pastedTxtSplitted[0]} `; + urlToFetch = pastedTxtSplitted[1]; + taggedUrl = `<${urlToFetch}>` + } + editor.replaceSelection(taggedUrl) const isImageReponse = response => { @@ -917,22 +931,23 @@ export default class CodeEditor extends React.Component { const replaceTaggedUrl = replacement => { const value = editor.getValue() const cursor = editor.getCursor() - const newValue = value.replace(taggedUrl, replacement) + const newValue = titleMark + value.replace(taggedUrl, replacement) const newCursor = Object.assign({}, cursor, { - ch: cursor.ch + newValue.length - value.length + ch: cursor.ch + newValue.length - (value.length - titleMark.length) }) + editor.setValue(newValue) editor.setCursor(newCursor) } - fetch(pastedTxt, { + fetch(urlToFetch, { method: 'get' }) .then(response => { if (isImageReponse(response)) { - return this.mapImageResponse(response, pastedTxt) + return this.mapImageResponse(response, urlToFetch) } else { - return this.mapNormalResponse(response, pastedTxt) + return this.mapNormalResponse(response, urlToFetch) } }) .then(replacement => { diff --git a/browser/lib/utils.js b/browser/lib/utils.js index 1d15b722..4bcc9698 100644 --- a/browser/lib/utils.js +++ b/browser/lib/utils.js @@ -132,8 +132,13 @@ export function isObjectEqual (a, b) { return true } +export function isMarkdownTitleURL (str) { + return /(^#{1,6}\s)(?:\w+:|^)\/\/(?:[^\s\.]+\.\S{2}|localhost[\:?\d]*)/.test(str) +} + export default { lastFindInArray, escapeHtmlCharacters, - isObjectEqual + isObjectEqual, + isMarkdownTitleURL } diff --git a/tests/lib/utils.test.js b/tests/lib/utils.test.js new file mode 100644 index 00000000..d696eb29 --- /dev/null +++ b/tests/lib/utils.test.js @@ -0,0 +1,14 @@ +import test from 'ava' +import { isMarkdownTitleURL } from '../../browser/lib/utils' + +test('isMarkdownTitleURL returns true for valid Markdown title with url', (t) => { + t.true(isMarkdownTitleURL('# https://validurl.com')) + t.true(isMarkdownTitleURL('## https://validurl.com')) + t.true(isMarkdownTitleURL('###### https://validurl.com')) +}) + +test('isMarkdownTitleURL returns true for invalid Markdown title with url', (t) => { + t.false(isMarkdownTitleURL('1 https://validurl.com')) + t.false(isMarkdownTitleURL('24 https://validurl.com')) + t.false(isMarkdownTitleURL('####### https://validurl.com')) +})