OSDN Git Service

transformation of kana seq. into LuaTeX-ja itself.
[luatex-ja/luatexja.git] / src / ltj-inputbuf.lua
index 4f7c875..7f39b9b 100644 (file)
@@ -1,45 +1,90 @@
 --
--- luatexja/inputbuf.lua
+-- ltj-inputbuf.lua
 --
-luatexbase.provides_module({
-  name = 'luatexja.inputbuf',
-  date = '2011/04/01',
-  version = '0.1',
-  description = 'Supressing a space by newline after Japanese characters',
-})
-module('luatexja.inputbuf', package.seeall)
-local err, warn, info, log = luatexbase.errwarinf(_NAME)
 
-luatexja.load_module('charrange'); local ltjc = luatexja.charrange
+luatexja.load_module 'base';      local ltjb = luatexja.base
+luatexja.load_module 'charrange'; local ltjc = luatexja.charrange
 
+local utflen = utf.len
+local utfbyte = utf.byte
+local utfchar = utf.char
 local node_new = node.new
-local id_glyph = node.id('glyph')
+local node_free = node.free
+local id_glyph = node.id 'glyph'
+local getcatcode, getcount = tex.getcatcode, tex.getcount
+local ltjc_is_japanese_char_curlist = ltjc.is_japanese_char_curlist
+
+local substituter
+do
+    local uchar = utf.char
+    local cd, cp = uchar(0x3099), uchar(0x309A)
+    substituter = (utf.substituter or utf.subtituter)      -- typo in lualibs?
+    {
+      ['ウ'..cd] = 'ヴ', ['う'..cd] = uchar(0x30F4),
+      ['か'..cd] = 'が', ['カ'..cd] = 'ガ',
+      ['き'..cd] = 'ぎ', ['キ'..cd] = 'ギ',
+      ['く'..cd] = 'ぐ', ['ク'..cd] = 'グ',
+      ['け'..cd] = 'げ', ['ケ'..cd] = 'ゲ',
+      ['こ'..cd] = 'ご', ['コ'..cd] = 'ゴ',
+      --
+      ['さ'..cd] = 'ざ', ['サ'..cd] = 'ザ',
+      ['し'..cd] = 'じ', ['シ'..cd] = 'ジ',
+      ['す'..cd] = 'ず', ['ス'..cd] = 'ズ',
+      ['せ'..cd] = 'ぜ', ['セ'..cd] = 'ゼ',
+      ['そ'..cd] = 'ぞ', ['ソ'..cd] = 'ゾ',
+      --
+      ['た'..cd] = 'だ', ['タ'..cd] = 'ダ',
+      ['ち'..cd] = 'ぢ', ['チ'..cd] = 'ヂ',
+      ['つ'..cd] = 'づ', ['ツ'..cd] = 'ヅ',
+      ['て'..cd] = 'で', ['テ'..cd] = 'デ',
+      ['と'..cd] = 'ど', ['ト'..cd] = 'ド',
+      --
+      ['は'..cd] = 'ば', ['ハ'..cd] = 'バ', ['は'..cp] = 'ぱ', ['ハ'..cp] = 'パ',
+      ['ひ'..cd] = 'び', ['ヒ'..cd] = 'ビ', ['ひ'..cp] = 'ぴ', ['ヒ'..cp] = 'ピ',
+      ['ふ'..cd] = 'ぶ', ['フ'..cd] = 'ブ', ['ふ'..cp] = 'ぷ', ['フ'..cp] = 'プ',
+      ['へ'..cd] = 'べ', ['ヘ'..cd] = 'ベ', ['へ'..cp] = 'ぺ', ['ヘ'..cp] = 'ペ',
+      ['ほ'..cd] = 'ぼ', ['ホ'..cd] = 'ボ', ['ほ'..cp] = 'ぽ', ['ホ'..cp] = 'ポ',
+      --
+      ['ゝ'..cd] = 'ゞ', ['ヽ'..cd] = 'ヾ',
+      ['ワ'..cd] = uchar(0x30F7), ['ヰ'..cd] = uchar(0x30F8),
+      ['ヱ'..cd] = uchar(0x30F9), ['ヲ'..cd] = uchar(0x30FA),
+    }
+end
 
 --- the following function is modified from jafontspec.lua (by K. Maeda).
 --- Instead of "%", we use U+FFFFF for suppressing spaces.
-function add_comment(buffer)
-   local i = utf.len(buffer)
-   while (i>0) and (tex.getcatcode(utf.byte(buffer, i))==1 
-                or tex.getcatcode(utf.byte(buffer, i))==2) do
-      i=i-1
+--DEBUG require"socket"
+local time_line = 0
+local start_time_measure, stop_time_measure
+   = ltjb.start_time_measure, ltjb.stop_time_measure
+local function add_comment(buffer)
+   start_time_measure 'inputbuf'; buffer = substituter(buffer)
+   local i = utflen(buffer)
+   local c = utfbyte(buffer, i)
+   while (i>0) and (getcatcode(c)==1 or getcatcode(c)==2) do
+      i=i-1; if (i>0) then c = utfbyte(buffer, i) end;
    end
    if i>0 then
-      local c = utf.byte(buffer, i)
-      local ct = tex.getcatcode(c)
-      local ctl = tex.getcatcode(13) -- endline character
-      if ((ct==11) or (ct==12)) and (ctl==5) then
-        local p =  node_new(id_glyph)
-        p.char = c
-        if ltjc.is_ucs_in_japanese_char(p) then
-           buffer = buffer .. string.char(0xF3,0xBF,0xBF,0xBF) -- U+FFFFF
-        end
-        node.free(p)
+      if c>=0x80 then
+         local te = tex.endlinechar
+         -- Is the catcode of endline character is 5 (end-of-line)?
+         if (te ~= -1) and (getcatcode(te)==5) then
+            local ct = getcatcode(c)
+            if (ct==11) or (ct==12) then
+               local lec = getcount 'ltjlineendcomment'
+               -- Is the catcode of \ltjlineendcomment (new comment char) is 14 (comment)?
+               if ltjc_is_japanese_char_curlist(c) and (getcatcode(lec)==14) then
+                  stop_time_measure 'inputbuf'; return buffer .. utfchar(lec)
+               end
+            end
+         end
       end
    end
+   stop_time_measure 'inputbuf'
    return buffer
 end
 
-luatexbase.add_to_callback('process_input_buffer', 
+luatexbase.add_to_callback('process_input_buffer',
    add_comment,'ltj.process_input_buffer')
 
---EOF
\ No newline at end of file
+--EOF