Convert StringBuilder to String array basis

This commit is contained in:
Garth Snyder 2019-03-03 18:45:46 -08:00
parent 5d688cd09f
commit 2cfe21cb27
6 changed files with 43 additions and 50 deletions

View File

@ -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)
}
}

View File

@ -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())

View File

@ -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
}
}

View File

@ -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)

View File

@ -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)

View File

@ -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 */,