diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..e9e73cc --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,4 @@ +((nil + . ((eval . (progn (add-to-list 'load-path (project-root (project-current))) + (require 'helpers) + (add-hook 'before-save-hook #'hangul-convert-buffer-to-jamo)))))) diff --git a/helpers.el b/helpers.el new file mode 100644 index 0000000..1bd6c46 --- /dev/null +++ b/helpers.el @@ -0,0 +1,55 @@ +(defun hangul-syllables-to-jamo (str) + "Convert HANGUL SYLLABLES characters in STR to their HANGUL JAMO +equivalents." + (let ((result "") + (i 0)) + (while (< i (length str)) + (let ((char (aref str i))) + (if (and (>= char #xAC00) (<= char #xD7A3)) + ;; Hangul syllable + (let* ((code (- char #xAC00)) + (lead (/ code (* 21 28))) + (medial (/ (% code (* 21 28)) 28)) + (final (% code 28)) + (lead-jamo (+ #x1100 lead)) + (medial-jamo (+ #x1161 medial)) + (final-jamo (if (> final 0) (+ #x11A7 final) nil))) + (setq result + (concat result (char-to-string lead-jamo) + (char-to-string medial-jamo) + (if final-jamo (char-to-string final-jamo) "")))) + ;; Not a Hangul syllable + (setq result (concat result (char-to-string char))))) + (setq i (1+ i))) + result)) + +(defun hangul-convert-region-to-jamo (beg end) + (interactive "r") + (replace-region-contents + beg end (lambda () + (hangul-syllables-to-jamo (buffer-substring (point-min) + (point-max)))))) + +(defun hangul-convert-buffer-to-jamo () + (interactive) + (hangul-convert-region-to-jamo (point-min) (point-max))) + +(require 'dash) + +(defconst gf-hangul/choseong + (cl-loop for i from #x1100 to #x1112 collect i)) + +(defconst gf-hangul/jungseong + (cl-loop for i from #x1161 to #x1175 collect i)) + +(defconst gf-hangul/batchim + (cl-loop for i from #x11a8 to #x11c2 collect i)) + +(defun gf-hangul/make-pattern (name seq) + (format "'%s' : pattern Str = #(%s) ;" + name (->> seq + (--map (concat "\"" it "\"")) + (-interpose " | ") + (apply #'concat)))) + +(provide 'helpers)