-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathOrgFileWriter.swift
127 lines (109 loc) · 3.17 KB
/
OrgFileWriter.swift
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
//
// OrgFileWriter.swift
// SwiftOrg
//
// Created by Xiaoxing Hu on 29/09/16.
// Copyright © 2016 Xiaoxing Hu. All rights reserved.
//
import Foundation
protocol Textifiable {
func textify(indent: Int) -> [String]
}
extension Section: Textifiable {
func textify(indent: Int) -> [String] {
var lines = [String]()
var headlineComponents = [String]()
headlineComponents.append(String(repeating: "*", count: stars))
if let k = keyword {
headlineComponents.append(k)
}
if let p = priority {
headlineComponents.append("[#\(p)]")
}
if let t = title {
headlineComponents.append(t)
}
lines += [headlineComponents.joined(separator: " ")]
// write drawers
for d in drawers ?? [] {
lines += d.textify(indent: stars + 1)
}
for n in content {
if let tn = n as? Textifiable {
lines += tn.textify(indent: stars + 1)
}
}
lines += ["\n"]
return lines
}
}
extension Paragraph: Textifiable {
func textify(indent: Int) -> [String] {
return lines.map { line in line.indent(indent) }
}
}
extension Block: Textifiable {
func textify(indent: Int) -> [String] {
var begin = ["#+BEGIN_\(name.uppercased())"]
if let p = params {
begin += p
}
var lines = [begin.joined(separator: " ").indent(indent)]
lines += content
lines += ["#+END_\(name.uppercased())".indent(indent)]
return lines
}
}
extension List: Textifiable {
func textify(indent: Int) -> [String] {
// TODO impl sublist for Textifiable
return items.enumerated().map { index, item in
var parts = [ordered ? "\(index)." : "-"]
if let c = item.checked {
parts += [c ? "[X]" : "[ ]"]
}
parts += [item.text ?? ""]
return parts.joined(separator: " ").indent(indent)
}
}
}
extension HorizontalRule: Textifiable {
func textify(indent: Int) -> [String] {
return ["-----"]
}
}
extension Comment: Textifiable {
func textify(indent: Int) -> [String] {
return ["# \(text ?? "")"]
}
}
extension Footnote: Textifiable {
func textify(indent: Int) -> [String] {
// TODO impl footnote for Textifiable
return []
}
}
extension Drawer: Textifiable {
func textify(indent: Int) -> [String] {
var lines = [":\(name.uppercased()):"]
lines += content
lines += [":END:"]
return lines.map { line in line.indent(indent) }
}
}
extension OrgDocument: Textifiable {
func textify(indent: Int = 0) -> [String] {
var lines = [String]()
let settingLines = settings.map { k, v in "#+\(k): \(v)" }
lines.append(contentsOf: settingLines)
for node in content {
if let n = node as? Textifiable {
lines += n.textify(indent: indent)
}
}
return lines
}
public func toText() -> String {
return self.textify().joined(separator: "\n")
}
}