Skip to content
Snippets Groups Projects
Commit e1472c5e authored by Philipp Stadler's avatar Philipp Stadler
Browse files

fix: add ⻏ SVG and stroke data

parent 7a10b0e1
Branches
Tags
1 merge request!22fix: correct stroke order for li part of 裡
export interface AssembleInput {
char: string
from: number
to: number
deltaRight?: number
deltaUp?: number,
dropRadStrokes?: true
}
/**
* Characters that are not defined but have parts that occur in other
* characters can be assembled here.
*
* In contrast to patched Hanzi Writer, this will also get stroke types from
* components.
*/
export const globalAssembleFrom: Map<string, Array<AssembleInput>> = new Map()
globalAssembleFrom.set('', [
{
char: '',
from: 8,
to: 10,
dropRadStrokes: true
}
])
......@@ -2,6 +2,7 @@ import fs from 'fs'
import { applyOverridesInPlace } from './overrides'
import { animDataConcat, animDataSlice, animDataTranslate } from './anim-data'
import { compat } from './blocks/index'
import { AssembleInput, globalAssembleFrom } from './global-overrides'
export interface HanziWriterData {
strokes: string[]
......@@ -13,6 +14,10 @@ const noHanziWriterData: HanziWriterData = { strokes: [], medians: [] }
export async function queryPatchedHanziWriterData (
char: string
): Promise<HanziWriterData> {
const assembleFrom = globalAssembleFrom.get(char)
if (assembleFrom !== undefined) {
return await fromParts(assembleFrom)
}
// kangxi radicals are often not defined, but CJK ideograms have a good
// chance, so use that data instead
const hanziWriterCompatChar = compat(char)
......@@ -23,6 +28,27 @@ export async function queryPatchedHanziWriterData (
)
}
async function fromParts(assembleFrom: AssembleInput[]): Promise<HanziWriterData> {
const parts = await Promise.all(assembleFrom.map(
async ({ char, from, to, deltaRight, deltaUp, dropRadStrokes }) => {
const dataFull = await queryHanziWriterData(char)
const extracted = animDataSlice(dataFull, from, to)
const positioned = animDataTranslate(extracted, deltaRight ?? 0, deltaUp ?? 0)
if (dropRadStrokes === true) {
delete positioned.radStrokes
}
return positioned
}
))
if (parts.length === 0) {
throw new Error('why zero parts?')
}
return parts.slice(1).reduce(
(acc, next) => animDataConcat(acc, next),
parts[0]
)
}
export function loadHanziWriterDataWithoutOverridesSync (
char: string
): Omit<HanziWriterData, 'trad'> {
......@@ -254,7 +280,7 @@ const hanziWriterOverrides = new Map<string, Partial<HanziWriterData>>(
-25,
-25
)
)
),
})
)
......
import { StrokeType } from '../../src-common/stroke-encodings'
/**
* Custom values for the stroke types, without affecting SVG data.
*
* Can be used to repair broken cnchar entries.
*/
export const strokeTypeOverrides = new Map<string, StrokeType[]>(
Object.entries({
: [
......
......@@ -8,6 +8,7 @@ import {
import { strokeTypeOverrides } from './stroke-type-overrides'
import { compat } from './blocks/index'
import { normalizeStroke } from './stroke-normalize'
import { globalAssembleFrom } from './global-overrides'
cnchar.use(cncharOrder, cncharTrad)
......@@ -29,6 +30,13 @@ export function queryStrokeTypes (
expectedLen?: number
): StrokeType[] {
const compatChar = compat(char)
const assembleFrom = globalAssembleFrom.get(char)
if (assembleFrom !== undefined) {
return assembleFrom.reduce(
(acc, next) => acc.concat(queryStrokeTypes(next.char).slice(next.from, next.to)),
[] as StrokeType[]
)
}
const override =
strokeTypeOverrides.get(char) ?? strokeTypeOverrides.get(compatChar)
if (override !== undefined) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment