templateRenderer.ts 1.69 KB
import type {
  LabelTemplateData,
  StructuredEscTemplate,
  StructuredLabelTemplate,
  StructuredTscTemplate,
} from './types/printer'

function resolveTemplateValue (key: string, data: LabelTemplateData): string {
  const value = data[key]
  if (value == null) return ''
  return String(value)
}

export function applyTemplateData (content: string, data: LabelTemplateData = {}): string {
  return String(content || '').replace(/\{\{\s*([\w.-]+)\s*\}\}/g, (_, key: string) => resolveTemplateValue(key, data))
}

export function resolveTscTemplate (
  template: StructuredLabelTemplate,
  data: LabelTemplateData = {}
): StructuredTscTemplate {
  if (!template.tsc) {
    throw new Error(`Template "${template.key}" does not support TSC printers`)
  }
  return {
    ...template.tsc,
    items: template.tsc.items.map((item) => {
      if (item.type === 'text') {
        return { ...item, text: applyTemplateData(item.text, data) }
      }
      if (item.type === 'qrcode' || item.type === 'barcode') {
        return { ...item, value: applyTemplateData(item.value, data) }
      }
      return { ...item }
    }),
  }
}

export function resolveEscTemplate (
  template: StructuredLabelTemplate,
  data: LabelTemplateData = {}
): StructuredEscTemplate {
  if (!template.esc) {
    throw new Error(`Template "${template.key}" does not support ESC printers`)
  }
  return {
    ...template.esc,
    items: template.esc.items.map((item) => {
      if (item.type === 'text') {
        return { ...item, text: applyTemplateData(item.text, data) }
      }
      if (item.type === 'qrcode' || item.type === 'barcode') {
        return { ...item, value: applyTemplateData(item.value, data) }
      }
      return { ...item }
    }),
  }
}