@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fenom-js.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"],"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"],"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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"}
@@ -0,0 +1,173 @@
1
+ export declare const filters: {
2
+ /**
3
+ * Преобразует строку в верхний регистр
4
+ */
5
+ upper: (s: any) => string;
6
+ /**
7
+ * Преобразует строку в нижний регистр
8
+ */
9
+ lower: (s: any) => string;
10
+ /**
11
+ * Делает первую букву строки заглавной, остальные — строчными
12
+ * 'аННА' → 'Анна'
13
+ */
14
+ capitalize: (s: any) => string;
15
+ /**
16
+ * Аналог capitalize (для совместимости)
17
+ */
18
+ ucfirst: (s: any) => string;
19
+ /**
20
+ * Делает первую букву каждого слова заглавной
21
+ * 'hello world' → 'Hello World'
22
+ */
23
+ ucwords: (s: any) => string;
24
+ /**
25
+ * Делает первую букву строки строчной
26
+ * 'Hello' → 'hello'
27
+ */
28
+ lcfirst: (s: any) => string;
29
+ /**
30
+ * Удаляет пробелы с краёв строки
31
+ */
32
+ trim: (s: any) => string;
33
+ /**
34
+ * Удаляет пробелы слева
35
+ */
36
+ ltrim: (s: any) => string;
37
+ /**
38
+ * Удаляет пробелы справа
39
+ */
40
+ rtrim: (s: any) => string;
41
+ /**
42
+ * Преобразует \n → <br>
43
+ */
44
+ nl2br: (s: any) => string;
45
+ /**
46
+ * Заменяет подстроку
47
+ * {$str|replace:'old':'new'}
48
+ */
49
+ replace: (s: any, search: string, replace: string) => string;
50
+ /**
51
+ * Обрезает строку
52
+ * {$str|substr:0:5}
53
+ */
54
+ substr: (...args: any[]) => any;
55
+ /**
56
+ * Кодирует строку в URL
57
+ */
58
+ urlencode: (s: any) => string;
59
+ /**
60
+ * Декодирует URL
61
+ */
62
+ urldecode: (s: any) => string;
63
+ /**
64
+ * Экранирует HTML-символы
65
+ */
66
+ escape: (...args: any[]) => any;
67
+ /**
68
+ * Синоним escape
69
+ */
70
+ e: (s: any) => any;
71
+ /**
72
+ * Первый элемент массива/объекта
73
+ */
74
+ first: (...args: any[]) => any;
75
+ /**
76
+ * Последний элемент массива/объекта
77
+ */
78
+ last: (...args: any[]) => any;
79
+ /**
80
+ * Объединяет массив в строку
81
+ * {$arr|join:', '}
82
+ */
83
+ join: (...args: any[]) => any;
84
+ /**
85
+ * Переворачивает массив или строку
86
+ */
87
+ reverse: (...args: any[]) => any;
88
+ /**
89
+ * Сортирует массив по значениям
90
+ */
91
+ sort: (...args: any[]) => any;
92
+ /**
93
+ * Сортирует массив по ключам
94
+ */
95
+ ksort: (...args: any[]) => any;
96
+ /**
97
+ * Возвращает только уникальные значения
98
+ */
99
+ unique: (...args: any[]) => any;
100
+ /**
101
+ * Перемешивает массив
102
+ */
103
+ shuffle: (...args: any[]) => any;
104
+ /**
105
+ * Возвращает срез массива/строки
106
+ * {$arr|slice:0:2}
107
+ */
108
+ slice: (arr: any, start: number, length?: number) => any;
109
+ /**
110
+ * Объединяет два массива
111
+ * {$arr1|merge:$arr2}
112
+ */
113
+ merge: (arr1: any, arr2: any) => any;
114
+ /**
115
+ * Разбивает массив на группы
116
+ * {$items|batch:3}
117
+ */
118
+ batch: (arr: any, size: number) => any;
119
+ /**
120
+ * Возвращает ключи массива/объекта
121
+ */
122
+ keys: (obj: Record<string, any>) => string[];
123
+ /**
124
+ * Возвращает значения массива/объекта
125
+ */
126
+ values: (obj: any) => unknown[];
127
+ /**
128
+ * Длина строки или количество элементов
129
+ */
130
+ length: (arr: any) => number;
131
+ /**
132
+ * Форматирует число
133
+ * {$price|number_format:2:'.':','}
134
+ */
135
+ number_format: (num: any, decimals?: number, decPoint?: string, thousandsSep?: string) => string;
136
+ /**
137
+ * Абсолютное значение
138
+ */
139
+ abs: (n: any) => number;
140
+ /**
141
+ * Округляет число
142
+ */
143
+ round: (n: any, precision?: number) => number;
144
+ /**
145
+ * Кодирует в JSON
146
+ */
147
+ json_encode: (data: any) => string;
148
+ /**
149
+ * Декодирует из JSON
150
+ */
151
+ json_decode: (str: any) => any;
152
+ /**
153
+ * Форматирует timestamp
154
+ * Формат: d.m.Y H:i:s
155
+ */
156
+ date: (timestamp: any, format?: string) => string;
157
+ /**
158
+ * Возвращает значение по умолчанию, если пусто
159
+ */
160
+ default: (s: any, def: string) => any;
161
+ /**
162
+ * Вывод без изменений
163
+ */
164
+ raw: (s: any) => any;
165
+ /**
166
+ * Отладка: вывод структуры
167
+ */
168
+ var_dump: (data: any) => string;
169
+ /**
170
+ * Отладка: красивый вывод
171
+ */
172
+ print_r: (data: any) => string;
173
+ };
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { FenomJs } from './engine/renderer';
2
+ export type { TemplateLoader } from './types/common';
3
+ export { tokenize } from './lexer/tokenize';
4
+ export { parse } from './parser/parser';
5
+ export { compile } from './compiler/compiler';
@@ -0,0 +1,14 @@
1
+ import type { TokenPattern } from "./../types/token";
2
+ export declare const SET_PATTERNS: TokenPattern[];
3
+ export declare const IF_PATTERNS: TokenPattern[];
4
+ export declare const FOREACH_PATTERNS: TokenPattern[];
5
+ export declare const SWITCH_PATTERNS: TokenPattern[];
6
+ export declare const CYCLE_PATTERNS: TokenPattern[];
7
+ export declare const INCLUDE_PATTERNS: TokenPattern[];
8
+ export declare const EXTENDS_PATTERNS: TokenPattern[];
9
+ export declare const FILTER_PATTERNS: TokenPattern[];
10
+ export declare const MACRO_PATTERNS: TokenPattern[];
11
+ export declare const IGNORE_PATTERN: TokenPattern[];
12
+ export declare const MISC_PATTERNS: TokenPattern[];
13
+ export declare const OUTPUT_PATTERN: TokenPattern[];
14
+ export declare const OPERATOR_PATTERN: TokenPattern[];
@@ -0,0 +1,2 @@
1
+ import type { Token } from './../types/token';
2
+ export declare function tokenize(input: string): Token[];
@@ -0,0 +1,2 @@
1
+ import type { TemplateLoader } from './../types/common';
2
+ export declare function createAsyncLoader(root: string): TemplateLoader;