@regmisatyam/retex 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/default.ts","../src/theme/themes.ts","../src/security/sanitize.ts","../src/icons/icons.ts","../src/renderers/css.ts","../src/renderers/context.ts","../src/renderers/structure.ts","../src/renderers/react.ts"],"names":["tokenSafe"],"mappings":"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","file":"react.js","sourcesContent":["import type { Theme } from \"../types/theme.js\";\n\n/**\n * The default ReTeX theme — a clean, ATS-friendly look that reads well both on\n * screen and in print. All other themes are partial overrides of this one.\n */\nexport const defaultTheme: Theme = {\n name: \"default\",\n colors: {\n primary: \"#2563eb\",\n secondary: \"#64748b\",\n text: \"#1e293b\",\n muted: \"#64748b\",\n background: \"#ffffff\",\n border: \"#e2e8f0\",\n accent: \"#2563eb\",\n success: \"#16a34a\",\n },\n fonts: {\n heading: '\"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif',\n body: '\"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif',\n mono: '\"JetBrains Mono\", \"SF Mono\", \"Fira Code\", Consolas, monospace',\n },\n fontSizes: {\n base: \"10.5pt\",\n small: \"9pt\",\n large: \"12pt\",\n Large: \"15pt\",\n Huge: \"22pt\",\n name: \"26pt\",\n section: \"13pt\",\n },\n spacing: {\n unit: \"4px\",\n section: \"1.1rem\",\n item: \"0.28rem\",\n page: \"0.55in\",\n },\n page: {\n size: \"Letter\",\n margin: \"0.55in\",\n maxWidth: \"8.5in\",\n },\n sectionStyle: \"rule\",\n};\n","import type { PartialTheme, Theme, ThemeColors } from \"../types/theme.js\";\nimport { defaultTheme } from \"./default.js\";\n\n/** Deep-merge a partial theme over a base theme (sub-objects merged shallowly). */\nexport function resolveTheme(partial?: PartialTheme, base: Theme = defaultTheme): Theme {\n if (!partial) return base;\n return {\n name: partial.name ?? base.name,\n colors: { ...base.colors, ...partial.colors } as ThemeColors,\n fonts: { ...base.fonts, ...partial.fonts },\n fontSizes: { ...base.fontSizes, ...partial.fontSizes },\n spacing: { ...base.spacing, ...partial.spacing },\n page: { ...base.page, ...partial.page },\n sectionStyle: partial.sectionStyle ?? base.sectionStyle,\n };\n}\n\n/** A modern, accent-forward theme with underlined section headings. */\nexport const modernTheme: Theme = resolveTheme({\n name: \"modern\",\n colors: { primary: \"#7c3aed\", accent: \"#7c3aed\", text: \"#111827\" },\n sectionStyle: \"underline\",\n});\n\n/** A restrained, classic serif theme suited to academic CVs. */\nexport const classicTheme: Theme = resolveTheme({\n name: \"classic\",\n colors: { primary: \"#111827\", secondary: \"#4b5563\", accent: \"#111827\" },\n fonts: {\n heading: 'Georgia, \"Times New Roman\", serif',\n body: 'Georgia, \"Times New Roman\", serif',\n mono: 'Consolas, \"Courier New\", monospace',\n },\n sectionStyle: \"rule\",\n});\n\n/** A compact, single-accent theme that maximizes content density. */\nexport const compactTheme: Theme = resolveTheme({\n name: \"compact\",\n fontSizes: {\n base: \"9.5pt\",\n small: \"8pt\",\n large: \"11pt\",\n Large: \"13pt\",\n Huge: \"18pt\",\n name: \"20pt\",\n section: \"11pt\",\n },\n spacing: { unit: \"3px\", section: \"0.7rem\", item: \"0.18rem\", page: \"0.4in\" },\n sectionStyle: \"bar\",\n});\n\n/** Built-in theme presets keyed by name. */\nexport const themes: Record<string, Theme> = {\n default: defaultTheme,\n modern: modernTheme,\n classic: classicTheme,\n compact: compactTheme,\n};\n\n/** Look up a preset theme by name, falling back to the default. */\nexport function getTheme(name: string): Theme {\n return themes[name] ?? defaultTheme;\n}\n","/**\n * Security utilities. ReTeX renders untrusted markup to HTML, so every text\n * node and attribute value must be escaped, and every URL must be vetted\n * before it reaches an `href`/`src`. The engine never evaluates source as\n * code — there is no `eval`, `Function`, or template-string interpolation of\n * user input into executable contexts.\n */\n\n/** HTML text-content escaping. Order matters: ampersand first. */\nexport function escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\n/** Escaping for values placed inside double-quoted HTML attributes. */\nexport function escapeAttribute(input: string): string {\n return escapeHtml(input);\n}\n\n/** Protocols we consider safe for links. */\nconst SAFE_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\", \"ftp:\", \"sms:\"]);\n\n/**\n * Matches the leading `scheme:` of a URL. We strip ASCII control characters\n * and whitespace first because browsers ignore them inside the scheme\n * (`java\\tscript:` is a classic bypass).\n */\nconst SCHEME_RE = /^([a-z][a-z0-9+.-]*):/i;\n\n/** Matches ASCII control characters (0x00–0x1F and 0x7F). */\n// eslint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = /[\\x00-\\x1f\\x7f]/g;\n\nexport interface UrlSanitizeResult {\n /** Safe URL, or `\"#\"` when the input was rejected. */\n safe: string;\n /** True when the original URL was blocked. */\n blocked: boolean;\n /** The detected scheme, when present. */\n scheme?: string;\n}\n\n/**\n * Sanitize a URL for use in an `href`.\n *\n * - Relative URLs and fragments are allowed as-is.\n * - Absolute URLs are allowed only for an allow-listed protocol.\n * - `javascript:`, `data:`, `vbscript:`, `file:` and friends are blocked.\n * - Control characters used to obfuscate the scheme are removed first.\n */\nexport function sanitizeUrl(input: string): UrlSanitizeResult {\n const raw = String(input ?? \"\").trim();\n\n // Strip ASCII control characters (incl. tabs/newlines) that browsers ignore\n // and that are commonly used to hide a `javascript:` scheme, e.g.\n // `java\\tscript:alert(1)`. They are removed from the emitted value too.\n const cleaned = raw.replace(CONTROL_CHARS_RE, \"\");\n\n const match = SCHEME_RE.exec(cleaned);\n if (!match) {\n // No scheme → relative URL, fragment, query, or protocol-relative.\n return { safe: cleaned, blocked: false };\n }\n\n const scheme = match[1]!.toLowerCase() + \":\";\n if (SAFE_PROTOCOLS.has(scheme)) {\n return { safe: cleaned, blocked: false, scheme };\n }\n\n return { safe: \"#\", blocked: true, scheme };\n}\n\n/**\n * Validate a CSS color token. Accepts `#rgb`, `#rrggbb`, `#rrggbbaa`,\n * `rgb()/rgba()/hsl()/hsla()` functional notation, and a curated set of\n * CSS named colors. Anything else is rejected so it can't smuggle\n * `url(javascript:…)` or `expression(...)` into a `style` attribute.\n */\nexport function isSafeColor(value: string): boolean {\n const v = value.trim();\n if (/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(v)) return true;\n if (/^(rgb|rgba|hsl|hsla)\\(\\s*[0-9.,%\\s/]+\\)$/i.test(v)) return true;\n return CSS_NAMED_COLORS.has(v.toLowerCase());\n}\n\n/**\n * Validate a CSS length/dimension such as `14pt`, `1.5rem`, `40%`, `200px`.\n * Used for `\\fontsize`, `\\column` widths and spacing commands.\n */\nexport function isSafeDimension(value: string): boolean {\n return /^-?\\d*\\.?\\d+(px|pt|em|rem|ex|ch|vw|vh|vmin|vmax|cm|mm|in|pc|%|fr)?$/.test(\n value.trim(),\n );\n}\n\n/**\n * Sanitize a value destined for a CSS property. Returns `undefined` when the\n * value is unsafe so callers can omit the declaration entirely.\n */\nexport function sanitizeStyleValue(value: string): string | undefined {\n const v = value.trim();\n if (/[<>;{}]/.test(v) || /expression|url\\s*\\(|javascript:/i.test(v)) {\n return undefined;\n }\n return v;\n}\n\n/** A pragmatic subset of CSS named colors. */\nexport const CSS_NAMED_COLORS = new Set([\n \"black\",\n \"silver\",\n \"gray\",\n \"grey\",\n \"white\",\n \"maroon\",\n \"red\",\n \"purple\",\n \"fuchsia\",\n \"green\",\n \"lime\",\n \"olive\",\n \"yellow\",\n \"navy\",\n \"blue\",\n \"teal\",\n \"aqua\",\n \"cyan\",\n \"magenta\",\n \"orange\",\n \"pink\",\n \"brown\",\n \"gold\",\n \"indigo\",\n \"violet\",\n \"tan\",\n \"beige\",\n \"ivory\",\n \"coral\",\n \"salmon\",\n \"khaki\",\n \"crimson\",\n \"turquoise\",\n \"lavender\",\n \"plum\",\n \"orchid\",\n \"slateblue\",\n \"slategray\",\n \"steelblue\",\n \"skyblue\",\n \"royalblue\",\n \"midnightblue\",\n \"darkblue\",\n \"darkgreen\",\n \"darkred\",\n \"darkgray\",\n \"darkgrey\",\n \"lightgray\",\n \"lightgrey\",\n \"lightblue\",\n \"transparent\",\n \"currentcolor\",\n \"inherit\",\n]);\n","/**\n * Icon registry. Icons are stored as the inner markup of a `0 0 24 24` SVG and\n * use `currentColor` so they inherit surrounding text color. The set is\n * intentionally small and extensible via {@link registerIcon} / plugins.\n *\n * Glyphs are simplified, original representations (not vendor logo artwork) so\n * the package carries no third-party asset licensing.\n */\n\nexport interface IconDefinition {\n /** Inner SVG markup (paths/shapes) with a `0 0 24 24` viewBox. */\n body: string;\n /** Whether shapes are stroked (true) or filled (false). */\n stroked?: boolean;\n /** Aliases that resolve to this icon. */\n aliases?: string[];\n}\n\nconst ICONS: Record<string, IconDefinition> = {\n github: {\n body: '<path d=\"M12 1.5A10.5 10.5 0 0 0 8.7 22c.5.1.7-.2.7-.5v-2c-2.9.6-3.5-1.3-3.5-1.3-.5-1.2-1.2-1.5-1.2-1.5-.9-.6.1-.6.1-.6 1 .1 1.6 1 1.6 1 .9 1.6 2.4 1.1 3 .9.1-.7.4-1.1.7-1.4-2.3-.3-4.8-1.2-4.8-5.2 0-1.2.4-2.1 1-2.9-.1-.3-.5-1.3.1-2.7 0 0 .9-.3 2.8 1.1a9.6 9.6 0 0 1 5 0c1.9-1.4 2.8-1.1 2.8-1.1.6 1.4.2 2.4.1 2.7.7.8 1 1.7 1 2.9 0 4-2.5 4.9-4.8 5.2.4.3.7 1 .7 2v3c0 .3.2.6.7.5A10.5 10.5 0 0 0 12 1.5Z\"/>',\n },\n linkedin: {\n body: '<path d=\"M20.5 2h-17A1.5 1.5 0 0 0 2 3.5v17A1.5 1.5 0 0 0 3.5 22h17a1.5 1.5 0 0 0 1.5-1.5v-17A1.5 1.5 0 0 0 20.5 2ZM8 19H5v-9h3v9ZM6.5 8.7A1.7 1.7 0 1 1 6.5 5.3a1.7 1.7 0 0 1 0 3.4ZM19 19h-3v-4.7c0-1.1 0-2.6-1.6-2.6s-1.8 1.2-1.8 2.5V19h-3v-9h2.9v1.2h.04a3.2 3.2 0 0 1 2.9-1.6c3.1 0 3.7 2 3.7 4.7V19Z\"/>',\n },\n email: {\n body: '<path d=\"M3 5h18a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1Zm.4 2 8.6 6 8.6-6H3.4ZM20 8.2l-7.4 5.2a1 1 0 0 1-1.2 0L4 8.2V17h16V8.2Z\"/>',\n aliases: [\"mail\", \"envelope\"],\n },\n phone: {\n body: '<path d=\"M6.6 10.8a15.5 15.5 0 0 0 6.6 6.6l2.2-2.2a1 1 0 0 1 1-.25 11.4 11.4 0 0 0 3.6.58 1 1 0 0 1 1 1V20a1 1 0 0 1-1 1A17 17 0 0 1 3 4a1 1 0 0 1 1-1h3.5a1 1 0 0 1 1 1 11.4 11.4 0 0 0 .57 3.6 1 1 0 0 1-.25 1l-2.2 2.2Z\"/>',\n aliases: [\"tel\", \"telephone\"],\n },\n location: {\n body: '<path d=\"M12 2a7 7 0 0 0-7 7c0 5 7 13 7 13s7-8 7-13a7 7 0 0 0-7-7Zm0 9.5A2.5 2.5 0 1 1 12 6.5a2.5 2.5 0 0 1 0 5Z\"/>',\n aliases: [\"map\", \"pin\", \"marker\", \"geo\"],\n },\n website: {\n body: '<path d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm6.9 6h-2.9a15.7 15.7 0 0 0-1.3-3.4A8 8 0 0 1 18.9 8ZM12 4c.8 1.1 1.5 2.5 1.9 4h-3.8c.4-1.5 1.1-2.9 1.9-4ZM4.3 14a8 8 0 0 1 0-4h3.3a17.6 17.6 0 0 0 0 4H4.3Zm.8 2h2.9a15.7 15.7 0 0 0 1.3 3.4A8 8 0 0 1 5.1 16Zm2.9-8H5.1a8 8 0 0 1 4.2-3.4A15.7 15.7 0 0 0 8 8Zm4 12c-.8-1.1-1.5-2.5-1.9-4h3.8c-.4 1.5-1.1 2.9-1.9 4Zm2.3-6h-4.6a15.3 15.3 0 0 1 0-4h4.6a15.3 15.3 0 0 1 0 4Zm.4 5.4a15.7 15.7 0 0 0 1.3-3.4h2.9a8 8 0 0 1-4.2 3.4ZM16.4 14a17.6 17.6 0 0 0 0-4h3.3a8 8 0 0 1 0 4h-3.3Z\"/>',\n aliases: [\"globe\", \"web\", \"link\", \"url\"],\n },\n twitter: {\n body: '<path d=\"M22 5.9c-.7.3-1.5.6-2.3.7a4 4 0 0 0 1.8-2.2c-.8.5-1.7.8-2.6 1a4 4 0 0 0-6.8 3.6A11.3 11.3 0 0 1 3.9 4.8a4 4 0 0 0 1.2 5.3c-.6 0-1.2-.2-1.8-.5a4 4 0 0 0 3.2 3.9c-.6.1-1.2.2-1.8.1a4 4 0 0 0 3.7 2.8A8 8 0 0 1 2 18.1 11.3 11.3 0 0 0 8.1 20c7.4 0 11.5-6.2 11.5-11.5v-.5c.8-.6 1.5-1.3 2-2.1Z\"/>',\n aliases: [\"x\"],\n },\n gitlab: {\n body: '<path d=\"m21.9 13.1-1.1-3.4-2.2-6.8a.6.6 0 0 0-1.1 0l-2.2 6.8H8.7L6.5 2.9a.6.6 0 0 0-1.1 0L3.2 9.7l-1.1 3.4a1.2 1.2 0 0 0 .4 1.3l9.5 6.9 9.5-6.9a1.2 1.2 0 0 0 .4-1.3Z\"/>',\n },\n stackoverflow: {\n body: '<path d=\"M17 21v-6h2v8H4v-8h2v6h11ZM7 17h9v-2H7v2Zm.3-4.2 8.8 1.8.4-2-8.8-1.8-.4 2Zm1.2-4.4 8.1 3.8.8-1.8-8.1-3.8-.8 1.8Zm2.5-4 6.9 5.7 1.3-1.5-6.9-5.7-1.3 1.5ZM15.6 1l-1.6 1.2 5.3 7.2 1.6-1.2L15.6 1Z\"/>',\n aliases: [\"stack-overflow\", \"so\"],\n },\n scholar: {\n body: '<path d=\"M12 2 1 9l11 7 9-5.7V17h2V9L12 2ZM5 14.2V18c0 1.7 3.1 3 7 3s7-1.3 7-3v-3.8l-7 4.4-7-4.4Z\"/>',\n aliases: [\"google-scholar\", \"academic\"],\n },\n orcid: {\n body: '<path d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20ZM8.5 7.6a1.1 1.1 0 1 1 0 2.2 1.1 1.1 0 0 1 0-2.2ZM9.5 17h-2v-6.2h2V17Zm2-6.2h3.3c2.2 0 3.6 1.5 3.6 3.1 0 1.8-1.4 3.1-3.6 3.1H11.5v-6.2Zm2 1.7v2.8h1.1c1.2 0 1.8-.6 1.8-1.4s-.6-1.4-1.8-1.4h-1.1Z\"/>',\n },\n calendar: {\n body: '<path d=\"M7 2v2H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-2V2h-2v2H9V2H7ZM5 9h14v10H5V9Z\"/>',\n aliases: [\"date\"],\n },\n briefcase: {\n body: '<path d=\"M9 3a2 2 0 0 0-2 2v1H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-3V5a2 2 0 0 0-2-2H9Zm0 3V5h6v1H9Z\"/>',\n aliases: [\"work\", \"job\"],\n },\n};\n\n// Build the alias lookup once.\nconst ALIASES: Record<string, string> = {};\nfor (const [name, def] of Object.entries(ICONS)) {\n for (const alias of def.aliases ?? []) ALIASES[alias] = name;\n}\n\n/** Resolve a (possibly aliased) icon name to its canonical key. */\nexport function resolveIconName(name: string): string | undefined {\n const key = name.trim().toLowerCase();\n if (ICONS[key]) return key;\n if (ALIASES[key]) return ALIASES[key];\n return undefined;\n}\n\nexport function hasIcon(name: string): boolean {\n return resolveIconName(name) !== undefined;\n}\n\nexport function getIcon(name: string): IconDefinition | undefined {\n const key = resolveIconName(name);\n return key ? ICONS[key] : undefined;\n}\n\n/** Register (or override) an icon at runtime. Used by plugins. */\nexport function registerIcon(name: string, def: IconDefinition): void {\n const key = name.trim().toLowerCase();\n ICONS[key] = def;\n for (const alias of def.aliases ?? []) ALIASES[alias] = key;\n}\n\n/** All canonical icon names, for completion / docs. */\nexport function iconNames(): string[] {\n return Object.keys(ICONS);\n}\n\n/**\n * Render an icon to an inline SVG string. Returns `null` for unknown icons so\n * callers can emit a diagnostic and a graceful fallback.\n */\nexport function iconToSvg(\n name: string,\n opts: { size?: number | string; className?: string } = {},\n): string | null {\n const def = getIcon(name);\n if (!def) return null;\n const size = opts.size ?? \"1em\";\n const dim = typeof size === \"number\" ? `${size}` : size;\n const cls = opts.className ? ` class=\"${opts.className}\"` : \"\";\n const fillOrStroke = def.stroked\n ? 'fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"'\n : 'fill=\"currentColor\"';\n return (\n `<svg${cls} width=\"${dim}\" height=\"${dim}\" viewBox=\"0 0 24 24\" ` +\n `${fillOrStroke} role=\"img\" aria-hidden=\"true\" focusable=\"false\">` +\n `${def.body}</svg>`\n );\n}\n","import type { Theme } from \"../types/index.js\";\n\nconst tokenSafe = (s: string): string => s.replace(/[^a-zA-Z0-9_-]/g, \"\");\n\n/**\n * Generate the stylesheet for a rendered resume from a {@link Theme}. Theme\n * values become CSS custom properties so they can be overridden at runtime,\n * and every theme color is exposed as `--retex-color-<token>` for use by\n * `\\themecolor`.\n */\nexport function themeToCss(theme: Theme, prefix = \"retex\"): string {\n const p = prefix;\n const colorVars = Object.entries(theme.colors)\n .map(([k, v]) => ` --${p}-color-${tokenSafe(k)}: ${v};`)\n .join(\"\\n\");\n\n return `.${p}-resume {\n${colorVars}\n --${p}-primary: ${theme.colors.primary};\n --${p}-text: ${theme.colors.text};\n --${p}-muted: ${theme.colors.muted};\n --${p}-border: ${theme.colors.border};\n --${p}-bg: ${theme.colors.background};\n --${p}-font-heading: ${theme.fonts.heading};\n --${p}-font-body: ${theme.fonts.body};\n --${p}-font-mono: ${theme.fonts.mono};\n --${p}-fs-base: ${theme.fontSizes.base};\n --${p}-fs-small: ${theme.fontSizes.small};\n --${p}-fs-large: ${theme.fontSizes.large};\n --${p}-fs-Large: ${theme.fontSizes.Large};\n --${p}-fs-Huge: ${theme.fontSizes.Huge};\n --${p}-fs-name: ${theme.fontSizes.name};\n --${p}-fs-section: ${theme.fontSizes.section};\n --${p}-sp-section: ${theme.spacing.section};\n --${p}-sp-item: ${theme.spacing.item};\n\n box-sizing: border-box;\n max-width: ${theme.page.maxWidth};\n margin: 0 auto;\n padding: ${theme.spacing.page};\n background: var(--${p}-bg);\n color: var(--${p}-text);\n font-family: var(--${p}-font-body);\n font-size: var(--${p}-fs-base);\n line-height: 1.45;\n}\n.${p}-resume *, .${p}-resume *::before, .${p}-resume *::after { box-sizing: border-box; }\n\n.${p}-header { margin-bottom: var(--${p}-sp-section); }\n.${p}-name {\n font-family: var(--${p}-font-heading);\n font-size: var(--${p}-fs-name);\n font-weight: 700;\n margin: 0 0 0.1em;\n color: var(--${p}-text);\n letter-spacing: -0.01em;\n}\n.${p}-title {\n font-size: var(--${p}-fs-large);\n color: var(--${p}-primary);\n margin: 0 0 0.45em;\n font-weight: 500;\n}\n.${p}-contact {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem 1rem;\n font-size: var(--${p}-fs-small);\n color: var(--${p}-muted);\n}\n.${p}-contact-item {\n display: inline-flex;\n align-items: center;\n gap: 0.3em;\n color: inherit;\n text-decoration: none;\n}\n.${p}-contact-item svg { opacity: 0.8; }\n\n.${p}-section { margin-bottom: var(--${p}-sp-section); break-inside: avoid; }\n.${p}-section-title {\n font-family: var(--${p}-font-heading);\n font-size: var(--${p}-fs-section);\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--${p}-primary);\n margin: 0 0 0.5em;\n}\n.${p}-section--rule .${p}-section-title { border-bottom: 2px solid var(--${p}-border); padding-bottom: 0.2em; }\n.${p}-section--underline .${p}-section-title { text-decoration: underline; text-underline-offset: 3px; }\n.${p}-section--bar .${p}-section-title {\n border-left: 3px solid var(--${p}-primary);\n padding-left: 0.5em;\n border-bottom: none;\n}\n.${p}-subsection-title {\n font-family: var(--${p}-font-heading);\n font-size: var(--${p}-fs-large);\n font-weight: 600;\n margin: 0.6em 0 0.3em;\n}\n\n.${p}-entry { margin-bottom: 0.6rem; break-inside: avoid; }\n.${p}-entry-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 1rem;\n}\n.${p}-entry-title { font-weight: 700; }\n.${p}-entry-subtitle { color: var(--${p}-primary); font-weight: 500; }\n.${p}-entry-dates, .${p}-entry-location {\n color: var(--${p}-muted);\n font-size: var(--${p}-fs-small);\n white-space: nowrap;\n}\n.${p}-entry-body { margin-top: 0.15rem; }\n.${p}-entry-body p { margin: 0.2em 0; }\n\n.${p}-list { margin: 0.2rem 0 0.2rem 1.1rem; padding: 0; }\n.${p}-list li { margin-bottom: var(--${p}-sp-item); padding-left: 0.15rem; }\n\n.${p}-columns { display: flex; gap: 1.5rem; align-items: flex-start; }\n.${p}-column { min-width: 0; }\n\n.${p}-skills { display: flex; flex-wrap: wrap; gap: 0.4rem; list-style: none; margin: 0.2rem 0; padding: 0; }\n.${p}-skill {\n background: color-mix(in srgb, var(--${p}-primary) 12%, transparent);\n color: var(--${p}-primary);\n border-radius: 4px;\n padding: 0.12rem 0.5rem;\n font-size: var(--${p}-fs-small);\n font-weight: 500;\n white-space: nowrap;\n}\n\n.${p}-link { color: var(--${p}-primary); text-decoration: none; }\n.${p}-link:hover { text-decoration: underline; }\n.${p}-icon { display: inline-flex; vertical-align: -0.125em; }\n.${p}-rule { border: none; border-top: 1px solid var(--${p}-border); margin: 0.6rem 0; }\n.${p}-center { text-align: center; }\n.${p}-scale-small { font-size: var(--${p}-fs-small); }\n.${p}-scale-large { font-size: var(--${p}-fs-large); }\n.${p}-scale-Large { font-size: var(--${p}-fs-Large); }\n.${p}-scale-Huge { font-size: var(--${p}-fs-Huge); }\np.${p}-para { margin: 0 0 0.45em; }\np.${p}-para:last-child { margin-bottom: 0; }\n\n@media print {\n .${p}-resume { max-width: none; margin: 0; padding: 0; }\n .${p}-section, .${p}-entry { break-inside: avoid; }\n a { color: inherit; }\n}`;\n}\n","import type { Node, Theme } from \"../types/index.js\";\n\n/** Node types that participate in block (vertical) flow. */\nexport const BLOCK_TYPES = new Set<string>([\n \"section\",\n \"job\",\n \"education\",\n \"project\",\n \"skills\",\n \"list\",\n \"columns\",\n \"rule\",\n]);\n\nexport function isBlockNode(node: Node): boolean {\n if (BLOCK_TYPES.has(node.type)) return true;\n if (node.type === \"space\") return node.axis === \"vertical\";\n if (node.type === \"command\" && node.name === \"center\") return true;\n return false;\n}\n\n/**\n * Plugin HTML renderer. Receives the node, the active context, and a callback\n * to recursively render child nodes to HTML.\n */\nexport type HtmlRenderFn = (\n node: Node,\n ctx: HtmlRenderContext,\n renderChildren: (nodes: Node[]) => string,\n) => string;\n\nexport interface HtmlRenderContext {\n theme: Theme;\n classPrefix: string;\n /** Override renderers keyed by node `type` or `command:<name>`. */\n overrides: Map<string, HtmlRenderFn>;\n /** Render arbitrary inline/block nodes to an HTML string. */\n renderNodes: (nodes: Node[]) => string;\n cls: (name: string) => string;\n}\n\n/** A target-agnostic, serializable element used by the React renderer. */\nexport interface ReactElementSpec {\n type: string;\n props: Record<string, unknown>;\n children: Array<ReactElementSpec | string>;\n}\n","import type { Node, SectionNode, ContactNode, FieldMap } from \"../types/index.js\";\n\n/** A document region: an optional leading section heading plus its body. */\nexport interface Region {\n section?: SectionNode;\n nodes: Node[];\n}\n\n/** Split a document's children into regions delimited by level-1 sections. */\nexport function toRegions(children: Node[]): Region[] {\n const regions: Region[] = [{ nodes: [] }];\n for (const node of children) {\n if (node.type === \"section\" && node.level === 1) {\n regions.push({ section: node, nodes: [] });\n } else {\n regions[regions.length - 1]!.nodes.push(node);\n }\n }\n return regions;\n}\n\nexport const CONTACTISH = new Set([\"contact\", \"icon\", \"link\", \"url\"]);\n\nexport interface PreambleParts {\n name?: ContactNode;\n title?: ContactNode;\n contacts: Node[];\n other: Node[];\n}\n\n/** Separate a preamble into header pieces (name/title/contacts) and the rest. */\nexport function splitPreamble(nodes: Node[]): PreambleParts {\n const name = nodes.find(\n (n): n is ContactNode => n.type === \"contact\" && n.field === \"name\",\n );\n const title = nodes.find(\n (n): n is ContactNode => n.type === \"contact\" && n.field === \"title\",\n );\n const contacts = nodes.filter(\n (n) => CONTACTISH.has(n.type) && n !== name && n !== title,\n );\n const other = nodes.filter(\n (n) =>\n !CONTACTISH.has(n.type) &&\n n.type !== \"parbreak\" &&\n !(n.type === \"text\" && n.value.trim() === \"\"),\n );\n return { name, title, contacts, other };\n}\n\nexport interface EntryParts {\n title: string;\n subtitle: string;\n dates: string;\n location: string;\n url: string;\n}\n\n/** Normalize a job/education/project field map into renderable entry parts. */\nexport function entryParts(fields: FieldMap, kind: string): EntryParts {\n let title: string;\n let subtitle: string;\n if (kind === \"education\") {\n // School is the prominent line; the degree is the subtitle.\n title = fields.school ?? fields.degree ?? \"\";\n subtitle = fields.school ? (fields.degree ?? \"\") : \"\";\n } else if (kind === \"project\") {\n title = fields.name ?? fields.title ?? \"\";\n subtitle = fields.organization ?? fields.tech ?? \"\";\n } else {\n title = fields.title ?? fields.role ?? fields.name ?? \"\";\n subtitle = fields.company ?? fields.organization ?? \"\";\n }\n return {\n title,\n subtitle,\n dates: dateRange(fields.start, fields.end, fields.date),\n location: fields.location ?? \"\",\n url: fields.url ?? fields.link ?? \"\",\n };\n}\n\nexport function dateRange(start?: string, end?: string, date?: string): string {\n if (date) return date;\n if (start && end) return `${start} – ${end}`;\n return start ?? end ?? \"\";\n}\n","import {\n type Node,\n type DocumentNode,\n type SectionNode,\n type Theme,\n type ListNode,\n type ColumnsNode,\n type CommandNode,\n} from \"../types/index.js\";\nimport { resolveTheme } from \"../theme/themes.js\";\nimport {\n sanitizeUrl,\n isSafeColor,\n isSafeDimension,\n sanitizeStyleValue,\n} from \"../security/sanitize.js\";\nimport { iconToSvg } from \"../icons/icons.js\";\nimport { themeToCss } from \"./css.js\";\nimport { isBlockNode } from \"./context.js\";\nimport { toRegions, splitPreamble, entryParts } from \"./structure.js\";\n\n/**\n * Minimal structural type for a JSX factory (React.createElement, Preact's `h`,\n * etc.). Declaring it locally means the package has **no** hard React\n * dependency — callers pass whichever factory they use.\n */\nexport type JsxFactory = (\n type: unknown,\n props: Record<string, unknown> | null,\n ...children: unknown[]\n) => unknown;\n\n/** A React render override keyed by node `type` or `command:<name>`. */\nexport type ReactRenderFn = (\n node: Node,\n ctx: ReactRenderContext,\n renderChildren: (nodes: Node[]) => unknown[],\n) => unknown;\n\nexport interface ReactRenderContext {\n theme: Theme;\n classPrefix: string;\n h: JsxFactory;\n Fragment: unknown;\n overrides: Map<string, ReactRenderFn>;\n renderNodes: (nodes: Node[]) => unknown[];\n cls: (name: string) => string;\n}\n\nexport interface ReactRenderOptions {\n /** JSX factory. Required. Pass `React.createElement`. */\n createElement: JsxFactory;\n /** Fragment component. Pass `React.Fragment`. Falls back to a `<div>`. */\n Fragment?: unknown;\n theme?: Theme;\n classPrefix?: string;\n overrides?: Map<string, ReactRenderFn>;\n header?: boolean;\n}\n\nconst tokenSafe = (s: string): string => s.replace(/[^a-zA-Z0-9_-]/g, \"\");\n\n/**\n * The React renderer. Produces a React element tree mirroring the HTML\n * renderer's structure and class names, so the same theme stylesheet applies.\n */\nexport class ReactRenderer {\n private readonly theme: Theme;\n private readonly prefix: string;\n private readonly h: JsxFactory;\n private readonly Fragment: unknown;\n private readonly overrides: Map<string, ReactRenderFn>;\n private readonly useHeader: boolean;\n private key = 0;\n\n constructor(options: ReactRenderOptions) {\n if (typeof options.createElement !== \"function\") {\n throw new TypeError(\n \"ReactRenderer requires a `createElement` factory (e.g. React.createElement).\",\n );\n }\n this.theme = options.theme ?? resolveTheme();\n this.prefix = options.classPrefix ?? \"retex\";\n this.h = options.createElement;\n this.Fragment = options.Fragment ?? \"div\";\n this.overrides = options.overrides ?? new Map();\n this.useHeader = options.header ?? true;\n }\n\n /** The stylesheet for the active theme. Render it in a `<style>` yourself. */\n styles(): string {\n return themeToCss(this.theme, this.prefix);\n }\n\n /** Render the document AST to a React element. */\n render(ast: DocumentNode): unknown {\n const regions = toRegions(ast.children);\n const parts: unknown[] = [];\n const preamble = regions[0]?.section ? undefined : regions.shift();\n if (preamble) parts.push(...this.renderPreamble(preamble.nodes));\n for (const region of regions) {\n if (region.section) parts.push(this.renderSection(region.section, region.nodes));\n else parts.push(...this.renderFlow(region.nodes));\n }\n return this.el(\"div\", { className: this.cls(\"resume\") }, parts);\n }\n\n private ctx(): ReactRenderContext {\n return {\n theme: this.theme,\n classPrefix: this.prefix,\n h: this.h,\n Fragment: this.Fragment,\n overrides: this.overrides,\n renderNodes: (nodes) => this.renderFlow(nodes),\n cls: (name) => this.cls(name),\n };\n }\n\n /* --------------------------- structuring ---------------------------- */\n\n private renderSection(section: SectionNode, body: Node[]): unknown {\n return this.el(\n \"section\",\n {\n className: `${this.cls(\"section\")} ${this.cls(\"section\")}--${this.theme.sectionStyle}`,\n },\n [\n this.el(\"h2\", { className: this.cls(\"section-title\") }, [section.title]),\n this.el(\"div\", { className: this.cls(\"section-body\") }, this.renderFlow(body)),\n ],\n );\n }\n\n private renderPreamble(nodes: Node[]): unknown[] {\n if (!this.useHeader) return this.renderFlow(nodes);\n const { name, title, contacts, other } = splitPreamble(nodes);\n const out: unknown[] = [];\n if (name || title || contacts.length > 0) {\n const head: unknown[] = [];\n if (name) head.push(this.el(\"h1\", { className: this.cls(\"name\") }, [name.value]));\n if (title) head.push(this.el(\"p\", { className: this.cls(\"title\") }, [title.value]));\n if (contacts.length > 0) {\n head.push(\n this.el(\n \"div\",\n { className: this.cls(\"contact\") },\n contacts.map((c) => this.renderNode(c)),\n ),\n );\n }\n out.push(this.el(\"header\", { className: this.cls(\"header\") }, head));\n }\n if (other.length > 0) out.push(...this.renderFlow(other));\n return out;\n }\n\n /* ----------------------------- flow / inline ------------------------ */\n\n private renderFlow(nodes: Node[]): unknown[] {\n const out: unknown[] = [];\n let inline: Node[] = [];\n const flush = (): void => {\n if (inline.length === 0) return;\n const meaningful = inline.some((n) => n.type !== \"text\" || n.value.trim() !== \"\");\n if (meaningful) {\n out.push(\n this.el(\"p\", { className: this.cls(\"para\") }, this.renderInline(inline)),\n );\n }\n inline = [];\n };\n for (const node of nodes) {\n if (node.type === \"parbreak\") flush();\n else if (isBlockNode(node)) {\n flush();\n out.push(this.renderNode(node));\n } else inline.push(node);\n }\n flush();\n return out;\n }\n\n private renderInline(nodes: Node[]): unknown[] {\n return nodes.map((n) => this.renderNode(n));\n }\n\n /* ------------------------------ per node ---------------------------- */\n\n private renderNode(node: Node): unknown {\n const override =\n this.overrides.get(node.type) ??\n (node.type === \"command\" ? this.overrides.get(`command:${node.name}`) : undefined);\n if (override) return override(node, this.ctx(), (ns) => this.renderFlow(ns));\n\n switch (node.type) {\n case \"text\":\n return node.value;\n case \"parbreak\":\n return null;\n case \"linebreak\":\n return this.el(\"br\", null, []);\n case \"rule\":\n return this.el(\"hr\", { className: this.cls(\"rule\") }, []);\n case \"space\":\n return node.axis === \"vertical\"\n ? this.el(\"div\", { style: { height: this.dim(node.size) } }, [])\n : this.el(\n \"span\",\n { style: { display: \"inline-block\", width: this.dim(node.size) } },\n [],\n );\n case \"group\":\n return this.frag(this.renderInline(node.children));\n case \"bold\":\n return this.el(\"strong\", null, this.renderInline(node.children));\n case \"italic\":\n return this.el(\"em\", null, this.renderInline(node.children));\n case \"underline\":\n return this.el(\"u\", null, this.renderInline(node.children));\n case \"strike\":\n return this.el(\"s\", null, this.renderInline(node.children));\n case \"color\": {\n const inner = this.renderInline(node.children);\n if (!node.color || !isSafeColor(node.color)) return this.frag(inner);\n return this.el(\"span\", { style: { color: node.color } }, inner);\n }\n case \"themecolor\":\n return this.el(\n \"span\",\n {\n style: {\n color: `var(--${this.prefix}-color-${tokenSafe(node.token)}, currentColor)`,\n },\n },\n this.renderInline(node.children),\n );\n case \"fontsize\": {\n const inner = this.renderInline(node.children);\n if (!isSafeDimension(node.size)) return this.frag(inner);\n return this.el(\"span\", { style: { fontSize: node.size } }, inner);\n }\n case \"fontfamily\": {\n const inner = this.renderInline(node.children);\n const family =\n node.family === \"monospace\"\n ? `var(--${this.prefix}-font-mono)`\n : sanitizeStyleValue(node.family);\n if (!family) return this.frag(inner);\n return this.el(\"span\", { style: { fontFamily: family } }, inner);\n }\n case \"fontscale\":\n return node.scale === \"normal\"\n ? this.frag(this.renderInline(node.children))\n : this.el(\n \"span\",\n { className: this.cls(`scale-${node.scale}`) },\n this.renderInline(node.children),\n );\n case \"link\":\n return this.renderLink(node.href, this.renderInline(node.children));\n case \"url\":\n return this.renderLink(node.href, [node.rawHref]);\n case \"icon\":\n return this.renderIcon(node.name);\n case \"section\":\n return this.el(\n `h${node.level + 1}`,\n { className: this.cls(\"subsection-title\") },\n [node.title],\n );\n case \"list\":\n return this.renderList(node);\n case \"columns\":\n return this.renderColumns(node);\n case \"skills\":\n return this.el(\n \"ul\",\n { className: this.cls(\"skills\") },\n node.items.map((s) => this.el(\"li\", { className: this.cls(\"skill\") }, [s])),\n );\n case \"job\":\n return this.renderEntry(node, \"job\");\n case \"education\":\n return this.renderEntry(node, \"education\");\n case \"project\":\n return this.renderEntry(node, \"project\");\n case \"contact\":\n return this.renderContact(node);\n case \"command\":\n return this.renderCommand(node);\n default:\n return null;\n }\n }\n\n private renderContact(node: Extract<Node, { type: \"contact\" }>): unknown {\n const item = this.cls(\"contact-item\");\n switch (node.field) {\n case \"email\":\n return this.contactLink(`mailto:${node.value}`, \"email\", node.value, item);\n case \"phone\":\n return this.contactLink(\n `tel:${node.value.replace(/[^\\d+]/g, \"\")}`,\n \"phone\",\n node.value,\n item,\n );\n case \"website\":\n return this.contactLink(node.value, \"website\", node.value, item);\n case \"location\":\n return this.el(\"span\", { className: item }, [\n this.renderIcon(\"location\"),\n node.value,\n ]);\n default:\n return this.el(\"span\", { className: item }, [node.value]);\n }\n }\n\n private contactLink(url: string, icon: string, label: string, cls: string): unknown {\n const { safe } = sanitizeUrl(url);\n return this.el(\"a\", { className: cls, href: safe }, [this.renderIcon(icon), label]);\n }\n\n private renderLink(href: string, label: unknown[]): unknown {\n const { safe } = sanitizeUrl(href);\n const external = /^https?:/i.test(safe);\n const props: Record<string, unknown> = { className: this.cls(\"link\"), href: safe };\n if (external) {\n props.target = \"_blank\";\n props.rel = \"noopener noreferrer\";\n }\n return this.el(\"a\", props, label);\n }\n\n private renderList(node: ListNode): unknown {\n const tag = node.kind === \"enumerate\" ? \"ol\" : \"ul\";\n return this.el(\n tag,\n { className: this.cls(\"list\") },\n node.items.map((item) => this.el(\"li\", null, this.renderInline(item.children))),\n );\n }\n\n private renderColumns(node: ColumnsNode): unknown {\n return this.el(\n \"div\",\n { className: this.cls(\"columns\") },\n node.columns.map((col) => {\n const basis = isSafeDimension(col.width) ? col.width : \"auto\";\n const style = basis === \"auto\" ? { flex: \"1 1 0\" } : { flex: `0 0 ${basis}` };\n return this.el(\n \"div\",\n { className: this.cls(\"column\"), style },\n this.renderFlow(col.children),\n );\n }),\n );\n }\n\n private renderEntry(\n node: Extract<Node, { type: \"job\" | \"education\" | \"project\" }>,\n kind: string,\n ): unknown {\n const { title, subtitle, dates, location, url } = entryParts(node.fields, kind);\n const rows: unknown[] = [];\n const titleEl = url ? this.renderLink(sanitizeUrl(url).safe, [title]) : title;\n rows.push(\n this.el(\"div\", { className: this.cls(\"entry-row\") }, [\n this.el(\"span\", { className: this.cls(\"entry-title\") }, [titleEl]),\n dates ? this.el(\"span\", { className: this.cls(\"entry-dates\") }, [dates]) : null,\n ]),\n );\n if (subtitle || location) {\n rows.push(\n this.el(\"div\", { className: this.cls(\"entry-row\") }, [\n this.el(\"span\", { className: this.cls(\"entry-subtitle\") }, [subtitle]),\n location\n ? this.el(\"span\", { className: this.cls(\"entry-location\") }, [location])\n : null,\n ]),\n );\n }\n if (node.children.length > 0) {\n rows.push(\n this.el(\n \"div\",\n { className: this.cls(\"entry-body\") },\n this.renderFlow(node.children),\n ),\n );\n }\n return this.el(\"div\", { className: `${this.cls(\"entry\")} ${this.cls(kind)}` }, rows);\n }\n\n private renderCommand(node: CommandNode): unknown {\n const inner = node.args.flatMap((a) => a.children);\n if (node.name === \"center\") {\n return this.el(\"div\", { className: this.cls(\"center\") }, this.renderFlow(inner));\n }\n return this.frag(this.renderInline(inner));\n }\n\n private renderIcon(name: string): unknown {\n const svg = iconToSvg(name);\n if (!svg) return this.el(\"span\", { className: this.cls(\"icon\"), title: name }, []);\n // Inline SVG via dangerouslySetInnerHTML, matching React's escape hatch.\n return this.el(\n \"span\",\n {\n className: this.cls(\"icon\"),\n dangerouslySetInnerHTML: { __html: svg },\n },\n [],\n );\n }\n\n /* ------------------------------ helpers ----------------------------- */\n\n private el(\n type: unknown,\n props: Record<string, unknown> | null,\n children: unknown[],\n ): unknown {\n const filtered = children.filter((c) => c !== null && c !== undefined && c !== \"\");\n const finalProps = { ...(props ?? {}), key: this.key++ };\n return this.h(type, finalProps, ...filtered);\n }\n\n private frag(children: unknown[]): unknown {\n return this.el(this.Fragment, null, children);\n }\n\n private dim(value: string): string {\n return isSafeDimension(value) ? value : \"0\";\n }\n\n private cls(name: string): string {\n return `${this.prefix}-${name}`;\n }\n}\n\n/** Render a document AST to a React element tree. */\nexport function renderReact(ast: DocumentNode, options: ReactRenderOptions): unknown {\n return new ReactRenderer(options).render(ast);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@regmisatyam/retex",
3
+ "version": "0.1.0",
4
+ "description": "ReTeX — a modern, high-performance LaTeX-inspired markup language and compiler for resumes, research papers, and developer portfolios.",
5
+ "keywords": [
6
+ "resume",
7
+ "cv",
8
+ "latex",
9
+ "markup",
10
+ "compiler",
11
+ "parser",
12
+ "tokenizer",
13
+ "ast",
14
+ "renderer",
15
+ "html",
16
+ "react",
17
+ "pdf",
18
+ "typescript"
19
+ ],
20
+ "license": "MIT",
21
+ "author": "ReTeX contributors",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/regmisatyam/ReTex.git"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/regmisatyam/ReTex/issues"
28
+ },
29
+ "homepage": "https://github.com/regmisatyam/ReTex#readme",
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "type": "module",
34
+ "main": "./dist/index.cjs",
35
+ "module": "./dist/index.js",
36
+ "types": "./dist/index.d.ts",
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/index.d.ts",
40
+ "import": "./dist/index.js",
41
+ "require": "./dist/index.cjs"
42
+ },
43
+ "./react": {
44
+ "types": "./dist/react.d.ts",
45
+ "import": "./dist/react.js",
46
+ "require": "./dist/react.cjs"
47
+ }
48
+ },
49
+ "files": [
50
+ "dist",
51
+ "README.md",
52
+ "LICENSE"
53
+ ],
54
+ "sideEffects": false,
55
+ "scripts": {
56
+ "build": "tsup",
57
+ "typecheck": "tsc --noEmit",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest",
60
+ "test:cov": "vitest run --coverage",
61
+ "bench": "vitest bench --run",
62
+ "lint": "prettier --check \"src/**/*.{ts,tsx}\" && tsc --noEmit",
63
+ "format": "prettier --write \"{src,tests,examples}/**/*.{ts,tsx}\"",
64
+ "prepublishOnly": "npm run build"
65
+ },
66
+ "peerDependencies": {
67
+ "react": ">=17.0.0"
68
+ },
69
+ "peerDependenciesMeta": {
70
+ "react": {
71
+ "optional": true
72
+ }
73
+ },
74
+ "devDependencies": {
75
+ "@types/node": "^22.10.0",
76
+ "@types/react": "^18.3.0",
77
+ "react": "^18.3.0",
78
+ "tsup": "^8.3.5",
79
+ "typescript": "^5.7.0",
80
+ "vitest": "^2.1.8"
81
+ },
82
+ "engines": {
83
+ "node": ">=18"
84
+ }
85
+ }