class MathML::LaTeX::Macro
Public Class Methods
new()
click to toggle source
# File lib/math_ml/latex.rb 185 def initialize 186 @commands = Hash.new 187 @environments = Hash.new 188 end
Public Instance Methods
check_parameter_numbers(src, opt, whole)
click to toggle source
# File lib/math_ml/latex.rb 228 def check_parameter_numbers(src, opt, whole) 229 s = Scanner.new(src) 230 until s.eos? 231 case 232 when s.scan(/#{MBEC}*?\#(\d+|.)/) 233 raise parse_error("Need positive number.") unless s[1]=~/\d+/ 234 raise parse_error("Parameter \# too large.", s[1]+s.rest, whole) if s[1].to_i>opt 235 else 236 return nil 237 end 238 end 239 end
commands(com)
click to toggle source
# File lib/math_ml/latex.rb 300 def commands(com) 301 @commands[com] 302 end
environments(env)
click to toggle source
# File lib/math_ml/latex.rb 316 def environments(env) 317 @environments[env] 318 end
expand_command(com, params, opt=nil)
click to toggle source
# File lib/math_ml/latex.rb 304 def expand_command(com, params, opt=nil) 305 return nil unless @commands.has_key?(com) 306 c = @commands[com] 307 opt = c.option if c.option && !opt 308 params.unshift(opt) if c.option 309 raise ParseError.new("Need more parameter.") if params.size < c.num 310 311 c.body.gsub(/(#{MBEC}*?)\#(\d+)/) do 312 $1.to_s << params[$2.to_i-1] 313 end 314 end
expand_environment(env, body, params, opt=nil)
click to toggle source
# File lib/math_ml/latex.rb 320 def expand_environment(env, body, params, opt=nil) 321 return nil unless @environments.has_key?(env) 322 e = @environments[env] 323 opt = e.option if e.option && !opt 324 params.unshift(opt) if e.option 325 raise ParseError.new("Need more parameter.") if params.size < e.num 326 327 bg = e.beginning.gsub(/(#{MBEC}*?)\#(\d+)/) do 328 $1.to_s << params[$2.to_i-1] 329 end 330 331 en = e.ending.gsub(/(#{MBEC}*?)\#(\d+)/) do 332 $1.to_s << params[$2.to_i-1] 333 end 334 335 " #{bg} #{body} #{en} " 336 end
parse(src)
click to toggle source
# File lib/math_ml/latex.rb 197 def parse(src) 198 @scanner = Scanner.new(src) 199 until @scanner.eos? 200 unless @scanner.scan_command 201 @scanner.scan_space 202 raise parse_error("Syntax error.") 203 end 204 case @scanner[1] 205 when "newcommand" 206 parse_newcommand 207 when "newenvironment" 208 parse_newenvironment 209 else 210 raise parse_error("Syntax error.", @scanner.matched) 211 end 212 end 213 rescue BlockNotClosed => e 214 raise parse_error("Block not closed.") 215 rescue OptionNotClosed => e 216 raise parse_error("Option not closed.") 217 end
parse_error(message, rest="", whole=nil)
click to toggle source
# File lib/math_ml/latex.rb 190 def parse_error(message, rest="", whole=nil) 191 rest = whole[/\A.*?(#{Regexp.escape(rest)}.*\z)/, 1] if whole 192 rest << @scanner.rest 193 done = @scanner.string[0, @scanner.string.size-rest.size] 194 ParseError.new(message, rest, done) 195 end
parse_newcommand()
click to toggle source
# File lib/math_ml/latex.rb 241 def parse_newcommand 242 case 243 when @scanner.scan_block 244 s = Scanner.new(@scanner[1]) 245 raise parse_error("Need newcommand.", s.rest+"}") unless s.scan_command 246 com = s[1] 247 raise parse_error("Syntax error." ,s.rest+"}") unless s.eos? 248 when @scanner.scan_command 249 s = Scanner.new(@scanner[1]) 250 com = s.scan_command 251 else 252 raise parse_error("Need newcommand.") 253 end 254 255 optnum = scan_num_of_parameter 256 opt = @scanner.scan_option ? @scanner[1] : nil 257 258 case 259 when @scanner.scan_block 260 body = @scanner[1] 261 when @scanner.scan_command 262 body = @scanner.matched 263 else 264 body = @scanner.scan(/./) 265 end 266 267 raise parse_error("Need parameter.") unless body 268 269 check_parameter_numbers(body, optnum, @scanner.matched) 270 271 optnum-=1 if opt 272 @commands[com] = Command.new(optnum, body, opt) 273 end
parse_newenvironment()
click to toggle source
# File lib/math_ml/latex.rb 275 def parse_newenvironment 276 case 277 when @scanner.scan_block 278 env = @scanner[1] 279 when @scanner.scan_command 280 raise ParseError.new 281 when @scanner.scan(/./) 282 env = @scanner.matched 283 end 284 raise parse_error("Syntax error.", env[/\A.*?(\\.*\z)/, 1], @scanner.matched) if env=~/\\/ 285 286 optnum = scan_num_of_parameter 287 opt = @scanner.scan_option ? @scanner[1] : nil 288 289 b = @scanner.scan_block ? @scanner[1] : @scanner.scan_any 290 raise parse_error("Need begin block.") unless b 291 check_parameter_numbers(b, optnum, @scanner.matched) 292 e = @scanner.scan_block ? @scanner[1] : @scanner.scan_any 293 raise parse_error("Need end block.") unless e 294 check_parameter_numbers(e, optnum, @scanner.matched) 295 296 optnum -= 1 if opt 297 @environments[env] = Environment.new(optnum, b, e, opt) 298 end
scan_num_of_parameter()
click to toggle source
# File lib/math_ml/latex.rb 219 def scan_num_of_parameter 220 if @scanner.scan_option 221 raise parse_error("Need positive number.", @scanner[1]+"]") unless @scanner[1]=~/\A#{RE::SPACE}*\d+#{RE::SPACE}*\z/ 222 @scanner[1].to_i 223 else 224 0 225 end 226 end