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
|
local platform = require 'bee.platform'
local files = require 'files'
local furi = require 'file-uri'
local workspace = require "workspace"
local m = {}
m.cache = {}
--- `aaa/bbb/ccc.lua` 与 `?.lua` 将返回 `aaa.bbb.cccc`
local function getOnePath(path, searcher)
local stemPath = path
: gsub('%.[^%.]+$', '')
: gsub('[/\\]+', '.')
local stemSearcher = searcher
: gsub('%.[^%.]+$', '')
: gsub('[/\\]+', '.')
local start = stemSearcher:match '()%?' or 1
for pos = start, #stemPath do
local word = stemPath:sub(start, pos)
local newSearcher = stemSearcher:gsub('%?', (word:gsub('%%', '%%%%')))
if files.eq(newSearcher, stemPath) then
return word
end
end
return nil
end
function m.getVisiblePath(path, searchers, strict)
path = path:gsub('^[/\\]+', '')
local uri = furi.encode(path)
local libraryPath = files.getLibraryPath(uri)
if not m.cache[path] then
local result = {}
m.cache[path] = result
if libraryPath then
libraryPath = libraryPath:gsub('^[/\\]+', '')
end
for _, searcher in ipairs(searchers) do
local isAbsolute = searcher:match '^[/\\]'
or searcher:match '^%a+%:'
local cutedPath = path
local head
local pos = 1
if not isAbsolute then
if libraryPath then
pos = #libraryPath + 2
else
path = workspace.getRelativePath(uri)
end
end
repeat
cutedPath = path:sub(pos)
head = path:sub(1, pos - 1)
pos = path:match('[/\\]+()', pos)
if platform.OS == 'Windows' then
searcher = searcher :gsub('[/\\]+', '\\')
:gsub('^[/\\]+', '')
else
searcher = searcher :gsub('[/\\]+', '/')
:gsub('^[/\\]+', '')
end
local expect = getOnePath(cutedPath, searcher)
if expect then
if head then
searcher = head .. searcher
end
result[#result+1] = {
searcher = searcher,
expect = expect,
}
end
until not pos or strict
end
end
return m.cache[path]
end
function m.flush()
m.cache = {}
end
files.watch(function (ev)
if ev == 'create'
or ev == 'remove' then
m.flush()
end
end)
return m
|