Skip to content

Commit aed12f3

Browse files
refactor(lib): remove module wrapper && minor cleanups
1 parent 54562b4 commit aed12f3

11 files changed

+191
-2562
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ const html = render(tree, options)
8585

8686
|Name|Type|Default|Description|
8787
|:--:|:--:|:-----:|:----------|
88-
|**[`singleTags`](#singletags)**|`{Array}`|`[]`|Specify custom single tags (self closing)|
89-
|**[`closingSingleTag`](#closingSingleTag)**|`{String\|RegExp}`|[`>`](#default)|Specify the single tag closing format|
88+
|**[`singleTags`](#singletags)**|`{Array<String\|RegExp>}`|`[]`|Specify custom single tags (self closing)|
89+
|**[`closingSingleTag`](#closingSingleTag)**|`{String}`|[`>`](#default)|Specify the single tag closing format|
9090

9191
### `singleTags`
9292

@@ -110,7 +110,7 @@ const html = render(tree, options)
110110

111111
#### `{RegExp}`
112112

113-
```
113+
```js
114114
const render = require('posthtml-render')
115115

116116
const tree = [ { tag: '%=title%' } ]

RENDER.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Options
4646

4747
| Name | Type | Description |
4848
| --- | --- | --- |
49-
| singleTags | <code>Array</code> | Custom single tags (selfClosing) |
49+
| singleTags | <code>Array.&lt;(String\|RegExp)&gt;</code> | Custom single tags (selfClosing) |
5050
| closingSingleTag | <code>String</code> | Closing format for single tag Formats: ``` tag: `<br></br>` ```, slash: `<br />` ```, ```default: `<br>` ``` |
5151

5252
<a name="render..html"></a>

lib/browser.min.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/browser.min.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/index.js

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
var SINGLE_TAGS = [
2+
'area',
3+
'base',
4+
'br',
5+
'col',
6+
'command',
7+
'embed',
8+
'hr',
9+
'img',
10+
'input',
11+
'keygen',
12+
'link',
13+
'menuitem',
14+
'meta',
15+
'param',
16+
'source',
17+
'track',
18+
'wbr',
19+
// Custom (PostHTML)
20+
'import',
21+
'include',
22+
'extend',
23+
'component'
24+
]
25+
26+
/**
27+
* Render PostHTML Tree to HTML
28+
*
29+
* @param {Array|Object} tree PostHTML Tree
30+
* @param {Object} options Options
31+
*
32+
* @return {String} HTML
33+
*/
34+
function render (tree, options) {
35+
/**
36+
* Options
37+
*
38+
* @type {Object}
39+
*
40+
* @prop {Array<String|RegExp>} singleTags Custom single tags (selfClosing)
41+
* @prop {String} closingSingleTag Closing format for single tag
42+
*
43+
* Formats:
44+
*
45+
* ``` tag: `<br></br>` ```, slash: `<br />` ```, ```default: `<br>` ```
46+
*/
47+
options = options || {}
48+
49+
var singleTags = SINGLE_TAGS.concat(options.singleTags || [])
50+
var singleRegExp = singleTags.filter(function (tag) {
51+
return tag instanceof RegExp ? tag : false
52+
})
53+
54+
var closingSingleTag = options.closingSingleTag
55+
56+
return html(tree)
57+
58+
/**
59+
* HTML Stringifier
60+
*
61+
* @param {Array|Object} tree PostHTML Tree
62+
*
63+
* @return {String} result HTML
64+
*/
65+
function html (tree) {
66+
var result = ''
67+
68+
traverse([].concat(tree), function (node) {
69+
if (!node) return
70+
71+
if (typeof node === 'string' || typeof node === 'number') {
72+
result += node
73+
74+
return
75+
}
76+
77+
if (typeof node.tag === 'boolean' && !node.tag) {
78+
typeof node.content !== 'object' && (result += node.content)
79+
80+
return node.content
81+
}
82+
83+
// treat as new root tree if node is an array
84+
if (Array.isArray(node)) {
85+
result += html(node)
86+
87+
return
88+
}
89+
90+
var tag = node.tag || 'div'
91+
92+
if (isSingleTag(tag, singleTags, singleRegExp)) {
93+
result += '<' + tag + attrs(node.attrs)
94+
95+
switch (closingSingleTag) {
96+
case 'tag':
97+
result += '></' + tag + '>'
98+
99+
break
100+
case 'slash':
101+
result += ' />'
102+
103+
break
104+
default:
105+
result += '>'
106+
}
107+
} else {
108+
result += '<' + tag + (node.attrs ? attrs(node.attrs) : '') + '>' + (node.content ? html(node.content) : '') + '</' + tag + '>'
109+
}
110+
})
111+
112+
return result
113+
}
114+
}
115+
116+
/**
117+
* @module posthtml-render
118+
*
119+
* @version 1.0.7
120+
* @license MIT
121+
*/
122+
module.exports = render
123+
124+
/** @private */
125+
function attrs (obj) {
126+
var attr = ''
127+
128+
for (var key in obj) {
129+
if (typeof obj[key] === 'boolean' && obj[key]) {
130+
attr += ' ' + key
131+
} else if (
132+
typeof obj[key] === 'string' ||
133+
typeof obj[key] === 'number'
134+
) {
135+
attr += ' ' + key + '="' + obj[key] + '"'
136+
}
137+
}
138+
139+
return attr
140+
}
141+
142+
/** @private */
143+
function traverse (tree, cb) {
144+
if (Array.isArray(tree)) {
145+
for (var i = 0, length = tree.length; i < length; i++) {
146+
traverse(cb(tree[i]), cb)
147+
}
148+
} else if (typeof tree === 'object' && tree.hasOwnProperty('content')) {
149+
traverse(tree.content, cb)
150+
}
151+
152+
return tree
153+
}
154+
155+
/** @private */
156+
function isSingleTag (tag, singleTags, singleRegExp) {
157+
if (singleRegExp.length) {
158+
for (var i = 0; i < singleRegExp.length; i++) {
159+
return tag.match(singleRegExp[i]) ? true : false
160+
}
161+
}
162+
163+
if (singleTags.indexOf(tag) === -1) {
164+
return false
165+
}
166+
167+
return true
168+
}

lib/posthtml-render.js

Lines changed: 0 additions & 154 deletions
This file was deleted.

0 commit comments

Comments
 (0)