@genkaok/fenom-js 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/compiler/compile-ast.d.ts +2 -0
  2. package/compiler/compile-node.d.ts +2 -0
  3. package/compiler/compiler.d.ts +2 -0
  4. package/compiler/evaluate.d.ts +2 -0
  5. package/compiler/functions.d.ts +9 -0
  6. package/engine/loader.d.ts +2 -0
  7. package/engine/renderer.d.ts +8 -0
  8. package/fenom-js.cjs +1815 -0
  9. package/fenom-js.cjs.map +1 -0
  10. package/fenom-js.mjs +1810 -0
  11. package/fenom-js.mjs.map +1 -0
  12. package/filters/filters.d.ts +173 -0
  13. package/index.d.ts +5 -0
  14. package/lexer/patterns.d.ts +14 -0
  15. package/lexer/tokenize.d.ts +2 -0
  16. package/loader/loader.d.ts +2 -0
  17. package/node.cjs +1838 -0
  18. package/node.cjs.map +1 -0
  19. package/node.d.ts +4 -0
  20. package/node.mjs +1832 -0
  21. package/node.mjs.map +1 -0
  22. package/package.json +38 -0
  23. package/parser/parse-block.d.ts +6 -0
  24. package/parser/parse-expression.d.ts +2 -0
  25. package/parser/parse-extends.d.ts +6 -0
  26. package/parser/parse-for.d.ts +6 -0
  27. package/parser/parse-if.d.ts +5 -0
  28. package/parser/parse-switch.d.ts +5 -0
  29. package/parser/parser.d.ts +3 -0
  30. package/readme.md +130 -0
  31. package/types/common.d.ts +18 -0
  32. package/types/compiler/compile-ast.d.ts +2 -0
  33. package/types/compiler/compile-node.d.ts +2 -0
  34. package/types/compiler/compiler.d.ts +2 -0
  35. package/types/compiler/evaluate.d.ts +2 -0
  36. package/types/compiler/functions.d.ts +9 -0
  37. package/types/engine/loader.d.ts +2 -0
  38. package/types/engine/renderer.d.ts +8 -0
  39. package/types/expression.d.ts +27 -0
  40. package/types/filters/filters.d.ts +173 -0
  41. package/types/index.d.ts +5 -0
  42. package/types/lexer/patterns.d.ts +14 -0
  43. package/types/lexer/tokenize.d.ts +2 -0
  44. package/types/loader/loader.d.ts +2 -0
  45. package/types/node.d.ts +4 -0
  46. package/types/parser/parse-block.d.ts +6 -0
  47. package/types/parser/parse-expression.d.ts +2 -0
  48. package/types/parser/parse-extends.d.ts +6 -0
  49. package/types/parser/parse-for.d.ts +6 -0
  50. package/types/parser/parse-if.d.ts +5 -0
  51. package/types/parser/parse-switch.d.ts +5 -0
  52. package/types/parser/parser.d.ts +3 -0
  53. package/types/token.d.ts +9 -0
  54. package/types/types/common.d.ts +18 -0
  55. package/types/types/expression.d.ts +27 -0
  56. package/types/types/token.d.ts +9 -0
package/node.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.mjs","sources":["../../src/fenom-js/lexer/patterns.ts","../../src/fenom-js/lexer/tokenize.ts","../../src/fenom-js/parser/parse-if.ts","../../src/fenom-js/parser/parse-for.ts","../../src/fenom-js/parser/parse-switch.ts","../../src/fenom-js/parser/parser.ts","../../src/fenom-js/parser/parse-expression.ts","../../src/fenom-js/compiler/functions.ts","../../src/fenom-js/compiler/evaluate.ts","../../src/fenom-js/compiler/compile-ast.ts","../../src/fenom-js/compiler/compiler.ts","../../src/fenom-js/filters/filters.ts","../../src/fenom-js/engine/renderer.ts","../../src/fenom-js/engine/loader.ts"],"sourcesContent":["import type { TokenPattern } from \"./../types/token\";\n\n// --- ГРУППА: Переменные и присвоение ---\nexport const SET_PATTERNS: TokenPattern[] = [\n // 1. {set $var = {...} или [...]}\n {\n type: 'set',\n regex: /^\\{set\\s+\\$(\\w+)\\s*=\\s*(\\{[^{}]*(?:\\{[^{}]*\\}[^{}]*)*\\}|\\[[^\\[\\]]*(?:\\[[^\\[\\]]*\\][^\\[\\]]*)*\\])\\}/,\n process(match) {\n return {\n variable: match[1], // без $\n value: match[2].trim() // строка: \"{a:1}\" или \"[1,2]\"\n };\n }\n },\n\n // 2. {set $var = \"строка\" или 'строка'}\n {\n type: 'set',\n regex: /^\\{set\\s+\\$(\\w+)\\s*=\\s*(['\"])(.*?)\\2\\}/,\n process(match) {\n return {\n variable: match[1],\n value: match[3] // содержимое внутри кавычек\n };\n }\n },\n\n // 3. {set $var = 123 / true / $other / $a + 1}\n {\n type: 'set',\n regex: /^\\{set\\s+\\$(\\w+)\\s*=\\s*([^{][^}]*)\\}/,\n process(match) {\n return {\n variable: match[1],\n value: match[2].trim() // любое выражение: 100, $x, $count + 1 и т.д.\n };\n }\n },\n\n // 4. {add $var ++}\n {\n type: 'add',\n regex: /^\\{add\\s+\\$(\\w+)\\s*\\+\\+\\}/,\n process(match) {\n return {\n variable: match[1]\n };\n }\n },\n\n // 5. {var $var = \"значение\"} — аналог set, но может инициализировать\n {\n type: 'var',\n regex: /^\\{var\\s+\\$(\\w+)\\s*=\\s*(['\"])(.*?)\\2\\}/,\n process(match) {\n return {\n variable: match[1],\n value: match[3]\n };\n }\n }\n];\n\n// --- ГРУППА: Условия ---\nexport const IF_PATTERNS: TokenPattern[] = [\n {\n type: 'if',\n regex: /^\\{if\\s+(.+?)\\}/,\n process(match) {\n return { condition: match[1].trim() };\n }\n },\n {\n type: 'elseif',\n regex: /^\\{elseif\\s+(.+?)\\}/,\n process(match) {\n return { condition: match[1].trim() };\n }\n },\n {\n type: 'else',\n regex: /^\\{else\\}/\n },\n {\n type: 'endif',\n regex: /^\\{\\/if\\}/\n }\n];\n\n// --- ГРУППА: Циклы ---\nexport const FOREACH_PATTERNS: TokenPattern[] = [\n // 1. for i..j\n {\n type: 'for_range',\n regex: /^\\{(for|foreach)\\s+(\\d+)\\.\\.(\\d+)\\s+as\\s*\\$(\\w+)(?:\\s*\\|\\s*reverse)?\\s*\\}/,\n process(match) {\n return {\n start: parseInt(match[2], 10),\n end: parseInt(match[3], 10),\n item: match[4],\n reverse: match[0].includes('| reverse')\n };\n }\n },\n\n // 2. {foreach $path.as.array as $item}\n {\n type: 'for',\n regex: /^\\{(for|foreach)\\s*\\$([^\\s}]+?)\\s+as\\s*\\$(\\w+)(\\s*\\|\\s*reverse)?\\s*\\}/,\n process: (match) => ({\n collection: `$${match[2]}`,\n item: match[3],\n key: null,\n reverse: !!match[4]\n })\n },\n\n // 3. {foreach $path as $key => $item}\n {\n type: 'for',\n regex: /^\\{(for|foreach)\\s*\\$([^\\s}]+?)\\s+as\\s*\\$(\\w+)\\s*=>\\s*\\$(\\w+)(\\s*\\|\\s*reverse)?\\s*\\}/,\n process: (match) => ({\n collection: `$${match[2]}`,\n key: match[3],\n item: match[4],\n reverse: !!match[5]\n })\n },\n\n // 3. {foreach $path as $key => $item}\n {\n type: 'for',\n regex: /^\\{(for|foreach)\\s*\\$([^\\s}]+?)\\s+as\\s*\\$(\\w+)\\s*=>\\s*\\$(\\w+)(?:\\s*\\|\\s*reverse)?\\s*\\}/,\n process: (match) => ({\n collection: `$${match[2]}`,\n key: match[3],\n item: match[4],\n reverse: match[0].includes('| reverse')\n })\n },\n\n // 4. endfor\n {\n type: 'endfor',\n regex: /^\\{\\/(?:for|foreach)\\}/\n },\n\n // 5. foreachelse\n {\n type: 'foreachelse',\n regex: /^\\{foreachelse\\}/\n },\n\n // 6. break / continue\n {\n type: 'break',\n regex: /^\\{break\\}/i\n },\n {\n type: 'continue',\n regex: /^\\{continue\\}/i\n }\n];\n\n// --- ГРУППА: Switch ---\nexport const SWITCH_PATTERNS: TokenPattern[] = [\n {\n type: 'switch',\n regex: /^\\{switch\\s+(.+?)\\}/,\n process(match) {\n return { value: match[1].trim() };\n }\n },\n {\n type: 'case',\n regex: /^\\{case\\s+(.+?)\\}/,\n process(match) {\n return { value: match[1].trim() };\n }\n },\n {\n type: 'default',\n regex: /^\\{default\\}/\n },\n {\n type: 'endswitch',\n regex: /^\\{\\/switch\\}/\n }\n];\n\n// --- ГРУППА: Cycle ---\nexport const CYCLE_PATTERNS: TokenPattern[] = [\n {\n type: 'cycle',\n regex: /^\\{cycle\\s+(.+?)\\}/,\n process(match) {\n return { values: match[1] }; // например: \"'red','blue'\"\n }\n }\n];\n\n// --- ГРУППА: Включение шаблонов ---\nexport const INCLUDE_PATTERNS: TokenPattern[] = [\n {\n type: 'include',\n // Поддерживает: {include 'file:...' key=\"value\" key='value' key=$var key=word}\n regex: /^\\{include\\s+['\"]file:([^'\"]+)['\"](?:\\s+((?:\\s*\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s}]+))+))?\\s*\\}/,\n process: (match) => {\n const file = match[1];\n const paramsPart = match[2]; // 'title=\"Тест\" user=$currentUser'\n\n const params: Record<string, string> = {};\n\n if (paramsPart) {\n // Извлекаем все `ключ=значение` через регулярку\n const paramRegex = /(\\w+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s}]+))/g;\n let paramMatch;\n while ((paramMatch = paramRegex.exec(paramsPart)) !== null) {\n const key = paramMatch[1];\n const value = paramMatch[2] || paramMatch[3] || paramMatch[4] || '';\n params[key] = value;\n }\n }\n\n return { file, params };\n }\n }\n];\n\n// --- ГРУППА: Наследование ---\nexport const EXTENDS_PATTERNS: TokenPattern[] = [\n // {extends 'file:...'}\n {\n type: 'extends',\n regex: /^\\{extends\\s+['\"]file:([^'\"]+)['\"]\\s*\\}/,\n process: (match) => ({ file: match[1] }),\n },\n\n // {block \"name\"} → открывается\n {\n type: 'block_open',\n regex: /^\\{block\\s+(['\"])(.*?)\\1\\s*\\}/,\n process(match) {\n return { name: match[2] };\n }\n },\n\n // {/block} → закрывается\n {\n type: 'block_close',\n regex: /^\\{\\/block\\}/,\n },\n\n // {parent} — вставляет родительский контент блока\n {\n type: 'parent',\n regex: /^\\{parent\\}/\n },\n\n // {paste \"blockName\"} — вставка другого блока (Fenom-фича)\n {\n type: 'paste',\n regex: /^\\{paste\\s+(['\"])(.*?)\\1\\}/,\n process(match) {\n return { name: match[2] };\n }\n },\n\n // {use 'file:...'} — импорт макросов\n {\n type: 'use',\n regex: /^\\{use\\s+(['\"])(.*?)\\1\\}/,\n process(match) {\n return { file: match[2] };\n }\n }\n];\n\n// --- ГРУППА: Фильтры и экранирование ---\nexport const FILTER_PATTERNS: TokenPattern[] = [\n {\n type: 'filter',\n regex: /^\\{filter\\s+(.+?)\\}/,\n process(match) {\n return { filter: match[1].trim() };\n }\n },\n {\n type: 'endfilter',\n regex: /^\\{\\/filter\\}/\n },\n {\n type: 'raw',\n regex: /^\\{raw\\}/\n },\n {\n type: 'endraw',\n regex: /^\\{\\/raw\\}/\n },\n {\n type: 'autoescape',\n regex: /^\\{autoescape\\}/\n },\n {\n type: 'endautoescape',\n regex: /^\\{\\/autoescape\\}/\n }\n];\n\n// --- ГРУППА: Макросы и импорт ---\nexport const MACRO_PATTERNS: TokenPattern[] = [\n {\n type: 'macro',\n regex: /^\\{macro\\s+(\\w+)(?:\\s*\\((.*?)\\))?\\}/,\n process(match) {\n const args = match[2] ? match[2].split(',').map(s => s.trim()) : [];\n return { name: match[1], args };\n }\n },\n {\n type: 'endmacro',\n regex: /^\\{\\/macro\\}/\n },\n {\n type: 'import',\n regex: /^\\{import\\s+(['\"])(.*?)\\1\\s+as\\s+(\\w+)\\}/,\n process(match) {\n return { file: match[2], alias: match[3] };\n }\n }\n];\n\n// --- ГРУППА: Игнор ---\nexport const IGNORE_PATTERN: TokenPattern[] = [\n {\n type: 'ignore_block',\n regex: /^\\{ignore\\}([\\s\\S]*?)\\{\\/ignore\\}/,\n process: (match) => ({\n content: match[1] // содержимое между {ignore} и {/ignore}\n })\n }\n];\n\n// --- ГРУППА: Прочее ---\nexport const MISC_PATTERNS: TokenPattern[] = [\n {\n type: 'unset',\n regex: /^\\{unset\\s+\\$([^\\s}]+)\\}/,\n process(match) {\n return { variable: '$' + match[1] };\n }\n },\n {\n type: 'comment',\n regex: /^\\{\\*\\s*([\\s\\S]*?)\\s*\\*\\}/,\n // не нужно process — мы просто пропустим этот блок\n }\n];\n\n// --- ГРУППА: Вывод переменных с модификаторами ---\nexport const OUTPUT_PATTERN: TokenPattern[] = [\n // 1. {output name=\"title\"}\n {\n type: 'output',\n regex: /^\\{output\\s+name\\s*=\\s*(['\"])(.*?)\\1\\s*\\}/,\n process: (match) => ({\n name: match[2],\n filters: []\n })\n },\n\n // 2. {output \"$title\"} или {output $title}\n {\n type: 'output',\n regex: /^\\{output\\s+(['\"])(.*?)\\1\\s*\\}/,\n process: (match) => ({\n name: match[2],\n filters: []\n })\n },\n {\n type: 'output',\n regex: /^\\{output\\s+([^\\s}]+)\\s*\\}/,\n process: (match) => ({\n name: match[1],\n filters: []\n })\n },\n\n // 3. Выражения: {output $user.age + 18}\n {\n type: 'output',\n regex: /^\\{output\\s+(\\$?[^}]+)\\}/,\n process: (match) => ({\n name: match[1].trim(),\n filters: []\n })\n },\n\n // 🔥 4. ОСНОВНОЙ случай: {$var}, {$var|filter}, {$var|filter:\"arg\"}\n {\n type: 'output',\n regex: /^\\{\\$(.+?)\\}/, // ← нежадный — ловит всё внутри\n process: (match) => {\n const content = match[1].trim();\n const parts = content.split('|').map(s => s.trim());\n const variable = parts[0];\n const filters = parts.slice(1);\n return {\n name: `$${variable}`, // → '$arr'\n filters // → ['length']\n };\n }\n },\n\n // Любое выражение в { ... }, даже без $\n {\n type: 'output',\n regex: /^\\{([^$].+?)\\}/,\n process: (match) => {\n const content = match[1].trim();\n return {\n name: content, // → '\"Привет\" ~ \" \" ~ \"мир\"'\n filters: []\n };\n }\n }\n];\n// Поддержка ++, --, +=, -=, *= и т.д.\nexport const OPERATOR_PATTERN: TokenPattern[] = [\n {\n type: 'operator',\n regex: /^\\{\\$([^\\s}]+)\\s*(\\+\\+|--|\\+=|-=|\\*=|\\/=|\\%=)\\s*([^}]+)?\\}/,\n process: (match) => {\n const variable = match[1];\n const operator = match[2];\n const value = match[3]?.trim() || '1';\n return { variable: '$' + variable, operator, value };\n }\n }\n];","import type { TokenPattern, Token } from './../types/token';\nimport * as Patterns from './patterns';\n\n// Объединяем все паттерны\nconst ALL_PATTERNS: TokenPattern[] = [\n ...Patterns.EXTENDS_PATTERNS,\n ...Patterns.INCLUDE_PATTERNS,\n ...Patterns.FOREACH_PATTERNS,\n ...Patterns.SWITCH_PATTERNS,\n ...Patterns.OPERATOR_PATTERN,\n ...Patterns.IF_PATTERNS,\n ...Patterns.IGNORE_PATTERN,\n ...Patterns.SET_PATTERNS,\n ...Patterns.MISC_PATTERNS,\n ...Patterns.CYCLE_PATTERNS,\n ...Patterns.FILTER_PATTERNS,\n ...Patterns.MACRO_PATTERNS,\n ...Patterns.OUTPUT_PATTERN,\n];\n\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let pos = 0;\n\n while (pos < input.length) {\n let matched = false;\n\n if (input.slice(pos).startsWith('{ignore}')) {\n let depth = 1;\n let i = pos + 8; // длина '{ignore}'\n\n while (i < input.length) {\n if (input.length - i >= 8 && input.startsWith('{ignore}', i)) {\n depth++;\n i += 8;\n continue;\n }\n\n if (input.length - i >= 9 && input.startsWith('{/ignore}', i)) {\n depth--;\n i += 9;\n\n if (depth === 0) {\n const content = input.slice(pos + 8, i - 9);\n tokens.push({ type: 'ignore_block', content });\n pos = i;\n matched = true;\n break;\n }\n\n continue;\n }\n\n i++;\n }\n\n if (!matched) {\n tokens.push({ type: 'text', value: '{ignore}' });\n pos += 8;\n }\n\n continue;\n }\n\n if (input[pos] !== '{') {\n const nextBrace = input.indexOf('{', pos);\n\n if (nextBrace === -1) {\n tokens.push({ type: 'text', value: input.slice(pos) });\n break;\n }\n\n if (nextBrace > pos) {\n tokens.push({ type: 'text', value: input.slice(pos, nextBrace) });\n }\n\n pos = nextBrace;\n }\n\n for (const pattern of ALL_PATTERNS) {\n const substr = input.slice(pos);\n const match = substr.match(pattern.regex);\n\n if (match) {\n if (pattern.type === 'comment') {\n tokens.push({ type: 'comment' });\n pos += match[0].length;\n matched = true;\n break;\n }\n\n const token: Token = {\n type: pattern.type,\n value: match[0] // ← добавляем оригинальный текст токена\n };\n\n if (pattern.process) {\n Object.assign(token, pattern.process(match));\n }\n\n tokens.push(token);\n pos += match[0].length;\n matched = true;\n break;\n }\n }\n\n if (!matched) {\n const context = input.slice(pos, pos + 30).replace(/\\n/g, '↵');\n console.warn(`Skip unknown tag at ${pos}: \"${context}\"`);\n pos++;\n }\n\n // console.log('[TOKEN] matched:', tokens);\n }\n\n return tokens;\n}","// parseIf.ts\nimport type { Token } from './../types/token';\nimport { parse } from './../parser/parser';\n\nexport function parseIf(tokens: Token[], index: number): { node: any; nextIndex: number; } {\n const ifToken = tokens[index];\n const node: any = {\n type: 'if',\n condition: ifToken.condition,\n body: [],\n elseIfs: [],\n elseBody: []\n };\n\n let i = index + 1;\n let depth = 0;\n\n // Собираем токены для каждой ветки\n const bodyTokens: Token[] = [];\n const elseIfs: { condition: string; tokens: Token[]; }[] = [];\n const elseTokens: Token[] = [];\n\n let currentElseIf: { condition: string; tokens: Token[]; } | null = null;\n let inElseBranch = false;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n // Увеличиваем глубину для всех вложенных блоков\n if (token.type === 'if') {\n depth++;\n }\n if (token.type === 'for' || token.type === 'foreach' || token.type === 'for_range') {\n depth++;\n }\n\n if (depth > 0) {\n // Внутри вложенного блока — собираем токены и обновляем глубину\n if (!currentElseIf && !inElseBranch) {\n bodyTokens.push(token);\n } else if (currentElseIf) {\n currentElseIf.tokens.push(token);\n } else if (inElseBranch) {\n elseTokens.push(token);\n }\n // Уменьшаем глубину для закрывающих тегов\n if (token.type === 'endif') {\n depth--;\n }\n if (token.type === 'endfor' || token.type === 'endforeach') {\n depth--;\n }\n i++;\n continue;\n }\n\n // Обработка веток\n if (token.type === 'elseif') {\n if (!currentElseIf && !inElseBranch) {\n currentElseIf = {\n condition: token.condition,\n tokens: []\n };\n elseIfs.push(currentElseIf);\n } else if (currentElseIf) {\n currentElseIf.tokens.push(token);\n } else if (inElseBranch) {\n elseTokens.push(token);\n }\n i++;\n continue;\n }\n\n if (token.type === 'else') {\n // 🔴 Завершаем текущий elseif\n currentElseIf = null;\n inElseBranch = true;\n i++;\n continue;\n }\n\n if (token.type === 'endif') {\n break;\n }\n\n // Собираем токены\n if (!currentElseIf && !inElseBranch) {\n bodyTokens.push(token);\n } else if (currentElseIf) {\n currentElseIf.tokens.push(token);\n } else if (inElseBranch) {\n elseTokens.push(token);\n }\n\n i++;\n }\n\n // 🔥 ПАРСИМ собранные токены → в AST\n node.body = parse(bodyTokens);\n\n node.elseIfs = elseIfs.map(elif => ({\n condition: elif.condition,\n body: parse(elif.tokens)\n }));\n\n node.elseBody = parse(elseTokens);\n\n // Возвращаем следующий индекс после {/if}\n return {\n node,\n nextIndex: i + 1 // пропускаем {/if}\n };\n}\n","import type { Token } from '../types/token';\nimport type { ASTNode } from '../types/common';\n\nimport { parse } from './parser';\n\nexport function parseFor(tokens: Token[], index: number): { node: ASTNode; nextIndex: number; } {\n const token = tokens[index];\n\n let node: ASTNode;\n\n // 🔥 Обработка for_range\n if (token.type === 'for_range') {\n node = {\n type: 'for_range',\n start: token.start,\n end: token.end,\n item: token.item,\n reverse: Boolean(token.reverse),\n body: [],\n elseBody: []\n };\n }\n // Обычный for / foreach\n else if (token.type === 'for' || token.type === 'foreach') {\n node = {\n type: 'for',\n collection: token.collection,\n item: token.item,\n key: token.key || null,\n reverse: Boolean(token.reverse),\n body: [],\n elseBody: []\n };\n }\n // Неизвестный токен\n else {\n throw new Error(`Invalid for token at ${index}: ${token.type}`);\n }\n\n let i = index + 1;\n let depth = 0;\n let inElseBranch = false;\n\n const bodyTokens: Token[] = [];\n const elseTokens: Token[] = [];\n\n while (i < tokens.length) {\n const currentToken = tokens[i];\n\n // Увеличиваем глубину для вложенных блоков (циклы и условия)\n if (currentToken.type === 'for' || currentToken.type === 'foreach' || currentToken.type === 'for_range') {\n depth++;\n }\n if (currentToken.type === 'if') {\n depth++;\n }\n\n // Закрывающие теги\n if (currentToken.type === 'endfor' || currentToken.type === 'endforeach') {\n if (depth > 0) {\n depth--;\n } else {\n break; // выходим — нашли конец текущего цикла\n }\n }\n if (currentToken.type === 'endif') {\n if (depth > 0) {\n depth--;\n } else {\n // Этого не должно происходить в корректном шаблоне\n // но на всякий случай просто игнорируем\n }\n }\n\n // Поддержка {foreachelse}\n if (currentToken.type === 'foreachelse') {\n if (depth === 0) {\n inElseBranch = true;\n i++;\n continue;\n }\n }\n\n // Собираем токены в нужную ветку\n if (!inElseBranch) {\n bodyTokens.push(currentToken);\n } else {\n elseTokens.push(currentToken);\n }\n\n i++;\n }\n\n if (i >= tokens.length) {\n throw new Error('Unclosed for loop: expected {/for}');\n }\n\n // Рекурсивно парсим\n node.body = parse(bodyTokens);\n if (elseTokens.length > 0) {\n node.elseBody = parse(elseTokens);\n }\n\n return {\n node,\n nextIndex: i + 1 // пропускаем {/for}\n };\n}","import type { Token } from './../types/token';\n\nexport function parseSwitch(tokens: Token[], index: number): { node: any; nextIndex: number; } {\n const switchToken = tokens[index];\n const node: any = {\n type: 'switch',\n value: switchToken.value,\n cases: [],\n defaultBody: []\n };\n\n let i = index + 1;\n let depth = 0;\n let currentCase: any = null;\n let hasDefault = false;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n if (token.type === 'switch') {\n depth++;\n }\n\n if (token.type === 'endswitch') {\n if (depth > 0) {\n depth--;\n if (currentCase) {\n currentCase.body.push(token);\n }\n i++;\n continue;\n }\n\n return {\n node,\n nextIndex: i + 1\n };\n }\n\n if (depth > 0) {\n if (currentCase) {\n currentCase.body.push(token);\n }\n i++;\n continue;\n }\n\n if (token.type === 'case') {\n currentCase = {\n value: token.value,\n body: []\n };\n node.cases.push(currentCase);\n i++;\n continue;\n }\n\n if (token.type === 'default') {\n if (hasDefault) {\n throw new Error('Duplicate {default} in switch');\n }\n hasDefault = true;\n currentCase = null; // после этого идёт defaultBody\n i++;\n continue;\n }\n\n // Добавляем токены в нужное место\n if (currentCase) {\n currentCase.body.push(token);\n } else if (hasDefault) {\n node.defaultBody.push(token);\n } else {\n // Пока нет default — все токены до него относятся к последнему case\n if (node.cases.length > 0) {\n node.cases[node.cases.length - 1].body.push(token);\n }\n }\n\n i++;\n }\n\n throw new Error('Unclosed switch: expected {/switch}');\n}\n","import type { Token } from './../types/token';\nimport type { ASTNode } from './../types/common';\n\nimport { parseIf } from './parse-if';\nimport { parseFor } from './parse-for';\nimport { parseSwitch } from './parse-switch';\n\n// parser/parser.ts\nexport function parse(tokens: Token[]): ASTNode[] {\n const ast: ASTNode[] = [];\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n // --- Обработка block ---\n if (token.type === 'block_open') {\n const blockName = token.name;\n i++; // пропускаем {block ...}\n\n const blockTokens: Token[] = [];\n let depth = 0;\n\n while (i < tokens.length) {\n const current = tokens[i];\n\n if (current.type === 'block_open') {\n depth++;\n }\n if (current.type === 'block_close') {\n if (depth === 0) break;\n depth--;\n }\n\n blockTokens.push(current);\n i++;\n }\n\n const body = parse(blockTokens); // ← рекурсивно парсим содержимое\n\n ast.push({\n type: 'block',\n name: blockName,\n body,\n });\n\n i++; // пропускаем {/block}\n continue;\n }\n\n // --- Обработка extends ---\n if (token.type === 'extends') {\n ast.push({ ...token });\n i++;\n continue;\n }\n\n // --- Обработка include ---\n if (token.type === 'include') {\n ast.push({ ...token });\n i++;\n continue;\n }\n\n // --- Остальные теги ---\n if (['set', 'var', 'add'].includes(token.type)) {\n ast.push({ ...token });\n i++;\n continue;\n }\n\n if (token.type === 'if') {\n const { node, nextIndex } = parseIf(tokens, i);\n ast.push(node);\n i = nextIndex; // ← сначала обновляем\n continue;\n }\n\n if (['for', 'foreach', 'for_range'].includes(token.type)) {\n const { node, nextIndex } = parseFor(tokens, i);\n ast.push(node);\n i = nextIndex;\n continue;\n }\n\n if (token.type === 'switch') {\n const { node, nextIndex } = parseSwitch(tokens, i);\n ast.push(node);\n i = nextIndex;\n continue;\n }\n\n if (token.type === 'output') {\n const match = token.value.match(/^\\{\\$(.+)\\}$/);\n\n if (!match) {\n ast.push({ type: 'text', value: token.value });\n i++;\n continue;\n }\n\n const content = match[1].trim();\n const parts = content.split('|');\n const variable = parts[0];\n const filters = parts.slice(1);\n\n ast.push({\n type: 'output',\n name: `$${variable}`,\n filters\n });\n\n i++;\n continue;\n }\n\n if (['elseif', 'else', 'endif', 'endfor', 'endforeach', 'endswitch'].includes(token.type)) {\n i++;\n continue;\n }\n\n // Простые токены\n ast.push({ ...token });\n i++;\n }\n\n return ast;\n}\n","import type { ExpressionNode, BinaryOperator } from './../types/expression';\n\nfunction tokenizeExpression(expr: string): Array<{ type: 'op' | 'var' | 'num' | 'str' | 'filter', value: string; }> {\n const tokens: Array<{ type: 'op' | 'var' | 'num' | 'str' | 'filter', value: string; }> = [];\n const re = /(\\s+|[$a-zA-Z_]\\w*(?:\\.\\w+)*|\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|\\d+(?:\\.\\d+)?|[-+*/%=<>!&|?:(){}[\\]~]+|[\\w-]+:)/g;\n let match;\n\n const isOperator = (val: string): val is BinaryOperator => {\n return [\n '+', '-', '*', '/', '%',\n '==', '!=', '!==', '<', '<=', '>', '>=',\n '&&', '||', '!', '(', ')', '?', ':',\n '~' // ← добавили\n ].includes(val);\n };\n\n while ((match = re.exec(expr)) !== null) {\n const val = match[0].trim();\n if (!val) continue;\n\n if (isOperator(val)) {\n tokens.push({ type: 'op', value: val });\n } else if (val === '|') {\n tokens.push({ type: 'filter', value: val });\n } else if (val.startsWith('$')) {\n tokens.push({ type: 'var', value: val });\n } else if (/^[\"']/.test(val)) {\n const str = val.slice(1, -1).replace(/\\\\(.)/g, '$1');\n tokens.push({ type: 'str', value: str });\n } else if (!isNaN(+val)) {\n tokens.push({ type: 'num', value: val });\n } else {\n tokens.push({ type: 'str', value: val });\n }\n }\n\n return tokens;\n}\n\n// Основная функция — только один раз\nexport function parseExpression(expr: string): ExpressionNode {\n const tokens = tokenizeExpression(expr);\n let pos = 0;\n\n function parseTernary(): ExpressionNode {\n const test = parseLogical();\n if (pos < tokens.length && tokens[pos].value === '?') {\n pos++;\n const consequent = parseExpressionInternal(); // ✅ Используем внутреннюю\n if (pos < tokens.length && tokens[pos].value === ':') pos++;\n const alternate = parseTernary();\n return { type: 'conditional', test, consequent, alternate };\n }\n return test;\n }\n\n function parseLogical(): ExpressionNode {\n return parseBinary(() => parseEquality(), ['||', '&&']);\n }\n\n function parseEquality(): ExpressionNode {\n return parseBinary(() => parseRelational(), ['==', '!=', '!==']);\n }\n\n function parseRelational(): ExpressionNode {\n return parseBinary(() => parseAdditive(), ['<', '<=', '>', '>=']);\n }\n\n function parseAdditive(): ExpressionNode {\n return parseBinary(() => parseMultiplicative(), ['+', '-', '~']);\n }\n\n function parseMultiplicative(): ExpressionNode {\n return parseBinary(() => parseUnary(), ['*', '/', '%']);\n }\n\n function parseUnary(): ExpressionNode {\n if (pos < tokens.length && ['!', '+', '-'].includes(tokens[pos].value)) {\n const op = tokens[pos].value as '!' | '+' | '-';\n pos++;\n return { type: 'unary', operator: op, argument: parseUnary() };\n }\n return parsePrimary();\n }\n\n function parsePrimary(): ExpressionNode {\n const token = tokens[pos];\n if (!token) throw new Error('Unexpected end of expression');\n\n if (token.type === 'num') {\n pos++;\n return { type: 'literal', value: +token.value };\n }\n if (token.type === 'str') {\n pos++;\n return { type: 'literal', value: token.value };\n }\n if (token.type === 'var') {\n pos++;\n return { type: 'variable', path: token.value.slice(1) };\n }\n if (token.value === '(') {\n pos++;\n const expr = parseTernary();\n if (pos >= tokens.length || tokens[pos].value !== ')') {\n throw new Error('Expected )');\n }\n pos++;\n return expr;\n }\n\n throw new Error(`Unexpected token: ${token.value}`);\n }\n\n function parseBinary(\n parseLeft: () => ExpressionNode,\n operators: string[]\n ): ExpressionNode {\n let left = parseLeft();\n while (pos < tokens.length && operators.includes(tokens[pos].value)) {\n const op = tokens[pos].value as BinaryOperator;\n pos++;\n const right = parseLeft();\n left = { type: 'binary', operator: op, left, right };\n }\n return left;\n }\n\n function parseExpressionInternal(): ExpressionNode {\n return parseTernary();\n }\n\n return parseTernary();\n}\n","export function contextPath(path: string): string {\n if (path.startsWith('$')) {\n return `context.${path.slice(1)}`;\n }\n return isNaN(+path) ? `'${path}'` : path;\n}\n\nexport function parseValue(value: string): any {\n // Убираем пробелы\n value = value.trim();\n\n // Булевы\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value === 'null') return null;\n if (value === 'undefined') return undefined;\n\n // Число\n if (!isNaN(+value) && !value.includes(' ')) {\n return +value;\n }\n\n // Строка в кавычках\n if (/^[\"'](.*)[\"']$/.test(value)) {\n return value.slice(1, -1);\n }\n\n // Массив: ['a', 'b'] → только простые\n if (value.startsWith('[') && value.endsWith(']')) {\n try {\n const items = value.slice(1, -1).split(',').map(s => s.trim());\n return items.map(parseValue);\n } catch { }\n }\n\n // Объект: {a:1} → упрощённо\n if (value.startsWith('{') && value.endsWith('}')) {\n try {\n return JSON.parse(value\n .replace(/(\\w+):/g, '\"$1\":')\n .replace(/'/g, '\"')\n );\n } catch { }\n }\n\n // Переменная? Нет — возвращаем как строку\n // ❌ Не разрешаем $ здесь — это делает parseExpression\n return value;\n}\n\nexport function transformExpression(exp: string): string {\n return exp.startsWith('$') ? exp.slice(1) : exp;\n}\n\nfunction transformConcatenation(expr: string): string {\n const parts: string[] = [];\n let current = '';\n let inString = false;\n let depth = 0; // для скобок\n\n for (let char of expr) {\n if ((char === '\"' || char === \"'\") && depth === 0) {\n inString = !inString;\n }\n if (char === '(' && !inString) depth++;\n if (char === ')' && !inString) depth--;\n\n if (char === '~' && !inString && depth === 0) {\n if (current.trim()) {\n parts.push(current.trim());\n current = '';\n }\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n parts.push(current.trim());\n }\n\n if (parts.length === 0) return '\"\"';\n if (parts.length === 1) return transformExpression(parts[0]);\n\n return parts.map(part => transformExpression(part)).join(' + ');\n}\n\nexport function isVariable(str: string): boolean {\n return /^\\$(\\w+)(\\.\\w+)*$/.test(str.trim());\n}\n\nexport function warnFilter(\n name: string,\n expected: 'array' | 'string' | 'object',\n fn: (...args: any[]) => any\n) {\n return (...args: any[]) => {\n const value = args[0];\n let isValid = false;\n\n switch (expected) {\n case 'array':\n isValid = Array.isArray(value) || typeof value === 'string';\n break;\n case 'string':\n isValid = typeof value === 'string';\n break;\n case 'object':\n isValid = value && typeof value === 'object' && !Array.isArray(value);\n break;\n }\n\n if (!isValid) {\n console.warn(`[Fenom] filter '${name}' should be used with ${expected}, but got ${typeof value}`);\n }\n\n return fn(...args);\n };\n}\n\nexport function transformCondition(cond: string): string {\n return cond\n .replace(/\\$(\\w+)/g, 'context.$1')\n .replace(/&&/g, '&&')\n .replace(/\\|\\|/g, '||');\n}\n\nexport function minifyHTML(html: string): string {\n return html\n .replace(/>\\s+</g, '><') // > < → ><\n .replace(/\\s{2,}/g, ' ') // множественные пробелы\n .replace(/(<!--.*?-->)\\s+/g, '$1') // пробелы после комментариев\n .trim();\n}\n\nexport function getFromContext(path: string, context: any): any {\n if (!path || typeof path !== 'string') return undefined;\n\n const cleanPath = path.startsWith('$') ? path.slice(1) : path;\n\n const tokens: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of cleanPath) {\n if (char === '.' && !inBracket) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n } else if (char === '[') {\n if (current) {\n tokens.push(current);\n current = '';\n }\n current = '[';\n inBracket = true;\n } else if (char === ']') {\n current += ']';\n tokens.push(current);\n current = '';\n inBracket = false;\n } else {\n current += char;\n }\n }\n\n if (current) {\n tokens.push(current);\n }\n\n let value: any = context;\n for (const token of tokens) {\n if (token.startsWith('[')) {\n const match = token.match(/^\\[(?:'(.+)'|\"(.+)\"|(\\d+))\\]$/);\n if (match) {\n const key = match[1] || match[2] || parseInt(match[3], 10);\n value = value?.[key];\n }\n } else {\n value = value?.[token];\n }\n }\n\n return value;\n}\n\nexport function applyFilters(value: any, filterList: string[], context: any, filters: any): any {\n let result = value;\n for (const filter of filterList) {\n const [name, ...args] = filter.split(':').map(s => s.trim());\n const filterFn = filters[name];\n if (typeof filterFn === 'function') {\n const argValues = args.map(arg => {\n if (/^[\"'].*[\"']$/.test(arg)) return arg.slice(1, -1);\n if (!isNaN(+arg)) return +arg;\n if (arg.startsWith('$')) return getFromContext(arg.slice(1), context) ?? '';\n return arg;\n });\n try {\n result = filterFn(result, ...argValues);\n } catch (e) {\n result = '';\n }\n }\n }\n return result;\n}","import type { ExpressionNode } from '../types/expression';\nimport { getFromContext } from './functions';\n\nexport function evaluate(\n node: ExpressionNode,\n context: any,\n filters: Record<string, Function>\n): any {\n switch (node.type) {\n\n case 'literal':\n return node.value;\n\n case 'variable':\n return getFromContext(node.path, context) ?? '';\n\n case 'unary':\n const arg = evaluate(node.argument, context, filters);\n switch (node.operator) {\n case '!': return !arg;\n case '+': return +arg;\n case '-': return -arg;\n }\n break;\n\n case 'binary': {\n const left = evaluate(node.left, context, filters);\n const right = evaluate(node.right, context, filters);\n\n switch (node.operator) {\n case '+': return left + right;\n case '-': return left - right;\n case '*': return left * right;\n case '/': return left / right;\n case '%': return left % right;\n case '==': return left == right;\n case '!=': return left != right;\n case '!==': return left !== right;\n case '<': return left < right;\n case '<=': return left <= right;\n case '>': return left > right;\n case '>=': return left >= right;\n case '&&': return left && right;\n case '||': return left || right;\n case '~': return String(left) + String(right);\n }\n break;\n }\n\n case 'conditional':\n const test = evaluate(node.test, context, filters);\n return test\n ? evaluate(node.consequent, context, filters)\n : evaluate(node.alternate, context, filters);\n\n case 'filter': {\n const input = evaluate(node.expression, context, filters);\n const args = node.args.map(arg => evaluate(arg, context, filters));\n const filterFn = filters[node.filter];\n if (typeof filterFn === 'function') {\n return filterFn(input, ...args);\n }\n return input;\n }\n }\n\n return '';\n}","import type { ASTNode, TemplateLoader } from '../types/common';\nimport { tokenize } from '../lexer/tokenize';\nimport { parse } from '../parser/parser';\nimport { parseExpression } from '../parser/parse-expression';\nimport { evaluate } from './evaluate';\nimport { getFromContext, applyFilters, parseValue } from './functions';\n\nexport async function compileAST(\n ast: ASTNode[],\n loader?: TemplateLoader,\n context: any = {},\n filters: any = {}\n): Promise<string> {\n let result = '';\n\n for (const node of ast) {\n switch (node.type) {\n case 'text':\n result += node.value;\n break;\n\n case 'ignore_block':\n result += node.content || '';\n break;\n\n case 'comment':\n break;\n\n case 'output': {\n try {\n const exp = node.name.trim();\n let evaluated;\n\n if (/[+\\-*/%<>!=&|?:~]/.test(exp)) {\n const ast = parseExpression(exp);\n evaluated = evaluate(ast, context, filters);\n } else {\n evaluated = getFromContext(exp, context) ?? '';\n }\n\n const filtered = applyFilters(evaluated, node.filters, context, filters);\n result += String(filtered);\n } catch (e) {\n console.warn(`Eval error: ${node.name}`, e);\n result += '';\n }\n break;\n }\n\n case 'set': {\n try {\n const valueStr = node.value.trim();\n if (/[+\\-*/%~]/.test(valueStr)) {\n const ast = parseExpression(valueStr);\n context[node.variable] = evaluate(ast, context, filters);\n } else if (valueStr.startsWith('$')) {\n context[node.variable] = getFromContext(valueStr, context) ?? '';\n } else {\n context[node.variable] = parseValue(valueStr);\n }\n } catch (e) {\n context[node.variable] = '';\n }\n break;\n }\n\n case 'var':\n if (context[node.variable] === undefined) {\n context[node.variable] = parseValue(node.value);\n }\n break;\n\n case 'add':\n context[node.variable] = (context[node.variable] || 0) + 1;\n break;\n\n case 'if': {\n let cond = false;\n try {\n const ast = parseExpression(node.condition);\n cond = !!evaluate(ast, context, filters);\n } catch (e) {\n console.warn(`Condition error: ${node.condition}`, e);\n }\n\n const body = cond\n ? node.body\n : (node.elseIfs?.find((elseIf: any) => {\n try {\n const ast = parseExpression(elseIf.condition);\n return !!evaluate(ast, context, filters);\n } catch {\n return false;\n }\n })?.body || node.elseBody || []);\n\n result += await compileAST(body, loader, context, filters);\n break;\n }\n\n case 'for_range': {\n const { start, end, item, reverse, body, elseBody } = node;\n\n const range = [];\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n if (reverse) range.reverse();\n\n let innerResult = '';\n\n if (range.length === 0 && elseBody) {\n innerResult += await compileAST(elseBody, loader, context, filters);\n } else {\n for (const value of range) {\n const newContext = { ...context };\n newContext[item] = value;\n\n newContext.loop = {\n index: value - start + 1,\n first: value === (reverse ? end : start),\n last: value === (reverse ? start : end),\n key: value - start\n };\n\n innerResult += await compileAST(body, loader, newContext, filters);\n }\n }\n\n result += innerResult;\n break;\n }\n\n case 'for': {\n const collectionPath = node.collection.startsWith('$') ? node.collection.slice(1) : node.collection;\n const collection = getFromContext(collectionPath, context);\n\n let items: Array<[any, any]> = [];\n\n if (Array.isArray(collection)) {\n items = Array.from(collection.entries());\n } else if (collection && typeof collection === 'object') {\n items = Object.entries(collection);\n }\n\n if (node.reverse) items = items.reverse();\n\n if (items.length === 0 && node.elseBody) {\n result += await compileAST(node.elseBody, loader, context, filters);\n } else {\n for (const [index, itemValue] of items) {\n const newContext = { ...context };\n newContext[node.item] = itemValue;\n if (node.key) newContext[node.key] = index;\n\n newContext.loop = {\n index: index + 1,\n first: index === 0,\n last: index === items.length - 1,\n key: index,\n };\n\n result += await compileAST(node.body, loader, newContext, filters);\n }\n }\n break;\n }\n\n case 'switch': {\n const rawValue = node.value.startsWith('$') ? node.value.slice(1) : node.value;\n const value = getFromContext(rawValue, context) ?? rawValue;\n let matched = false;\n for (const c of node.cases) {\n // Case values can be strings like \"a\" or variables\n const caseValue = c.value.startsWith('$') \n ? getFromContext(c.value.slice(1), context) \n : c.value.replace(/^[\"']|[\"']$/g, '');\n if (caseValue === value) {\n result += await compileAST(c.body, loader, context, filters);\n matched = true;\n break;\n }\n }\n if (!matched && node.defaultBody) {\n result += await compileAST(node.defaultBody, loader, context, filters);\n }\n break;\n }\n\n case 'operator': {\n const { variable, operator, value } = node;\n const varName = variable.startsWith('$') ? variable.slice(1) : variable;\n\n let numValue = isNaN(+value) ? getFromContext(value, context) ?? 0 : +value;\n\n const currentValue = getFromContext(variable, context) ?? 0;\n\n switch (operator) {\n case '++':\n context[varName] = currentValue + 1;\n break;\n case '--':\n context[varName] = currentValue - 1;\n break;\n case '+=':\n context[varName] = currentValue + numValue;\n break;\n case '-=':\n context[varName] = currentValue - numValue;\n break;\n case '*=':\n context[varName] = currentValue * numValue;\n break;\n case '/=':\n context[varName] = currentValue / numValue;\n break;\n case '%=':\n context[varName] = currentValue % numValue;\n break;\n }\n\n break;\n }\n\n case 'block':\n if (typeof context.block === 'function') {\n result += await context.block(node.name);\n }\n break;\n\n case 'include': {\n if (!loader) {\n console.warn(`{include '${node.file}'} ignored: no loader`);\n break;\n }\n try {\n const includedTemplate = await loader(node.file);\n const tokens = tokenize(includedTemplate);\n const includedAST = parse(tokens);\n const html = await compileAST(includedAST, loader, { ...context, ...node.params }, filters);\n result += html;\n } catch (err) {\n result += `<span style=\"color:red\">[Include error: ${(err as Error).message}]</span>`;\n }\n break;\n }\n\n case 'extends':\n break;\n\n default:\n console.warn(`Unknown node type: ${node.type}`);\n }\n }\n\n return result;\n}","import type { ASTNode, TemplateLoader } from '../types/common';\nimport { tokenize } from '../lexer/tokenize';\nimport { parse } from '../parser/parser';\nimport { compileAST } from './compile-ast';\n\nexport function compile(\n ast: ASTNode[],\n loader?: TemplateLoader\n): (context: any, filters: any) => Promise<string> {\n const blocks: Record<string, ASTNode[]> = {};\n let parentFile: string | null = null;\n\n for (const node of ast) {\n if (node.type === 'extends') {\n parentFile = node.file;\n } else if (node.type === 'block') {\n blocks[node.name] = node.body;\n }\n }\n\n if (parentFile) {\n return async function (context: any, filters: any): Promise<string> {\n \n if (!loader) {\n throw new Error(`Template uses {extends '${parentFile}'}, but no loader provided`);\n }\n\n try {\n const template = await loader(parentFile);\n const tokens = tokenize(template);\n const parentAst = parse(tokens);\n\n const parentBlocks: Record<string, ASTNode[]> = {};\n for (const node of parentAst) {\n if (node.type === 'block') {\n parentBlocks[node.name] = node.body;\n }\n }\n\n const finalBlocks = { ...parentBlocks, ...blocks };\n const blockContent: Record<string, string> = {};\n\n context.block = async (name: string): Promise<string> => {\n if (blockContent[name] !== undefined) return blockContent[name];\n const blockAst = finalBlocks[name];\n if (!blockAst) {\n blockContent[name] = '';\n return '';\n }\n blockContent[name] = await compileAST(blockAst, loader, context, filters);\n return blockContent[name];\n };\n\n return await compileAST(parentAst, loader, context, filters);\n } catch (err: any) {\n return `[Render error: ${err.message}]`;\n }\n };\n } else {\n return async function (context: any, filters: any): Promise<string> {\n return await compileAST(ast, loader, context, filters);\n };\n }\n}","import { warnFilter } from './../compiler/functions';\n\nexport const filters = {\n // ——— Строковые фильтры ————————————————————————\n\n /**\n * Преобразует строку в верхний регистр\n */\n upper: (s: any) => String(s).toUpperCase(),\n\n /**\n * Преобразует строку в нижний регистр\n */\n lower: (s: any) => String(s).toLowerCase(),\n\n /**\n * Делает первую букву строки заглавной, остальные — строчными\n * 'аННА' → 'Анна'\n */\n capitalize: (s: any) => {\n const str = String(s).trim();\n if (str.length === 0) return '';\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n },\n\n /**\n * Аналог capitalize (для совместимости)\n */\n ucfirst: (s: any) => filters.capitalize(s),\n\n /**\n * Делает первую букву каждого слова заглавной\n * 'hello world' → 'Hello World'\n */\n ucwords: (s: any) => {\n const str = String(s).trim();\n return str.replace(/\\b\\w/g, (match) => match.toUpperCase());\n },\n\n /**\n * Делает первую букву строки строчной\n * 'Hello' → 'hello'\n */\n lcfirst: (s: any) => {\n const str = String(s).trim();\n if (str.length === 0) return '';\n return str.charAt(0).toLowerCase() + str.slice(1);\n },\n\n /**\n * Удаляет пробелы с краёв строки\n */\n trim: (s: any) => String(s).trim(),\n\n /**\n * Удаляет пробелы слева\n */\n ltrim: (s: any) => String(s).replace(/^\\s+/, ''),\n\n /**\n * Удаляет пробелы справа\n */\n rtrim: (s: any) => String(s).replace(/\\s+$/, ''),\n\n /**\n * Преобразует \\n → <br>\n */\n nl2br: (s: any) => String(s).replace(/\\n/g, '<br>'),\n\n /**\n * Заменяет подстроку\n * {$str|replace:'old':'new'}\n */\n replace: (s: any, search: string, replace: string) => {\n const str = String(s);\n return str.split(String(search)).join(String(replace));\n },\n\n /**\n * Обрезает строку\n * {$str|substr:0:5}\n */\n substr: warnFilter('substr', 'string', (s: any, start: number, length?: number) => {\n const str = String(s);\n return length === undefined ? str.slice(start) : str.slice(start, start + length);\n }),\n\n /**\n * Кодирует строку в URL\n */\n urlencode: (s: any) => encodeURIComponent(String(s)),\n\n /**\n * Декодирует URL\n */\n urldecode: (s: any) => decodeURIComponent(String(s)),\n\n /**\n * Экранирует HTML-символы\n */\n escape: warnFilter('escape', 'string', (s: any) => {\n const str = String(s);\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }),\n\n /**\n * Синоним escape\n */\n e: (s: any) => filters.escape(s),\n\n // ——— Работа с массивами ——————————————————————\n\n /**\n * Первый элемент массива/объекта\n */\n first: warnFilter('first', 'array', (arr: any) => {\n if (Array.isArray(arr)) return arr[0];\n if (arr && typeof arr === 'object') return Object.values(arr)[0];\n return '';\n }),\n\n /**\n * Последний элемент массива/объекта\n */\n last: warnFilter('last', 'array', (arr: any) => {\n if (Array.isArray(arr)) return arr[arr.length - 1];\n if (arr && typeof arr === 'object') {\n const values = Object.values(arr);\n return values[values.length - 1];\n }\n return '';\n }),\n\n /**\n * Объединяет массив в строку\n * {$arr|join:', '}\n */\n join: warnFilter('join', 'array', (arr: any, separator: string = ',') => {\n if (Array.isArray(arr)) return arr.join(separator);\n if (arr && typeof arr === 'object') return Object.values(arr).join(separator);\n return String(arr);\n }),\n\n /**\n * Переворачивает массив или строку\n */\n reverse: warnFilter('reverse', 'array', (arr: any[]) => {\n return Array.isArray(arr) ? [...arr].reverse() : arr;\n }),\n\n /**\n * Сортирует массив по значениям\n */\n sort: warnFilter('sort', 'array', (arr: any) => {\n if (Array.isArray(arr)) return [...arr].sort();\n return arr;\n }),\n\n /**\n * Сортирует массив по ключам\n */\n ksort: warnFilter('ksort', 'object', (obj: any) => {\n if (obj && typeof obj === 'object') {\n const sorted: any = {};\n Object.keys(obj).sort().forEach(key => {\n sorted[key] = obj[key];\n });\n return sorted;\n }\n return obj;\n }),\n\n /**\n * Возвращает только уникальные значения\n */\n unique: warnFilter('unique', 'array', (arr: any) => {\n if (Array.isArray(arr)) return [...new Set(arr)];\n return arr;\n }),\n\n /**\n * Перемешивает массив\n */\n shuffle: warnFilter('shuffle', 'array', (arr: any) => {\n if (!Array.isArray(arr)) return arr;\n const newArr = [...arr];\n for (let i = newArr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [newArr[i], newArr[j]] = [newArr[j], newArr[i]];\n }\n return newArr;\n }),\n\n /**\n * Возвращает срез массива/строки\n * {$arr|slice:0:2}\n */\n slice: (arr: any, start: number, length?: number) => {\n if (Array.isArray(arr) || typeof arr === 'string') {\n return length === undefined ? arr.slice(start) : arr.slice(start, start + length);\n }\n return arr;\n },\n\n /**\n * Объединяет два массива\n * {$arr1|merge:$arr2}\n */\n merge: (arr1: any, arr2: any) => {\n if (Array.isArray(arr1) && Array.isArray(arr2)) {\n return [...arr1, ...arr2];\n }\n return arr1;\n },\n\n /**\n * Разбивает массив на группы\n * {$items|batch:3}\n */\n batch: (arr: any, size: number) => {\n if (!Array.isArray(arr)) return arr;\n const result = [];\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n return result;\n },\n\n /**\n * Возвращает ключи массива/объекта\n */\n keys: (obj: Record<string, any>) => {\n return obj && typeof obj === 'object' ? Object.keys(obj) : [];\n },\n\n /**\n * Возвращает значения массива/объекта\n */\n values: (obj: any) => (obj && typeof obj === 'object' ? Object.values(obj) : []),\n\n /**\n * Длина строки или количество элементов\n */\n length: (arr: any) => {\n if (Array.isArray(arr)) return arr.length;\n if (arr && typeof arr === 'object') return Object.keys(arr).length;\n return String(arr).length;\n },\n\n // ——— Форматирование и числа ——————————————————\n\n /**\n * Форматирует число\n * {$price|number_format:2:'.':','}\n */\n number_format: (num: any, decimals: number = 0, decPoint: string = '.', thousandsSep: string = ',') => {\n const n = Number(num);\n if (isNaN(n)) return '';\n return n.toLocaleString('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n useGrouping: true\n }).replace(/,/g, thousandsSep).replace(/\\./g, decPoint);\n },\n\n /**\n * Абсолютное значение\n */\n abs: (n: any) => Math.abs(Number(n) || 0),\n\n /**\n * Округляет число\n */\n round: (n: any, precision: number = 0) => {\n const factor = 10 ** precision;\n return Math.round((Number(n) || 0) * factor) / factor;\n },\n\n // ——— JSON ————————————————————————————————\n\n /**\n * Кодирует в JSON\n */\n json_encode: (data: any) => JSON.stringify(data),\n\n /**\n * Декодирует из JSON\n */\n json_decode: (str: any) => {\n try {\n return JSON.parse(String(str));\n } catch {\n return null;\n }\n },\n\n // ——— Дата ————————————————————————————————\n\n /**\n * Форматирует timestamp\n * Формат: d.m.Y H:i:s\n */\n date: (timestamp: any, format: string = 'd.m.Y') => {\n const n = Number(timestamp);\n const d = new Date(isNaN(n) ? timestamp : n * 1000);\n if (isNaN(d.getTime())) {\n console.warn(`[Fenom] filter 'date' received invalid timestamp: ${timestamp}`);\n return '';\n }\n\n const pad = (n: number) => n.toString().padStart(2, '0');\n return format\n .replace(/d/g, pad(d.getDate()))\n .replace(/m/g, pad(d.getMonth() + 1))\n .replace(/Y/g, d.getFullYear().toString())\n .replace(/H/g, pad(d.getHours()))\n .replace(/i/g, pad(d.getMinutes()))\n .replace(/s/g, pad(d.getSeconds()));\n },\n\n // ——— Прочее ——————————————————————————————\n\n /**\n * Возвращает значение по умолчанию, если пусто\n */\n default: (s: any, def: string) => {\n return (s == null || s === '' || (typeof s === 'object' && Object.keys(s).length === 0))\n ? def\n : s;\n },\n\n /**\n * Вывод без изменений\n */\n raw: (s: any) => s,\n\n /**\n * Отладка: вывод структуры\n */\n var_dump: (data: any) => {\n return `<pre>${JSON.stringify(data, null, 2)}</pre>`;\n },\n\n /**\n * Отладка: красивый вывод\n */\n print_r: (data: any) => {\n return `<pre>${data instanceof Object ? JSON.stringify(data, null, 2) : String(data)}</pre>`;\n }\n};\n","import type { TemplateLoader } from '../types/common';\nimport { tokenize } from '../lexer/tokenize';\nimport { parse } from '../parser/parser';\nimport { compile } from '../compiler/compiler';\nimport { minifyHTML } from '../compiler/functions';\nimport { filters } from '../filters/filters';\n\nexport async function FenomJs(\n template: string,\n options?: {\n context?: Record<string, any>;\n loader?: TemplateLoader;\n minify?: boolean;\n debug?: boolean;\n }\n): Promise<string> {\n const {\n context = {},\n loader,\n minify = false,\n debug = false\n } = options || {};\n\n try {\n const tokens = tokenize(template);\n if (debug) console.log('tokens', tokens);\n\n const ast = parse(tokens);\n if (debug) console.log('ast', ast);\n\n const compiled = compile(ast, loader);\n const html = await compiled(context, filters);\n return minify ? minifyHTML(html) : html;\n } catch (err) {\n console.error('Template error:', err);\n return `<span style=\"color:red\">[Ошибка шаблона: ${(err as Error).message}]</span>`;\n }\n}\n\n// Re-export filters\nexport { filters } from '../filters/filters';\n","import type { TemplateLoader } from '../types/common';\nimport { join } from 'path';\nimport { readFile } from 'fs/promises';\n\nexport function createAsyncLoader(root: string): TemplateLoader {\n return async function loader(file: string) {\n const fullPath = join(root, file);\n if (!fullPath.endsWith('.tpl')) {\n throw new Error(`Template path must end with .tpl: ${file}`);\n }\n try {\n const content = await readFile(fullPath, 'utf-8');\n return content;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(`Template not found: ${fullPath}`);\n }\n throw err;\n }\n };\n}\n"],"names":["Patterns.EXTENDS_PATTERNS","Patterns.INCLUDE_PATTERNS","Patterns.FOREACH_PATTERNS","Patterns.SWITCH_PATTERNS","Patterns.OPERATOR_PATTERN","Patterns.IF_PATTERNS","Patterns.IGNORE_PATTERN","Patterns.SET_PATTERNS","Patterns.MISC_PATTERNS","Patterns.CYCLE_PATTERNS","Patterns.FILTER_PATTERNS","Patterns.MACRO_PATTERNS","Patterns.OUTPUT_PATTERN"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@genkaok/fenom-js",
3
+ "version": "1.0.13",
4
+ "description": "Simple and fast template engine",
5
+ "author": "@Alekseevich-psk",
6
+ "main": "./index.cjs",
7
+ "module": "./index.mjs",
8
+ "types": "./types/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./types/index.d.ts",
12
+ "import": "./fenom-js.mjs",
13
+ "require": "./fenom-js.cjs"
14
+ },
15
+ "./node": {
16
+ "types": "./types/node.d.ts",
17
+ "import": "./node.mjs",
18
+ "require": "./node.cjs"
19
+ }
20
+ },
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/Alekseevich-psk/fenom-js.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/Alekseevich-psk/fenom-js/issues"
30
+ },
31
+ "keywords": [
32
+ "template",
33
+ "engine",
34
+ "html",
35
+ "fenom"
36
+ ],
37
+ "license": "MIT"
38
+ }
@@ -0,0 +1,6 @@
1
+ import type { Token } from './../types/token';
2
+ import type { ASTNode } from './../types/common';
3
+ export declare function parseBlock(tokens: Token[], index: number): {
4
+ node: ASTNode;
5
+ nextIndex: number;
6
+ };
@@ -0,0 +1,2 @@
1
+ import type { ExpressionNode } from './../types/expression';
2
+ export declare function parseExpression(expr: string): ExpressionNode;
@@ -0,0 +1,6 @@
1
+ import type { Token } from './../types/token';
2
+ import type { ASTNode } from './../types/common';
3
+ export declare function parseExtends(tokens: Token[], index: number): {
4
+ node: ASTNode;
5
+ nextIndex: number;
6
+ };
@@ -0,0 +1,6 @@
1
+ import type { Token } from '../types/token';
2
+ import type { ASTNode } from '../types/common';
3
+ export declare function parseFor(tokens: Token[], index: number): {
4
+ node: ASTNode;
5
+ nextIndex: number;
6
+ };
@@ -0,0 +1,5 @@
1
+ import type { Token } from './../types/token';
2
+ export declare function parseIf(tokens: Token[], index: number): {
3
+ node: any;
4
+ nextIndex: number;
5
+ };
@@ -0,0 +1,5 @@
1
+ import type { Token } from './../types/token';
2
+ export declare function parseSwitch(tokens: Token[], index: number): {
3
+ node: any;
4
+ nextIndex: number;
5
+ };
@@ -0,0 +1,3 @@
1
+ import type { Token } from './../types/token';
2
+ import type { ASTNode } from './../types/common';
3
+ export declare function parse(tokens: Token[]): ASTNode[];
package/readme.md ADDED
@@ -0,0 +1,130 @@
1
+ # ⚙️ fenom-js
2
+
3
+ JavaScript-шаблонизатор, разрабатывался как максимально близкий аналог шаблонизатора [Fenom для PHP](https://github.com/fenom-template/fenom), используемого в CMS **MODX Revolution**, чтобы верстальщики и разработчики могли работать локально без запуска сервера.
4
+
5
+ 🔧 **Асинхронный**, **без зависимости от сборщиков**, работает **в браузере** и **локально** — идеален для верстки и прототипирования.
6
+
7
+ 📌 В **бета-версии**. Пригоден для тестирования и локального использования.
8
+
9
+ ---
10
+
11
+ ## 💬 Особенности
12
+
13
+ - Синтаксис, близкий к `fenom.php` (MODX Revo)
14
+ - Поддерживает:
15
+ - - Переменные: **{$var}**
16
+ - - Условия: **{if}**
17
+ - - Поддержка: **==, !=, >, <, >=, <=, ===, !==, !, &&, ||, in** (для массивов).
18
+ - - Тернарные и логические операторы: **{$age >= 18 ? 'Да' : 'Нет'}**
19
+ - - Циклы **{foreach}** + Поддержка вложенных циклов.
20
+ - - Фильтры: Применяются через **|** (как в оригинальном Fenom):
21
+ - - Исключение: **{ignore}**
22
+ - - Комментарии: **{ _ комментарий _ }**
23
+ - Работает **в браузере** и **в Node.js**
24
+ - В браузере: **без `include` и `extends`** (ограничение среды)
25
+ - Легко внедряется в HTML-страницы для локальной верстки
26
+
27
+ ---
28
+
29
+ ## 🖥️ Установка
30
+
31
+ ```bash
32
+ npm install fenom-js
33
+ ```
34
+
35
+ ## 🖥️Пример использования
36
+
37
+ ### В шаблонах .tpl
38
+
39
+ ```html
40
+ <body>
41
+ <h1>Привет, {$name}!</h1>
42
+ {if $isAdmin}
43
+ <p>Вы — администратор.</p>
44
+ {/if}
45
+ </body>
46
+ ```
47
+
48
+ ### Js context (В браузере)
49
+
50
+ ```javascript
51
+ import { FenomJs } from "fenom-js";
52
+
53
+ // Получаем HTML шаблона
54
+ const templateHTML = document.body.innerHTML;
55
+
56
+ // Данные
57
+ const data = {
58
+ name: "Анна",
59
+ isAdmin: true,
60
+ };
61
+
62
+ // Рендерим
63
+ const html = await FenomJs(templateHTML, {
64
+ context: data,
65
+ });
66
+
67
+ // Вставляем обратно
68
+ document.body.innerHTML = html;
69
+ ```
70
+
71
+ ## 🧩 vite-plugin-fenom
72
+
73
+ 📌 Это отдельный пакет, для работы с **vite**
74
+
75
+ ```bash
76
+ npm install vite-plugin-fenom --save-dev
77
+ ```
78
+
79
+ ## ⚙️ Конфигурация (vite.config.ts или vite.config.js)
80
+
81
+ ```ts
82
+ import { defineConfig } from "vite";
83
+ import fenom from "vite-plugin-fenom";
84
+
85
+ export default defineConfig({
86
+ plugins: [
87
+ fenom({
88
+ pages: "src/pages/",
89
+ data: "src/data/**/*.json",
90
+ root: "src/",
91
+ }),
92
+ ],
93
+ build: {
94
+ outDir: "dist",
95
+ emptyOutDir: true,
96
+ rollupOptions: {
97
+ input: ["src/scripts/main.ts", "src/styles/style.css"],
98
+ },
99
+ },
100
+ });
101
+ ```
102
+
103
+ ### 🗂️ Структура проекта (пример)
104
+
105
+ ```
106
+ src/demo/
107
+ ├── data/
108
+ │ ├── site.json // Глобальные переменные: {$site.title}
109
+ │ └── pages/
110
+ │ ├── index.json // Контекст для index.tpl
111
+ │ └── catalog.json // Контекст для catalog.tpl
112
+ ├── pages/
113
+ │ ├── index.tpl
114
+ │ └── catalog.tpl
115
+ ├── blocks/
116
+ │ └── header.tpl // Может использоваться через {include 'blocks/header.tpl'}
117
+ └── layouts/
118
+ └── main.tpl // Шаблон через {extends 'layouts/main.tpl'}
119
+ ```
120
+
121
+ ## Статус
122
+
123
+ 🟡 Бета-версия — API может меняться.
124
+ Приветствуются предложения, PR!
125
+
126
+ [Сообщить об ошибке](https://github.com/Alekseevich-psk/fenom-js/issues)
127
+
128
+ ## Ссылки
129
+
130
+ [🐱 GitHub](https://github.com/Alekseevich-psk/fenom-js)
@@ -0,0 +1,18 @@
1
+ export interface ASTNode {
2
+ type: string;
3
+ [key: string]: any;
4
+ }
5
+ export interface UserConfig {
6
+ root?: string;
7
+ dataDir?: string;
8
+ pagesDir?: string;
9
+ scanAll?: boolean;
10
+ minify?: boolean;
11
+ }
12
+ export type TemplateLoader = (file: string) => Promise<string>;
13
+ export interface FenomOptions {
14
+ context?: Record<string, any>;
15
+ loader?: TemplateLoader;
16
+ minify?: boolean;
17
+ debug?: boolean;
18
+ }
@@ -0,0 +1,2 @@
1
+ import type { ASTNode, TemplateLoader } from '../types/common';
2
+ export declare function compileAST(ast: ASTNode[], loader?: TemplateLoader, context?: any, filters?: any): Promise<string>;
@@ -0,0 +1,2 @@
1
+ import type { ASTNode } from '../types/common';
2
+ export declare function compileNode(node: ASTNode, addLine: (code: string) => void, context: any, filters: any): void;
@@ -0,0 +1,2 @@
1
+ import type { ASTNode, TemplateLoader } from '../types/common';
2
+ export declare function compile(ast: ASTNode[], loader?: TemplateLoader): (context: any, filters: any) => Promise<string>;
@@ -0,0 +1,2 @@
1
+ import type { ExpressionNode } from '../types/expression';
2
+ export declare function evaluate(node: ExpressionNode, context: any, filters: Record<string, Function>): any;
@@ -0,0 +1,9 @@
1
+ export declare function contextPath(path: string): string;
2
+ export declare function parseValue(value: string): any;
3
+ export declare function transformExpression(exp: string): string;
4
+ export declare function isVariable(str: string): boolean;
5
+ export declare function warnFilter(name: string, expected: 'array' | 'string' | 'object', fn: (...args: any[]) => any): (...args: any[]) => any;
6
+ export declare function transformCondition(cond: string): string;
7
+ export declare function minifyHTML(html: string): string;
8
+ export declare function getFromContext(path: string, context: any): any;
9
+ export declare function applyFilters(value: any, filterList: string[], context: any, filters: any): any;
@@ -0,0 +1,2 @@
1
+ import type { TemplateLoader } from '../types/common';
2
+ export declare function createAsyncLoader(root: string): TemplateLoader;
@@ -0,0 +1,8 @@
1
+ import type { TemplateLoader } from '../types/common';
2
+ export declare function FenomJs(template: string, options?: {
3
+ context?: Record<string, any>;
4
+ loader?: TemplateLoader;
5
+ minify?: boolean;
6
+ debug?: boolean;
7
+ }): Promise<string>;
8
+ export { filters } from '../filters/filters';
@@ -0,0 +1,27 @@
1
+ export type ExpressionNode = {
2
+ type: 'literal';
3
+ value: string | number | boolean;
4
+ } | {
5
+ type: 'variable';
6
+ path: string;
7
+ } | {
8
+ type: 'unary';
9
+ operator: '!' | '+' | '-';
10
+ argument: ExpressionNode;
11
+ } | {
12
+ type: 'binary';
13
+ operator: BinaryOperator;
14
+ left: ExpressionNode;
15
+ right: ExpressionNode;
16
+ } | {
17
+ type: 'conditional';
18
+ test: ExpressionNode;
19
+ consequent: ExpressionNode;
20
+ alternate: ExpressionNode;
21
+ } | {
22
+ type: 'filter';
23
+ expression: ExpressionNode;
24
+ filter: string;
25
+ args: ExpressionNode[];
26
+ };
27
+ export type BinaryOperator = '+' | '-' | '*' | '/' | '%' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '~';