|
1 |
| -import {Attributes, Node} from 'posthtml-parser'; |
2 |
| -import {Options, quoteStyleEnum} from '../types/index.d'; |
| 1 | +import {Attributes, NodeText, NodeTag} from 'posthtml-parser'; |
| 2 | +import {closingSingleTagOptionEnum, closingSingleTagTypeEnum, Options, quoteStyleEnum} from '../types/index.d'; |
| 3 | + |
| 4 | +type Node = NodeText | NodeTag & { |
| 5 | + closeAs?: closingSingleTagTypeEnum; |
| 6 | +}; |
3 | 7 |
|
4 | 8 | const SINGLE_TAGS = [
|
5 | 9 | 'area',
|
@@ -107,23 +111,40 @@ function render(tree?: Node | Node[], options: Options = {}): string {
|
107 | 111 | result += attrs(node.attrs);
|
108 | 112 | }
|
109 | 113 |
|
| 114 | + const closeAs = { |
| 115 | + [closingSingleTagTypeEnum.tag]: `></${tag}>`, |
| 116 | + [closingSingleTagTypeEnum.slash]: ' />', |
| 117 | + [closingSingleTagTypeEnum.default]: '>' |
| 118 | + }; |
| 119 | + |
110 | 120 | if (isSingleTag(tag)) {
|
111 | 121 | switch (closingSingleTag) {
|
112 |
| - case 'tag': |
113 |
| - result += `></${tag}>`; |
| 122 | + case closingSingleTagOptionEnum.tag: |
| 123 | + result += closeAs[closingSingleTagTypeEnum.tag]; |
| 124 | + |
| 125 | + break; |
| 126 | + case closingSingleTagOptionEnum.slash: |
| 127 | + result += closeAs[closingSingleTagTypeEnum.slash]; |
114 | 128 |
|
115 | 129 | break;
|
116 |
| - case 'slash': |
117 |
| - result += ' />'; |
| 130 | + case closingSingleTagOptionEnum.closeAs: |
| 131 | + result += closeAs[node.closeAs ? |
| 132 | + closingSingleTagTypeEnum[node.closeAs] : |
| 133 | + closingSingleTagTypeEnum.default]; |
118 | 134 |
|
119 | 135 | break;
|
120 | 136 | default:
|
121 |
| - result += '>'; |
| 137 | + result += closeAs[closingSingleTagTypeEnum.default]; |
122 | 138 | }
|
123 | 139 |
|
124 | 140 | if (node.content) {
|
125 | 141 | result += html(node.content);
|
126 | 142 | }
|
| 143 | + } else if (closingSingleTag === closingSingleTagOptionEnum.closeAs && node.closeAs) { |
| 144 | + const type = node.closeAs ? |
| 145 | + closingSingleTagTypeEnum[node.closeAs] : |
| 146 | + closingSingleTagTypeEnum.default; |
| 147 | + result += `${closeAs[type]}${html(node.content)}`; |
127 | 148 | } else {
|
128 | 149 | result += `>${html(node.content)}</${tag}>`;
|
129 | 150 | }
|
|
0 commit comments