summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luatexja/src/ltj-compat.lua
blob: c8e046c63da8940e79bdc50691fc03f3b593ccae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
--
-- ltj-compat.lua
--

luatexja.load_module('base');   local ltjb = luatexja.base
luatexja.load_module('stack');  local ltjs = luatexja.stack
local stack_table_index = luatexja.stack_table_index

-- load jisx0208 table
local cache_ver = 3

local cache_outdate_fn = function (t) return t.version~=cache_ver end
local jisx0208 = ltjb.load_cache('ltj-jisx0208',cache_outdate_fn)
if not jisx0208 then -- make cache
   jisx0208 = require('ltj-jisx0208.lua')
   ltjb.save_cache_luc('ltj-jisx0208', jisx0208)
end


-- \kuten, \jis, \euc, \sjis, \ucs, \kansuji
local utfchar=utf.char
local function to_kansuji(num)
   if not num then num=0; return
   elseif num<0 then
      num = -num; tex.write('-')
   end
   local s = ""
   while num~=0 do
      s = utfchar(
	 ltjs.get_stack_table(luatexja.stack_table_index.KSJ + num%10,
				'', tex.getcount('ltj@@stack'))) .. s
      num=math.floor(num/10)
   end
   tex.write(s)
end

-- \ucs: 単なる identity
local function from_ucs(i)
   if type(i)~='number' then
      ltjb.package_error('luatexja',
			 "invalid character code (".. tostring(i) .. ")",
			 "I'm going to use 0 instead of that illegal character code.")
      i=0
   end
   tex.write(i)
end

-- \kuten: 面区点 (それぞれで16進2桁を使用)=> Unicode 符号位置
local function from_kuten(i)
   if type(i)~='number' then
      ltjb.package_error('luatexja',
			 "invalid character code (".. tostring(i) .. ")",
			 "I'm going to use 0 instead of that illegal character code.")
      i=0
   end
   if (i%256==0)or(i%256>94) then
     tex.write('0')
   else 
     tex.write(tostring(jisx0208.table_jisx0208_uptex[math.floor(i/256)*94+(i%256)-94] or 0))
   end
end

-- \euc: EUC-JP による符号位置 => Unicode 符号位置
local function from_euc(i)
   if type(i)~='number' then
      ltjb.package_error('luatexja',
			 "invalid character code (".. tostring(i) .. ")",
			 "I'm going to use 0 instead of that illegal character code.")
      i=0
   elseif i>=0x10000 or i<0xa0a0 then
      i=0
   end
   from_kuten(i-0xa0a0)
end

-- \jis: ISO-2022-JP による符号位置 => Unicode 符号位置
local function from_jis(i)
   if (type(i)~='number') or i>=0x10000 or i<0 then
      ltjb.package_error('luatexja',
			 "invalid character code (".. tostring(i) .. ")",
			 "I'm going to use 0 instead of that illegal character code.")
      i=0
   end
   from_kuten(i-0x2020)
end

-- \sjis: Shift_JIS による符号位置 => Unicode 符号位置
local function from_sjis(i)
   if (type(i)~='number') or i>=0x10000 or i<0 then
      ltjb.package_error('luatexja',
			 "invalid character code (".. tostring(i) .. ")",
			 "I'm going to use 0 instead of that illegal character code.")
      tex.write('0'); return
   end
   local c2 = math.floor(i/256)
   local c1 = i%256
   local shift_jisx0213_s1a3_table = {
      { [false]= 1, [true]= 8},
      { [false]= 3, [true]= 4},
      { [false]= 5, [true]=12},
      { [false]=13, [true]=14},
      { [false]=15 } }
   if c2 >= 0x81 then
      if c2 >= 0xF0 then -- this if block won't be true
	 if (c2 <= 0xF3 or (c2 == 0xF4 and c1 < 0x9F)) then
	    c2 = 0x100 + shift_jisx0213_s1a3_table[c2 - 0xF0 + 1][(0x9E < c1)];
	 else -- 78<=k<=94
	    c2 = c2 * 2 - 413 + 0x100; if 0x9E < c1 then c2=c2+1 end
	 end
     else
	if c2<=0x9f then i=0x101 else i=0x181 end
	c2 = c2 + c2 - i; if 0x9E < c1 then c2=c2+1 end
     end
     if c1 < 0x9F then
	if c1>0x7f then i=0x40 else i=0x3f end
	c1 = c1 - i
     else
	c1 = c1 - 0x9e
     end
     from_kuten(c2*256+c1)
  end
end

luatexja.binary_pars.kansujichar = function(c, t)
   if type(c)~='number' or c<0 or c>9 then
      ltjb.package_error('luatexja',
			 'Invalid KANSUJI number (' .. tostring(c) .. ')',
			 'A KANSUJI number should be in the range 0..9.\n'..
			    'So I changed this one to zero.')
      c=0
   end
   return ltjs.get_stack_table(stack_table_index.KSJ + c, 0, t)
end


local t = {
   from_euc   = from_euc,
   from_kuten = from_kuten,
   from_jis   = from_jis,
   from_sjis  = from_sjis,
   from_ucs   = from_ucs,
   to_kansuji = to_kansuji,
}
luatexja.compat = t