Function: lao-transcribe-single-roman-syllable-to-lao
lao-transcribe-single-roman-syllable-to-lao is an autoloaded and
byte-compiled function defined in lao-util.el.gz.
Signature
(lao-transcribe-single-roman-syllable-to-lao FROM TO &optional STR)
Documentation
Transcribe a Romanized Lao syllable in the region FROM and TO to Lao string.
Only the first syllable is transcribed. The value has the form: (START END LAO-STRING), where START and END are the beginning and end positions of the Roman Lao syllable, LAO-STRING is the Lao character transcription of it.
Optional 3rd arg STR, if non-nil, is a string to search for Roman Lao syllable. In that case, FROM and TO are indexes to STR.
Source Code
;; Defined in /usr/src/emacs/lisp/language/lao-util.el.gz
;;;###autoload
(defun lao-transcribe-single-roman-syllable-to-lao (from to &optional str)
"Transcribe a Romanized Lao syllable in the region FROM and TO to Lao string.
Only the first syllable is transcribed.
The value has the form: (START END LAO-STRING), where
START and END are the beginning and end positions of the Roman Lao syllable,
LAO-STRING is the Lao character transcription of it.
Optional 3rd arg STR, if non-nil, is a string to search for Roman Lao
syllable. In that case, FROM and TO are indexes to STR."
(if str
(if (setq from (string-match lao-transcription-pattern str from))
(progn
(if (>= from to)
(setq from nil)
(setq to (match-end 0)))))
(save-excursion
(goto-char from)
(if (setq to (re-search-forward lao-transcription-pattern to t))
(setq from (match-beginning 0))
(setq from nil))))
(if from
(let* ((consonant (match-string 1 str))
(semivowel (match-string 3 str))
(vowel (match-string 5 str))
(maa-sakod (match-string 8 str))
(tone (match-string 9 str))
lao-consonant lao-semivowel lao-vowel lao-maa-sakod lao-tone
clen cidx)
(setq to (match-end 0))
(if (not consonant)
(setq str (cdr (assoc (match-string 0 str)
lao-transcription-punctuation-alist)))
(setq lao-consonant
(cdr (assoc consonant lao-transcription-consonant-alist)))
(if (vectorp lao-consonant)
(setq lao-consonant (aref lao-consonant 0)))
(setq clen (length lao-consonant))
(if semivowel
;; Include semivowel in STR.
(setq lao-semivowel
(cdr (assoc semivowel lao-transcription-semi-vowel-alist))
str (if (= clen 1)
(concat lao-consonant lao-semivowel)
(concat (substring lao-consonant 0 1) lao-semivowel
(substring lao-consonant 1))))
(setq str lao-consonant))
(if vowel
(let (rule)
(setq lao-vowel
(cdr (assoc vowel lao-transcription-vowel-alist)))
(if (vectorp lao-vowel)
(setq lao-vowel (aref lao-vowel 0)))
(setq rule (assoc lao-vowel lao-vowel-reordering-rule))
(if (null maa-sakod)
(setq rule (nth 1 rule))
(setq lao-maa-sakod
(cdr (assoc maa-sakod lao-transcription-maa-sakod-alist))
rule
(or (cdr (assq (aref lao-maa-sakod 0) (nthcdr 2 rule)))
(nth 2 rule)
(nth 1 rule))))
(or rule
(error "Lao vowel %S has no re-ordering rule" lao-vowel))
(setq lao-consonant str str "")
(while rule
(if (= (car rule) 0)
(setq str (concat str lao-consonant)
cidx (length str))
(setq str (concat str (list (car rule)))))
(setq rule (cdr rule)))
(or cidx
(error "Lao vowel %S has malformed re-ordering rule" vowel))
;; Set CIDX to after upper or lower vowel if any.
(let ((len (length str)))
(while (and (< cidx len)
(memq (get-char-code-property (aref str cidx)
'phonetic-type)
'(vowel-lower vowel-upper)))
(setq cidx (1+ cidx))))
(if lao-maa-sakod
(setq str (concat str lao-maa-sakod)))
(if tone
(setq lao-tone
(cdr (assoc tone lao-transcription-tone-alist))
str (concat (substring str 0 cidx) lao-tone
(substring str cidx)))))))
(list from to (lao-compose-string str)))))