-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmdrelink.py
96 lines (73 loc) · 3.31 KB
/
mdrelink.py
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
import sublime, sublime_plugin, math
def removeOphange(self, edit):
links = []
regions = self.view.find_all("(\[\&\d+\])[:]", sublime.IGNORECASE, "\\1", links)
for i, r in enumerate(links):
find = self.view.find_all(r, sublime.LITERAL)
if len(find) == 1:
line = self.view.line(regions[i])
self.view.erase(edit, line)
def cleanup(self, edit):
redundantNewLine = self.view.find_all("\[\&.+?\]\: [http|\/|\.\/|\~\/].+?\n{2,}\[.+?\]\: [http|\/|\.\/|\~\/].+?\n")
trimNewLine = []
self.view.find_all("(\[\&.+?\]\: [http|\/|\.\/|\~\/].+?\n)\n+(\[\&.+?\]\: [http|\/|\.\/|\~\/].+?\n)", sublime.IGNORECASE, "\\1\\2", trimNewLine)
for i, r in enumerate(redundantNewLine):
self.view.replace(edit, r, trimNewLine[i])
def reorderReferences(self, edit):
references = []
self.view.find_all("(\[\&\d+\])[^:]", sublime.IGNORECASE, "\\1", references)
for i, ref in enumerate(references):
regions = self.view.find_all(ref, sublime.LITERAL)
regions.reverse()
pad = int(math.floor(math.log(len(references), 10)))+1
for r in regions:
self.view.replace(edit, r, "[#{:0{padding}d}#]".format(i+1, padding = pad))
# remove #
hashedReferences = []
hashedRegion = self.view.find_all("\[\#(\d+)\#\]", sublime.IGNORECASE, "[&\\1]", hashedReferences)
hashedReferences.reverse()
hashedRegion.reverse()
for i, r in enumerate(hashedRegion):
self.view.replace(edit, r, hashedReferences[i])
# sort
texts = []
newRegions = self.view.find_all("^(\[\&\d+\]:.+?\n)", sublime.IGNORECASE, "\\1", texts)
newRegions.reverse()
for i, r in enumerate(newRegions):
self.view.erase(edit, r)
for address in sorted(texts):
self.view.insert(edit, self.view.size(), address)
def formattedLinkReference(i, size):
pad = int(math.floor(math.log(size, 10)))+1
return "[&{:0{padding}d}]".format(i, padding = pad)
class mdrelinkCommand(sublime_plugin.TextCommand):
def run(self, edit):
removeOphange(self, edit)
oldlinks = []
self.view.find_all("^\s*(\[\&\d+\]):", sublime.IGNORECASE, "\\1", oldlinks)
# get all link location
links = self.view.find_all("\[.+?\](\([http|\/|\.\/|\~\/].+?\))")
# get link's text
texts = []
self.view.find_all("(\[.+?\])\([http|\/|\.\/|\~\/].+?\)", sublime.IGNORECASE, "\\1", texts)
# get link's addresses
addresses = []
self.view.find_all("\[.+?\]\(([http|\/|\.\/|\~\/].+?)\)", sublime.IGNORECASE, "\\1", addresses)
addresses.reverse()
if len(links) > 0:
self.view.insert(edit, self.view.size(), '\n\n')
# large enough to prevent same link id
counter = len(oldlinks)*100 + 1
newnumbers = []
for i, r in enumerate(links):
formatRefLink = formattedLinkReference(counter, len(oldlinks))
newnumbers.append(formatRefLink)
line = formatRefLink + ': '+ addresses.pop() + '\n'
self.view.insert(edit, self.view.size(), line)
counter += 1
for r in reversed(links):
self.view.replace(edit, r, texts.pop() + newnumbers.pop())
# self.view.replace(edit, r, texts.pop())
# Cleanup
cleanup(self, edit)
reorderReferences(self, edit)