korean.rb.patch

Jun NAITOH, 2011-03-21 04:12

Download (3.29 KB)

View differences:

vendor/plugins/rfpdf/lib/rfpdf/korean.rb 2011-03-19 01:45:17.000000000 -0400
116 116
  		MBMultiCell(w,h,txt,border,align,fill)
117 117
  	else
118 118
  		super(w,h,txt,border,align,fill)
119
    end
119
  	end  
120 120
  end
121 121

  
122 122
  def MBMultiCell(w,h,txt,border=0,align='L',fill=0)
123
  	#Multi-byte version of MultiCell()
123
  	#Multi-byte version of MultiCell() for UTF-8
124
  	#Output text with automatic or explicit line breaks
124 125
  	cw=@CurrentFont['cw']
125 126
  	if(w==0)
126 127
  		w=@w-@rMargin-@x
127
    end
128
  	end  
128 129
  	wmax=(w-2*@cMargin)*1000/@FontSize
129 130
  	s=txt.gsub("\r",'')
130 131
  	nb=s.length
131 132
  	if(nb>0 and s[nb-1]=="\n")
132 133
  		nb-=1
133
    end
134
  	end  
134 135
  	b=0
135 136
  	if(border)
136 137
  		if(border==1)
......
139 140
  			b2='LR'
140 141
  		else
141 142
  			b2=''
142
  			if(border.to_s.index('L').nil?)
143
  			if(border.to_s.index('L'))
143 144
  				b2+='L'
144
        end
145
  			if(border.to_s.index('R').nil?)
145
  			end
146
  			if(border.to_s.index('R'))
146 147
  				b2+='R'
147
        end
148
  			b=border.to_s.index('T').nil? ? b2+'T' : b2
148
  			end
149
  			b=border.to_s.index('T') ? b2+'T' : b2
149 150
  		end
150 151
  	end
151 152
  	sep=-1
152 153
  	i=0
153 154
  	j=0
154
  	l=0
155
  	l=0    # Automatic line break counter
155 156
  	nl=1
156 157
  	while(i<nb)
157
  		#Get next character
158
  		c=s[i]
159
  		#Check if ASCII or MB
160
  		ascii=(c<128)
161
  		if(c=="\n")
162
  			#Explicit line break
158
  		case s[i]
159
  		when 0x00 .. 0x09, 0x0b .. 0x7f	# UTF-8 1byte ASCII
160
  			ascii=true
161
	  		n=1
162
  			l+=cw[s[i].chr] || 0
163
  			if(s[i].chr==' ')
164
  				sep=i
165
  			end
166
  		when 0x0a	# Explicit line break "\n"
163 167
  			Cell(w,h,s[j,i-j],b,2,align,fill)
164 168
  			i+=1
165 169
  			sep=-1
......
168 172
  			nl+=1
169 173
  			if(border and nl==2)
170 174
  				b=b2
171
        end
175
  			end
172 176
  			next
173
  		end
174
  		if(!ascii)
177
  		when 0xc0 .. 0xdf	# UTF-8 2byte
178
  			n=2
179
  			l+=500
175 180
  			sep=i
176
  			ls=l
177
  		elsif(c==' ')
181
  		when 0xe0 .. 0xee	# UTF-8 3byte
182
  			n=3
183
  			l+=1000		# Full-width character
178 184
  			sep=i
179
  			ls=l
185
  		when 0xef		# UTF-8 3byte
186
  			n=3
187
  			if((s[i+1]==0xbd and (s[i+2]>=0xa1 and s[i+2]<=0xbf)) or (s[i+1]==0xbe and(s[i+2]>=0x80 and s[i+2]<=0x9f)))
188
  				l+=500	# Half-width katakana (UTF-8: EFBDA1 - EFBDBF, EFBE80 - EFBE9F)
189
  			else
190
  				l+=1000	# Full-width character
191
  			end
192
  			sep=i
193
  		when 0xf0 .. 0xf7	# UTF-8 4byte
194
  			n=4
195
  			l+=1000
196
  			sep=i
197
  		when 0xf8 .. 0xfb	# UTF-8 5byte
198
  			n=5
199
  			l+=1000
200
  			sep=i
201
  		when 0xfc .. 0xfd	# UTF-8 6byte
202
  			n=6
203
  			l+=1000
204
  			sep=i
205
  		else
206
	  		i+=1
207
  			next
180 208
  		end
181
  		l+=(ascii ? cw[c.chr] : 1000) || 0
209

  
182 210
  		if(l>wmax)
183 211
  			#Automatic line break
184 212
  			if(sep==-1 or i==j)
185 213
  				if(i==j)
186
  					i+=ascii ? 1 : 2
187
          end
214
  					i+=n
215
  				end
188 216
  				Cell(w,h,s[j,i-j],b,2,align,fill)
189 217
  			else
190 218
  				Cell(w,h,s[j,sep-j],b,2,align,fill)
......
196 224
  			nl+=1
197 225
  			if(border and nl==2)
198 226
  				b=b2
199
        end
227
  			end
200 228
  		else
201
  			i+=ascii ? 1 : 2
202
      end
229
  			i+=n
230
  			if(!ascii)
231
  				sep=i
232
  			end
233
  		end
203 234
  	end
204 235
  	#Last chunk
205 236
  	if(border and not border.to_s.index('B').nil?)
206 237
  		b+='B'
207
    end
238
  	end  
208 239
  	Cell(w,h,s[j,i-j],b,2,align,fill)
209 240
  	@x=@lMargin
210 241
  end