Compare commits

...

10 Commits

4 changed files with 173 additions and 9 deletions
+7
View File
@@ -0,0 +1,7 @@
{
"workspace": {
"library": [
"types"
]
}
}
Executable
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
lua /home/murat/Projects/luago/luago.lua
+122 -9
View File
@@ -3,32 +3,145 @@ local lfs = require("lfs")
-- list of markdown files in working directory -- list of markdown files in working directory
local markdownFiles = {} local markdownFiles = {}
local haveIndexmd = false
local haveIndexhtml = false
-- amount of markdown files in working directory -- amount of markdown files in working directory
local markdownFileCount = 0 local markdownFileCount = 0
local currentDir = lfs.currentdir() local currentDir = lfs.currentdir()
for file in lfs.dir(currentDir) do for file in lfs.dir(currentDir) do
-- ignore "." and ".." files -- ignore "." and ".." files
if not(file:sub(1,3) == ".." or file:sub(1,2) == '.') then if not(file:sub(1,2) == ".." or file:sub(1,1) == '.') then
local filePath = currentDir .. '/' .. file local filePath = currentDir .. '/' .. file
-- match file names ending with ".md" -- match file names ending with ".md"
if file:match("index.md") then haveIndexmd = true end
if file:match("index.html") then haveIndexhtml = true end
if file:match("%.md$") then if file:match("%.md$") then
markdownFileCount = markdownFileCount + 1 markdownFileCount = markdownFileCount + 1
markdownFiles[markdownFileCount] = filePath markdownFiles[markdownFileCount] = {
options = {},
filePath = filePath,
fileName = file:sub(1, file:len()-3),
content = ""
}
end end
end end
end end
-- stop the program if "index.html" or "index.md" doesn't exist
if (not(haveIndexhtml) and not(haveIndexmd)) then return print("Can't find index.html or index.md!") end
for index, value in ipairs(markdownFiles) do -- check for options section on every markdown file
-- print file path with index for index, file in ipairs(markdownFiles) do
print(index .. ': ' .. markdownFiles[index]) local f = io.open(file.filePath, 'r')
local f = io.open(markdownFiles[index], 'r')
if f then if f then
local content = f:read("*all") local content = f:read("*all")
f:close() f:close()
-- print file content if content:sub(1,4) ~= "---\n" then
print(content) return print(file.filePath .. " file doesn't have a options section!")
end
local fileOptions = content:sub(5, content:len())
if fileOptions:find("---") then
fileOptions = fileOptions:sub(1, fileOptions:find("---\n")-1)
local lines = {}
local lineCount = 0
while fileOptions:find("\n") do
lineCount = lineCount + 1
lines[lineCount] = fileOptions:sub(1, fileOptions:find("\n"))
fileOptions = fileOptions:sub(fileOptions:find("\n")+1, fileOptions:len())
end
-- fill options table
for i, value in ipairs(lines) do
if value:sub(value:len(), value:len()) == "\n" then
value = value:sub(1, value:find("\n")-1)
end
local colonPos = value:find(":")
if colonPos then
local key = value:sub(1, colonPos - 1):match("^%s*(.-)%s*$")
local val = value:sub(colonPos + 1):match("^%s*(.-)%s*$")
if key and key ~= "" then
markdownFiles[index].options[key] = val
end
end
end
else
return print(file.filePath .. " file doesn't have a options section!")
end
else else
print("can't read the file ".. markdownFiles[index]) print("can't read the file " .. file.filePath)
end end
end end
-- replace markdownFiles.content with md file content
for index, value in ipairs(markdownFiles) do
local f = io.open(markdownFiles[index].filePath)
if f then
local content = f:read("*a")
f:close()
-- delete options section
content = content:sub(5, content:len())
content = content:sub(content:find("---\n")+4, content:len())
markdownFiles[index].content = content
end
end
for index, value in ipairs(markdownFiles) do
print("---------------")
-- print file path with index
print(index .. ': ' .. markdownFiles[index].filePath)
local f = io.open(markdownFiles[index].filePath, 'r')
if f then
f:close()
-- print file content
print(markdownFiles[index].content)
-- print file options
print("--- OPTIONS ---")
for key, val in pairs(markdownFiles[index].options) do
print(key .. ": " .. val)
end
print("---------------")
else
print("can't read the file " .. markdownFiles[index].filePath)
end
end
-- get index.html content
local indexFile = io.open("index.html"):read("*all")
local siteName
local siteTitle
-- remove and create "public/" directory
lfs.rmdir("public")
lfs.mkdir("public")
for index, value in ipairs(markdownFiles) do
local workDir = lfs.currentdir()
-- create html file for that md file
local htmlFile = io.open(workDir .. "/public/" .. markdownFiles[index].fileName .. ".html", 'w')
if htmlFile then
local content = indexFile
-- replace <!-- sitecontents --> with markdown file content
local start_idx, end_idx = content:find("<!-- sitecontents -->", 1, true)
if start_idx and end_idx then
local first = content:sub(1, start_idx - 1)
local second = content:sub(end_idx + 1)
content = first .. markdownFiles[index].content .. second
end
while content:find("<!-- title -->", 1, true) do
start_idx, end_idx = content:find("<!-- title -->", 1, true)
if start_idx and end_idx then
local first = content:sub(1, start_idx - 1)
local second = content:sub(end_idx + 1)
content = first .. markdownFiles[index].options["title"] .. second
end
end
htmlFile:write(content)
htmlFile:close()
else
print("Error: Cannot create html file for " .. markdownFiles[index].filePath)
end
end
+41
View File
@@ -0,0 +1,41 @@
---@meta
---@class lfs
local lfs = {}
---@param filepath string
---@param aname? string|table
---@return table|string|nil result
---@return string? error_msg
function lfs.attributes(filepath, aname) end
---@param path string
---@return boolean success
---@return string? error_msg
function lfs.chdir(path) end
---@return string path
function lfs.currentdir() end
---@param path string
---@return fun():string iter
---@return table dir_obj
function lfs.dir(path) end
---@param dirname string
---@return boolean success
---@return string? error_msg
function lfs.mkdir(dirname) end
---@param dirname string
---@return boolean success
---@return string? error_msg
function lfs.rmdir(dirname) end
---@param filepath string
---@param atime? number
---@param mtime? number
---@return boolean success
---@return string? error_msg
function lfs.touch(filepath, atime, mtime) end
return lfs