Skip to content

Commit

Permalink
Only mutate showdown.js if < 1.7.4
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonmit committed Mar 14, 2018
1 parent 14b7b76 commit 9865c65
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 161 deletions.
13 changes: 10 additions & 3 deletions addon/components/markdown-to-html.js
Expand Up @@ -25,16 +25,23 @@ const ShowdownComponent = Component.extend({
const owner = getOwner(this);

if (owner && owner.hasRegistration(CONFIG_LOOKUP)) {
this._globalOptions = (owner.resolveRegistration(CONFIG_LOOKUP) || {}).showdown;
this._globalOptions = (
owner.resolveRegistration(CONFIG_LOOKUP) || {}
).showdown;
}
},

html: computed('markdown', 'converter', function() {
let showdownOptions = this.getShowdownProperties(get(this, 'defaultOptionKeys'));
let showdownOptions = this.getShowdownProperties(
get(this, 'defaultOptionKeys')
);
let converter = get(this, 'converter');

for (let option in showdownOptions) {
if (showdownOptions.hasOwnProperty(option) && (typeof showdownOptions[option]) !== 'undefined') {
if (
showdownOptions.hasOwnProperty(option) &&
typeof showdownOptions[option] !== 'undefined'
) {
converter.setOption(option, showdownOptions[option]);
}
}
Expand Down
52 changes: 38 additions & 14 deletions index.js
Expand Up @@ -22,12 +22,14 @@ module.exports = {
let resolve = require('resolve');

return path.dirname(resolve.sync('showdown', { basedir: basedir }));
} catch(_) {
} catch (_) {
try {
return path.dirname(require.resolve('showdown'));
} catch(e) {
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND') {
this.ui.writeLine(`ember-cli-showdown: showdown not installed, be sure you have showdown installed via npm/yarn.`)
this.ui.writeLine(
`ember-cli-showdown: showdown not installed, be sure you have showdown installed via npm/yarn.`
);
return;
}

Expand All @@ -44,24 +46,46 @@ module.exports = {
include: ['showdown.js', 'showdown.js.map']
});

showdownTree = stringReplace(showdownTree, {
files: ['showdown.js'],
patterns: [
{
match: /\/\/# sourceMappingURL=showdown.js.map/g,
replacement: ''
}
]
});

let pkg = require(path.join(modulePath, '..', 'package.json'));

if (pkg) {
let version = pkg.version.split('.');

/* if version is >= 1.7.4, we do not need to remove 'typeof module !== 'undefined'' */
if (version.length >= 3) {
let major = parseInt(version[0], 10);
let minor = parseInt(version[1], 10);
let patch = parseInt(version[2], 10);

if (major >= 1 && minor >= 7 && patch >= 4) {
return showdownTree;
}
}
}

/*
* The stringReplace forces showdown's loader to use define.amd vs. commonjs/node.
* This allows us to use the vendored copy of showdown when the app is eval'd within node (fastboot).
* https://github.com/showdownjs/showdown/blob/5d2016c0c1fa2bd722e45b952f1e446c3c870d0f/src/loader.js#L4
*
* fixed here: https://github.com/showdownjs/showdown/pull/426 but cannot be relied on right now.
* we can do a semver showdown version check and take this path if showdown ver < patched ver
*/
return stringReplace(showdownTree, {
files: ['showdown.js'],
patterns: [{
match: /typeof module !== 'undefined'/g,
replacement: 'false'
},
{
match: /\/\/# sourceMappingURL=showdown.js.map/g,
replacement: ''
}]
patterns: [
{
match: /typeof module !== 'undefined'/g,
replacement: 'false'
}
]
});
}
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -29,7 +29,7 @@
"ember-cli-htmlbars": "^2.0.3",
"ember-cli-import-polyfill": "^0.2.0",
"ember-getowner-polyfill": "^2.0.1",
"showdown": "^1.7.3"
"showdown": "^1.7.4"
},
"devDependencies": {
"broccoli-asset-rev": "^2.4.5",
Expand Down
100 changes: 64 additions & 36 deletions tests/unit/components/markdown-to-html-test.js
@@ -1,5 +1,5 @@
import { run } from '@ember/runloop';
import showdown from 'showdown';
import { run } from '@ember/runloop';
import { moduleForComponent, test } from 'ember-qunit';

moduleForComponent('markdown-to-html', 'Unit | Component | markdown to html', {
Expand All @@ -9,7 +9,12 @@ moduleForComponent('markdown-to-html', 'Unit | Component | markdown to html', {
test('it renders', function(assert) {
assert.expect(1);
this.render();
assert.equal(this.$().text().trim(), '');
assert.equal(
this.$()
.text()
.trim(),
''
);
});

test('it produces markdown', function(assert) {
Expand All @@ -25,7 +30,14 @@ test('it produces markdown', function(assert) {
let expectedHtml = '<h2 id="helloworld">Hello, <a href="#">world</a></h2>';

assert.equal(component.get('html').toString(), expectedHtml);
assert.equal(component.$().html().toString().trim(), expectedHtml);
assert.equal(
component
.$()
.html()
.toString()
.trim(),
expectedHtml
);
});

test('it inserts <br> tag', function(assert) {
Expand All @@ -51,13 +63,17 @@ test('supports setting showdown options', function(assert) {
this.render();

run(function() {
component.set('markdown', '# title\nI ~~dislike~~ enjoy visiting http://www.google.com');
component.set(
'markdown',
'# title\nI ~~dislike~~ enjoy visiting http://www.google.com'
);
component.set('simplifiedAutoLink', true);
component.set('headerLevelStart', 3);
component.set('strikethrough', true);
});

let expectedHtml = '<h3 id="title">title</h3>\n<p>I <del>dislike</del> enjoy visiting <a href="http://www.google.com">http://www.google.com</a></p>';
let expectedHtml =
'<h3 id="title">title</h3>\n<p>I <del>dislike</del> enjoy visiting <a href="http://www.google.com">http://www.google.com</a></p>';

assert.equal(component.get('html').toString(), expectedHtml);
});
Expand All @@ -75,34 +91,40 @@ test('supports setting showdown options merged with global options', function(as
this.render();

run(function() {
component.set('markdown', '# title\nI ~~dislike~~ enjoy visiting http://www.google.com');
component.set(
'markdown',
'# title\nI ~~dislike~~ enjoy visiting http://www.google.com'
);
component.set('headerLevelStart', 3);
component.set('strikethrough', true);
});

let expectedHtml = '<h3 id="title">title</h3>\n<p>I <del>dislike</del> enjoy visiting <a href="http://www.google.com">http://www.google.com</a></p>';
let expectedHtml =
'<h3 id="title">title</h3>\n<p>I <del>dislike</del> enjoy visiting <a href="http://www.google.com">http://www.google.com</a></p>';

assert.equal(component.get('html').toString(), expectedHtml);
});

test('it supports loading showdown extensions', function(assert) {
assert.expect(1);

showdown.extension("demo", function() {
return [{
type: "lang",
regex: "this is an ember showdown!",
replace() {
return "no it isn't!";
showdown.extension('demo', function() {
return [
{
type: 'lang',
regex: 'this is an ember showdown!',
replace() {
return "no it isn't!";
}
}
}];
];
});

let component = this.subject({ extensions: ['demo'] });
this.render();

run(function() {
component.set("markdown", "this is an ember showdown!");
component.set('markdown', 'this is an ember showdown!');
});

let expectedHtml = "<p>no it isn't!</p>";
Expand All @@ -129,53 +151,59 @@ test('does not reset default showdown options with undefined', function(assert)
showdown.setOption('strikethrough', originalStrikeThroughValue);
});


test('it supports loading showdown extensions', function(assert) {
assert.expect(1);

showdown.extension("demo", function() {
return [{
type: "lang",
regex: /\sa\s/,
replace() {
return " an ember ";
showdown.extension('demo', function() {
return [
{
type: 'lang',
regex: /\sa\s/,
replace() {
return ' an ember ';
}
}
}];
];
});

showdown.extension("excited", function() {
return [{
type: "lang",
regex: /showdown/,
replace() {
return "showdown!";
showdown.extension('excited', function() {
return [
{
type: 'lang',
regex: /showdown/,
replace() {
return 'showdown!';
}
}
}];
];
});

let component = this.subject({ extensions: 'demo excited' });
this.render();

run(function() {
component.set("markdown", "this is a showdown");
component.set('markdown', 'this is a showdown');
});

let expectedHtml = "<p>this is an ember showdown!</p>";
let expectedHtml = '<p>this is an ember showdown!</p>';
assert.equal(component.get('html').toString(), expectedHtml);
});


test('it does not munge code fences', function(assert) {
assert.expect(1);

let component = this.subject();
this.render();

run(function() {
component.set("ghCodeBlocks", true);
component.set("markdown", "```html\n<strong>hello</strong>\n<em>world</em>\n```");
component.set('ghCodeBlocks', true);
component.set(
'markdown',
'```html\n<strong>hello</strong>\n<em>world</em>\n```'
);
});

let expectedHtml = "<pre><code class=\"html language-html\">&lt;strong&gt;hello&lt;/strong&gt;\n&lt;em&gt;world&lt;/em&gt;\n</code></pre>";
let expectedHtml =
'<pre><code class="html language-html">&lt;strong&gt;hello&lt;/strong&gt;\n&lt;em&gt;world&lt;/em&gt;\n</code></pre>';
assert.equal(component.get('html').toString(), expectedHtml);
});

0 comments on commit 9865c65

Please sign in to comment.