toss / es-hangul

A modern JavaScript library for handling Hangul characters.
https://es-hangul.slash.page/
MIT License
1.26k stars 85 forks source link

[Feature]: 한글 타이핑 효과의 구현 #141

Closed seungrodotlee closed 1 month ago

seungrodotlee commented 2 months ago

Description

자모음이 분리/조합되며 타이핑 되는 한글의 특성에 따라 이러한 타이핑 효과를 기 구현된 es-hangul 내 유틸리티들을 활용하여 간단하게 구현할 수 있는 함수 / 훅을 구현하고자 하는데, 몇 가지 논의사항이 있어 이슈 올립니다.

const { value, run } = useTypingHangul("안녕하세요", { from: "안녕", speed: 50 });

return (
  <div>
    <p>{value}</p>
    <button onClick={run}>run</button>
  </div>
)

논의가 필요한 부분

Possible Solution

No response

etc.

No response

okinawaa commented 2 months ago

이슈레이징 감사합니다!

es-hangul은 리액트와, 종속되어있지 않은 순수자바스크립트/타입스크립트 에서의 도움을 주면 좋겠어요. es-hangul에서 자바스크립트로 표현가능한, 편리한 함수나 기능들을 제공하고, 그것을 다른 라이브러리에서 리액트와 es-hangul을 동시에 사용하여, 위 이슈에서 말씀해주신 기능들을 구현가능할것으로 보여요.

결론적으로 해당 기능은 es-hangul의 범주가 아니라고 생각합니다!

seungrodotlee commented 2 months ago

리액트 의존성을 만드는 것은 저도 좋은 방향은 아닌 것 같습니다! 쓰고나니 제가 예시를 좀 잘못 든 것 같네용

구현하고자 하는 바의 핵심은 한글의 자모음 분리 / 조합 특성에 맞는 타이핑 효과를 구현하는 것으로 현재 구현중인 함수의 사용부는 대략 아래와 같습니다.

const block = docuement.querySelector("#block");

/** 제너레이터를 직접 사용 */
/**
  * function* typeHangul(target: string, options?: TypingOptions):  AsyncGenerator<string, void, unknown>;
  */
const typeGenerator = typeHangul("안녕하세요", { initial: "" });

for await (const value of typeGenerator) {
  block.innerHTML = value;
}

/**  run 메소드와 핸들러 등록을 통한 사용 */
/**
  * getTypewriterHangul(initial?: string): {
  *    onType: (callback: TypingEventListener) => () => void;
  *    type: (target: string, options?: Omit<TypingOptions, 'initial'>) => Promise<void>;
  *    reset: (value?: string) => void;
  * }
  */
const { type, onType, reset } = getTypewriterHangul("");

const unsubscribeTyping = onType((value, { from, to }) => {
  console.log(`typing: ${from} -> ${to}`);

  block.innerHTML = value;
});

await type("안녕하세요");

또한 작업 간 타이핑 효과의 목적 / 제한 역시 좀 더 방향성을 명확히 하였습니다.

목적성을 명확히 하고 타 프레임워크 / 라이브러리와의 의존성을 제거한다면 es-hangul의 범주에 충분히 포함될 수 있는 기능이 아닐까 생각하는데, 다른 분들의 의견이 궁금합니다!

seungrodotlee commented 1 month ago

174 에서의 논의를 바탕으로 close 처리 합니다.