alpha
This commit is contained in:
@@ -121,39 +121,62 @@ function M:custom(str)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M:g(str)
|
||||||
|
self:custom(str)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
function M:h1(str)
|
function M:h1(str)
|
||||||
str = str or ""
|
str = str or ""
|
||||||
table.insert(self.parts, "<h1>" .. str .. "</h1>")
|
self:custom("<h1>" .. str .. "</h1>")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function M:h2(str)
|
function M:h2(str)
|
||||||
str = str or ""
|
str = str or ""
|
||||||
table.insert(self.parts, "<h2>" .. str .. "</h2>")
|
self:custom("<h2>" .. str .. "</h2>")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function M:h3(str)
|
function M:h3(str)
|
||||||
str = str or ""
|
str = str or ""
|
||||||
table.insert(self.parts, "<h3>" .. str .. "</h3>")
|
self:custom("<h3>" .. str .. "</h3>")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function M:h4(str)
|
function M:h4(str)
|
||||||
str = str or ""
|
str = str or ""
|
||||||
table.insert(self.parts, "<h4>" .. str .. "</h4>")
|
self:custom("<h4>" .. str .. "</h4>")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function M:h5(str)
|
function M:h5(str)
|
||||||
str = str or ""
|
str = str or ""
|
||||||
table.insert(self.parts, "<h5>" .. str .. "</h5>")
|
self:custom("<h5>" .. str .. "</h5>")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function M:h6(str)
|
function M:h6(str)
|
||||||
str = str or ""
|
str = str or ""
|
||||||
table.insert(self.parts, "<h6>" .. str .. "</h6>")
|
self:custom("<h6>" .. str .. "</h6>")
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:p(str)
|
||||||
|
str = str or ""
|
||||||
|
table.insert(self.parts, "<p>" .. str .. "</p>")
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:note(content)
|
||||||
|
content = content or ""
|
||||||
|
self:custom('<div class="note">' .. content .. '</div>')
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:a(link, str)
|
||||||
|
str = str or ""
|
||||||
|
table.insert(self.parts, "<a href=\"" .. link .. "\">" .. str .. "</a>")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
19
core/markdown.lua
Normal file
19
core/markdown.lua
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- Markdown to HTML conversion function
|
||||||
|
-- Uses the Go backend markdown parser
|
||||||
|
function M.to_html(markdown_text)
|
||||||
|
markdown_text = markdown_text or ""
|
||||||
|
|
||||||
|
-- Get the fes module
|
||||||
|
local fes_mod = package.loaded.fes
|
||||||
|
if fes_mod and fes_mod.markdown_to_html then
|
||||||
|
return fes_mod.markdown_to_html(markdown_text)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Fallback: return error message if Go function not available
|
||||||
|
return "<p>Error: markdown_to_html function not available</p>"
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
|
|
||||||
@@ -16,4 +16,4 @@ function M.site_version()
|
|||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
2
go.mod
2
go.mod
@@ -3,7 +3,7 @@ module fes
|
|||||||
go 1.25.4
|
go 1.25.4
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect
|
github.com/gomarkdown/markdown v0.0.0-20250810172220-2e2c11897d1a // indirect
|
||||||
github.com/gomarkdown/mdtohtml v0.0.0-20240124153210-d773061d1585 // indirect
|
github.com/gomarkdown/mdtohtml v0.0.0-20240124153210-d773061d1585 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
github.com/yuin/gopher-lua v1.1.1 // indirect
|
github.com/yuin/gopher-lua v1.1.1 // indirect
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -1,4 +1,6 @@
|
|||||||
github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
|
github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
|
||||||
|
github.com/gomarkdown/markdown v0.0.0-20250810172220-2e2c11897d1a h1:l7A0loSszR5zHd/qK53ZIHMO8b3bBSmENnQ6eKnUT0A=
|
||||||
|
github.com/gomarkdown/markdown v0.0.0-20250810172220-2e2c11897d1a/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
|
||||||
github.com/gomarkdown/mdtohtml v0.0.0-20240124153210-d773061d1585/go.mod h1:6grYm5/uY15CwgBBqwA3+o/cAzaxssckznJ0B35ouBY=
|
github.com/gomarkdown/mdtohtml v0.0.0-20240124153210-d773061d1585/go.mod h1:6grYm5/uY15CwgBBqwA3+o/cAzaxssckznJ0B35ouBY=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||||
|
|||||||
54
main.go
54
main.go
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
_ "embed"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -11,10 +12,22 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gomarkdown/markdown"
|
||||||
|
"github.com/gomarkdown/markdown/html"
|
||||||
|
"github.com/gomarkdown/markdown/parser"
|
||||||
"github.com/pelletier/go-toml/v2"
|
"github.com/pelletier/go-toml/v2"
|
||||||
lua "github.com/yuin/gopher-lua"
|
lua "github.com/yuin/gopher-lua"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:embed core/builtin.lua
|
||||||
|
var builtinLua string
|
||||||
|
|
||||||
|
//go:embed core/markdown.lua
|
||||||
|
var markdownLua string
|
||||||
|
|
||||||
|
//go:embed core/std.lua
|
||||||
|
var stdLua string
|
||||||
|
|
||||||
const version = "1.0.0"
|
const version = "1.0.0"
|
||||||
|
|
||||||
type MyConfig struct {
|
type MyConfig struct {
|
||||||
@@ -31,22 +44,36 @@ type MyConfig struct {
|
|||||||
|
|
||||||
var port = flag.Int("p", 3000, "set the server port")
|
var port = flag.Int("p", 3000, "set the server port")
|
||||||
|
|
||||||
|
// markdownToHTML converts markdown text to HTML
|
||||||
|
func markdownToHTML(mdText string) string {
|
||||||
|
extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
|
||||||
|
p := parser.NewWithExtensions(extensions)
|
||||||
|
doc := p.Parse([]byte(mdText))
|
||||||
|
|
||||||
|
htmlFlags := html.CommonFlags | html.HrefTargetBlank
|
||||||
|
opts := html.RendererOptions{Flags: htmlFlags}
|
||||||
|
renderer := html.NewRenderer(opts)
|
||||||
|
|
||||||
|
return string(markdown.Render(doc, renderer))
|
||||||
|
}
|
||||||
|
|
||||||
func loadLua(luaDir string, entry string, cfg *MyConfig) (string, error) {
|
func loadLua(luaDir string, entry string, cfg *MyConfig) (string, error) {
|
||||||
L := lua.NewState()
|
L := lua.NewState()
|
||||||
defer L.Close()
|
defer L.Close()
|
||||||
|
|
||||||
L.PreloadModule("fes", func(L *lua.LState) int {
|
L.PreloadModule("fes", func(L *lua.LState) int {
|
||||||
mod := L.NewTable()
|
mod := L.NewTable()
|
||||||
wd, _ := os.Getwd()
|
|
||||||
corePath := filepath.Join(wd, "core")
|
// Load core modules from embedded files
|
||||||
files, _ := os.ReadDir(corePath)
|
coreModules := map[string]string{
|
||||||
for _, f := range files {
|
"builtin": builtinLua,
|
||||||
if f.IsDir() || filepath.Ext(f.Name()) != ".lua" {
|
"markdown": markdownLua,
|
||||||
continue
|
"std": stdLua,
|
||||||
}
|
}
|
||||||
modName := f.Name()[:len(f.Name())-len(".lua")]
|
|
||||||
if err := L.DoFile(filepath.Join(corePath, f.Name())); err != nil {
|
for modName, luaCode := range coreModules {
|
||||||
fmt.Println("error loading", f.Name(), ":", err)
|
if err := L.DoString(luaCode); err != nil {
|
||||||
|
fmt.Println("error loading", modName, ":", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val := L.Get(-1)
|
val := L.Get(-1)
|
||||||
@@ -82,6 +109,13 @@ func loadLua(luaDir string, entry string, cfg *MyConfig) (string, error) {
|
|||||||
configTable.RawSetString("fes", fesTable)
|
configTable.RawSetString("fes", fesTable)
|
||||||
mod.RawSetString("config", configTable)
|
mod.RawSetString("config", configTable)
|
||||||
}
|
}
|
||||||
|
// Register markdown_to_html function
|
||||||
|
mod.RawSetString("markdown_to_html", L.NewFunction(func(L *lua.LState) int {
|
||||||
|
mdText := L.ToString(1)
|
||||||
|
html := markdownToHTML(mdText)
|
||||||
|
L.Push(lua.LString(html))
|
||||||
|
return 1
|
||||||
|
}))
|
||||||
L.Push(mod)
|
L.Push(mod)
|
||||||
return 1
|
return 1
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[site]
|
[site]
|
||||||
|
|
||||||
name = "test"
|
name = "sam-fan-page"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
authors = ["vx-clutch"]
|
authors = ["vx-clutch"]
|
||||||
|
|
||||||
6
sam-fan-page/www/index.lua
Normal file
6
sam-fan-page/www/index.lua
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
local fes = require("fes")
|
||||||
|
local site = fes.site_builder()
|
||||||
|
|
||||||
|
site:h1("Hello, World!")
|
||||||
|
|
||||||
|
return site
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
local fes = require("fes")
|
|
||||||
local site = fes.site_builder()
|
|
||||||
|
|
||||||
site:h1("Hello, Sam!")
|
|
||||||
site:h2(fes.std.fes_version())
|
|
||||||
site:h2(fes.std.site_version())
|
|
||||||
|
|
||||||
return site
|
|
||||||
Reference in New Issue
Block a user