From faa44988e146fe047cb1bb685ed39af58fac969b Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Mon, 23 Oct 2006 22:02:04 +0000 Subject: [PATCH] Modify changelog generator script: combine adjacent lines of text into the same line and then break long lines of text into multiple lines. Subversion-branch: /tools Subversion-revision: 723 --- svnhistory | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/svnhistory b/svnhistory index dd0bdc8..0e24bab 100755 --- a/svnhistory +++ b/svnhistory @@ -7,11 +7,126 @@ class Change @description = "" end + # Combine multiple lines of text into long run-on lines. Empty + # lines of text denote paragraphs. Lines beginning with '*' + # are also recognised as bullet point lists. + + def combine_lines(input) + result = "" + + input.each_line do |s| + s = s.chomp + + if result.length > 0 && result[-1, 1] != "\n" + + # Don't do any of this if we just started a new line + + if s =~ /^\s*$/ + # empty line; make this break a paragraph. + result += "\n\n" + elsif s =~ /^\s*\*/ + # bullet point + result += "\n" + else + result += " " + end + end + + result += s + end + + result + end + + # Reformat the description and break into lines + + def break_lines(input) + result = "" + + input.each_line do |s| + + if s =~ /^\s*$/ + # empty line + result += "\n" + else + + # Amount to indent each line by so that they align + # with the initial bullet point (if this line is a + # bullet point) + + indent_length = if s =~ /^(\s*\*\s*)/ + $1.length + else + 0 + end + + # Split this line into words, then add them to nextline + # one at a time until it reaches a 70 character limit. + + nextline = s[0, indent_length] + s = s[indent_length, s.length] + + words = s.split(/\s+/) + + words.each do |word| + + # If the next word will run over the limit, break + # onto a new line. + + if nextline.length > indent_length \ + && nextline.length + word.length + 1 > 70 + + result += nextline + "\n" + nextline = " " * indent_length + end + + # Space to separate from the previous word, but only + # if this is not the start of a line + + if nextline.length > indent_length + if nextline[-1, 1] == "." + + # Two spaces after a period + + nextline += " " + end + nextline += " " + end + + nextline += word + end + + # Print the last "unfinished" line + + if nextline.length > indent_length + result += nextline + "\n" + end + end + end + + result + end + + def remove_trailing_newlines(s) + while s[-2, 2] == "\n\n" + s = s.chop + end + + s + end + def print_change puts "#{@time} #{@author}" - @description.each_line do |s| + puts "\t" + + munged = combine_lines(@description) + munged = break_lines(munged) + munged = remove_trailing_newlines(munged) + munged.each_line do |s| puts "\t" + s end + + puts end end