Add pug and html renderer. Implement hidden flag.

This commit is contained in:
Artur Gurgul 2025-08-14 07:29:40 +00:00
parent aa563e60ea
commit 3684688cdc
16 changed files with 119 additions and 33 deletions

15
.nvim.lua Normal file
View file

@ -0,0 +1,15 @@
return {
fzf_ignore_dirs = {
"node_modules",
"dist",
"build",
".next",
"coverage"
}
}
use('prettier/vim-prettier')
vim.g['prettier#autoformat'] = 1
vim.g['prettier#quickfix_enabled'] = 0

View file

@ -1,3 +1,3 @@
#!/usr/bin/env node
import "../dist/index.js"
import "../dist/index.js"

View file

@ -4,7 +4,7 @@ nav
h2(style="font-size: 15px; margin-top: -0.5em;") and this is my notepad.
hr.hr-text(data-content="Contents")
ul#blog-posts.posts
each page in context.pages
each page in context.pages.filter(it => it.showInMenu)
li
span »
a(href=page.url, style=(page.isCurrent ? "font-weight: bold;" : ""))= page.title

View file

@ -16,7 +16,7 @@
},
"repository": {
"type": "git",
"url": "git+https://github.com/artur-gurgul-pro/sajt.git"
"url": "https://gurgul.pro/app/sajt.git"
},
"keywords": [
"generator",
@ -31,7 +31,7 @@
"bugs": {
"url": "https://github.com/artur-gurgul-pro/sajt/issues"
},
"homepage": "https://github.com/artur-gurgul-pro/sajt#readme",
"homepage": "http://gurgul.pro/",
"dependencies": {
"chalk": "^5.4.1",
"commander": "^14.0.0",

View file

@ -41,10 +41,11 @@ export default class Page {
this.fileName = dirArray.pop() || ""
dirArray.shift()
this.dir = dirArray
this.hidden = this.file.data?.hidden || false
// TODO: if tilte do not exists search in markdown for # title
this.title = this.file.data.title
this.layout = this.file.data.layout || "default"
this.hidden = this.file.data?.hidden || this.title == undefined || this.title.trim() == ""
}
}
}

View file

@ -9,8 +9,11 @@ import pug from 'pug'
import utils from "./utils.js"
import Markdown from './markdown.js'
import Yaml from './yaml.js'
import Markdown from './renderer/markdown.js'
import Yaml from './renderer/yaml.js'
import Pug from './renderer/pug.js'
import Html from './renderer/html.js'
import Page from './page.js'
export default class Project {
@ -38,16 +41,19 @@ export default class Project {
}
loadPages(): Page[] {
const mdParser = new Markdown()
const yamlParser = new Yaml()
let listMD = utils.getAllFilesWithExtension('.',".md", this.config.config.ignore)
.map(path => new Page(path, mdParser))
const parsers = [new Markdown(), new Yaml(), new Pug(), new Html()]
const pages = Array<Page>()
let listYML = utils.getAllFilesWithExtension('.',".yml", this.config.config.ignore)
.map(path => new Page(path, yamlParser))
return listMD.concat(listYML)
for(const parser of parsers) {
for(const extension of parser.fileExtensions) {
let newPages = utils
.getAllFilesWithExtension('.', `.${extension}`, this.config.config.ignore)
.map(path => new Page(path, parser))
pages.push(...newPages)
}
}
return pages
}
compile(page: Page) {
@ -75,9 +81,10 @@ export default class Project {
pages: this.pages.map(it => { return {
title: it.title,
isCurrent: page == it,
showInMenu: it.hidden == false,
url: it.finalPath,
isDir: false
}})
}
}
}
}

View file

@ -1,10 +1,11 @@
export interface File {
get html(): string
get data(): { [key: string]: any }
get html(): string
get data(): { [key: string]: any }
}
export default interface Renderer {
get name(): string
loadAsHTML(path: string): File
}
get name(): string
get fileExtensions(): Array<string>
loadAsHTML(path: string): File
}

19
src/renderer/html.ts Normal file
View file

@ -0,0 +1,19 @@
import Renderer , {File} from "../renderer.js"
import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'
export default class Html implements Renderer {
name = "html"
fileExtensions = ["htm", "html"]
loadAsHTML(filePath: string): File {
const fileContents = fs.readFileSync(path.join("./", filePath), 'utf8')
const { data: metadata, content: htmlContent } = matter(fileContents)
return {
data: metadata,
html: htmlContent
}
}
}

View file

@ -1,4 +1,4 @@
import Parser , {File} from "./renderer.js"
import Parser , {File} from "./../renderer.js"
import hljs from 'highlight.js'
import { marked } from 'marked'
@ -17,6 +17,7 @@ marked.use(markedHighlight({
export default class Markdown implements Parser {
name = "md"
fileExtensions = ["md", "markdown"]
loadAsHTML(filePath: string): File {
const fileContents = fs.readFileSync(path.join("./", filePath), 'utf8')
@ -35,7 +36,6 @@ renderer.paragraph = (text) => {
return text.text
}
export function parseMarkdown(obj: any) {
for (let key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
@ -55,4 +55,4 @@ export function parseMarkdown(obj: any) {
obj[key] = marked(obj[key], { renderer });
}
}
}
}

20
src/renderer/pug.ts Normal file
View file

@ -0,0 +1,20 @@
import pug from 'pug'
import Renderer , {File} from "../renderer.js"
import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'
export default class Pug implements Renderer {
name = "pug"
fileExtensions = ["pug"]
loadAsHTML(filePath: string): File {
const fileContents = fs.readFileSync(path.join("./", filePath), 'utf8')
const { data: metadata, content: pugContent } = matter(fileContents)
return {
data: metadata,
html: pug.render(pugContent)
}
}
}

View file

@ -1,20 +1,17 @@
import yaml from 'js-yaml'
import Renderer , {File} from "./renderer.js"
import Renderer , {File} from "../renderer.js"
import fs from 'fs'
export default class Yaml implements Renderer {
name = "yml"
fileExtensions = ["yml"]
loadAsHTML(file: string): File {
const fileContents = fs.readFileSync(file, 'utf8')
// let data = {...site.data}
// delete data.layout
// parseMarkdown(data)
return {
data: yaml.load(fileContents) as { [key: string]: any },
html: ""
}
}
}
}

1
types/renderer.d.ts vendored
View file

@ -6,5 +6,6 @@ export interface File {
}
export default interface Renderer {
get name(): string;
get fileExtensions(): Array<string>;
loadAsHTML(path: string): File;
}

6
types/renderer/html.d.ts vendored Normal file
View file

@ -0,0 +1,6 @@
import Renderer, { File } from "../renderer.js";
export default class Html implements Renderer {
name: string;
fileExtensions: string[];
loadAsHTML(filePath: string): File;
}

7
types/renderer/markdown.d.ts vendored Normal file
View file

@ -0,0 +1,7 @@
import Parser, { File } from "./../renderer.js";
export default class Markdown implements Parser {
name: string;
fileExtensions: string[];
loadAsHTML(filePath: string): File;
}
export declare function parseMarkdown(obj: any): void;

6
types/renderer/pug.d.ts vendored Normal file
View file

@ -0,0 +1,6 @@
import Renderer, { File } from "../renderer.js";
export default class Pug implements Renderer {
name: string;
fileExtensions: string[];
loadAsHTML(filePath: string): File;
}

6
types/renderer/yaml.d.ts vendored Normal file
View file

@ -0,0 +1,6 @@
import Renderer, { File } from "../renderer.js";
export default class Yaml implements Renderer {
name: string;
fileExtensions: string[];
loadAsHTML(file: string): File;
}