-
Notifications
You must be signed in to change notification settings - Fork 4
/
MdxSourceBuilderLink.vim
294 lines (282 loc) · 9.92 KB
/
MdxSourceBuilderLink.vim
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
" 读取词典参数 ------------------------------------------------------------{{{1
let s:CSSName = g:CSSName
let s:pageNumDigit = '%0'. g:pageNumDigit . 'd'
let s:sourceStyle = anyMoreSource[1]
let s:pagePrefix = anyMoreSource[2]
" 初始化及通用函数定义 ----------------------------------------------------{{{1
" 清理并保存,以便后续代码可以正常运作
silent! normal! Go
silent! global/^"/d
silent! global/^$/d
silent! w!
function! StandardizeStyle(sourceStyle)
" 将 page,keywords 输入文件格式整理为标准格式
if a:sourceStyle == 0
" No further treatment is required
" 适合如下标准词条格式:一行页码 + 多行关键词(每行一个关键词)
" 0001
" a
" b
" c
" 0002
" x
" y
" z
elseif a:sourceStyle == 1
" 适合如下词条格式:行格式为'一个页码+多个中文单字符的关键词'
" 0001吖阿啊锕腌啊嗄啊哎
" 0002哀埃挨唉锿挨皑癌毐欸嗳矮蔼
" 0003霭艾砹唉爱隘碍嗳嗌媛瑷
" 以下将的单行格式转换为标准词条格式
" 将页码换行
silent! %s/^\d\{3,}\($\)\@!/\0\r/e
" 将每个字独立成行
silent! %s/\D\($\)\@!/\0\r/ge
elseif a:sourceStyle == 2
" 适合如下词条格式:行格式为"页码 + 分隔符 + 单个中或英关键词"
" 分隔符兼容:Tab键'\t', 4个及以上空格'\s\{4,}'
" 0001 abandon
" 0001 abandoned
" 0002 abandonee
" 0002 a bas
" 0003 abdominous
" 将所有Tab替换为空格
silent! set expandtab tabstop=4 | %retab
normal gg
let linenumber = printf(s:pageNumDigit, 0)
for line in getline(1,'$')
let words = split(line, '\s\{4,}')
if linenumber == words[0]
silent! s/^.*$/\= words[1]/e
else
let linenumber = words[0]
silent! s/^.*$/\= words[0] . "\n". get(words, 1, "")/e
endif
silent! normal j
endfor
elseif a:sourceStyle == 3
" 适合如下词条格式:行格式为"单个中或英关键词 + 分隔符 + 页码"
" 分隔符兼容:Tab键'\t', 4个及以上空格'\s\{4,}'
" abandon 0001
" abandoned 0001
" abandonee 0002
" a bas 0002
" abdominous 0003
" 将所有Tab替换为空格
silent! set expandtab tabstop=4 | %retab
" 将格式转为sourceStyle 2
silent! %s/^\(.\{-}\)\s\{4,}\(\d\{3,}\)$/\2 \1/
normal gg
let linenumber = printf(s:pageNumDigit, 0)
for line in getline(1,'$')
let words = split(line, '\s\{4,}')
if linenumber == words[0]
silent! s/^.*$/\= words[1]/e
else
let linenumber = words[0]
silent! s/^.*$/\= words[0] . "\n". get(words, 1, "")/e
endif
silent! normal j
endfor
else
echomsg "警告!未定义 SourceStyle " . a:sourceStyle . " 的标准化方案!"
endif
" 清理并保存,以便后续代码可以正常运作
silent! normal! Go
silent! %s/?/?/g
silent! global/^$/d
silent! w!
endfunction
function! PageList()
" 创建、排序、去重 pageList
let s:pageList = []
global/^\d\{3,}$/call add(s:pageList, str2nr(getline('.')))
let s:pageList = uniq(sort(s:pageList,'n'))
return s:pageList
" echomsg s:pageList
endfunction
function! KeywordsDict()
let startline = line(".")
let currentPage = str2nr(getline('.'))
silent! cbelow
let endline = line(".")
let lastline = line("$")
if endline == startline
if endline == lastline
silent! let s:keywordsDict[currentPage]
\= get(s:keywordsDict, currentPage, [])
\+ getline(startline+1, endline-1)
else
silent! let s:keywordsDict[currentPage]
\= get(s:keywordsDict, currentPage, [])
\+ getline(startline+1, lastline)
endif
else
silent! let s:keywordsDict[currentPage]
\= get(s:keywordsDict, currentPage, [])
\+ getline(startline+1, endline-1)
silent! cabove
endif
return s:keywordsDict
endfunction
function! KeywordsDicts()
let s:keywordsDict = {}
silent! vimgrep /^\d\{3,}$/ %
silent! cdo call KeywordsDict()
" echomsg s:keywordsDict
endfunction
" 根据SourceStyle输出标准的mdx源文件格式 ----------------------------------{{{1
if index([0,1,2,3], s:sourceStyle) >= 0
" 运行初始化函数
silent! call StandardizeStyle(s:sourceStyle)
silent! call PageList()
silent! call KeywordsDicts()
" 清空全文
silent! %delete
" 将标准化词条转为标准的mdx源文件格式
for currentPage in s:pageList
for currentKeyword in s:keywordsDict[currentPage]
silent! let s:atLink = [currentKeyword
\, '@@@LINK=' . s:pagePrefix
\. printf(s:pageNumDigit, currentPage)
\, '</>']
silent! call append('$', s:atLink)
endfor
endfor
elseif s:sourceStyle == 104
" 将带有编号的主词条改造为使用"s+编号"进行检索
silent! %s/^\(\d*\)\(\s.*\)$/s\1\r@@@LINK=\0\r<\/>/
elseif s:sourceStyle == 105
" 运行初始化函数
silent! call StandardizeStyle(s:sourceStyle)
silent! call PageList()
silent! call KeywordsDicts()
" 清空全文
silent! 0,$d
" 将标准化词条转为标准的mdx源文件格式
for currentPage in s:pageList
for currentKeyword in s:keywordsDict[currentPage]
" 对currentKeyword进行特殊处理
silent! let s:atLink = [currentKeyword
\, '@@@LINK=' . s:pagePrefix
\. printf(s:pageNumDigit, currentPage)
\, '</>'
\, "s" . split(currentKeyword, '\s')[0]
\, '@@@LINK=' . currentKeyword
\, '</>']
silent! call append('$', s:atLink)
endfor
endfor
elseif s:sourceStyle == 106
" 1. “中英文”定位到页面
let lineDicts = {}
let lineNumber = 0
for line in getline(1,'$')
let lineDicts[lineNumber] = split(line, '\s\{4,}')
let lineNumber += 1
endfor
" 清空全文
silent! 0,$d
for line in range(lineNumber)
let lineList = lineDicts[line]
silent! let s:atLink = [lineList[2]
\, '@@@LINK=' . s:pagePrefix
\. lineList[0]
\, '</>'
\, lineList[1]
\, '@@@LINK=' . lineList[2]
\, '</>'
\, lineList[3]
\, '@@@LINK=' . lineList[2]
\, '</>']
silent! call append('$', s:atLink)
endfor
elseif s:sourceStyle == 107
" 添加编号链接
silent! %s/\(\d\+\)/<a href="entry:\/\/s\1">\1<\/a>/g
" 给每个词条添加CSS
silent! execute '%s/^\(<\/>\)/'
\. '<link rel="stylesheet" type="text\/css" href="'
\. s:CSSName
\. '" \/>\r\0/e'
elseif s:sourceStyle == 109
" 基于888改造:主词条为页码
silent! g/^\s*"/d
silent! global/^$/d
silent! %s/?/?/g
silent! set expandtab tabstop=4 | %retab
silent! w!
let lineDicts = {}
let lineNumber = 0
for line in getline(1,'$')
let lineDicts[lineNumber] = split(line, '\s\{4,}')
let lineNumber += 1
endfor
silent! %delete
for line in range(lineNumber)
let lineList = lineDicts[line]
for dictKeyword in lineList[1:]
silent! let s:atLink = [dictKeyword
\, '@@@LINK=' . s:pagePrefix . lineList[0]
\, '</>']
silent! call append('$', s:atLink)
endfor
endfor
elseif s:sourceStyle == 888
" 适用于快速手工添加链接词条
" 词条格式:现有关键词\t链接词条1\t链接词条2\t链接词条3
" 分隔符兼容Tab和空格(4位及以上)
" 可以添加注释行:与VimL一样,以 " 开头
" 可以添加空行
" ///////////////
" 清理数据:删除注释行、空行、问号中文化、Tab转空格
silent! g/^\s*"/d
silent! global/^$/d
silent! %s/?/?/g
silent! set expandtab tabstop=4 | %retab
silent! w!
let lineDicts = {}
let lineNumber = 0
for line in getline(1,'$')
let lineDicts[lineNumber] = split(line, '\s\{4,}')
let lineNumber += 1
endfor
silent! 0,$d
for line in range(lineNumber)
let lineList = lineDicts[line]
for dictKeyword in lineList[1:]
silent! let s:atLink = [dictKeyword
\, '@@@LINK=' . lineList[0]
\, '</>']
silent! call append('$', s:atLink)
endfor
endfor
elseif s:sourceStyle == 998
" 清理数据:删除注释行、空行
" 注释行:与VimL一样,以 " 开头
silent! g/^\s*"/d
silent! global/^$/d
silent! w!
" 给每个词条添加CSS
silent! execute '%s/^\(<\/>\)/'
\. '<link rel="stylesheet" type="text\/css" href="'
\. s:CSSName
\. '" \/>\r\0/e'
elseif s:sourceStyle == 999
" 清理数据:删除注释行、空行
" 注释行:与VimL一样,以 " 开头
silent! g/^\s*"/d
silent! global/^$/d
silent! w!
" No further treatment is required
else
echomsg "警告!!未定义 SourceStyle " . s:sourceStyle . " 的处理方案!"
endif
" 将输出结果保存到mdxSource ----------------------------------------------{{{1
silent! global/^$/d
let g:mdxSource = extend(g:mdxSource, getline(1, "$"))
" Reference --------------------------------------------------------------{{{1
finish
" 在新Tab页打开output文件
silent! tabe %:r.output.%:e
/* vim: set et sw=4 ts=4 sts=4 fdm=marker ff=unix ft=vim fenc=utf8 nobomb: */