Skip to content

Commit

Permalink
룰 적용 구조 작업 resolve #3
Browse files Browse the repository at this point in the history
  • Loading branch information
Sungho Kim authored and seonim-ryu committed Feb 5, 2020
1 parent 62b8476 commit 740dc88
Show file tree
Hide file tree
Showing 8 changed files with 219 additions and 13 deletions.
4 changes: 4 additions & 0 deletions libs/to-mark/src/domRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ DomRunner.prototype.next = function() {
return node;
};

DomRunner.prototype.getNode = function() {
return this._current;
};

DomRunner.prototype._isNeedNextSearch = function(node, current) {
return !node && current !== this._root;
};
Expand Down
38 changes: 38 additions & 0 deletions libs/to-mark/src/renderer.basic.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
* @fileoverview Implements basicRenderer
* @author Sungho Kim(sungho-kim@nhnent.com) FE Development Team/NHN Ent.
*/

'use strict';

var Renderer = require('./renderer');

/**
* basicRenderer
* @exports basicRenderer
* @augments Renderer
*/
var basicRenderer = Renderer.factory({
'TEXT_NODE': function(runner) {
return runner.getNode().nodeValue;
},
'H1, H2, H3, H4, H5, H6': function(runner) {
var res;

res = '# ';

if (runner.getNode().childNodes.length) {
runner.next();
res += this.convert(runner);
}


return res;
},
'EM': function(runner) {
return '*' + runner.getNode().innerText + '*';
}
});


module.exports = basicRenderer;
72 changes: 72 additions & 0 deletions libs/to-mark/src/renderer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* @fileoverview Implements Renderer
* @author Sungho Kim(sungho-kim@nhnent.com) FE Development Team/NHN Ent.
*/

'use strict';

function forEachOwnProperties(obj, iteratee, context) {
var key;

context = context || null;

for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (iteratee.call(context, obj[key], key, obj) === false) {
break;
}
}
}
}

/**
* Renderer
* @exports Renderer
* @augments
* @constructor
* @param {object} rules rules to add
* @class
*/
function Renderer(rules) {
this.rules = {};

if (rules) {
this.addRules(rules);
}
}

Renderer.prototype.addRule = function(selectorString, converter) {
var selectors = selectorString.split(','),
selector = selectors.pop();

while (selector) {
this.rules[selector] = converter;
selector = selectors.pop();
}
};

Renderer.prototype.addRules = function(rules) {
var self = this;

forEachOwnProperties(rules, function(converter, selectorString) {
self.addRule(selectorString, converter);
});
};

Renderer.prototype.convert = function(runner) {
var result,
convertor = this.rules[runner.getNode().tagName || 'TEXT_NODE'];

if (convertor) {
result = convertor.call(this, runner);
}

return result;
};

Renderer.factory = function(rules) {
var renderer = new Renderer(rules);
return renderer;
};

module.exports = Renderer;
13 changes: 5 additions & 8 deletions libs/to-mark/src/toMark.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
'use strict';

var DomRunner = require('./domRunner'),
toDom = require('./toDom');
toDom = require('./toDom'),
basicRenderer = require('./renderer.basic');

/**
* toMark
Expand All @@ -15,15 +16,11 @@ var DomRunner = require('./domRunner'),
* @return {string} converted markdown text
*/
function toMark(htmlStr) {
var nodes = new DomRunner(toDom(htmlStr)),
var runner = new DomRunner(toDom(htmlStr)),
markdownResult = '';

var node = nodes.next();

if (node.tagName === 'H1') {
markdownResult = '# Hello World!';
} else if (node.tagName === 'H2') {
markdownResult = '## Hello World!';
while (runner.next()) {
markdownResult += basicRenderer.convert(runner);
}

return markdownResult;
Expand Down
10 changes: 10 additions & 0 deletions libs/to-mark/test/domRunner.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -282,4 +282,14 @@ describe('domRunner', function() {
expect(node.tagName).toEqual('TH');
});
});

describe('get current node', function() {
beforeEach(function() {
domRunner = new DomRunner(toDom('<div>currentText</div>'));
});

it('check table tags', function() {
expect(domRunner.next()).toBe(domRunner.getNode());
});
});
});
26 changes: 26 additions & 0 deletions libs/to-mark/test/renderer.basic.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
'use strict';

var basicRenderer = require('../src/renderer.basic'),
toDom = require('../src/toDom'),
DomRunner = require('../src/domRunner');

describe('basicRenderer', function() {
var runner,
result;

describe('Headings', function() {
it('H1', function() {
runner = new DomRunner(toDom('<h1>heading</h1>'));
runner.next();
result = basicRenderer.convert(runner);
expect(result).toEqual('# heading');
});

it('H1 EM', function() {
runner = new DomRunner(toDom('<h1><em>heading</em></h1>'));
runner.next();
result = basicRenderer.convert(runner);
expect(result).toEqual('# *heading*');
});
});
});
49 changes: 49 additions & 0 deletions libs/to-mark/test/renderer.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
'use strict';

var Renderer = require('../src/renderer'),
DomRunner = require('../src/domRunner'),
toDom = require('../src/toDom');

describe('renderer', function() {
var runner;

beforeEach(function() {
runner = new DomRunner(toDom('<h1>test</h1>'));
runner.next();
});

it('can take the rule to render', function() {
var convertedText,
renderer = Renderer.factory();

renderer.addRule('H1, H2, H3, H4, H5, H6', function() {
return 'mytext';
});

convertedText = renderer.convert(runner);

expect(convertedText).toEqual('mytext');
});

it('add rules with factory', function() {
var convertedText,
renderer = Renderer.factory({
'H1, H2, H3, H4, H5, H6': function() {
return 'mytext';
}
});

convertedText = renderer.convert(runner);

expect(convertedText).toEqual('mytext');
});

it('if there is no rule, conveter returns undefined', function() {
var convertedText,
renderer = Renderer.factory();

convertedText = renderer.convert(runner);

expect(convertedText).toBeUndefined();
});
});
20 changes: 15 additions & 5 deletions libs/to-mark/test/toMark.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,19 @@ describe('toMark', function() {
expect(mdText).toEqual('# Hello World!');
});

it('convert heading2 tag to markdown', function() {
var mdText = toMark('<h2>Hello World!</h2>');
expect(mdText).toEqual('## Hello World!');
xit('convert heading2 tag to markdown', function() {
var mdText = toMark('<h2>Hello <em>World!</em></h2>');
expect(mdText).toEqual('## Hello *World!*');
});

xit('convert heading2 tag to markdown', function() {
var mdText = toMark('<h2>Hello <em>World!</em></h2>');
expect(mdText).toEqual('## Hello *World!*');
});

xit('convert heading1, heading2 tag to markdown', function() {
var mdText = toMark('<h1>Hello World!</h1><h2>Hello World!</h2>');
expect(mdText).toEqual('# Hello World!## Hello World!');
});
});

Expand All @@ -30,9 +40,9 @@ describe('toDom', function() {
expect(dom.childNodes.length).toEqual(1);
expect(dom.childNodes[0].tagName).toEqual('IMG');
expect(dom.childNodes[0].attributes[0].name).toEqual('src');
expect(dom.childNodes[0].attributes[0].nodeValue).toEqual('https://www.google.co.kr/images/nav_logo195.png');
expect(dom.childNodes[0].src).toEqual('https://www.google.co.kr/images/nav_logo195.png');
expect(dom.childNodes[0].attributes[1].name).toEqual('alt');
expect(dom.childNodes[0].attributes[1].nodeValue).toEqual('altText');
expect(dom.childNodes[0].alt).toEqual('altText');
});
});
});
Expand Down

0 comments on commit 740dc88

Please sign in to comment.