@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.cjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.cjs","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","join","readFile"],"mappings":"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"}
package/node.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { FenomJs } from './engine/renderer';
2
+ export { createAsyncLoader } from './engine/loader';
3
+ export type { TemplateLoader } from './types/common';
4
+ export { tokenize, parse, compile } from './index';