import { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation, } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import bwipjs from "bwip-js"; @Component({ selector: "sd-barcode", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [], template: `
`, }) export class SdBarcode { private readonly _sanitizer = inject(DomSanitizer); type = input.required(); value = input(); // bwip-js는 바코드 데이터를 기하학적 SVG로 변환하는 신뢰할 수 있는 라이브러리이므로 // bypassSecurityTrustHtml을 사용한다. 사용자 HTML은 전달되지 않는다. protected _trustedSvgHtml = computed(() => { const text = this.value(); if (text == null || text === "") { return ""; } try { const svg = bwipjs.toSVG({ bcid: this.type(), text, }); return this._sanitizer.bypassSecurityTrustHtml(svg); } catch { return ""; } }); } export type BarcodeType = | "auspost" | "azteccode" | "azteccodecompact" | "aztecrune" | "bc412" | "channelcode" | "codablockf" | "code11" | "code128" | "code16k" | "code2of5" | "code32" | "code39" | "code39ext" | "code49" | "code93" | "code93ext" | "codeone" | "coop2of5" | "daft" | "databarexpanded" | "databarexpandedcomposite" | "databarexpandedstacked" | "databarexpandedstackedcomposite" | "databarlimited" | "databarlimitedcomposite" | "databaromni" | "databaromnicomposite" | "databarstacked" | "databarstackedcomposite" | "databarstackedomni" | "databarstackedomnicomposite" | "databartruncated" | "databartruncatedcomposite" | "datalogic2of5" | "datamatrix" | "datamatrixrectangular" | "datamatrixrectangularextension" | "dotcode" | "ean13" | "ean13composite" | "ean14" | "ean2" | "ean5" | "ean8" | "ean8composite" | "flattermarken" | "gs1-128" | "gs1-128composite" | "gs1-cc" | "gs1datamatrix" | "gs1datamatrixrectangular" | "gs1dldatamatrix" | "gs1dlqrcode" | "gs1dotcode" | "gs1northamericancoupon" | "gs1qrcode" | "hanxin" | "hibcazteccode" | "hibccodablockf" | "hibccode128" | "hibccode39" | "hibcdatamatrix" | "hibcdatamatrixrectangular" | "hibcmicropdf417" | "hibcpdf417" | "hibcqrcode" | "iata2of5" | "identcode" | "industrial2of5" | "interleaved2of5" | "isbn" | "ismn" | "issn" | "itf14" | "japanpost" | "kix" | "leitcode" | "mailmark" | "mands" | "matrix2of5" | "maxicode" | "micropdf417" | "microqrcode" | "msi" | "onecode" | "pdf417" | "pdf417compact" | "pharmacode" | "pharmacode2" | "planet" | "plessey" | "posicode" | "postnet" | "pzn" | "qrcode" | "rationalizedCodabar" | "raw" | "rectangularmicroqrcode" | "royalmail" | "sscc18" | "swissqrcode" | "symbol" | "telepen" | "telepennumeric" | "ultracode" | "upca" | "upcacomposite" | "upce" | "upcecomposite";