Merge branch 'master' into develop
This commit is contained in:
commit
252d7acff6
|
@ -0,0 +1 @@
|
||||||
|
3.2
|
|
@ -15,6 +15,7 @@ extension Character {
|
||||||
public static let BackslashN: Character = "\n"
|
public static let BackslashN: Character = "\n"
|
||||||
public static let BackslashF: Character = Character(UnicodeScalar(12))
|
public static let BackslashF: Character = Character(UnicodeScalar(12))
|
||||||
public static let BackslashR: Character = "\r"
|
public static let BackslashR: Character = "\r"
|
||||||
|
public static let BackshashRBackslashN: Character = "\r\n"
|
||||||
|
|
||||||
//http://www.unicode.org/glossary/#supplementary_code_point
|
//http://www.unicode.org/glossary/#supplementary_code_point
|
||||||
public static let MIN_SUPPLEMENTARY_CODE_POINT: UInt32 = 0x010000
|
public static let MIN_SUPPLEMENTARY_CODE_POINT: UInt32 = 0x010000
|
||||||
|
@ -24,6 +25,7 @@ extension Character {
|
||||||
var isWhitespace: Bool {
|
var isWhitespace: Bool {
|
||||||
switch self {
|
switch self {
|
||||||
case Character.space, Character.BackslashT, Character.BackslashN,Character.BackslashF,Character.BackslashR: return true
|
case Character.space, Character.BackslashT, Character.BackslashN,Character.BackslashF,Character.BackslashR: return true
|
||||||
|
case Character.BackshashRBackslashN: return true
|
||||||
default: return false
|
default: return false
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1288,9 +1288,10 @@ open class Element: Node {
|
||||||
}
|
}
|
||||||
|
|
||||||
override public var hashValue: Int {
|
override public var hashValue: Int {
|
||||||
var h = super.hashValue
|
let prime = 31
|
||||||
h = Int.addWithOverflow(Int.multiplyWithOverflow(31, h).0, _tag.hashValue).0
|
var result = super.hashValue
|
||||||
return h
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_tag.hashValue).partialValue
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -771,8 +771,10 @@ open class Node: Equatable, Hashable {
|
||||||
/// Hash values are not guaranteed to be equal across different executions of
|
/// Hash values are not guaranteed to be equal across different executions of
|
||||||
/// your program. Do not save hash values to use during a future execution.
|
/// your program. Do not save hash values to use during a future execution.
|
||||||
public var hashValue: Int {
|
public var hashValue: Int {
|
||||||
var result: Int = description.hashValue
|
let prime = 31
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, baseUri != nil ? baseUri!.hashValue : 31).0
|
var result = 1
|
||||||
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(description.hashValue).partialValue
|
||||||
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(baseUri?.hashValue ?? 31).partialValue
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -399,31 +399,31 @@ public struct OrderedSetGenerator<T: Hashable>: IteratorProtocol {
|
||||||
|
|
||||||
extension OrderedSetGenerator where T: Comparable {}
|
extension OrderedSetGenerator where T: Comparable {}
|
||||||
|
|
||||||
public func +<T: Hashable, S: Sequence> (lhs: OrderedSet<T>, rhs: S) -> OrderedSet<T> where S.Iterator.Element == T {
|
public func +<T, S: Sequence> (lhs: OrderedSet<T>, rhs: S) -> OrderedSet<T> where S.Iterator.Element == T {
|
||||||
let joinedSet = lhs
|
let joinedSet = lhs
|
||||||
joinedSet.append(contentsOf: rhs)
|
joinedSet.append(contentsOf: rhs)
|
||||||
|
|
||||||
return joinedSet
|
return joinedSet
|
||||||
}
|
}
|
||||||
|
|
||||||
public func +=<T: Hashable, S: Sequence> (lhs: inout OrderedSet<T>, rhs: S) where S.Iterator.Element == T {
|
public func +=<T, S: Sequence> (lhs: inout OrderedSet<T>, rhs: S) where S.Iterator.Element == T {
|
||||||
lhs.append(contentsOf: rhs)
|
lhs.append(contentsOf: rhs)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func -<T: Hashable, S: Sequence> (lhs: OrderedSet<T>, rhs: S) -> OrderedSet<T> where S.Iterator.Element == T {
|
public func -<T, S: Sequence> (lhs: OrderedSet<T>, rhs: S) -> OrderedSet<T> where S.Iterator.Element == T {
|
||||||
let purgedSet = lhs
|
let purgedSet = lhs
|
||||||
purgedSet.remove(rhs)
|
purgedSet.remove(rhs)
|
||||||
|
|
||||||
return purgedSet
|
return purgedSet
|
||||||
}
|
}
|
||||||
|
|
||||||
public func -=<T: Hashable, S: Sequence> (lhs: inout OrderedSet<T>, rhs: S) where S.Iterator.Element == T {
|
public func -=<T, S: Sequence> (lhs: inout OrderedSet<T>, rhs: S) where S.Iterator.Element == T {
|
||||||
lhs.remove(rhs)
|
lhs.remove(rhs)
|
||||||
}
|
}
|
||||||
|
|
||||||
extension OrderedSet: Equatable { }
|
extension OrderedSet: Equatable { }
|
||||||
|
|
||||||
public func ==<T: Hashable> (lhs: OrderedSet<T>, rhs: OrderedSet<T>) -> Bool {
|
public func ==<T> (lhs: OrderedSet<T>, rhs: OrderedSet<T>) -> Bool {
|
||||||
if lhs.count != rhs.count {
|
if lhs.count != rhs.count {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,6 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
#if !os(Linux)
|
|
||||||
extension NSTextCheckingResult {
|
|
||||||
func range(at idx: Int) -> NSRange {
|
|
||||||
return rangeAt(idx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public struct Pattern {
|
public struct Pattern {
|
||||||
public static let CASE_INSENSITIVE: Int = 0x02
|
public static let CASE_INSENSITIVE: Int = 0x02
|
||||||
let pattern: String
|
let pattern: String
|
||||||
|
@ -76,9 +68,9 @@ public class Matcher {
|
||||||
|
|
||||||
public func group(_ i: Int) -> String? {
|
public func group(_ i: Int) -> String? {
|
||||||
let b = matches[index]
|
let b = matches[index]
|
||||||
let c = b.range(at:i)
|
let c = b.rangeAt(i)
|
||||||
if(c.location == NSNotFound) {return nil}
|
if(c.location == NSNotFound) {return nil}
|
||||||
let result = string.substring(c.location, c.length)
|
let result = string.substring(c.location, c.length)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
public func group() -> String? {
|
public func group() -> String? {
|
||||||
|
|
|
@ -235,16 +235,18 @@ open class Tag: Hashable {
|
||||||
/// Hash values are not guaranteed to be equal across different executions of
|
/// Hash values are not guaranteed to be equal across different executions of
|
||||||
/// your program. Do not save hash values to use during a future execution.
|
/// your program. Do not save hash values to use during a future execution.
|
||||||
public var hashValue: Int {
|
public var hashValue: Int {
|
||||||
var result: Int = _tagName.hashValue
|
let prime = 31
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _isBlock ? 1 : 0).0
|
var result = 1
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _formatAsBlock ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_tagName.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _canContainBlock ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_isBlock.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _canContainInline ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_formatAsBlock.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _empty ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_canContainBlock.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _selfClosing ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_canContainInline.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _preserveWhitespace ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_empty.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _formList ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_selfClosing.hashValue).partialValue
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(31, result).0, _formSubmit ? 1 : 0).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_preserveWhitespace.hashValue).partialValue
|
||||||
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_formList.hashValue).partialValue
|
||||||
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(_formSubmit.hashValue).partialValue
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ open class Token {
|
||||||
}
|
}
|
||||||
|
|
||||||
func tokenType() -> String {
|
func tokenType() -> String {
|
||||||
return String(describing: type(of: self))
|
return String(describing: Swift.type(of: self))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,7 +32,7 @@ open class Token {
|
||||||
}
|
}
|
||||||
|
|
||||||
open func toString()throws->String {
|
open func toString()throws->String {
|
||||||
return String(describing: type(of: self))
|
return String(describing: Swift.type(of: self))
|
||||||
}
|
}
|
||||||
|
|
||||||
final class Doctype: Token {
|
final class Doctype: Token {
|
||||||
|
|
|
@ -642,7 +642,7 @@ extension TypedValue: Hashable {
|
||||||
public var hashValue: Int {
|
public var hashValue: Int {
|
||||||
let prime = 31
|
let prime = 31
|
||||||
var result = 1
|
var result = 1
|
||||||
result = Int.addWithOverflow(Int.multiplyWithOverflow(prime, result).0, value.hash).0
|
result = prime.multipliedReportingOverflow(by: result).partialValue.addingReportingOverflow(value.hash).partialValue
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,7 +331,9 @@
|
||||||
8CE418231DAA54A900240B42 /* Tests */,
|
8CE418231DAA54A900240B42 /* Tests */,
|
||||||
8CE418171DAA54A900240B42 /* Products */,
|
8CE418171DAA54A900240B42 /* Products */,
|
||||||
);
|
);
|
||||||
|
indentWidth = 4;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
tabWidth = 4;
|
||||||
};
|
};
|
||||||
8CE418171DAA54A900240B42 /* Products */ = {
|
8CE418171DAA54A900240B42 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
|
@ -476,18 +478,18 @@
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 0800;
|
LastSwiftUpdateCheck = 0800;
|
||||||
LastUpgradeCheck = 0810;
|
LastUpgradeCheck = 0900;
|
||||||
ORGANIZATIONNAME = "Nabil Chatbi";
|
ORGANIZATIONNAME = "Nabil Chatbi";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
8CE418151DAA54A900240B42 = {
|
8CE418151DAA54A900240B42 = {
|
||||||
CreatedOnToolsVersion = 8.0;
|
CreatedOnToolsVersion = 8.0;
|
||||||
LastSwiftMigration = 0800;
|
LastSwiftMigration = 0900;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
8CE4181E1DAA54A900240B42 = {
|
8CE4181E1DAA54A900240B42 = {
|
||||||
CreatedOnToolsVersion = 8.0;
|
CreatedOnToolsVersion = 8.0;
|
||||||
DevelopmentTeam = 69CKJW5DBB;
|
DevelopmentTeam = 69CKJW5DBB;
|
||||||
LastSwiftMigration = 0820;
|
LastSwiftMigration = 0900;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -644,7 +646,9 @@
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
@ -652,7 +656,11 @@
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_SUSPICIOUS_MOVES = YES;
|
CLANG_WARN_SUSPICIOUS_MOVES = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
@ -683,6 +691,8 @@
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
|
||||||
|
SWIFT_VERSION = 3.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
VERSION_INFO_PREFIX = "";
|
VERSION_INFO_PREFIX = "";
|
||||||
|
@ -698,7 +708,9 @@
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
@ -706,7 +718,11 @@
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_SUSPICIOUS_MOVES = YES;
|
CLANG_WARN_SUSPICIOUS_MOVES = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
@ -729,6 +745,8 @@
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||||
|
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
|
||||||
|
SWIFT_VERSION = 3.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
@ -759,7 +777,6 @@
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 3.0;
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -785,7 +802,6 @@
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||||
SWIFT_VERSION = 3.0;
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -805,7 +821,6 @@
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 3.0;
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -824,7 +839,6 @@
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.scinfu.SwiftSoupTests;
|
PRODUCT_BUNDLE_IDENTIFIER = com.scinfu.SwiftSoupTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_VERSION = 3.0;
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0810"
|
LastUpgradeVersion = "0900"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
@ -26,6 +26,7 @@
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
language = ""
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
<Testables>
|
<Testables>
|
||||||
<TestableReference
|
<TestableReference
|
||||||
|
@ -55,6 +56,7 @@
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
language = ""
|
||||||
launchStyle = "0"
|
launchStyle = "0"
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
|
|
@ -469,6 +469,14 @@ class DocumentTest: XCTestCase {
|
||||||
// assertTrue("Should have contained a ' ' or a ' '.",
|
// assertTrue("Should have contained a ' ' or a ' '.",
|
||||||
// output.contains(" ") || output.contains(" "));
|
// output.contains(" ") || output.contains(" "));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
func testNewLine(){
|
||||||
|
let h = "<html><body><div>\r\n<div dir=\"ltr\">\r\n<div id=\"divtagdefaultwrapper\"><font face=\"Calibri,Helvetica,sans-serif\" size=\"3\" color=\"black\"><span style=\"font-size:12pt;\" id=\"divtagdefaultwrapper\">\r\n<div style=\"margin-top:0;margin-bottom:0;\"> TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\"><br>\r\n\r\n</div>\r\n<div style=\"margin-top:0;margin-bottom:0;\">TEST</div>\r\n</span></font></div>\r\n</div>\r\n</div>\r\n</body></html>"
|
||||||
|
|
||||||
|
let doc: Document = try! SwiftSoup.parse(h)
|
||||||
|
let text = try! doc.text()
|
||||||
|
try! XCTAssertEqual(text, "TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST")
|
||||||
|
}
|
||||||
|
|
||||||
static var allTests = {
|
static var allTests = {
|
||||||
return [
|
return [
|
||||||
|
|
|
@ -10,108 +10,9 @@ import XCTest
|
||||||
@testable import SwiftSoup
|
@testable import SwiftSoup
|
||||||
|
|
||||||
class SwiftSoupTests: XCTestCase {
|
class SwiftSoupTests: XCTestCase {
|
||||||
var html : String!
|
|
||||||
override func setUp() {
|
|
||||||
super.setUp()
|
|
||||||
let myURLString = "http://www.pointlesssites.com"
|
|
||||||
guard let myURL = URL(string: myURLString) else {
|
|
||||||
print("Error: \(myURLString) doesn't seem to be a valid URL")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
html = try! String(contentsOf: myURL, encoding: .utf8)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func getCustomWhiteList() -> Whitelist {
|
|
||||||
var whiteList: Whitelist?
|
|
||||||
do {
|
|
||||||
whiteList = try Whitelist.relaxed().preserveRelativeLinks(true)
|
|
||||||
.addTags("style")
|
|
||||||
.addTags("font")
|
|
||||||
.addTags("center")
|
|
||||||
.addTags("input")
|
|
||||||
.addTags("hr")
|
|
||||||
.addTags("title")
|
|
||||||
.addTags("iframe")
|
|
||||||
.addTags("map")
|
|
||||||
.addTags("area")
|
|
||||||
.addAttributes("font", "style", "color", "class", "face", "size")
|
|
||||||
.addAttributes("a", "style", "class")
|
|
||||||
.addAttributes("b", "style", "class")
|
|
||||||
.addAttributes("blockquote", "style", "class")
|
|
||||||
.addAttributes("br", "style", "class")
|
|
||||||
.addAttributes("caption", "style", "class")
|
|
||||||
.addAttributes("cite", "style", "class")
|
|
||||||
.addAttributes("code", "style", "class")
|
|
||||||
.addAttributes("col", "style", "class")
|
|
||||||
.addAttributes("colgroup", "style", "class")
|
|
||||||
.addAttributes("div", "style", "color", "class", "align")
|
|
||||||
.addAttributes("dl", "style", "class")
|
|
||||||
.addAttributes("dt", "style", "class")
|
|
||||||
.addAttributes("em", "style", "class")
|
|
||||||
.addAttributes("h1", "style", "class")
|
|
||||||
.addAttributes("h2", "style", "class")
|
|
||||||
.addAttributes("h3", "style", "class")
|
|
||||||
.addAttributes("h4", "style", "class")
|
|
||||||
.addAttributes("h5", "style", "class")
|
|
||||||
.addAttributes("h6", "style", "class")
|
|
||||||
.addAttributes("i", "style", "class")
|
|
||||||
.addAttributes("img", "style", "class", "usemap", "border")
|
|
||||||
.addAttributes("li", "style", "class")
|
|
||||||
.addAttributes("ol", "style", "class")
|
|
||||||
.addAttributes("p", "style", "class", "align")
|
|
||||||
.addAttributes("pre", "style", "class")
|
|
||||||
.addAttributes("q", "style", "class")
|
|
||||||
.addAttributes("small", "style", "class")
|
|
||||||
.addAttributes("span", "style", "class")
|
|
||||||
.addAttributes("strike", "style", "class")
|
|
||||||
.addAttributes("strong", "style", "class")
|
|
||||||
.addAttributes("sub", "style", "class")
|
|
||||||
.addAttributes("sup", "style", "class")
|
|
||||||
.addAttributes("table", "style", "class", "bgcolor", "align", "cellpadding",
|
|
||||||
"cellspacing", "border", "height", "align", "role", "dir")
|
|
||||||
.addAttributes("tbody", "style", "class")
|
|
||||||
.addAttributes("td", "style", "class", "bgcolor", "align", "valign", "height", "tabindex")
|
|
||||||
.addAttributes("tfoot", "style", "class")
|
|
||||||
.addAttributes("th", "style", "class", "align")
|
|
||||||
.addAttributes("thead", "style", "class")
|
|
||||||
.addAttributes("tr", "style", "class", "valign", "align")
|
|
||||||
.addAttributes("u", "style", "class")
|
|
||||||
.addAttributes("ul", "style", "class")
|
|
||||||
.addAttributes("center", "style", "class")
|
|
||||||
.addAttributes("style", "type")
|
|
||||||
.addAttributes("input", "type", "class", "disabled")
|
|
||||||
.addAttributes("iframe", "src", "style", "class")
|
|
||||||
.addAttributes("map", "name")
|
|
||||||
.addAttributes("area", "shape", "coords", "id", "href", "alt")
|
|
||||||
|
|
||||||
.addProtocols("img", "src", "cid", "data", "http", "https")
|
|
||||||
.addProtocols("a", "href", "travelertodo")
|
|
||||||
.addProtocols("a", "href", "ibmscp")
|
|
||||||
.addProtocols("a", "href", "sametime")
|
|
||||||
.addProtocols("a", "href", "stmeetings")
|
|
||||||
} catch Exception.Error (let type, let message) {
|
|
||||||
} catch {
|
|
||||||
}
|
|
||||||
return whiteList!
|
|
||||||
}
|
|
||||||
|
|
||||||
func testClean()
|
|
||||||
{
|
|
||||||
let customWhitelist = getCustomWhiteList()
|
|
||||||
var cleanHTML: String
|
|
||||||
do{
|
|
||||||
let noPrettyPrint = OutputSettings().prettyPrint(pretty: false)
|
|
||||||
let outputDocument = try SwiftSoup.parse(html.replaceAll(of: "\r\n", with: "\n"))
|
|
||||||
let bodyElement = outputDocument.body()
|
|
||||||
|
|
||||||
outputDocument.outputSettings(noPrettyPrint)
|
|
||||||
cleanHTML = try SwiftSoup.clean(outputDocument.html(), customWhitelist)!
|
|
||||||
|
|
||||||
|
|
||||||
}catch{
|
|
||||||
print("")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue