From: Christian Neukirchen Date: 2005-12-11T04:01:27+09:00 Subject: Re: LyX chapter lister Steve Litt writes: > Hi all, > > The script under my sig is a filter that takes a LyX file from stdin and spits > out the chapters. Right now it doesn't do parts, but it probably will later > on. Perhaps some day it will handle the whole hierchy of > Part/chapter/section/subsection/subsubsection/paragraph/subparagraph. > Consider this version public domain with no warranty. > > Steve Litt > http://www.troubleshooters.com > slitt@troubleshooters.com > > #!/usr/bin/ruby > > ### SLURP STDIN > lines = [] > while line = gets > lines.push(line.chomp) > end lines = STDIN.readlines > #### FIND CHAPTER NAMES > temp_lineno = -9999 > chapno = 0 > chapname = "" > in_chapter = false > lines.each do |line| # Alternatively, use ARGF.each { |line| > if line =~ /^\s*\\layout Chapter/ > in_chapter = true > chapname = "" > chapno += 1 > # puts "dia startchapter " + line + in_chapter.to_s > elsif in_chapter and line =~ /^\s*\\layout/ > printf("%2d: %s\n", chapno, chapname) if chapno > 0 > #puts "dia endchapter " + line > in_chapter = false > elsif in_chapter > chapname += (" " + line) unless line =~ /^\s*\\/ or line =~ /^\s*$/ elsif in_chapter && line =~ /^\s*(\\|$)/ chapname << " " << line end > end > end > printf("%2d: %s\n", chapno, chapname) if chapname and chapname != "" Also, I'd use puts and #{} instead of printf, but tastes vary. Your code would be a good example for the flip-flop operator (no religious wars, please): if (line =~ /^\s*\\layout Chapter/)..(line =~ /^\s*\\layout/) if line =~ /^\s*(\\|$)/ chapname << " " << line end end Happy hacking, -- Christian Neukirchen http://chneukirchen.org