-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
DTHTMLParserNode.m
136 lines (106 loc) · 2.61 KB
/
DTHTMLParserNode.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//
// DTHTMLParserNode.m
// DTCoreText
//
// Created by Oliver Drobnik on 26.12.12.
// Copyright (c) 2012 Drobnik.com. All rights reserved.
//
#import "DTHTMLParserNode.h"
#import "DTHTMLParserTextNode.h"
@implementation DTHTMLParserNode
{
NSString *_name;
__unsafe_unretained DTHTMLParserNode *_parentNode;
NSMutableArray *_childNodes;
}
- (id)initWithName:(NSString *)name attributes:(NSDictionary *)attributes
{
self = [super init];
if (self)
{
_name = [name copy];
[self setAttributes:attributes]; // property to allow overriding
}
return self;
}
- (void)addChildNode:(DTHTMLParserNode *)childNode
{
// first child creates array
if (!_childNodes)
{
_childNodes = [[NSMutableArray alloc] init];
}
childNode.parentNode = self;
[_childNodes addObject:childNode];
}
- (void)removeChildNode:(DTHTMLParserNode *)childNode
{
[_childNodes removeObject:childNode];
}
- (void)removeAllChildNodes
{
[_childNodes removeAllObjects];
}
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@ name='%@'>", NSStringFromClass([self class]), _name];
}
- (void)_appendHTMLToString:(NSMutableString *)string indentLevel:(NSUInteger)indentLevel
{
// indent to the level
for (int i=0; i<indentLevel; i++)
{
[string appendString:@" "];
}
// write own name tag open
[string appendFormat:@"<%@", _name];
// sort attribute names
NSArray *sortedKeys = [_attributes.allKeys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *oneKey in sortedKeys)
{
NSString *attribute = [_attributes objectForKey:oneKey];
[string appendFormat:@" %@=\"%@\"", oneKey, attribute];
}
if (![_childNodes count])
{
[string appendString:@" \\>\n"];
return;
}
[string appendFormat:@">\n"];
// output attributes
for (DTHTMLParserNode *childNode in _childNodes)
{
[childNode _appendHTMLToString:string indentLevel:indentLevel+1];
}
// indent to the level
for (int i=0; i<indentLevel; i++)
{
[string appendString:@" "];
}
// write own name tag close
[string appendFormat:@"</%@>\n", _name];
}
- (NSString *)debugDescription
{
NSMutableString *tmpString = [NSMutableString string];
[self _appendHTMLToString:tmpString indentLevel:0];
return tmpString;
}
- (NSString *)text
{
NSMutableString *text = [NSMutableString string];
for (DTHTMLParserTextNode *oneChild in self.childNodes)
{
if ([oneChild isKindOfClass:[DTHTMLParserTextNode class]])
{
[text appendString:[oneChild characters]];
}
}
return text;
}
#pragma mark - Properties
@synthesize name = _name;
@synthesize attributes = _attributes;
@synthesize parentNode = _parentNode;
@synthesize childNodes = _childNodes;
@end