1 | -- resty-gitweb@utils/utils.lua |
2 | -- Basic utilities/resources for git HTTP site implementation |
3 |
|
4 | -- Copyright (c) 2020 Joshua 'joshuas3' Stockin |
5 | -- <https://git.joshstock.in/resty-gitweb> |
6 | -- This software is licensed under the MIT License. |
7 |
|
8 | local _M = {} |
9 |
|
10 | string.split = function(str, delimiter) |
11 | local t = {} |
12 | if not str or str == "" then |
13 | return t |
14 | end |
15 | if delimiter == "" then -- string to table |
16 | string.gsub(str, ".", function(c) table.insert(t, c) end) |
17 | return t |
18 | end |
19 | delimiter = delimiter or "%s" |
20 | local str_len = string.len(str) |
21 | local ptr = 1 |
22 | while true do |
23 | local sub = string.sub(str, ptr, str_len) |
24 | local pre, after = string.find(sub, delimiter) |
25 | if pre then -- delimiter found |
26 | table.insert(t, string.sub(str, ptr, ptr + (pre - 2))) |
27 | ptr = ptr + after |
28 | else -- delimiter not found |
29 | table.insert(t, string.sub(str, ptr, str_len)) |
30 | break |
31 | end |
32 | end |
33 | return t |
34 | end |
35 |
|
36 |
|
37 | string.trim = function(str) |
38 | return str:match('^()%s*$') and '' or str:match('^%s*(.*%S)') |
39 | end |
40 |
|
41 |
|
42 | _M.process = function(command) |
43 | local output |
44 | local status, err = pcall(function() |
45 | local process = io.popen(command, "r") |
46 | assert(process, "Error opening process") |
47 | output = process:read("*all") |
48 | process:close() |
49 | end) |
50 | if status then |
51 | return output |
52 | else |
53 | return string.format("Error in call: %s", err or command) |
54 | end |
55 | end |
56 |
|
57 | _M.markdown = function(input) |
58 | local output |
59 | local status, err = pcall(function() |
60 | local tmpfile = os.tmpname() |
61 | local fp = io.open(tmpfile, "w") |
62 | fp:write(input) |
63 | fp:close() |
64 | local process = io.popen("md2html --github "..tmpfile, "r") |
65 | assert(process, "Error opening process") |
66 | output = process:read("*all") |
67 | process:close() |
68 | os.remove(tmpfile) |
69 | end) |
70 | if status then |
71 | return output |
72 | else |
73 | return string.format("Error in call: %s", err or command) |
74 | end |
75 | end |
76 |
|
77 | _M.highlight = function(input, file_name) |
78 | local output |
79 | local status, err = pcall(function() |
80 | local t = os.tmpname() |
81 | io.open(t,"w"):close() |
82 | os.remove(t) |
83 | local tmpfile = t..file_name |
84 | local fp = io.open(tmpfile, "w") |
85 | fp:write(input) |
86 | fp:close() |
87 | local process = io.popen("highlight --stdout -f --failsafe --inline-css "..tmpfile, "r") |
88 | assert(process, "Error opening process") |
89 | output = process:read("*all") |
90 | process:close() |
91 | os.remove(tmpfile) |
92 | end) |
93 | if status then |
94 | return output |
95 | else |
96 | return string.format("Error in call: %s", err or command) |
97 | end |
98 | end |
99 |
|
100 | _M.html_sanitize = function(str) |
101 | local sanitized = tostring(str):gsub("&", "&") |
102 | :gsub("<", "<") |
103 | :gsub(">", ">") |
104 | :gsub("\"", """) |
105 | :gsub("'", "'") |
106 | return sanitized |
107 | end |
108 |
|
109 | _M.iso8601 = function(iso8601) |
110 | iso8601 = iso8601 or "0000-00-00T00:00:00GMT-5:00" |
111 | local y,mo,d,h,mi,s = iso8601:match("(%d%d%d%d)-(%d%d)-(%d%d)T(%d%d):(%d%d):(%d%d)") |
112 | local luatime = os.time{year=y,month=mo,day=d,hour=h,min=mi,sec=s} |
113 | return os.date("%d %b %Y %H:%M", luatime) |
114 | end |
115 |
|
116 | _M.print_table = function(t, l) -- for debugging |
117 | l = l or 0 |
118 | local n = false |
119 | for i,v in pairs(t) do n = true break end |
120 | if n then |
121 | ngx.print("{\n") |
122 | for i,v in pairs(t) do |
123 | for i=0,l do ngx.print(" ") end |
124 | ngx.print("<span style='color:red'>",i,"</span>: ") |
125 | if type(v) ~= "table" then |
126 | if type(v) == "string" then |
127 | ngx.print("\"") |
128 | local s = v:gsub("&", "&"):gsub("<","<"):gsub(">",">"):gsub("\"","\\"") |
129 | ngx.print(s) |
130 | ngx.print("\"") |
131 | else |
132 | ngx.print(v) |
133 | end |
134 | else |
135 | _M.print_table(v,l+1) |
136 | end |
137 | ngx.print("\n") |
138 | end |
139 | for i=0,l-1 do ngx.print(" ") end |
140 | ngx.print("}") |
141 | else |
142 | ngx.print("{}") |
143 | end |
144 | end |
145 |
|
146 | return _M |
147 |
|