Skip to content

Commit 3f35b6d

Browse files
author
Martin Brecht-Precht
committed
Refactored all javascript classes. Switched to prototyped pure javascript implementation.
1 parent 23eeaac commit 3f35b6d

File tree

9 files changed

+1045
-1009
lines changed

9 files changed

+1045
-1009
lines changed

example.html

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
<head>
44
<meta charset="UTF-8">
55
<title>Markdom Javascript Handler example</title>
6-
<script type="text/javascript" src="src/common/js.class.js"></script>
7-
<script type="text/javascript" src="src/common/binded-class.js"></script>
86
<script type="text/javascript" src="src/common/string-builder.js"></script>
7+
<script type="text/javascript" src="src/common/simple-markdom-event-dispatcher.js"></script>
98
<script type="text/javascript" src="src/common/html-tag-builder.js"></script>
109
<script type="text/javascript" src="src/json-dispatcher.js"></script>
1110
<script type="text/javascript" src="src/debug-handler.js"></script>
@@ -29,7 +28,6 @@
2928
}
3029

3130
fetch('example-data.json', function (jsonString) {
32-
console.log(jsonString);
3331
var jsonDispatcher = new JsonDispatcher(jsonString);
3432
var debugHandler = new DebugHandler();
3533
jsonDispatcher.dispatchTo(debugHandler);

src/common/binded-class.js

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

src/common/html-tag-builder.js

Lines changed: 164 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -20,167 +20,174 @@
2020
* THE SOFTWARE.
2121
*/
2222

23+
var HtmlTagBuilderTypes = {
24+
TYPE_CODE_BLOCK: 'CODE_BLOCK',
25+
TYPE_CODE_INLINE: 'CODE_INLINE',
26+
TYPE_COMMENT: 'COMMENT',
27+
TYPE_DIVISION: 'DIVISION',
28+
TYPE_HEADING_BEGIN: 'HEADING_BEGIN',
29+
TYPE_HEADING_END: 'HEADING_END',
30+
TYPE_UNORDERED_LIST_BEGIN: 'UNORDERED_LIST_BEGIN',
31+
TYPE_UNORDERED_LIST_END: 'UNORDERED_LIST_END',
32+
TYPE_ORDERED_LIST_BEGIN: 'ORDERED_LIST_BEGIN',
33+
TYPE_ORDERED_LIST_END: 'ORDERED_LIST_END',
34+
TYPE_LIST_ITEM_BEGIN: 'LIST_ITEM_BEGIN',
35+
TYPE_LIST_ITEM_END: 'LIST_ITEM_END',
36+
TYPE_PARAGRAPH_BEGIN: 'PARAGRAPH_BEGIN',
37+
TYPE_PARAGRAPH_END: 'PARAGRAPH_END',
38+
TYPE_QUOTE_BEGIN: 'QUOTE_BEGIN',
39+
TYPE_QUOTE_END: 'QUOTE_END',
40+
TYPE_EMPHASIS_LEVEL_1_BEGIN: 'EMPHASIS_LEVEL_1_BEGIN',
41+
TYPE_EMPHASIS_LEVEL_1_END: 'EMPHASIS_LEVEL_1_END',
42+
TYPE_EMPHASIS_LEVEL_2_BEGIN: 'EMPHASIS_LEVEL_2_BEGIN',
43+
TYPE_EMPHASIS_LEVEL_2_END: 'EMPHASIS_LEVEL_2_END',
44+
TYPE_IMAGE: 'IMAGE',
45+
TYPE_LINE_BREAK: 'LINE_BREAK',
46+
TYPE_LINK_BEGIN: 'LINK_BEGIN',
47+
TYPE_LINK_END: 'LINK_END',
48+
HEADING_LEVEL_1: 1,
49+
HEADING_LEVEL_2: 2,
50+
HEADING_LEVEL_3: 3,
51+
HEADING_LEVEL_4: 4,
52+
HEADING_LEVEL_5: 5,
53+
HEADING_LEVEL_6: 6
54+
};
55+
56+
var HtmlTagBuilder = function() {
57+
this._type = this.BUILD_TYPE_HTML;
58+
};
59+
60+
HtmlTagBuilder.prototype.BUILD_TYPE_HTML = 'HTML';
61+
HtmlTagBuilder.prototype.BUILD_TYPE_XHTML = 'XHTML';
62+
2363
//noinspection JSUnusedGlobalSymbols
24-
var HtmlTagBuilder = BindedJsClass.extend({
25-
statics: {
26-
BUILD_TYPE_HTML: 'HTML',
27-
BUILD_TYPE_XHTML: 'XHTML',
28-
TYPE_CODE_BLOCK: 'CODE_BLOCK',
29-
TYPE_CODE_INLINE: 'CODE_INLINE',
30-
TYPE_COMMENT: 'COMMENT',
31-
TYPE_DIVISION: 'DIVISION',
32-
TYPE_HEADING_BEGIN: 'HEADING_BEGIN',
33-
TYPE_HEADING_END: 'HEADING_END',
34-
TYPE_UNORDERED_LIST_BEGIN: 'UNORDERED_LIST_BEGIN',
35-
TYPE_UNORDERED_LIST_END: 'UNORDERED_LIST_END',
36-
TYPE_ORDERED_LIST_BEGIN: 'ORDERED_LIST_BEGIN',
37-
TYPE_ORDERED_LIST_END: 'ORDERED_LIST_END',
38-
TYPE_LIST_ITEM_BEGIN: 'LIST_ITEM_BEGIN',
39-
TYPE_LIST_ITEM_END: 'LIST_ITEM_END',
40-
TYPE_PARAGRAPH_BEGIN: 'PARAGRAPH_BEGIN',
41-
TYPE_PARAGRAPH_END: 'PARAGRAPH_END',
42-
TYPE_QUOTE_BEGIN: 'QUOTE_BEGIN',
43-
TYPE_QUOTE_END: 'QUOTE_END',
44-
TYPE_EMPHASIS_LEVEL_1_BEGIN: 'EMPHASIS_LEVEL_1_BEGIN',
45-
TYPE_EMPHASIS_LEVEL_1_END: 'EMPHASIS_LEVEL_1_END',
46-
TYPE_EMPHASIS_LEVEL_2_BEGIN: 'EMPHASIS_LEVEL_2_BEGIN',
47-
TYPE_EMPHASIS_LEVEL_2_END: 'EMPHASIS_LEVEL_2_END',
48-
TYPE_IMAGE: 'IMAGE',
49-
TYPE_LINE_BREAK: 'LINE_BREAK',
50-
TYPE_LINK_BEGIN: 'LINK_BEGIN',
51-
TYPE_LINK_END: 'LINK_END',
52-
HEADING_LEVEL_1: 1,
53-
HEADING_LEVEL_2: 2,
54-
HEADING_LEVEL_3: 3,
55-
HEADING_LEVEL_4: 4,
56-
HEADING_LEVEL_5: 5,
57-
HEADING_LEVEL_6: 6
58-
},
59-
_type: null,
60-
construct: function () {
61-
this._type = HtmlTagBuilder.BUILD_TYPE_HTML;
62-
},
63-
setType: function (buildType) {
64-
this._type = buildType;
65-
},
66-
getType: function () {
67-
return this._type;
68-
},
69-
isXhtml: function () {
70-
return this._type === HtmlTagBuilder.BUILD_TYPE_XHTML;
71-
},
72-
buildTag: function (type, value, attributes, variant) {
73-
switch (type) {
74-
case HtmlTagBuilder.TYPE_CODE_BLOCK:
75-
return '<pre><code' + this._getAttributeString(attributes) + '>' + value + '</code></pre>';
76-
case HtmlTagBuilder.TYPE_CODE_INLINE:
77-
return '<code' + this._getAttributeString(attributes) + '>' + value + '</code>';
78-
case HtmlTagBuilder.TYPE_COMMENT:
79-
return '<!-- ' + value + ' -->';
80-
case HtmlTagBuilder.TYPE_DIVISION:
81-
var hrTag = '<hr' + this._getAttributeString(attributes);
82-
if (this.isXhtml()) {
83-
return hrTag + ' />';
84-
}
85-
return hrTag + '>';
86-
case HtmlTagBuilder.TYPE_HEADING_BEGIN:
87-
switch (variant) {
88-
case HtmlTagBuilder.HEADING_LEVEL_2:
89-
return '<h2' + this._getAttributeString(attributes) + '>';
90-
case HtmlTagBuilder.HEADING_LEVEL_3:
91-
return '<h3' + this._getAttributeString(attributes) + '>';
92-
case HtmlTagBuilder.HEADING_LEVEL_4:
93-
return '<h4' + this._getAttributeString(attributes) + '>';
94-
case HtmlTagBuilder.HEADING_LEVEL_5:
95-
return '<h5' + this._getAttributeString(attributes) + '>';
96-
case HtmlTagBuilder.HEADING_LEVEL_6:
97-
return '<h6' + this._getAttributeString(attributes) + '>';
98-
case HtmlTagBuilder.HEADING_LEVEL_1:
99-
default:
100-
return '<h1' + this._getAttributeString(attributes) + '>';
101-
}
102-
case HtmlTagBuilder.TYPE_HEADING_END:
103-
switch (variant) {
104-
case HtmlTagBuilder.HEADING_LEVEL_2:
105-
return '</h2>';
106-
case HtmlTagBuilder.HEADING_LEVEL_3:
107-
return '</h3>';
108-
case HtmlTagBuilder.HEADING_LEVEL_4:
109-
return '</h4>';
110-
case HtmlTagBuilder.HEADING_LEVEL_5:
111-
return '</h5>';
112-
case HtmlTagBuilder.HEADING_LEVEL_6:
113-
return '</h6>';
114-
case HtmlTagBuilder.HEADING_LEVEL_1:
115-
default:
116-
return '</h1>';
117-
}
118-
case HtmlTagBuilder.TYPE_UNORDERED_LIST_BEGIN:
119-
return '<ul' + this._getAttributeString(attributes) + '>';
120-
case HtmlTagBuilder.TYPE_UNORDERED_LIST_END:
121-
return '</ul>';
122-
case HtmlTagBuilder.TYPE_ORDERED_LIST_BEGIN:
123-
return '<ol' + this._getAttributeString(attributes) + '>';
124-
case HtmlTagBuilder.TYPE_ORDERED_LIST_END:
125-
return '</ol>';
126-
case HtmlTagBuilder.TYPE_LIST_ITEM_BEGIN:
127-
return '<li' + this._getAttributeString(attributes) + '>';
128-
case HtmlTagBuilder.TYPE_LIST_ITEM_END:
129-
return '</li>';
130-
case HtmlTagBuilder.TYPE_PARAGRAPH_BEGIN:
131-
return '<p' + this._getAttributeString(attributes) + '>';
132-
case HtmlTagBuilder.TYPE_PARAGRAPH_END:
133-
return '</p>';
134-
case HtmlTagBuilder.TYPE_QUOTE_BEGIN:
135-
return '<blockquote' + this._getAttributeString(attributes) + '>';
136-
case HtmlTagBuilder.TYPE_QUOTE_END:
137-
return '</blockquote>';
138-
case HtmlTagBuilder.TYPE_EMPHASIS_LEVEL_1_BEGIN:
139-
return '<em' + this._getAttributeString(attributes) + '>';
140-
case HtmlTagBuilder.TYPE_EMPHASIS_LEVEL_1_END:
141-
return '</em>';
142-
case HtmlTagBuilder.TYPE_EMPHASIS_LEVEL_2_BEGIN:
143-
return '<strong' + this._getAttributeString(attributes) + '>';
144-
case HtmlTagBuilder.TYPE_EMPHASIS_LEVEL_2_END:
145-
return '</strong>';
146-
case HtmlTagBuilder.TYPE_IMAGE:
147-
var imgTag = '<img' + this._getAttributeString(attributes);
148-
if (this.isXhtml()) {
149-
return imgTag + ' />';
150-
}
151-
return imgTag + '>';
152-
case HtmlTagBuilder.TYPE_LINE_BREAK:
153-
if (this.isXhtml()) {
154-
return '<br />';
155-
}
156-
return '<br>';
157-
case HtmlTagBuilder.TYPE_LINK_BEGIN:
158-
return '<a' + this._getAttributeString(attributes) + '>';
159-
case HtmlTagBuilder.TYPE_LINK_END:
160-
return '</a>';
161-
}
162-
throw new HandlerException('Invalid tagname type ' + type);
163-
},
164-
_getAttributeString: function (attributes) {
165-
var attributeParts = [];
166-
for (var key in attributes) {
167-
if (!attributes.hasOwnProperty(key)) {
168-
continue;
64+
HtmlTagBuilder.prototype.setType = function (buildType) {
65+
this._type = buildType;
66+
return this;
67+
};
68+
69+
//noinspection JSUnusedGlobalSymbols
70+
HtmlTagBuilder.prototype.getType = function () {
71+
return this._type;
72+
};
73+
74+
HtmlTagBuilder.prototype.isXhtml = function () {
75+
return this._type === this.BUILD_TYPE_XHTML;
76+
};
77+
78+
HtmlTagBuilder.prototype.buildTag = function (type, value, attributes, variant) {
79+
switch (type) {
80+
case HtmlTagBuilderTypes.TYPE_CODE_BLOCK:
81+
return '<pre><code' + this._getAttributeString(attributes) + '>' + value + '</code></pre>';
82+
case HtmlTagBuilderTypes.TYPE_CODE_INLINE:
83+
return '<code' + this._getAttributeString(attributes) + '>' + value + '</code>';
84+
case HtmlTagBuilderTypes.TYPE_COMMENT:
85+
return '<!-- ' + value + ' -->';
86+
case HtmlTagBuilderTypes.TYPE_DIVISION:
87+
var hrTag = '<hr' + this._getAttributeString(attributes);
88+
if (this.isXhtml()) {
89+
return hrTag + ' />';
16990
}
170-
var value = attributes[key];
171-
if (value === null) {
172-
continue;
91+
return hrTag + '>';
92+
case HtmlTagBuilderTypes.TYPE_HEADING_BEGIN:
93+
switch (variant) {
94+
case HtmlTagBuilderTypes.HEADING_LEVEL_1:
95+
return '<h1' + this._getAttributeString(attributes) + '>';
96+
case HtmlTagBuilderTypes.HEADING_LEVEL_2:
97+
return '<h2' + this._getAttributeString(attributes) + '>';
98+
case HtmlTagBuilderTypes.HEADING_LEVEL_3:
99+
return '<h3' + this._getAttributeString(attributes) + '>';
100+
case HtmlTagBuilderTypes.HEADING_LEVEL_4:
101+
return '<h4' + this._getAttributeString(attributes) + '>';
102+
case HtmlTagBuilderTypes.HEADING_LEVEL_5:
103+
return '<h5' + this._getAttributeString(attributes) + '>';
104+
case HtmlTagBuilderTypes.HEADING_LEVEL_6:
105+
return '<h6' + this._getAttributeString(attributes) + '>';
106+
default:
107+
throw new HandlerException('Invalid heading level ' + level);
173108
}
174-
value = value.replace(/^\s+|\s+$/g, '');
175-
if (value.length === 0) {
176-
continue;
109+
case HtmlTagBuilderTypes.TYPE_HEADING_END:
110+
switch (variant) {
111+
case HtmlTagBuilderTypes.HEADING_LEVEL_1:
112+
return '</h2>';
113+
case HtmlTagBuilderTypes.HEADING_LEVEL_2:
114+
return '</h2>';
115+
case HtmlTagBuilderTypes.HEADING_LEVEL_3:
116+
return '</h3>';
117+
case HtmlTagBuilderTypes.HEADING_LEVEL_4:
118+
return '</h4>';
119+
case HtmlTagBuilderTypes.HEADING_LEVEL_5:
120+
return '</h5>';
121+
case HtmlTagBuilderTypes.HEADING_LEVEL_6:
122+
return '</h6>';
123+
default:
124+
throw new HandlerException('Invalid heading level ' + level);
177125
}
178-
attributeParts.push(key.toString().toLowerCase() + '="' + value + '"');
126+
case HtmlTagBuilderTypes.TYPE_UNORDERED_LIST_BEGIN:
127+
return '<ul' + this._getAttributeString(attributes) + '>';
128+
case HtmlTagBuilderTypes.TYPE_UNORDERED_LIST_END:
129+
return '</ul>';
130+
case HtmlTagBuilderTypes.TYPE_ORDERED_LIST_BEGIN:
131+
return '<ol' + this._getAttributeString(attributes) + '>';
132+
case HtmlTagBuilderTypes.TYPE_ORDERED_LIST_END:
133+
return '</ol>';
134+
case HtmlTagBuilderTypes.TYPE_LIST_ITEM_BEGIN:
135+
return '<li' + this._getAttributeString(attributes) + '>';
136+
case HtmlTagBuilderTypes.TYPE_LIST_ITEM_END:
137+
return '</li>';
138+
case HtmlTagBuilderTypes.TYPE_PARAGRAPH_BEGIN:
139+
return '<p' + this._getAttributeString(attributes) + '>';
140+
case HtmlTagBuilderTypes.TYPE_PARAGRAPH_END:
141+
return '</p>';
142+
case HtmlTagBuilderTypes.TYPE_QUOTE_BEGIN:
143+
return '<blockquote' + this._getAttributeString(attributes) + '>';
144+
case HtmlTagBuilderTypes.TYPE_QUOTE_END:
145+
return '</blockquote>';
146+
case HtmlTagBuilderTypes.TYPE_EMPHASIS_LEVEL_1_BEGIN:
147+
return '<em' + this._getAttributeString(attributes) + '>';
148+
case HtmlTagBuilderTypes.TYPE_EMPHASIS_LEVEL_1_END:
149+
return '</em>';
150+
case HtmlTagBuilderTypes.TYPE_EMPHASIS_LEVEL_2_BEGIN:
151+
return '<strong' + this._getAttributeString(attributes) + '>';
152+
case HtmlTagBuilderTypes.TYPE_EMPHASIS_LEVEL_2_END:
153+
return '</strong>';
154+
case HtmlTagBuilderTypes.TYPE_IMAGE:
155+
var imgTag = '<img' + this._getAttributeString(attributes);
156+
if (this.isXhtml()) {
157+
return imgTag + ' />';
158+
}
159+
return imgTag + '>';
160+
case HtmlTagBuilderTypes.TYPE_LINE_BREAK:
161+
if (this.isXhtml()) {
162+
return '<br />';
163+
}
164+
return '<br>';
165+
case HtmlTagBuilderTypes.TYPE_LINK_BEGIN:
166+
return '<a' + this._getAttributeString(attributes) + '>';
167+
case HtmlTagBuilderTypes.TYPE_LINK_END:
168+
return '</a>';
169+
}
170+
throw new HandlerException('Invalid tagname type ' + type);
171+
};
172+
173+
HtmlTagBuilder.prototype._getAttributeString = function (attributes) {
174+
var attributeParts = [];
175+
for (var key in attributes) {
176+
if (!attributes.hasOwnProperty(key)) {
177+
continue;
179178
}
180-
if (attributeParts.length === 0) {
181-
return '';
179+
var value = attributes[key];
180+
if (value === null) {
181+
continue;
182182
}
183-
return ' ' + attributeParts.join(' ');
183+
value = value.replace(/^\s+|\s+$/g, '');
184+
if (value.length === 0) {
185+
continue;
186+
}
187+
attributeParts.push(key.toString().toLowerCase() + '="' + value + '"');
184188
}
185-
});
186-
189+
if (attributeParts.length === 0) {
190+
return '';
191+
}
192+
return ' ' + attributeParts.join(' ');
193+
};

0 commit comments

Comments
 (0)