From 607cb6a5cde6d7b659938ab5b71ad34fb91312a9 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Sun, 6 May 2018 22:53:04 -0600 Subject: [PATCH 01/14] add markdownPreview component --- package.json | 2 + .../component/markdownPreview/index.js | 8 + .../component/markdownPreview/view.jsx | 54 +++ yarn.lock | 349 +++++++++++++++++- 4 files changed, 407 insertions(+), 6 deletions(-) create mode 100644 src/renderer/component/markdownPreview/index.js create mode 100644 src/renderer/component/markdownPreview/view.jsx diff --git a/package.json b/package.json index f70d259c8..08ac94889 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,8 @@ "redux-persist-transform-compress": "^4.2.0", "redux-persist-transform-filter": "0.0.16", "redux-thunk": "^2.2.0", + "remark": "^9.0.0", + "remark-react": "^4.0.3", "render-media": "^2.12.0", "reselect": "^3.0.0", "semver": "^5.3.0", diff --git a/src/renderer/component/markdownPreview/index.js b/src/renderer/component/markdownPreview/index.js new file mode 100644 index 000000000..b84658fb3 --- /dev/null +++ b/src/renderer/component/markdownPreview/index.js @@ -0,0 +1,8 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import MarkdownPreview from './view'; + +const select = () => ({}); +const perform = () => ({}); + +export default connect(select, perform)(MarkdownPreview); diff --git a/src/renderer/component/markdownPreview/view.jsx b/src/renderer/component/markdownPreview/view.jsx new file mode 100644 index 000000000..7b1ac6b79 --- /dev/null +++ b/src/renderer/component/markdownPreview/view.jsx @@ -0,0 +1,54 @@ +// @flow +import * as React from 'react'; +import remark from 'remark'; +import reactRenderer from 'remark-react'; +import Button from 'component/button'; + +type Props = { + children: React.Node, +}; + +const TitleMarkdown = (props: Props) => { + const { children } = props; + return
{children}
; +}; + +const LinkMarkDown = (props: Props) => { + const { children } = props; + return ( + + ); +}; + +type MarkdownProps = { + content: string, +}; + +const MarkdownPreview = (props: MarkdownProps) => { + const { content } = props; + const remarkOptions = { + sanatize: true, + remarkReactComponents: { + a: LinkMarkDown, + h1: TitleMarkdown, + h2: TitleMarkdown, + h3: TitleMarkdown, + h4: TitleMarkdown, + h5: TitleMarkdown, + h6: TitleMarkdown, + }, + }; + return ( +
+ { + remark() + .use(reactRenderer, remarkOptions) + .processSync(content).contents + } +
+ ); +}; + +export default MarkdownPreview; diff --git a/yarn.lock b/yarn.lock index 9ecf1eafd..367c330d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -131,6 +131,12 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@mapbox/hast-util-table-cell-style@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz#5b7166ae01297d72216932b245e4b2f0b642dca6" + dependencies: + unist-util-visit "^1.3.0" + "@octokit/rest@^15.2.6": version "15.2.6" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.2.6.tgz#16226f58fbf0ba88f631848fb622dfe0ad410c0c" @@ -399,6 +405,10 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" +array-iterate@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-1.1.2.tgz#f66a57e84426f8097f4197fbb6c051b8e5cdf7d8" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1244,6 +1254,10 @@ babylon@^6.18.0, babylon@^6.7.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" +bail@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3" + balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -1745,6 +1759,10 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" +ccount@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff" + center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" @@ -1780,6 +1798,22 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +character-entities-html4@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.2.tgz#c44fdde3ce66b52e8d321d6c1bf46101f0150610" + +character-entities-legacy@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c" + +character-entities@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.2.tgz#58c8f371c0774ef0ba9b2aca5f00d8f100e6e363" + +character-reference-invalid@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz#21e421ad3d84055952dab4a43a04e73cd425d3ed" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -1979,6 +2013,10 @@ codemirror@*: version "5.37.0" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.37.0.tgz#c349b584e158f590277f26d37c2469a6bc538036" +collapse-white-space@^1.0.0, collapse-white-space@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.4.tgz#ce05cf49e54c3277ae573036a26851ba430a0091" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2040,6 +2078,12 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz#b13793131d9ea2d2431cf5b507ddec258f0ce0db" + dependencies: + trim "0.0.1" + commander@2.15.x, commander@^2.11.0, commander@^2.13.0, commander@^2.14.1, commander@^2.5.0, commander@^2.9.0, commander@~2.15.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -2629,7 +2673,7 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -define-properties@^1.1.2: +define-properties@^1.1.1, define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" dependencies: @@ -2709,6 +2753,12 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" +detab@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.1.tgz#531f5e326620e2fd4f03264a905fb3bcc8af4df4" + dependencies: + repeat-string "^1.5.4" + detect-indent@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" @@ -3769,7 +3819,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0, extend@~3.0.1: +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -4577,6 +4627,24 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" +hast-to-hyperscript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-4.0.0.tgz#3eb25483ec72a8e9a71e4b1ad7eb8f7c86f755db" + dependencies: + comma-separated-tokens "^1.0.0" + is-nan "^1.2.1" + kebab-case "^1.0.0" + property-information "^3.0.0" + space-separated-tokens "^1.0.0" + trim "0.0.1" + unist-util-is "^2.0.0" + +hast-util-sanitize@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-1.1.2.tgz#d10bd6757a21e59c13abc8ae3530dd3b6d7d679e" + dependencies: + xtend "^4.0.1" + hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -5011,6 +5079,21 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.2.tgz#1fa6e49213cb7885b75d15862fb3f3d96c884f41" + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + +is-alphanumerical@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz#1138e9ae5040158dc6ff76b820acd6b7a181fd40" + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5025,7 +5108,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.1: +is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -5061,6 +5144,10 @@ is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" +is-decimal@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.2.tgz#894662d6a8709d307f3a276ca4339c8fa5dff0ff" + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -5151,6 +5238,10 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -5172,6 +5263,12 @@ is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" +is-nan@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2" + dependencies: + define-properties "^1.1.1" + is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" @@ -5314,6 +5411,10 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +is-whitespace-character@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz#ede53b4c6f6fb3874533751ec9280d01928d03ed" + is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" @@ -5322,6 +5423,10 @@ is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" +is-word-character@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.2.tgz#46a5dac3f2a1840898b91e576cd40d493f3ae553" + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -5680,6 +5785,10 @@ jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: dependencies: array-includes "^3.0.3" +kebab-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/kebab-case/-/kebab-case-1.0.0.tgz#3f9e4990adcad0c686c0e701f7645868f75f91eb" + keytar@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/keytar/-/keytar-4.2.1.tgz#8a06a6577fdf6373e0aa6b112277e63dec77fd12" @@ -6056,6 +6165,10 @@ loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" +longest-streak@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -6123,6 +6236,14 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-escapes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122" + +markdown-table@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.2.tgz#c78db948fa879903a41bce522e3b96f801c63786" + marked@*: version "0.3.19" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" @@ -6150,7 +6271,36 @@ md5@^2.1.0: crypt "~0.0.1" is-buffer "~1.1.1" -"mdurl@~ 1.0.1": +mdast-util-compact@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz#cdb5f84e2b6a2d3114df33bd05d9cb32e3c4083a" + dependencies: + unist-util-modify-children "^1.0.0" + unist-util-visit "^1.1.0" + +mdast-util-definitions@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-1.2.2.tgz#673f4377c3e23d3de7af7a4fe2214c0e221c5ac7" + dependencies: + unist-util-visit "^1.0.0" + +mdast-util-to-hast@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-3.0.0.tgz#69e367fb2a9eb02474dfc017733b8fd272d55d3a" + dependencies: + collapse-white-space "^1.0.0" + detab "^2.0.0" + mdast-util-definitions "^1.2.0" + mdurl "^1.0.1" + trim "0.0.1" + trim-lines "^1.0.0" + unist-builder "^1.0.1" + unist-util-generated "^1.1.0" + unist-util-position "^3.0.0" + unist-util-visit "^1.1.0" + xtend "^4.0.1" + +mdurl@^1.0.1, "mdurl@~ 1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -6952,6 +7102,17 @@ parse-diff@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/parse-diff/-/parse-diff-0.4.2.tgz#b173390e916564e8c70ccd37756047941e5b3ef2" +parse-entities@^1.0.2, parse-entities@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.2.tgz#9eaf719b29dc3bd62246b4332009072e01527777" + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-git-config@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-2.0.2.tgz#9f3154b069aefa747b199cbf95fefd2e749f7b36" @@ -7521,6 +7682,10 @@ prop-types@^15.5.1, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.8, loose-envify "^1.3.1" object-assign "^4.1.1" +property-information@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-3.2.0.tgz#fd1483c8fbac61808f5fe359e7693a1f48a58331" + proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" @@ -8037,6 +8202,62 @@ relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" +remark-parse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-react@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/remark-react/-/remark-react-4.0.3.tgz#980938f3bcc93bef220215b26b0b0a80f3158c7d" + dependencies: + "@mapbox/hast-util-table-cell-style" "^0.1.3" + hast-to-hyperscript "^4.0.0" + hast-util-sanitize "^1.0.0" + mdast-util-to-hast "^3.0.0" + +remark-stringify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-5.0.0.tgz#336d3a4d4a6a3390d933eeba62e8de4bd280afba" + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^1.1.0" + mdast-util-compact "^1.0.0" + parse-entities "^1.0.2" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^1.0.1" + unherit "^1.0.4" + xtend "^4.0.1" + +remark@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-9.0.0.tgz#c5cfa8ec535c73a67c4b0f12bfdbd3a67d8b2f60" + dependencies: + remark-parse "^5.0.0" + remark-stringify "^5.0.0" + unified "^6.0.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -8065,7 +8286,7 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -8081,6 +8302,10 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" @@ -8647,6 +8872,12 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +space-separated-tokens@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz#e95ab9d19ae841e200808cd96bc7bd0adbbb3412" + dependencies: + trim "0.0.1" + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -8738,6 +8969,10 @@ stat-mode@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" +state-toggle@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.1.tgz#c3cb0974f40a6a0f8e905b96789eb41afa1cde3a" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -8846,6 +9081,15 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +stringify-entities@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7" + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-hexadecimal "^1.0.0" + stringify-object@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd" @@ -9180,6 +9424,10 @@ tree-kill@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" +trim-lines@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.1.tgz#da738ff58fa74817588455e30b11b85289f2a396" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -9188,10 +9436,18 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +trim-trailing-lines@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz#e0ec0810fd3c3f1730516b45f49083caaf2774d9" + trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" +trough@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535" + "true-case-path@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" @@ -9314,6 +9570,24 @@ underscore@>1.4.4: version "1.9.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.0.tgz#31dbb314cfcc88f169cd3692d9149d81a00a73e4" +unherit@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.1.tgz#132748da3e88eab767e08fabfbb89c5e9d28628c" + dependencies: + inherits "^2.0.1" + xtend "^4.0.1" + +unified@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^2.0.0" + x-is-string "^0.1.0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -9355,6 +9629,46 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unist-builder@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-1.0.2.tgz#8c3b9903ef64bcfb117dd7cf6a5d98fc1b3b27b6" + dependencies: + object-assign "^4.1.0" + +unist-util-generated@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.2.tgz#8b993f9239d8e560be6ee6e91c3f7b7208e5ce25" + +unist-util-is@^2.0.0, unist-util-is@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.2.tgz#1193fa8f2bfbbb82150633f3a8d2eb9a1c1d55db" + +unist-util-modify-children@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz#c7f1b91712554ee59c47a05b551ed3e052a4e2d1" + dependencies: + array-iterate "^1.0.0" + +unist-util-position@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.0.1.tgz#8e220c24658239bf7ddafada5725ed0ea1ebbc26" + +unist-util-remove-position@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz#86b5dad104d0bbfbeb1db5f5c92f3570575c12cb" + dependencies: + unist-util-visit "^1.1.0" + +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + +unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.1.tgz#c019ac9337a62486be58531bc27e7499ae7d55c7" + dependencies: + unist-util-is "^2.1.1" + universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" @@ -9541,6 +9855,25 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-location@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.3.tgz#083ba80e50968e8d420be49dd1ea9a992131df77" + +vfile-message@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.0.1.tgz#51a2ccd8a6b97a7980bb34efb9ebde9632e93677" + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" + dependencies: + is-buffer "^1.1.4" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + videostream@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.4.2.tgz#9560254d00fabdc40955c1a3c282057d8db1d115" @@ -9827,6 +10160,10 @@ ws@^4.0.0: async-limiter "~1.0.0" safe-buffer "~5.1.0" +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -9881,7 +10218,7 @@ xss-filters@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/xss-filters/-/xss-filters-1.2.7.tgz#59fa1de201f36f2f3470dcac5f58ccc2830b0a9a" -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" From 8d99c53b6800f2182413f3f3892d846872bbc489 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Sun, 6 May 2018 22:56:18 -0600 Subject: [PATCH 02/14] implement new markdownPreview component --- src/renderer/component/fileDetails/view.jsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/renderer/component/fileDetails/view.jsx b/src/renderer/component/fileDetails/view.jsx index e49af3417..e23fc8c50 100644 --- a/src/renderer/component/fileDetails/view.jsx +++ b/src/renderer/component/fileDetails/view.jsx @@ -1,6 +1,6 @@ // @flow import * as React from 'react'; -import ReactMarkdown from 'react-markdown'; +import MarkdownPreview from 'component/markdownPreview'; import Button from 'component/button'; import path from 'path'; @@ -40,11 +40,7 @@ const FileDetails = (props: Props) => {
About
- +
)} From 28ec971be9fe0182808fc29389d1b5016a6cd292 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Sun, 6 May 2018 22:59:33 -0600 Subject: [PATCH 03/14] fix markdown styles #1179 --- src/renderer/scss/all.scss | 1 + .../scss/component/_markdown-preview.scss | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/renderer/scss/component/_markdown-preview.scss diff --git a/src/renderer/scss/all.scss b/src/renderer/scss/all.scss index ab9b445d8..0055ca6d0 100644 --- a/src/renderer/scss/all.scss +++ b/src/renderer/scss/all.scss @@ -17,6 +17,7 @@ @import 'component/_snack-bar.scss'; @import 'component/_content.scss'; @import 'component/_pagination.scss'; +@import 'component/_markdown-preview.scss'; @import 'component/_markdown-editor.scss'; @import 'component/_scrollbar.scss'; @import 'component/_spinner.scss'; diff --git a/src/renderer/scss/component/_markdown-preview.scss b/src/renderer/scss/component/_markdown-preview.scss new file mode 100644 index 000000000..51ed84cbf --- /dev/null +++ b/src/renderer/scss/component/_markdown-preview.scss @@ -0,0 +1,50 @@ +.markdown-preview { + margin: 0; +} + +.markdown-preview__title { + font-family: 'metropolis-semibold'; + font-size: 1.35em; + margin: 16px 0; +} + +.markdown-preview blockquote { + padding: 8px; + margin: 16px 0; + color: var(--color-help); + border-left: 2px solid var(--color-help); + background-color: var(--color-bg-alt); +} + +.markdown-preview table { + padding: 8px; + margin: 16px 0; + background-color: var(--card-bg); + + tr td, + tr th, + tr td:first-of-type, + tr th:first-of-type, + tr td:last-of-type, + tr th:last-of-type { + padding: 8px; + } +} + +.markdown-preview code { + display: block; + padding: 8px; + margin: 16px 0; + background-color: var(--color-bg-alt); + color: var(--color-help); + font-size: 1em; + font-family: Consolas, 'Lucida Console', 'Source Sans', monospace; +} + +.markdown-preview hr { + border: 1px solid var(--color-divider); +} + +.markdown-preview del { + color: var(--color-help); +} From bf59b1a54656e1dee10718785758d20681a3be92 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Sun, 6 May 2018 23:03:30 -0600 Subject: [PATCH 04/14] update changelog --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d8c212bd..0a072ed2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,16 +18,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). * Add flair to snackbar ([#1313](https://github.com/lbryio/lbry-app/pull/1313)) ### Fixed - * Black screen on macOS after maximizing LBRY and then closing ([#1235](https://github.com/lbryio/lbry-app/pull/1235)) * Fix content-type not shown correctly in file description ([#863](https://github.com/lbryio/lbry-app/pull/863)) * Fix [Flow](https://flow.org/) ([#1197](https://github.com/lbryio/lbry-app/pull/1197)) - * Black screen on macOS after maximizing LBRY and then closing ([#1235](https://github.com/lbryio/lbry-app/pull/1235)) + * Fix black screen on macOS after maximizing LBRY and then closing ([#1235](https://github.com/lbryio/lbry-app/pull/1235)) * Fix dark theme ([#1034](https://github.com/lbryio/lbry-app/issues/1034)) * Fix download percentage indicator overlay ([#1271](https://github.com/lbryio/lbry-app/issues/1271)) * Fix alternate row shading for transactions on dark theme ([#1355](https://github.com/lbryio/lbry-app/issues/#1355)) * Fix Description box on Publish (dark theme) ([#1356](https://github.com/lbryio/lbry-app/issues/#1356)) - * Fix spacing in search suggestions ([#1422])(https://github.com/lbryio/lbry-app/pull/1422)) - * Fix text/HTML files don't display correctly in-app anymore ([#1379])(https://github.com/lbryio/lbry-app/issues/1379) + * Fix spacing in search suggestions ([#1422](https://github.com/lbryio/lbry-app/pull/1422)) + * Fix text/HTML files don't display correctly in-app anymore ([#1379](https://github.com/lbryio/lbry-app/issues/1379) + * Fix markdown render ([#1179](https://github.com/lbryio/lbry-app/issues/1179) ## [0.21.3] - 2018-04-23 From b51d87fb01a2471dd2a93f538db9fd688a192585 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Sun, 6 May 2018 23:13:30 -0600 Subject: [PATCH 05/14] fix markdown table styles --- src/renderer/scss/component/_table.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/scss/component/_table.scss b/src/renderer/scss/component/_table.scss index d0db6f593..399789ea7 100644 --- a/src/renderer/scss/component/_table.scss +++ b/src/renderer/scss/component/_table.scss @@ -1,4 +1,5 @@ -table.table { +table.table, +.markdown-preview table { word-wrap: break-word; max-width: 100%; text-align: left; From 66ff07697ffc0f73cfcc7a730a5595bc7cd43567 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Wed, 9 May 2018 18:21:54 -0600 Subject: [PATCH 06/14] add confirmation modal for external links --- src/renderer/component/externalLink/index.js | 11 ++++++ src/renderer/component/externalLink/view.jsx | 34 ++++++++++++++++ .../component/markdownPreview/view.jsx | 36 ++++++----------- .../modal/modalOpenExternalLink/index.js | 11 ++++++ .../modal/modalOpenExternalLink/view.jsx | 39 +++++++++++++++++++ src/renderer/modal/modalRouter/view.jsx | 3 ++ 6 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 src/renderer/component/externalLink/index.js create mode 100644 src/renderer/component/externalLink/view.jsx create mode 100644 src/renderer/modal/modalOpenExternalLink/index.js create mode 100644 src/renderer/modal/modalOpenExternalLink/view.jsx diff --git a/src/renderer/component/externalLink/index.js b/src/renderer/component/externalLink/index.js new file mode 100644 index 000000000..806dd7499 --- /dev/null +++ b/src/renderer/component/externalLink/index.js @@ -0,0 +1,11 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { doNotify } from 'lbry-redux'; +import ExternalLink from './view'; + +const select = () => ({}); +const perform = dispatch => ({ + openModal: (modal, props) => dispatch(doNotify(modal, props)), +}); + +export default connect(select, perform)(ExternalLink); diff --git a/src/renderer/component/externalLink/view.jsx b/src/renderer/component/externalLink/view.jsx new file mode 100644 index 000000000..7f2bf9928 --- /dev/null +++ b/src/renderer/component/externalLink/view.jsx @@ -0,0 +1,34 @@ +// @flow +import React from 'react'; +import { MODALS } from 'lbry-redux'; +import Button from 'component/button'; + +type Props = { + href?: string, + title?: string, + children: React.Node, + openModal: string => void, +}; + +class ExternalLink extends React.PureComponent { + static defaultProps = { + href: null, + title: null, + }; + render() { + const { href, title, children, openModal } = this.props; + return href ? ( + + ) : ( + children + ); + } +} + +export default ExternalLink; diff --git a/src/renderer/component/markdownPreview/view.jsx b/src/renderer/component/markdownPreview/view.jsx index 7b1ac6b79..0dc36526f 100644 --- a/src/renderer/component/markdownPreview/view.jsx +++ b/src/renderer/component/markdownPreview/view.jsx @@ -2,42 +2,28 @@ import * as React from 'react'; import remark from 'remark'; import reactRenderer from 'remark-react'; -import Button from 'component/button'; +import ExternalLink from 'component/externalLink'; -type Props = { - children: React.Node, -}; +type MarkdownProps = { content: string }; +type TitleProps = { children: React.Node }; -const TitleMarkdown = (props: Props) => { +const MarkdownTitle = (props: TitleProps) => { const { children } = props; return
{children}
; }; -const LinkMarkDown = (props: Props) => { - const { children } = props; - return ( - - ); -}; - -type MarkdownProps = { - content: string, -}; - const MarkdownPreview = (props: MarkdownProps) => { const { content } = props; const remarkOptions = { sanatize: true, remarkReactComponents: { - a: LinkMarkDown, - h1: TitleMarkdown, - h2: TitleMarkdown, - h3: TitleMarkdown, - h4: TitleMarkdown, - h5: TitleMarkdown, - h6: TitleMarkdown, + a: ExternalLink, + h1: MarkdownTitle, + h2: MarkdownTitle, + h3: MarkdownTitle, + h4: MarkdownTitle, + h5: MarkdownTitle, + h6: MarkdownTitle, }, }; return ( diff --git a/src/renderer/modal/modalOpenExternalLink/index.js b/src/renderer/modal/modalOpenExternalLink/index.js new file mode 100644 index 000000000..6efc9efbe --- /dev/null +++ b/src/renderer/modal/modalOpenExternalLink/index.js @@ -0,0 +1,11 @@ +import { connect } from 'react-redux'; +import { doHideNotification } from 'lbry-redux'; +import ModalOpenExternalLink from './view'; + +const select = () => ({}); + +const perform = dispatch => ({ + closeModal: () => dispatch(doHideNotification()), +}); + +export default connect(select, perform)(ModalOpenExternalLink); diff --git a/src/renderer/modal/modalOpenExternalLink/view.jsx b/src/renderer/modal/modalOpenExternalLink/view.jsx new file mode 100644 index 000000000..ea18032d1 --- /dev/null +++ b/src/renderer/modal/modalOpenExternalLink/view.jsx @@ -0,0 +1,39 @@ +// @flow +import React from 'react'; +import { Modal } from 'modal/modal'; +import { shell } from 'electron'; + +type Props = { + url: string, + closeModal: () => void, +}; + +class ModalOpenExternalLink extends React.PureComponent { + openExternalLink() { + const { url } = this.props; + const { openExternal } = shell; + openExternal(url); + } + + render() { + const { url, closeModal } = this.props; + return ( + this.openExternalLink(url)} + onAborted={closeModal} + > +

+ {__('This link leads to an external website:')} + {url} + {__('LBRY Inc is not responsible for its content, click OK to proceed at your own risk.')} +

+
+ ); + } +} + +export default ModalOpenExternalLink; diff --git a/src/renderer/modal/modalRouter/view.jsx b/src/renderer/modal/modalRouter/view.jsx index e425dddf0..8e4402372 100644 --- a/src/renderer/modal/modalRouter/view.jsx +++ b/src/renderer/modal/modalRouter/view.jsx @@ -21,6 +21,7 @@ import ModalFirstSubscription from 'modal/modalFirstSubscription'; import ModalSendTip from '../modalSendTip'; import ModalPublish from '../modalPublish'; import ModalSearch from '../modalSearch'; +import ModalOpenExternalLink from '../modalOpenExternalLink'; class ModalRouter extends React.PureComponent { constructor(props) { @@ -155,6 +156,8 @@ class ModalRouter extends React.PureComponent { return ; case MODALS.SEARCH: return ; + case MODALS.CONFIRM_EXTERNAL_LINK: + return ; default: return null; } From 31b1494a5e692ea160c847a496db14c647f2bb8e Mon Sep 17 00:00:00 2001 From: btzr-io Date: Wed, 9 May 2018 20:47:08 -0600 Subject: [PATCH 07/14] update modal / message / styles --- src/renderer/component/button/view.jsx | 1 + src/renderer/component/externalLink/index.js | 1 - src/renderer/component/externalLink/view.jsx | 5 +++-- .../modal/modalOpenExternalLink/index.js | 4 +--- .../modal/modalOpenExternalLink/view.jsx | 18 ++++++++++++------ .../scss/component/_markdown-preview.scss | 16 ++++++++-------- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/renderer/component/button/view.jsx b/src/renderer/component/button/view.jsx index 9fe8e1dc3..f622ff28a 100644 --- a/src/renderer/component/button/view.jsx +++ b/src/renderer/component/button/view.jsx @@ -95,6 +95,7 @@ class Button extends React.PureComponent { ) : ( - ) : ( - children - ); + + // Regex for url protocol + const protocolRegex = new RegExp('^(https?|lbry)+:', 'i'); + const protocol = href ? protocolRegex.exec(href) : null; + + // Return plain text if no valid url + let element = {children}; + + // Return external link if protocol is http or https + if (protocol && (protocol[0] === 'http:' || protocol[0] === 'https:')) { + element = ( + + ); + } + + return element; + } + + render() { + const RenderLink = () => this.createLink(); + return ; } } diff --git a/src/renderer/modal/modalOpenExternalLink/view.jsx b/src/renderer/modal/modalOpenExternalLink/view.jsx index 7a92b75c1..76e8c4651 100644 --- a/src/renderer/modal/modalOpenExternalLink/view.jsx +++ b/src/renderer/modal/modalOpenExternalLink/view.jsx @@ -4,22 +4,22 @@ import { Modal } from 'modal/modal'; import { shell } from 'electron'; type Props = { - url: string, + uri: string, closeModal: () => void, }; class ModalOpenExternalLink extends React.PureComponent { openExternalLink() { - const { url, closeModal } = this.props; + const { uri, closeModal } = this.props; const { openExternal } = shell; - if (url) { - openExternal(url); + if (uri) { + openExternal(uri); } closeModal(); } render() { - const { url, closeModal } = this.props; + const { uri, closeModal } = this.props; return ( { >

Warning!

{__('This link leads to an external website.')}

-
{url}
+
{uri}

{__( 'LBRY Inc is not responsible for its content, click continue to proceed at your own risk.' From 8127db345bfb1f930b047982fe622a174f3fe1ea Mon Sep 17 00:00:00 2001 From: btzr-io Date: Fri, 11 May 2018 00:29:53 -0600 Subject: [PATCH 09/14] add code for local links --- src/renderer/component/externalLink/index.js | 2 ++ src/renderer/component/externalLink/view.jsx | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/renderer/component/externalLink/index.js b/src/renderer/component/externalLink/index.js index 3095951c7..795ad2172 100644 --- a/src/renderer/component/externalLink/index.js +++ b/src/renderer/component/externalLink/index.js @@ -1,9 +1,11 @@ import { connect } from 'react-redux'; import { doNotify } from 'lbry-redux'; +// import { doNavigate } from 'redux/actions/navigation'; import ExternalLink from './view'; const select = () => ({}); const perform = dispatch => ({ + // navigate: (path, params) => dispatch(doNavigate(path, params)), openModal: (modal, props) => dispatch(doNotify(modal, props)), }); diff --git a/src/renderer/component/externalLink/view.jsx b/src/renderer/component/externalLink/view.jsx index 27f98e040..44b1b1f71 100644 --- a/src/renderer/component/externalLink/view.jsx +++ b/src/renderer/component/externalLink/view.jsx @@ -7,6 +7,7 @@ type Props = { href: string, title?: string, children: React.Node, + // navigate: (string, ?{}) => void, openModal: ({ id: string }, { uri: string }) => void, }; @@ -40,6 +41,20 @@ class ExternalLink extends React.PureComponent { ); } + /* React-remark blocks the lbry protocol requires an external fix + // Return local link if valid lbry uri + if (protocol && protocol[0] === 'lbry:') { + element = ( + + ); + } */ + return element; } From ae7ae36702e680c04fd96b36ab56aa98a3678314 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Fri, 11 May 2018 01:41:22 -0600 Subject: [PATCH 10/14] add support for lbry protocol on sanitation schema --- package.json | 1 + src/renderer/component/externalLink/index.js | 4 ++-- src/renderer/component/externalLink/view.jsx | 16 ++++++---------- src/renderer/component/markdownPreview/view.jsx | 10 +++++++++- yarn.lock | 2 +- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index b07d6eef0..2a1d699a0 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "electron-window-state": "^4.1.1", "find-process": "^1.1.0", "formik": "^0.10.4", + "hast-util-sanitize": "^1.1.2", "keytar": "^4.2.1", "lbry-redux": "lbryio/lbry-redux", "localforage": "^1.7.1", diff --git a/src/renderer/component/externalLink/index.js b/src/renderer/component/externalLink/index.js index 795ad2172..2855016f2 100644 --- a/src/renderer/component/externalLink/index.js +++ b/src/renderer/component/externalLink/index.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux'; import { doNotify } from 'lbry-redux'; -// import { doNavigate } from 'redux/actions/navigation'; +import { doNavigate } from 'redux/actions/navigation'; import ExternalLink from './view'; const select = () => ({}); const perform = dispatch => ({ - // navigate: (path, params) => dispatch(doNavigate(path, params)), + navigate: (path, params) => dispatch(doNavigate(path, params)), openModal: (modal, props) => dispatch(doNotify(modal, props)), }); diff --git a/src/renderer/component/externalLink/view.jsx b/src/renderer/component/externalLink/view.jsx index 44b1b1f71..67fe10f60 100644 --- a/src/renderer/component/externalLink/view.jsx +++ b/src/renderer/component/externalLink/view.jsx @@ -7,7 +7,7 @@ type Props = { href: string, title?: string, children: React.Node, - // navigate: (string, ?{}) => void, + navigate: (string, ?{}) => void, openModal: ({ id: string }, { uri: string }) => void, }; @@ -18,7 +18,8 @@ class ExternalLink extends React.PureComponent { }; createLink() { - const { href, title, children, openModal } = this.props; + const { href, title, children, openModal, navigate } = this.props; + console.info(href); // Regex for url protocol const protocolRegex = new RegExp('^(https?|lbry)+:', 'i'); @@ -41,19 +42,14 @@ class ExternalLink extends React.PureComponent { ); } - /* React-remark blocks the lbry protocol requires an external fix - // Return local link if valid lbry uri + // Return local link if protocol is lbry uri if (protocol && protocol[0] === 'lbry:') { element = ( - ); - } */ + } return element; } diff --git a/src/renderer/component/markdownPreview/view.jsx b/src/renderer/component/markdownPreview/view.jsx index 0dc36526f..d3c8a314c 100644 --- a/src/renderer/component/markdownPreview/view.jsx +++ b/src/renderer/component/markdownPreview/view.jsx @@ -3,8 +3,16 @@ import * as React from 'react'; import remark from 'remark'; import reactRenderer from 'remark-react'; import ExternalLink from 'component/externalLink'; +import defaultSchema from 'hast-util-sanitize/lib/github.json'; + +// Use github sanitation schema +const schema = { ...defaultSchema }; + +// Extend sanitation schema to support lbry protocol +schema.protocols.href[3] = 'lbry'; type MarkdownProps = { content: string }; + type TitleProps = { children: React.Node }; const MarkdownTitle = (props: TitleProps) => { @@ -15,7 +23,7 @@ const MarkdownTitle = (props: TitleProps) => { const MarkdownPreview = (props: MarkdownProps) => { const { content } = props; const remarkOptions = { - sanatize: true, + sanitize: schema, remarkReactComponents: { a: ExternalLink, h1: MarkdownTitle, diff --git a/yarn.lock b/yarn.lock index 69fb54bea..996ffcebf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4608,7 +4608,7 @@ hast-to-hyperscript@^4.0.0: trim "0.0.1" unist-util-is "^2.0.0" -hast-util-sanitize@^1.0.0: +hast-util-sanitize@^1.0.0, hast-util-sanitize@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-1.1.2.tgz#d10bd6757a21e59c13abc8ae3530dd3b6d7d679e" dependencies: From 4935083fef359603c444933f53a2169fab4ac582 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Fri, 11 May 2018 09:14:08 -0600 Subject: [PATCH 11/14] add validation for uri --- src/renderer/component/externalLink/view.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/component/externalLink/view.jsx b/src/renderer/component/externalLink/view.jsx index 67fe10f60..2cd4a208b 100644 --- a/src/renderer/component/externalLink/view.jsx +++ b/src/renderer/component/externalLink/view.jsx @@ -1,6 +1,6 @@ // @flow import * as React from 'react'; -import { MODALS } from 'lbry-redux'; +import { MODALS, isURIValid } from 'lbry-redux'; import Button from 'component/button'; type Props = { @@ -43,7 +43,7 @@ class ExternalLink extends React.PureComponent { } // Return local link if protocol is lbry uri - if (protocol && protocol[0] === 'lbry:') { + if (protocol && protocol[0] === 'lbry:' && isURIValid(href)) { element = ( ); From 9260522aa857138fc125aa70ba60a40c2e4ee720 Mon Sep 17 00:00:00 2001 From: btzr-io Date: Fri, 11 May 2018 16:31:43 -0600 Subject: [PATCH 14/14] fix h6 font size --- src/renderer/scss/component/_markdown-preview.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/scss/component/_markdown-preview.scss b/src/renderer/scss/component/_markdown-preview.scss index d1841f690..53fa04924 100644 --- a/src/renderer/scss/component/_markdown-preview.scss +++ b/src/renderer/scss/component/_markdown-preview.scss @@ -34,7 +34,7 @@ } h6 { - font-size: 1em; + font-size: 0.84em; color: var(--color-help); } }