Skip to content

Commit ecb650f

Browse files
committed
Initial commit
0 parents  commit ecb650f

20 files changed

+3818
-0
lines changed

Package.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// swift-tools-version:5.0
2+
import PackageDescription
3+
4+
let package = Package(
5+
name: "html2text-swift",
6+
products: [
7+
.library(name: "HTML2Text", targets: ["HTML2Text"]),
8+
],
9+
dependencies: [
10+
.package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.0.0"),
11+
],
12+
targets: [
13+
.target(name: "HTML2Text", dependencies: ["SwiftSoup"])
14+
]
15+
)
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Python docs: https://docs.python.org/2/library/stdtypes.html#mapping-types-dict
2+
//
3+
// Most frequently used:
4+
// 12 dict.get
5+
// 4 dict.fromkeys
6+
// 2 dict.keys
7+
// 1 dict.iteritems
8+
// 1 dict.has_key
9+
//
10+
// >>> filter(lambda s: not s.startswith("_"), dir({}))
11+
// clear: Implemented.
12+
// copy
13+
// fromkeys: Implemented.
14+
// get: Implemented.
15+
// has_key: Implemented as hasKey.
16+
// items: Implemented.
17+
// iteritems
18+
// iterkeys
19+
// itervalues
20+
// keys: Already in Swift (instance variable, not method).
21+
// pop: Implemented.
22+
// popitem: Implemented.
23+
// setdefault
24+
// update
25+
// values: Already in Swift (instance variable, not method).
26+
// viewitems
27+
// viewkeys
28+
// viewvalues
29+
30+
public typealias dict = Swift.Dictionary
31+
32+
public extension Dictionary {
33+
mutating func clear() {
34+
self.removeAll()
35+
}
36+
37+
func get(_ key: Key) -> Value? {
38+
return self[key]
39+
}
40+
41+
func hasKey(_ key: Key) -> Bool {
42+
if let _ = self.get(key) {
43+
return true
44+
}
45+
return false
46+
}
47+
48+
func has_key(_ key: Key) -> Bool {
49+
return hasKey(key)
50+
}
51+
52+
mutating func pop(_ key: Key) -> Value? {
53+
if let val = self.get(key) {
54+
self.removeValue(forKey: key)
55+
return val
56+
}
57+
return nil
58+
}
59+
60+
mutating func popItem() -> (Key, Value)? {
61+
if self.count == 0 {
62+
return nil
63+
}
64+
let key = Array(self.keys)[0]
65+
let value = self.pop(key)!
66+
return (key, value)
67+
}
68+
69+
mutating func popitem() -> (Key, Value)? {
70+
return popItem()
71+
}
72+
73+
func items() -> [(Key, Value)] {
74+
var ret: [(Key, Value)] = []
75+
for (key, value) in zip(self.keys, self.values) {
76+
ret.append((key, value))
77+
}
78+
return ret
79+
}
80+
81+
static func fromKeys(_ sequence: [Key], _ defaultValue: Value) -> [Key: Value]{
82+
var dict = [Key: Value]()
83+
for key in sequence {
84+
dict[key] = defaultValue
85+
}
86+
return dict
87+
}
88+
89+
static func fromkeys(_ sequence: [Key], _ defaultValue: Value) -> [Key: Value] {
90+
return fromKeys(sequence, defaultValue)
91+
}
92+
93+
func copy() -> [Key: Value] {
94+
return self
95+
}
96+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Python docs: https://docs.python.org/2/library/stdtypes.html
2+
//
3+
// Most frequently used:
4+
// 15 file.close
5+
// 9 file.name
6+
// 8 file.readline
7+
// 7 file.write
8+
// 2 file.read
9+
// 1 file.writelines
10+
// 1 file.readlines
11+
// 1 file.fileno
12+
//
13+
// >>> filter(lambda s: not s.startswith("_"), dir(open("/tmp/foo")))
14+
// close: TODO.
15+
// closed
16+
// encoding
17+
// errors
18+
// fileno
19+
// flush: TODO.
20+
// isatty
21+
// mode
22+
// name
23+
// newlines
24+
// next
25+
// read
26+
// readinto
27+
// readline
28+
// readlines
29+
// seek
30+
// softspace
31+
// tell
32+
// truncate
33+
// write: TODO.
34+
// writelines
35+
// xreadlines
36+
37+
import Foundation
38+
39+
public typealias file = FileHandle
40+
41+
public extension FileHandle {
42+
func read() -> String {
43+
let data: Data = self.readDataToEndOfFile()
44+
return String(data: data, encoding: .utf8)!
45+
}
46+
47+
func readLines() -> [String] {
48+
return self.read().strip().split("\n")
49+
}
50+
51+
func readlines() -> [String] {
52+
return self.readLines()
53+
}
54+
55+
func close() {
56+
self.closeFile()
57+
}
58+
59+
func write(s: String) {
60+
if let data = s.data(using: .utf8) {
61+
self.write(data)
62+
}
63+
}
64+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Python docs: https://docs.python.org/2/library/stdtypes.html
2+
//
3+
// >>> filter(lambda s: not s.startswith("_"), dir(1.1))
4+
// as_integer_ratio
5+
// conjugate
6+
// fromhex
7+
// hex
8+
// imag
9+
// is_integer: Implemented.
10+
// real
11+
12+
public typealias float = Swift.Double
13+
14+
public extension Double {
15+
func isInteger() -> Bool {
16+
return math.floor(arg1: self) == self
17+
}
18+
19+
func isr() -> Bool {
20+
return self.isInteger()
21+
}
22+
}
23+
24+
public extension Float {
25+
func isInteger() -> Bool {
26+
return math.floor(arg1: Double(self)) == Double(self)
27+
}
28+
29+
func is_integer() -> Bool {
30+
return self.isInteger()
31+
}
32+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Python docs: https://docs.python.org/2/library/json.html
2+
//
3+
// Most frequently used:
4+
// 208 json.dumps
5+
// 191 json.loads
6+
// 28 json.load
7+
// 9 json.dump
8+
// 8 json.JSONEncoder
9+
// 3 json.JSONDecoder
10+
//
11+
// >>> filter(lambda s: not s.startswith("_"), dir(json))
12+
// JSONDecoder
13+
// JSONEncoder
14+
// decoder
15+
// dump
16+
// dumps
17+
// encoder
18+
// load
19+
// loads
20+
// scanner
21+
22+
import Foundation
23+
24+
public class json {
25+
public class func dumps(obj: Any) -> String {
26+
let jsonData = try? JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted)
27+
if let jsonData = jsonData {
28+
return String(data: jsonData, encoding: .utf8)!
29+
}
30+
return ""
31+
}
32+
33+
public class func loads(json: String) -> Any? {
34+
let jsonData = json.data(using: .utf8)
35+
let jsonObject = try? JSONSerialization.jsonObject(with: jsonData!, options: .mutableContainers)
36+
return jsonObject
37+
}
38+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Python docs: https://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange
2+
//
3+
// Most frequently used:
4+
// 2 list.sort
5+
// 2 list.pop
6+
// 2 list.append
7+
// 1 list.reverse
8+
// 1 list.remove
9+
// 1 list.insert
10+
//
11+
// >>> filter(lambda s: not s.startswith("_"), dir([]))
12+
// append: Already in Swift.
13+
// count: Added.
14+
// extend: Already in Swift.
15+
// index: Added.
16+
// insert: Failed to add. (TODO)
17+
// pop: Added.
18+
// remove: Added.
19+
// reverse: Added as "reverseInPlace" to avoid name collision with built-in Array.reverse.
20+
// sort: Failed to add. Name collision with built-in Array.sort. (TODO)
21+
22+
public extension Array {
23+
mutating func clear() {
24+
self.removeAll()
25+
}
26+
27+
mutating func reverseInPlace() {
28+
self.reverse()
29+
}
30+
31+
mutating func count<T>(_ element: T) -> Int where T: Equatable {
32+
if element is Array.Element {
33+
return Swift.unsafeBitCast(self, to: [T].self).filter({ $0 == element }).count
34+
}
35+
return 0
36+
}
37+
38+
mutating func remove<T>(_ element: T) where T: Equatable {
39+
if let i = index(element) {
40+
self.remove(at: i)
41+
}
42+
}
43+
44+
func index<T>(_ element: T) -> Int? where T: Equatable {
45+
if element is Array.Element {
46+
if let idx = Swift.unsafeBitCast(self, to: [T].self).firstIndex(of: element) {
47+
return idx
48+
}
49+
}
50+
return nil
51+
}
52+
53+
mutating func pop(_ index: Int?) -> Array.Element? {
54+
let i = index ?? self.count - 1
55+
guard self.count > 0 && i >= 0 && i < self.count else {
56+
return nil
57+
}
58+
defer { self.remove(at: i) }
59+
return self[i]
60+
}
61+
62+
mutating func pop() -> Array.Element? {
63+
return self.pop(nil)
64+
}
65+
}

0 commit comments

Comments
 (0)