Convert StringBuilder to String array basis
This commit is contained in:
parent
5d688cd09f
commit
2cfe21cb27
|
@ -925,9 +925,9 @@ open class Element: Node {
|
|||
if let textNode = (node as? TextNode) {
|
||||
Element.appendNormalisedText(accum, textNode)
|
||||
} else if let element = (node as? Element) {
|
||||
if (accum.length > 0 &&
|
||||
if !accum.isEmpty &&
|
||||
(element.isBlock() || element._tag.getName() == "br") &&
|
||||
!TextNode.lastCharIsWhitespace(accum)) {
|
||||
!TextNode.lastCharIsWhitespace(accum) {
|
||||
accum.append(" ")
|
||||
}
|
||||
}
|
||||
|
@ -1201,7 +1201,7 @@ open class Element: Node {
|
|||
|
||||
override func outerHtmlHead(_ accum: StringBuilder, _ depth: Int, _ out: OutputSettings)throws {
|
||||
if (out.prettyPrint() && (_tag.formatAsBlock() || (parent() != nil && parent()!.tag().formatAsBlock()) || out.outline())) {
|
||||
if (accum.length > 0) {
|
||||
if !accum.isEmpty {
|
||||
indent(accum, depth, out)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -189,7 +189,7 @@ open class Elements: NSCopying {
|
|||
open func text()throws->String {
|
||||
let sb: StringBuilder = StringBuilder()
|
||||
for element: Element in this {
|
||||
if (sb.length != 0) {
|
||||
if !sb.isEmpty {
|
||||
sb.append(" ")
|
||||
}
|
||||
sb.append(try element.text())
|
||||
|
@ -214,9 +214,14 @@ open class Elements: NSCopying {
|
|||
* @see #outerHtml()
|
||||
*/
|
||||
open func html()throws->String {
|
||||
var text = try this.reduce("") {result, name in "\(result)\(try name.html())\n"}
|
||||
text.removeLast()
|
||||
return text
|
||||
let sb: StringBuilder = StringBuilder()
|
||||
for element: Element in this {
|
||||
if !sb.isEmpty {
|
||||
sb.append("\n")
|
||||
}
|
||||
sb.append(try element.html())
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -228,7 +233,7 @@ open class Elements: NSCopying {
|
|||
open func outerHtml()throws->String {
|
||||
let sb: StringBuilder = StringBuilder()
|
||||
for element in this {
|
||||
if (sb.length != 0) {
|
||||
if !sb.isEmpty {
|
||||
sb.append("\n")
|
||||
}
|
||||
sb.append(try element.outerHtml())
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
/**
|
||||
Supports creation of a String from pieces
|
||||
https://gist.github.com/kristopherjohnson/1fc55e811d944a430289
|
||||
Based on https://gist.github.com/kristopherjohnson/1fc55e811d944a430289
|
||||
*/
|
||||
open class StringBuilder {
|
||||
fileprivate var stringValue: Array<Character>
|
||||
fileprivate var buffer: [String] = []
|
||||
|
||||
/**
|
||||
Construct with initial String contents
|
||||
|
@ -11,11 +11,13 @@ open class StringBuilder {
|
|||
:param: string Initial value; defaults to empty string
|
||||
*/
|
||||
public init(string: String = "") {
|
||||
self.stringValue = Array(string)
|
||||
if string != "" {
|
||||
buffer.append(string)
|
||||
}
|
||||
}
|
||||
|
||||
public init(_ size: Int) {
|
||||
self.stringValue = Array()
|
||||
self.buffer = Array()
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -24,15 +26,18 @@ open class StringBuilder {
|
|||
:return: String
|
||||
*/
|
||||
open func toString() -> String {
|
||||
return String(stringValue)
|
||||
return buffer.reduce("", +)
|
||||
}
|
||||
|
||||
/**
|
||||
Return the current length of the String object
|
||||
*/
|
||||
open var length: Int {
|
||||
return self.stringValue.count
|
||||
//return countElements(stringValue)
|
||||
open var xlength: Int {
|
||||
return buffer.map { $0.count }.reduce(0, +)
|
||||
}
|
||||
|
||||
open var isEmpty: Bool {
|
||||
return buffer.isEmpty
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -43,29 +48,27 @@ open class StringBuilder {
|
|||
:return: reference to this StringBuilder instance
|
||||
*/
|
||||
open func append(_ string: String) {
|
||||
stringValue.append(contentsOf: string)
|
||||
buffer.append(string)
|
||||
}
|
||||
|
||||
open func appendCodePoint(_ chr: Character) {
|
||||
stringValue.append(chr)
|
||||
buffer.append(String(chr))
|
||||
}
|
||||
|
||||
open func appendCodePoints(_ chr: [Character]) {
|
||||
stringValue.append(contentsOf: chr)
|
||||
buffer.append(String(chr))
|
||||
}
|
||||
|
||||
open func appendCodePoint(_ ch: Int) {
|
||||
stringValue.append(Character(UnicodeScalar(ch)!))
|
||||
buffer.append(String(UnicodeScalar(ch)!))
|
||||
}
|
||||
|
||||
open func appendCodePoint(_ ch: UnicodeScalar) {
|
||||
stringValue.append(Character(ch))
|
||||
buffer.append(String(ch))
|
||||
}
|
||||
|
||||
open func appendCodePoints(_ chr: [UnicodeScalar]) {
|
||||
for c in chr {
|
||||
appendCodePoint(c)
|
||||
}
|
||||
buffer.append(String(String.UnicodeScalarView(chr)))
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -77,19 +80,13 @@ open class StringBuilder {
|
|||
*/
|
||||
@discardableResult
|
||||
open func append<T: CustomStringConvertible>(_ value: T) -> StringBuilder {
|
||||
stringValue.append(contentsOf: value.description)
|
||||
buffer.append(value.description)
|
||||
return self
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
open func append(_ value: UnicodeScalar) -> StringBuilder {
|
||||
stringValue.append(contentsOf: value.description)
|
||||
return self
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
open func insert<T: CustomStringConvertible>(_ offset: Int, _ value: T) -> StringBuilder {
|
||||
stringValue.insert(contentsOf: value.description, at: offset)
|
||||
buffer.append(value.description)
|
||||
return self
|
||||
}
|
||||
|
||||
|
@ -102,7 +99,8 @@ open class StringBuilder {
|
|||
*/
|
||||
@discardableResult
|
||||
open func appendLine(_ string: String) -> StringBuilder {
|
||||
stringValue.append(contentsOf: "\n")
|
||||
buffer.append(string)
|
||||
buffer.append("\n")
|
||||
return self
|
||||
}
|
||||
|
||||
|
@ -115,8 +113,8 @@ open class StringBuilder {
|
|||
*/
|
||||
@discardableResult
|
||||
open func appendLine<T: CustomStringConvertible>(_ value: T) -> StringBuilder {
|
||||
stringValue.append(contentsOf: value.description)
|
||||
stringValue.append(contentsOf: "\n")
|
||||
buffer.append(value.description)
|
||||
buffer.append("\n")
|
||||
return self
|
||||
}
|
||||
|
||||
|
@ -127,7 +125,7 @@ open class StringBuilder {
|
|||
*/
|
||||
@discardableResult
|
||||
open func clear() -> StringBuilder {
|
||||
stringValue = Array()
|
||||
buffer.removeAll(keepingCapacity: true)
|
||||
return self
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,7 +116,7 @@ open class Token {
|
|||
if (_pendingAttributeName != nil) {
|
||||
var attribute: Attribute
|
||||
if (_hasPendingAttributeValue) {
|
||||
attribute = try Attribute(key: _pendingAttributeName!, value: _pendingAttributeValue.length > 0 ? _pendingAttributeValue.toString() : _pendingAttributeValueS!)
|
||||
attribute = try Attribute(key: _pendingAttributeName!, value: !_pendingAttributeValue.isEmpty ? _pendingAttributeValue.toString() : _pendingAttributeValueS!)
|
||||
} else if (_hasEmptyAttributeValue) {
|
||||
attribute = try Attribute(key: _pendingAttributeName!, value: "")
|
||||
} else {
|
||||
|
@ -183,7 +183,7 @@ open class Token {
|
|||
|
||||
func appendAttributeValue(_ append: String) {
|
||||
ensureAttributeValue()
|
||||
if (_pendingAttributeValue.length == 0) {
|
||||
if _pendingAttributeValue.isEmpty {
|
||||
_pendingAttributeValueS = append
|
||||
} else {
|
||||
_pendingAttributeValue.append(append)
|
||||
|
|
|
@ -47,7 +47,7 @@ final class Tokeniser {
|
|||
}
|
||||
|
||||
// if emit is pending, a non-character token was found: return any chars in buffer, and leave token for next read:
|
||||
if (charsBuilder.length > 0) {
|
||||
if !charsBuilder.isEmpty {
|
||||
let str: String = charsBuilder.toString()
|
||||
charsBuilder.clear()
|
||||
charsString = nil
|
||||
|
@ -88,7 +88,7 @@ final class Tokeniser {
|
|||
if (charsString == nil) {
|
||||
charsString = str
|
||||
} else {
|
||||
if (charsBuilder.length == 0) { // switching to string builder as more than one emit before read
|
||||
if charsBuilder.isEmpty { // switching to string builder as more than one emit before read
|
||||
charsBuilder.append(charsString!)
|
||||
}
|
||||
charsBuilder.append(str)
|
||||
|
|
|
@ -84,7 +84,6 @@
|
|||
8CE418721DAA568700240B42 /* SerializationException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE4184E1DAA568600240B42 /* SerializationException.swift */; };
|
||||
8CE418731DAA568700240B42 /* ArrayExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418501DAA568600240B42 /* ArrayExt.swift */; };
|
||||
8CE418741DAA568700240B42 /* CharacterExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418511DAA568600240B42 /* CharacterExt.swift */; };
|
||||
8CE418761DAA568700240B42 /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418531DAA568600240B42 /* OrderedDictionary.swift */; };
|
||||
8CE418781DAA568700240B42 /* StreamReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418551DAA568600240B42 /* StreamReader.swift */; };
|
||||
8CE4187A1DAA568700240B42 /* SwiftSoup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418571DAA568600240B42 /* SwiftSoup.swift */; };
|
||||
8CEA29591DAC112B0064A341 /* CharacterReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEA29581DAC112B0064A341 /* CharacterReader.swift */; };
|
||||
|
@ -97,7 +96,6 @@
|
|||
BB57C2E5222CB0E3008933AA /* Wirecutter.html in Resources */ = {isa = PBXBuildFile; fileRef = BB57C2DF222CB0E2008933AA /* Wirecutter.html */; };
|
||||
BB57C2E6222CB0E3008933AA /* GitHub.html in Resources */ = {isa = PBXBuildFile; fileRef = BB57C2E0222CB0E3008933AA /* GitHub.html */; };
|
||||
BB57C2E7222CB0E3008933AA /* Amazon.html in Resources */ = {isa = PBXBuildFile; fileRef = BB57C2E1222CB0E3008933AA /* Amazon.html */; };
|
||||
BD3B5B6A1FBED933001FDB3B /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418531DAA568600240B42 /* OrderedDictionary.swift */; };
|
||||
BD3B5B6B1FBED933001FDB3B /* Whitelist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC2FD8C1DB12382002CB469 /* Whitelist.swift */; };
|
||||
BD3B5B6C1FBED933001FDB3B /* Tokeniser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C82E1DB7E5D200B8FC22 /* Tokeniser.swift */; };
|
||||
BD3B5B6D1FBED933001FDB3B /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418541DAA568600240B42 /* Pattern.swift */; };
|
||||
|
@ -154,7 +152,6 @@
|
|||
BD3B5BA01FBED933001FDB3B /* DataUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418321DAA568600240B42 /* DataUtil.swift */; };
|
||||
BD3B5BA11FBED933001FDB3B /* ParseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C8301DB7E8CD00B8FC22 /* ParseError.swift */; };
|
||||
BD3B5BA41FBED933001FDB3B /* SwiftSoup.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CE418191DAA54A900240B42 /* SwiftSoup.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
BD3B5BAD1FC063BD001FDB3B /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418531DAA568600240B42 /* OrderedDictionary.swift */; };
|
||||
BD3B5BAE1FC063BD001FDB3B /* Whitelist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC2FD8C1DB12382002CB469 /* Whitelist.swift */; };
|
||||
BD3B5BAF1FC063BD001FDB3B /* Tokeniser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C82E1DB7E5D200B8FC22 /* Tokeniser.swift */; };
|
||||
BD3B5BB01FC063BD001FDB3B /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418541DAA568600240B42 /* Pattern.swift */; };
|
||||
|
@ -211,7 +208,6 @@
|
|||
BD3B5BE31FC063BD001FDB3B /* DataUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418321DAA568600240B42 /* DataUtil.swift */; };
|
||||
BD3B5BE41FC063BD001FDB3B /* ParseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C8301DB7E8CD00B8FC22 /* ParseError.swift */; };
|
||||
BD3B5BE71FC063BD001FDB3B /* SwiftSoup.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CE418191DAA54A900240B42 /* SwiftSoup.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
BD3B5BF01FC06423001FDB3B /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418531DAA568600240B42 /* OrderedDictionary.swift */; };
|
||||
BD3B5BF11FC06423001FDB3B /* Whitelist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC2FD8C1DB12382002CB469 /* Whitelist.swift */; };
|
||||
BD3B5BF21FC06423001FDB3B /* Tokeniser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C19C82E1DB7E5D200B8FC22 /* Tokeniser.swift */; };
|
||||
BD3B5BF31FC06423001FDB3B /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE418541DAA568600240B42 /* Pattern.swift */; };
|
||||
|
@ -368,7 +364,6 @@
|
|||
8CE4184E1DAA568600240B42 /* SerializationException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SerializationException.swift; sourceTree = "<group>"; };
|
||||
8CE418501DAA568600240B42 /* ArrayExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArrayExt.swift; sourceTree = "<group>"; };
|
||||
8CE418511DAA568600240B42 /* CharacterExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CharacterExt.swift; sourceTree = "<group>"; };
|
||||
8CE418531DAA568600240B42 /* OrderedDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderedDictionary.swift; sourceTree = "<group>"; };
|
||||
8CE418541DAA568600240B42 /* Pattern.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Pattern.swift; sourceTree = "<group>"; };
|
||||
8CE418551DAA568600240B42 /* StreamReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StreamReader.swift; sourceTree = "<group>"; };
|
||||
8CE418571DAA568600240B42 /* SwiftSoup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSoup.swift; sourceTree = "<group>"; };
|
||||
|
@ -454,7 +449,6 @@
|
|||
children = (
|
||||
8CE418501DAA568600240B42 /* ArrayExt.swift */,
|
||||
8CE418511DAA568600240B42 /* CharacterExt.swift */,
|
||||
8CE418531DAA568600240B42 /* OrderedDictionary.swift */,
|
||||
8CE418541DAA568600240B42 /* Pattern.swift */,
|
||||
8CE418551DAA568600240B42 /* StreamReader.swift */,
|
||||
8CEA295A1DAC23820064A341 /* String.swift */,
|
||||
|
@ -946,7 +940,6 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8CE418761DAA568700240B42 /* OrderedDictionary.swift in Sources */,
|
||||
8CC2FD8D1DB12382002CB469 /* Whitelist.swift in Sources */,
|
||||
8C19C82F1DB7E5D200B8FC22 /* Tokeniser.swift in Sources */,
|
||||
8CD4E8F01E12B0FF0039B951 /* Pattern.swift in Sources */,
|
||||
|
@ -1048,7 +1041,6 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
BD3B5B6A1FBED933001FDB3B /* OrderedDictionary.swift in Sources */,
|
||||
BD3B5B6B1FBED933001FDB3B /* Whitelist.swift in Sources */,
|
||||
BD3B5B6C1FBED933001FDB3B /* Tokeniser.swift in Sources */,
|
||||
BD3B5B6D1FBED933001FDB3B /* Pattern.swift in Sources */,
|
||||
|
@ -1111,7 +1103,6 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
BD3B5BAD1FC063BD001FDB3B /* OrderedDictionary.swift in Sources */,
|
||||
BD3B5BAE1FC063BD001FDB3B /* Whitelist.swift in Sources */,
|
||||
BD3B5BAF1FC063BD001FDB3B /* Tokeniser.swift in Sources */,
|
||||
BD3B5BB01FC063BD001FDB3B /* Pattern.swift in Sources */,
|
||||
|
@ -1174,7 +1165,6 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
BD3B5BF01FC06423001FDB3B /* OrderedDictionary.swift in Sources */,
|
||||
BD3B5BF11FC06423001FDB3B /* Whitelist.swift in Sources */,
|
||||
BD3B5BF21FC06423001FDB3B /* Tokeniser.swift in Sources */,
|
||||
BD3B5BF31FC06423001FDB3B /* Pattern.swift in Sources */,
|
||||
|
|
Loading…
Reference in New Issue