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