Steve Litt <slitt / earthlink.net> 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  <chneukirchen / gmail.com>  http://chneukirchen.org