Commits at 9626d6f341b3e5525a22efbfc5a1910e39f8a8cf
9626d6f3Fix Canvas having no color other than red and gray
Simple typo.
Shota FUJI
authored at
Shota FUJI
comitted at
d14df0a6Proper styles for callout
This work is foundation for later styling works.
Shota FUJI
authored at
Shota FUJI
comitted at
5aad74eaFix callout icon is not visible
hast-util-raw seems to lowercases every tagnames.
Shota FUJI
authored at
Shota FUJI
comitted at
432427c4Fix default opened callout is collapsed
hast-util-raw seems to have a bug on attribute handling: it mistake
an empty string as an absence of value.
Shota FUJI
authored at
Shota FUJI
comitted at
eac79b36Do not perform actual file write more than once on same file
Shota FUJI
authored at
Shota FUJI
comitted at
a9bf5e66File embed for JSONCanvas
Refactor for HTML rendering is to reduce unnecessary Mdast->Hast conversion.
Shota FUJI
authored at
Shota FUJI
comitted at
a1bcc49aAggregate mdast fromMarkdown extensions into one
Same as micromark's one.
Shota FUJI
authored at
Shota FUJI
comitted at
cbb403ecMake OFM image size parser to Mdast extension
I noticed an extension can be just a transform function when implementing OFM callout extension.
This is good.
Shota FUJI
authored at
Shota FUJI
comitted at
195452c5Aggregate micromark extensions into one
For usability. It's good abstraction IMO.
Inclusion of gfm is actually valid, as OFM includes subset of GFM.
Shota FUJI
authored at
Shota FUJI
comitted at
627b53c5Add comments on Safari's SVG rendering bug
I tried to apply workaround. It surely fixed position problem; however, it completely
ruined the rendering of non-overflowing elements. Safari is the new IE, yes.
If I could solve scroll (layout) problem on the canvas rendering, I'll switch to
SVG + HTML approach. It's ridiculous to abandon the most correct and semantic document
due to one problematic broken browser, but this is what we got. Cult made of normies and
fanboys encouraging unhealthy and uncompetetive web. At least Chrome does not have
this lot of rendering/compositing bugs.
Shota FUJI
authored at
Shota FUJI
comitted at
78f20ea9Implement complete JSONCanvas renderer
Even though files are 404 and Safari goes wild, basic rendering feature is done.
Shota FUJI
authored at
Shota FUJI
comitted at
4be26f81Move JSONCanvas layout related functions out to separate file
I wanted to add sub-components, but the file was large.
Shota FUJI
authored at
Shota FUJI
comitted at
772a7246Text node rendering for JSONCanvas
It's easier than I thought.
Shota FUJI
authored at
Shota FUJI
comitted at
984c50deOFM Comment extension (parser/Hast converter)
This is not much useful, though.
Shota FUJI
authored at
Shota FUJI
comitted at
a10dc8fcSyntax highlighting feature
Though styles are almost nothing. It's too early to add styles.
I considered - actually researched almost a day - tree-sitter for highlighting.
However, the state of the ecosystem is not ready to use for web/WASM environment.
* Some parsers use unexported C-API, which causes runtime panic.
* Markdown parser requires block parsing -> inline parsing per blocks.
* Generated parsers are large in general (e.g. TSX = ~3MB in WASM,
~5MB in `Uint8Array(JSON.parse("[0,...]"))` form).
* Parser alone is barely usable: query, especially tailor made highlight query is
needed for **each parsers**. (most of the parser I saw have "highlight.scm" but
it seems to be for reference)
While refractor requires additional tree-traversal for removing too generic
classes, I believe this is way too efficient and reliable compare to tree-sitter
(and its ecosystem) in its current state.
Shota FUJI
authored at
Shota FUJI
comitted at
b1d1fb2eDo not use filesystem timestamp for docs build
Git discards timestamps.
Shota FUJI
authored at
Shota FUJI
comitted at
10320234Fix build fails on frontmatter on but some documents have no frontmatter
Shota FUJI
authored at
Shota FUJI
comitted at
bff3e60cCreation and update timestamp in metadata
This is essential for me. This also enables user to sort documents based on
update or creation date.
Shota FUJI
authored at
Shota FUJI
comitted at
549a169cRendering callouts
Renders ugly. Styles are global. No colors. Links inside are not resolved.
However, this satisfies minimum required functionality and semantically
correct (except the broken links).
This still needs work so title part will be represented as a Mdast children
and later Mdast utility can work on that (I mean, link resolver).
I'll add appropriate styles at final styling process.
Shota FUJI
authored at
Shota FUJI
comitted at
be56e8d4OFM Callout extension Mdast utility
This is implemented as a transformer. I tried to implemented from syntax parser
but micromark's documentation on document parser (or, say, architecture as a whole)
is not great and unable to do that. Majority of the time I wasted was battling against
default parsers and undocumented APIs.
Surprisingly, this transformer approach is pretty robust. Phrasing parsing is already
done at the blockquote parser so I just needed split & replace. Easy.
Shota FUJI
authored at
Shota FUJI
comitted at
2eff673bFix TreeBuilder can't resolve assets without file extension
Shota FUJI
authored at
Shota FUJI
comitted at
55489dccMove ignore functionality to independent one
The problem is, "shortest path when possible" resolution
looks up for the ignored directories and files even if
it was ignored at the scan phase.
Shota FUJI
authored at
Shota FUJI
comitted at
4ad002ffUse separate GitHub Actions cache for each workflow
Deno does not download every modules listed in the lockfile.
Instead, it lazily downloads imported file: thus, the contents of
`$DENO_DIR` depends on "what module Deno loaded". Since workflows
run different entrypoints (deploy=docs/build.ts, test=test files),
only one of workflow benefit from cache and others could face a
lot of cache misses.
Shota FUJI
authored at
Shota FUJI
comitted at
4892e170Ignore CI cache directory from Deno checks
Otherwise a bunch of errors appears.
Shota FUJI
authored at
Shota FUJI
comitted at
13fc4272GitHub Actions for code validity
In case when I forgot to run these command on my machine.
Shota FUJI
authored at
Shota FUJI
comitted at
4ea55fd1Cache Deno intermediate files on GitHub Actions
In order to reduce build time.
Shota FUJI
authored at
Shota FUJI
comitted at
d33714c6"Shortest path when possible" link resolution
This is essential as Obsidian made it default (really, wtf?)
Shota FUJI
authored at
Shota FUJI
comitted at
87f677a9Remove garbage file
I guess Obsidian does not have proper file system access restriction / validation.
Shota FUJI
authored at
Shota FUJI
comitted at
5fa6adc7Support for absolute path resolution and extensions-less path
Even though Obsidian docs says it's not for Markdown link, it uses
the non-relative / extension-less path such as when it auto-update
paths on file move/rename.
Shota FUJI
authored at
Shota FUJI
comitted at
70fda17cFix document path ignores metadata name returned by Content Parser
Shota FUJI
authored at
Shota FUJI
comitted at
2356b4e7Add license information on docs copyright footer
Without the license attribution, strictly speaking, anyone clicked "Fork" on GitHub
and pushed their own patch to master branch, they violates the CC-BY-4.0 license.
Shota FUJI
authored at
Shota FUJI
comitted at
e4631a60Fix asset paths are one depth higher
This path resolution things need to be reworked fundamentally.
Shota FUJI
authored at
Shota FUJI
comitted at
0a64c599Add image size attribute sample on docs
It's not a big syntax extension, but it definitely is different to CommonMark (and GFM).
Shota FUJI
authored at
Shota FUJI
comitted at
41e7b19fMake Markdown samples page more user friendly
The pages have been test cases. User don't have an idea just by telling
"here is GFM samples."
Shota FUJI
authored at
Shota FUJI
comitted at
202533b0Add source code for the GFM samples
Without Markdown source code, people not familier GFM have no clue what those are.
Shota FUJI
authored at
Shota FUJI
comitted at
a2d7266aDo not save user provided assets to fixed location
User may use those assets in other places. In that case, the build directory
ends up containing duplicated asset files.
Shota FUJI
authored at
Shota FUJI
comitted at
fa19d6f4Use ".assets" instead of "assets"
The latter would conflict with "Assets". Risk is low, but it would be difficult
for user to debug this.
Shota FUJI
authored at
Shota FUJI
comitted at
06de59f1Resolve image asset file path
This mechanism is essential as Macana have separate file I/O.
Shota FUJI
authored at
Shota FUJI
comitted at
aa174285Add "Default Document" feature
The primary motivation is to set the link destination for header logo.
IMO, websites putting logo on the sticky header or appbar without making it a link
to the top/home page is EVIL.
This also improved usability by enabling generation of topmost `index.html`, where
user would land when they directly put domain name on browser address bar.
This can be polished more, such as "specify default document under this directory",
but I'm satisfied with the current implementation. It's enough.
Shota FUJI
authored at
Shota FUJI
comitted at
4ada2b92Image size annotation Markdown extension from Obsidian Flavored Markdown
Shota FUJI
authored at
Shota FUJI
comitted at
44036205Website logo on header
This isn't just an eye candy: similar looking websites need each logos, otherwise
visitor would confuse.
Shota FUJI
authored at
Shota FUJI
comitted at
e2335bfaDocument sorting
This is crucial, as the order of file / directories are not
guranteed. Escpecially working on cross-platform.
Shota FUJI
authored at
Shota FUJI
comitted at
0394d2d4Highlight Markdown extension from Obsidian Flavored Markdown
This patch also works as foundation / reference code for other internal Markdown extensions.
Shota FUJI
authored at
Shota FUJI
comitted at
66b67ed0Simplify content parsing / metadata generation
- Remove Metadata Parser
- Tree Builder now is also responsible for generating document metadata
- Content Parser now can return document metadata
The major factor motivating this refactor is the last bullet point.
I wrote Metadata Parser with YAML frontmatter parsing...but that is definetely
out of scope. What if one want to use HTML as a document and use `<title>`
element? What if one want to use JPEG as a document and use EXIF for title and
name? At all, metadata derived by content requires content parsing, thus Content
Parser returns document metadata.
Behaviors and options existed in VaultParser (Metadata Parser) and Tree Parser
are re-implemented as a more flexible plugin, TreeBuildStrategy. I noticed
those options are, in the end, `map` and `filter`. This design maintains both
customizability and ease-of-use.
Maybe the TreeBuildStrategy should be more generic so it's defined in the generic
Tree Builder interface side (`tree_builder/interface.ts`). But I kept this form
as I don't feel necessity for now. Maybe change later.
Shota FUJI
authored at
Shota FUJI
comitted at
8766e56aMove all data type definition into single place
Due to each modules owning data models, refactoring and sharing was difficult.
Shota FUJI
authored at
Shota FUJI
comitted at
140c1af0JSONCanvas support
This is not complete. Before supporting Markdown parsing inside Node, I have to
redesign metadata parsing flow. Messing Content Parser first would make the redesign
more difficult. Also, I believe this state of implementation is good enough to commit.
The scope is HUGE.
Shota FUJI
authored at
Shota FUJI
comitted at
c91ff476Move Markdown parsing out of page builder
This makes Page Builder more lightweight.
Shota FUJI
authored at
Shota FUJI
comitted at
862b4694Remove restriction on document name and use them as much as possible
Due to the restriction, URI (path) construction has been mess.
This change makes document names as a Single Source of Truth for URI.
Shota FUJI
authored at
Shota FUJI
comitted at
be6f89e1Human friendly docs directory names
It's ugly. Changing directory names directly was worse due to
URL becoming ugly also.
Shota FUJI
authored at
Shota FUJI
comitted at
cf7e93b6Removed locale assumptions
This is better than assuming top-level directories as a locale or entire Vault consists of
single locale. Large part is flexibility: one can choose between `<lang>/<..contents..>` structure
and `<..contents..>/<lang>` structure. In addition to the flexibility, directory name can be more
human friendly, such as "English" rather than "en".
This change eliminates the complexity of handling default language not having path prefix.
Thanks to this simplification, I can focus on path/name handling more.
The last notable change is replace of "locale" to "lang". I initially thought locale would be
appropriate as it also covers formatting. However, as the output of this program is (mostly)
public viewable website, the content SHOULD NOT specify which locale to use. Instead, UA is
responsible for deciding which locale to use for formatting.
Shota FUJI
authored at
Shota FUJI
comitted at
3acf36e6Display every locales' content on navigation tree
As this page layout uses tree for site navigation, I thought this presentation has
the best discoverability and usablity. Although the `en/` links does not work at the
moment, I'll change path construction strategy so it's kept as-is.
Shota FUJI
authored at
Shota FUJI
comitted at
6411ac4bBasic page builder
Although fundamental data models need improvements. Especially path related data.
Shota FUJI
authored at
Shota FUJI
comitted at
c3d0fbb7Simplify architecture further
The "Asset" thing existed because initially both Tree Builder and Page Builder
produced assets. However, because of architecture changes I did earlier, Tree
Builder no longer produces assets. That change and this change increase the scope
of Page Builder massively, but I believe this is far better abstract compared to
the previous ones.
For instance, if I were to create an Asset Plugin for CSS postprocessing, what
I/F needed for that? Even with this simple case, the I/F would be messy because
a number of the resulting artifacts could be larger than the input, such as when
the source CSS file imports other files. And, more (probably) important plugin,
is image optimisation. However, that task requires caller (= Page Builder) to
know the result in advance: e.g. a plugin generates WebP and Avif from JPEG file
and optimises the JPEG file but Page Builder can't use the former two because
it needs to know the plugin produces those files and modify `<img>` tag to
`<picture>` tag with corresponding `<source>` tags and `<img>` tag. Considering
these, I concluded the "Asset Manager" and "Asset Plugin" system are useless at most.
Again, this make Page Builder more fat. But what kind of website assets are needed
and how to generate those are differs by websites, at all. Page Builder need to be fat.
Shota FUJI
authored at
Shota FUJI
comitted at
28fa1e76Unexpected overwrite guard for FileSystem Writer
This is better as a middleware, because otherwise every writer implementation
needs to write their own guard.
Shota FUJI
authored at
Shota FUJI
comitted at
6e191af6Disable require-await lint rule
The bloat and stupidity of the current JS/TS "recommended" lint ecosystem is astonishing.
Shota FUJI
authored at
Shota FUJI
comitted at
d7629394Simplify architecture data flow
"Who own the control?" was not clear.
Shota FUJI
authored at
Shota FUJI
comitted at
8ade6613Validate generated document tree
If Tree Builder does not check its output, then Page Builder has to verify the document tree
and abort, which is not only messing responsibility but error-prone.
Shota FUJI
authored at
Shota FUJI
comitted at
0ff591a1Move filesystem_reader to project root
To reflect the architecture change.
Shota FUJI
authored at
Shota FUJI
comitted at
3e52c72fChange architecture and Create glossary
The previous archtecture too focused on flexibility and that makes grapsing the whole
picture hard and designing interfaces very difficult. It also suffers from the absense
of control/data owner: one can't determine which module has the ownership of whole
generation process.
Shota FUJI
authored at
Shota FUJI
comitted at