아래와 같이, 한글에서 설정하는 것과 완전히 동일하게, 편집 가능한 모든 요소를 수정하여 출력하도록 할 수 있습니다.
아래는 순서대로 스타일, 문단 속성, 글자 속성에 해당하는 코드의 일부분입니다.
/**
* Unified Styles (HWPX Style 정의)
*
* HWPX 스타일을 unified-theme-v2 기반으로 동적 생성합니다.
*
*/
import type { ParaStyleKey, CharStyleKey } from "./style-keywords";
import { getParaStyleId, getCharStyleId } from "./theme-to-hwpx-mapper";
/**
* HWPX 스타일 인터페이스
*/
export interface HwpxStyle {
// 스타일 메타데이터
id: number; // 스타일 ID
type: string; // 스타일 타입 ("PARA", "CHAR" 등)
name: string; // 한글 이름
engName?: string; // 영문 이름
langID: number; // 언어 ID (1042 = 한국어)
// 속성 참조 ID (숫자로 저장, 사용시 문자열 변환)
paraPrIDRef: number; // ParaProperty 참조
charPrIDRef: number; // CharProperty 참조
nextStyleIDRef: number; // 다음 스타일 참조
// 선택적 속성
lockForm?: number; // 스타일 잠금 여부
}
/**
* 스타일 정의 (Style Definition)
*
* 각 스타일은 ParaProperty와 CharProperty의 조합입니다.
*
* 새 스타일 추가 방법:
* 1. 배열에 새 항목 추가
* 2. paraStyleName: 사용할 Para 속성 이름 (unified-paras.ts 참조)
* 3. charStyleName: 사용할 Char 속성 이름 (unified-chars.ts 참조)
* 4. displayName: 한글 표시 이름 (예: "발문", "선지")
* 5. engName: 영문 이름 (선택, 예: "Default")
*
*/
const STYLE_DEFINITIONS = [
// 기본 스타일
{
paraStyleName: "Default" as ParaStyleKey,
charStyleName: "Default" as CharStyleKey,
displayName: "바탕글",
engName: "Default",
},
// 발문 관련 스타일
{
paraStyleName: "Statement" as ParaStyleKey,
charStyleName: "Statement" as CharStyleKey,
displayName: "발문",
engName: "",
},
{
paraStyleName: "StatementSub" as ParaStyleKey,
charStyleName: "Statement" as CharStyleKey,
displayName: "발문하단",
engName: "",
},
...
] as const;
/**
*
* ID는 name의 알파벳 순으로 자동 할당됩니다:
* - Default: 0 (항상 첫 번째)
* - 나머지: 알파벳 순으로 자동 정렬
* - 새 스타일 추가 시 아무 위치에나 추가 가능
*/
export const UNIFIED_PARAS = [
// 0: Default (기본 문단 - 바탕글)
{
name: "Default",
tabName: "Default",
borderFillName: "Default",
condense: 0,
snapToGrid: 1,
align: { horizontal: "JUSTIFY", vertical: "BASELINE" },
heading: { type: "NONE", level: 0 },
breakSetting: {
breakLatinWord: "KEEP_WORD",
breakNonLatinWord: "KEEP_WORD",
widowOrphan: 0,
keepWithNext: 0,
keepLines: 0,
pageBreakBefore: 0,
lineWrap: "BREAK",
},
margin: { intent: 0, left: 0, right: 0, prev: 0, next: 0 },
marginDefault: { intent: 0, left: 0, right: 0, prev: 0, next: 0 },
lineSpacing: { type: "PERCENT", value: 165 },
border: {
offsetLeft: 0,
offsetRight: 0,
offsetTop: 0,
offsetBottom: 0,
connect: 0,
ignoreMargin: 0,
},
},
// 1: Statement (발문 - 문항의 주요 본문)
{
name: "Statement",
tabName: "Statement",
borderFillName: "None",
numberingName: "Statement",
condense: 50,
snapToGrid: 0,
align: { horizontal: "LEFT", vertical: "CENTER" },
heading: { type: "NUMBER", level: 0 },
breakSetting: {
breakLatinWord: "KEEP_WORD",
breakNonLatinWord: "BREAK_WORD",
widowOrphan: 0,
keepWithNext: 0,
keepLines: 0,
pageBreakBefore: 0,
lineWrap: "BREAK",
},
margin: { intent: -1130, left: 0, right: 0, prev: 0, next: 1130 },
marginDefault: {
intent: -2260,
left: 0,
right: 0,
prev: 0,
next: 2260,
},
lineSpacing: { type: "PERCENT", value: 165 },
border: {
offsetLeft: 0,
offsetRight: 0,
offsetTop: 0,
offsetBottom: 0,
connect: 0,
ignoreMargin: 0,
},
},
...
}
/**
* 통합 글자 속성 정의
*
* ID는 name의 알파벳 순으로 자동 할당됩니다:
* - Default: 0 (항상 첫 번째)
* - 나머지: 알파벳 순으로 자동 정렬
* - 새 스타일 추가 시 아무 위치에나 추가 가능
*/
export const UNIFIED_CHARS = [
// 0: Default (기본 글자 - 바탕글)
{
name: "Default",
borderFillName: "Default",
fontNames: {
HANGUL: "Default",
LATIN: "Default",
HANJA: "Default",
JAPANESE: "Default",
OTHER: "Default",
SYMBOL: "Default",
USER: "Default",
},
height: 1150, // 11.5 pt
ratio: [100, 100, 100, 100, 100, 100, 100],
spacing: [0, 0, 0, 0, 0, 0, 0],
},
// 1: Statement (발문 글자)
{
name: "Statement",
borderFillName: "Default",
fontNames: {
HANGUL: "ShinmyungJoong",
LATIN: "HanyangShinmyungjo",
HANJA: "ShinmyungJoong",
JAPANESE: "ShinmyungJoong",
OTHER: "ShinmyungJoong",
SYMBOL: "ShinmyungJoong",
USER: "Myungjo",
},
height: 1150,
ratio: [95, 95, 95, 95, 95, 95, 95],
spacing: [-3, -5, -5, -5, -5, -5, -5],
},
...
}