feat: custom lang highlight, images dir, width bump, first post

- Wire up Ergon and ArchASM custom highlight.js languages
- Serve /content/images/ for post image embeds
- Blog width 820px -> 1040px to match landing page
- First real blog post: "Why make a blog?"

👾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta Code <noreply@letta.com>
This commit is contained in:
2026-06-24 16:22:37 +03:00
parent a2ed073569
commit 723fc7deb8
6 changed files with 212 additions and 1 deletions

76
src/lang/archasm.js Normal file
View File

@@ -0,0 +1,76 @@
hljs.registerLanguage('archasm', function(hljs) {
return {
name: 'ArchASM',
aliases: ['archasm'],
keywords: {
keyword: `
NOP HALT
PRINT PRINT_TOP
JMP JZ JNZ
ENTER LEAVE LGET LSET
BEGIN_TICK END_TICK
SAVE_GRID LOAD_GRID LOAD_ONT
PUSH_INT PUSH_FLOAT PUSH_BOOL PUSH_SYM
PACK_VALUE
UNPACK_VALUE_INT UNPACK_VALUE_FLOAT
UNPACK_VALUE_BOOL UNPACK_VALUE_SYM
IADD ISUB ADD SUB MUL DIV IMUL IDIV
EQ LT NOT
SWAP OVER ROT NROT DUP2 NIP TUCK
POP DUP
CREATE_NODE CREATE_EDGE
DELETE_NODE DELETE_EDGE
SET_NODE_PROPERTY GET_NODE_PROPERTY
UNSET_NODE_PROPERTY
SET_EDGE_PROPERTY GET_EDGE_PROPERTY
UNSET_EDGE_PROPERTY
ADD_INCIDENT_NODE REMOVE_INCIDENT_NODE
SET_INCIDENCE
FIND_INCIDENTS
GET_NODE_TYPE GET_EDGE_TYPE
GET_EDGE_ARITY GET_EDGE_NODE_AT
TRY_GET_NODE_PROPERTY
TRY_GET_EDGE_PROPERTY
GET_TIMELINE GET_ORIGIN_TICK
IS_MAIN GET_CURRENT_TICK
PUSH_VIEW POP_VIEW
EMIT_CLAIM EMIT_EDGE_CLAIM
CALL RET
ITER_EDGES_BY_TYPE
ITER_NODES_BY_TYPE
ITER_INCIDENT_EDGES
ITER_PROP_EQ
ITER_NEXT
ITER_EDGE_ROLE_NODES
`,
type: 'int float bool string'
},
contains: [
{
scope: 'comment',
begin: /\bNOTE\b/,
end: '$'
},
{
scope: 'meta',
begin: /^(SYMBOL)\b/
},
{
scope: 'symbol',
match: /^[A-Za-z_][A-Za-z0-9_]*:/
},
hljs.QUOTE_STRING_MODE,
hljs.NUMBER_MODE,
{
scope: 'operator',
match: /=/
}
]
};
});

71
src/lang/ergon.js Normal file
View File

@@ -0,0 +1,71 @@
hljs.registerLanguage('ergon', function(hljs) {
return {
name: 'Ergon',
aliases: ['ergon', 'agont'],
keywords: {
keyword: `
DECLARE TYPE EDGE RULE FUNCTION PROPERTY AXIOMATIC
PARAMS RETURNS
BEGIN_TICK END_TICK
LET SET CREATE PRINT
LOOP OVER DO END
IF THEN ELSE
RETURN CALL
SAVE GRID LOAD VM LOCAL
BRANCH SWITCH MAIN EXPORT PRUNE LIST DIFF
FIND GET ADD REMOVE
CONDITION EXPECTS CHANGED UNLESS AS
FOR INFER
FIELD REQUIRED OPTIONAL ROLE
WHERE
IS OF IN TO FROM WITH
INCIDENT TARGET BASELINE
AT TICK
PROP BY ID
NODE NODES EDGE EDGES
WEIGHT PRIORITY
LOGICAL STATEFUL WEIGHTED
AND OR NOT
`,
type: 'string int float bool void',
literal: 'TRUE FALSE',
built_in: '@timeline @is_main @origin_tick @current_tick'
},
contains: [
{
scope: 'comment',
begin: /\bNOTE\b/,
end: '$'
},
hljs.QUOTE_STRING_MODE,
hljs.NUMBER_MODE,
{
scope: 'variable',
match: /\b[A-Z][A-Z0-9_]*\b/
},
{
scope: 'title',
match: /\b[a-z][a-zA-Z0-9_]*\b/
},
{
scope: 'built_in',
match: /@(timeline|is_main|origin_tick|current_tick)\b/
},
{
scope: 'operator',
match: /!=|<=|>=|=|<|>|\+|-|\*|\//
}
]
};
});