Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/resources/extensions/quarto/lipsum/lipsum.lua
12923 views
1
2
3
local lipsum
4
5
math.randomseed(os.time())
6
7
8
-- reads a file
9
local function read_file(path)
10
local file = io.open(path, "rb")
11
if not file then return nil end
12
local content = file:read "*a"
13
file:close()
14
return content
15
end
16
17
-- read lipsum data
18
function readLipsum()
19
if lipsum == nil then
20
local file = quarto.utils.resolve_path("lipsum.json")
21
local fileContents = read_file(file)
22
if fileContents ~= nil then
23
local json = quarto.json.decode(fileContents)
24
lipsum = json
25
else
26
quarto.log.error("Unable to read lipsum data file.")
27
lipsum = {}
28
end
29
end
30
return lipsum
31
end
32
33
local rangePattern = '(%d+)%-(%d+)'
34
local barePattern = '^(%d+)$'
35
36
return {
37
['lipsum'] = function(args, kwargs, meta)
38
39
local isRandom = false
40
if kwargs and kwargs["random"] then
41
local randomVal = pandoc.utils.stringify(kwargs["random"])
42
if randomVal == "true" then
43
isRandom = true
44
end
45
end
46
47
local paraStart = 1
48
local paraEnd = 5
49
50
if args[1] ~= nil then
51
-- a range is specified, like 1-5, 2-3, 5-1
52
local range = pandoc.utils.stringify(args[1])
53
local _,_,startRange,endRange = range:find(rangePattern)
54
if startRange and endRange then
55
56
local startNumber = tonumber(startRange)
57
if startNumber ~= nil then
58
paraStart = startNumber
59
end
60
61
local endNumber = tonumber(endRange)
62
if endNumber ~= nil then
63
paraEnd = endNumber
64
end
65
else
66
-- a number of paragraphs is specified, like 10
67
local _,_,bareVal = range:find(barePattern)
68
if bareVal then
69
if isRandom then
70
paraStart = math.random(1, 17)
71
end
72
local endNumber = tonumber(bareVal)
73
if endNumber ~= nil then
74
paraEnd = paraStart + endNumber - 1
75
end
76
end
77
end
78
end
79
80
local paras = readLipsum();
81
local outputParas = {}
82
83
local count = paraEnd - paraStart + 1
84
if paraStart > paraEnd then
85
count = paraStart - paraEnd + 1
86
end
87
88
for i=1,count do
89
local paraIdx = i + (paraStart - 1)
90
if paraStart > paraEnd then
91
paraIdx = (paraStart + 1) - i
92
end
93
local outIdx = ((paraIdx-1)%(#paras-1))+1
94
outputParas[i] = pandoc.Para(paras[outIdx])
95
end
96
97
return outputParas
98
end
99
}
100
101