From 3684688cdc6461783ea9e7da1035acbd6455845d Mon Sep 17 00:00:00 2001 From: Artur Gurgul Date: Thu, 14 Aug 2025 07:29:40 +0000 Subject: [PATCH] Add pug and html renderer. Implement hidden flag. --- .nvim.lua | 15 +++++++++++++++ bin/sajt | 2 +- empty/.sajt/layouts/sidebar.pug | 2 +- package.json | 4 ++-- src/page.ts | 7 ++++--- src/project.ts | 31 +++++++++++++++++++------------ src/renderer.ts | 11 ++++++----- src/renderer/html.ts | 19 +++++++++++++++++++ src/{ => renderer}/markdown.ts | 6 +++--- src/renderer/pug.ts | 20 ++++++++++++++++++++ src/{ => renderer}/yaml.ts | 9 +++------ types/renderer.d.ts | 1 + types/renderer/html.d.ts | 6 ++++++ types/renderer/markdown.d.ts | 7 +++++++ types/renderer/pug.d.ts | 6 ++++++ types/renderer/yaml.d.ts | 6 ++++++ 16 files changed, 119 insertions(+), 33 deletions(-) create mode 100644 .nvim.lua create mode 100644 src/renderer/html.ts rename src/{ => renderer}/markdown.ts (94%) create mode 100644 src/renderer/pug.ts rename src/{ => renderer}/yaml.ts (67%) create mode 100644 types/renderer/html.d.ts create mode 100644 types/renderer/markdown.d.ts create mode 100644 types/renderer/pug.d.ts create mode 100644 types/renderer/yaml.d.ts diff --git a/.nvim.lua b/.nvim.lua new file mode 100644 index 0000000..0c37048 --- /dev/null +++ b/.nvim.lua @@ -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 + diff --git a/bin/sajt b/bin/sajt index 5661425..a933d8e 100755 --- a/bin/sajt +++ b/bin/sajt @@ -1,3 +1,3 @@ #!/usr/bin/env node -import "../dist/index.js" \ No newline at end of file +import "../dist/index.js" diff --git a/empty/.sajt/layouts/sidebar.pug b/empty/.sajt/layouts/sidebar.pug index 1efb8df..3bffd66 100755 --- a/empty/.sajt/layouts/sidebar.pug +++ b/empty/.sajt/layouts/sidebar.pug @@ -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 diff --git a/package.json b/package.json index 6c77797..554e056 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/page.ts b/src/page.ts index b43e73c..47d89cb 100644 --- a/src/page.ts +++ b/src/page.ts @@ -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() == "" } -} \ No newline at end of file +} diff --git a/src/project.ts b/src/project.ts index e96cd98..2ca5794 100644 --- a/src/project.ts +++ b/src/project.ts @@ -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() - 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 }}) } } -} \ No newline at end of file +} diff --git a/src/renderer.ts b/src/renderer.ts index 19c04e2..dfbfcd1 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -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 -} \ No newline at end of file + get name(): string + get fileExtensions(): Array + loadAsHTML(path: string): File +} diff --git a/src/renderer/html.ts b/src/renderer/html.ts new file mode 100644 index 0000000..ea07c34 --- /dev/null +++ b/src/renderer/html.ts @@ -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 + } + } +} diff --git a/src/markdown.ts b/src/renderer/markdown.ts similarity index 94% rename from src/markdown.ts rename to src/renderer/markdown.ts index 489f603..c5da559 100644 --- a/src/markdown.ts +++ b/src/renderer/markdown.ts @@ -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 }); } } -} \ No newline at end of file +} diff --git a/src/renderer/pug.ts b/src/renderer/pug.ts new file mode 100644 index 0000000..51bcf01 --- /dev/null +++ b/src/renderer/pug.ts @@ -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) + } + } +} diff --git a/src/yaml.ts b/src/renderer/yaml.ts similarity index 67% rename from src/yaml.ts rename to src/renderer/yaml.ts index c0bcc6f..6fa319d 100644 --- a/src/yaml.ts +++ b/src/renderer/yaml.ts @@ -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: "" } } -} \ No newline at end of file +} diff --git a/types/renderer.d.ts b/types/renderer.d.ts index cdfe669..54d5c00 100644 --- a/types/renderer.d.ts +++ b/types/renderer.d.ts @@ -6,5 +6,6 @@ export interface File { } export default interface Renderer { get name(): string; + get fileExtensions(): Array; loadAsHTML(path: string): File; } diff --git a/types/renderer/html.d.ts b/types/renderer/html.d.ts new file mode 100644 index 0000000..485477b --- /dev/null +++ b/types/renderer/html.d.ts @@ -0,0 +1,6 @@ +import Renderer, { File } from "../renderer.js"; +export default class Html implements Renderer { + name: string; + fileExtensions: string[]; + loadAsHTML(filePath: string): File; +} diff --git a/types/renderer/markdown.d.ts b/types/renderer/markdown.d.ts new file mode 100644 index 0000000..f002de1 --- /dev/null +++ b/types/renderer/markdown.d.ts @@ -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; diff --git a/types/renderer/pug.d.ts b/types/renderer/pug.d.ts new file mode 100644 index 0000000..3762966 --- /dev/null +++ b/types/renderer/pug.d.ts @@ -0,0 +1,6 @@ +import Renderer, { File } from "../renderer.js"; +export default class Pug implements Renderer { + name: string; + fileExtensions: string[]; + loadAsHTML(filePath: string): File; +} diff --git a/types/renderer/yaml.d.ts b/types/renderer/yaml.d.ts new file mode 100644 index 0000000..68f9a05 --- /dev/null +++ b/types/renderer/yaml.d.ts @@ -0,0 +1,6 @@ +import Renderer, { File } from "../renderer.js"; +export default class Yaml implements Renderer { + name: string; + fileExtensions: string[]; + loadAsHTML(file: string): File; +}