#!/usr/bin/env ruby # encoding: utf-8 =begin * Name: modify.rb * Description: A conversion script for canned substitutions, a fairly generic simple tool that can be used to store other canned conversions, (used here for altering SiSU markup or the SiSU program) * Author: Ralph Amissah * Copyright: (C) 1997 - 2012, Ralph Amissah, All Rights Reserved. * License: GPL 3 or later: * Packaged with: SiSU a framework for document structuring, publishing & search Copyright (C) Ralph Amissah This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . If you have Internet connection, the latest version of the GPL should be available at these locations: * Hompages: * Download: * Ralph Amissah =end module SiSU_Modify class Operations def initialize(cf,files) @cf,@files=cf,files @description="This is a script that contains canned text conversions for reuse" pwd=Dir.pwd @mod_inst='modify_instructions.rb' @modify_instructions_script="#{pwd}/#{@mod_inst}" if FileTest.file?(@modify_instructions_script) ==true puts <<-WOK autoload script: "#{@modify_instructions_script}" used by "ruby #{__FILE__} --convert" if "Extracted.new.modify.modules_and_classes" is used (see "matches_and_replaces") EDIT this file manually [to rebuild run: "ruby #{__FILE__} --build-gsub"] WOK else puts <<-WOK autoload script does not exist: "#{@modify_instructions_script}" needed for "ruby #{__FILE__} --convert" if "Extracted.new.modify.modules_and_classes" is used (see "matches_and_replaces") try run: "ruby #{__FILE__} --build-gsub" WOK end autoload :Extracted, "./#{@mod_inst}" end def matches_and_replaces #edit manually [ #Extracted.new.modify.modules_and_classes, #Extracted.new.modify.modules, #Extracted.new.modify.classes, #modify.dates, #modify.modules, #modify.classes, #modify.misc, ] end def message(text) response='' while response !~/yes/ print %{ #{text} To continue type "yes" [to exit type "no" or "quit"]: } response=File.new('/dev/tty').gets.strip exit if response =~/^(?:quit|no)$/ end end def help print < 0 @files.each do |i| @new,@matched,@empty1,@empty2=true,false,false,false file=File.open(i,'r') cont=file.readlines file.close @file=File.new(i,'w') cont.each do |t| matches_and_replaces.each do |match_and_replace| match_and_replace.each do |m,r| if t =~m p m.to_s + ' -> ' + r puts "in: #{t}" t=t.gsub(m,r) if m and r puts "out: #{t}" end end end if t=~/^\s*$/; @empty1=true else @empty1=false end @file.puts t unless (@empty1==true and @empty2==true) if t=~/^\s*$/; @empty2=true else @empty2=false end end @file.close end end end def report_modules_and_classes @f=nil @structure={} @arr={mod: [], cl: []} @files.each do |f| @new,@matched,@empty1,@empty2=true,false,false,false file=File.open(f,'r') cont=file.readlines file.close cont.each do |t| if f != @f @f=f @mod=nil #puts "---\n#{@f}" @structure[@f]={} end if t =~/^\s*module\s+\S+/ @mod=t.match(/^\s*module\s+(\S+)/)[1] #puts ' ' + @mod @arr[:mod] << @mod @structure[@f].store(@mod,[]) #@structure[@f] = {@mod => []} end if t =~/^\s*class\s+\S+/ cl=t.match(/^\s*class\s+(\S+)/)[1] #puts ' ' + cl @arr[:cl] << cl @structure[@f][@mod] << cl end end end @structure.sort.each do |fl,modules| puts "---\n" + fl modules.sort.each do |mod,classes| puts ' ' + mod classes.sort.each do |cl| puts ' ' + cl end end end puts '---' puts 'number of modules: ' + @arr[:mod].length.to_s + ', unique: ' + @arr[:mod].uniq.length.to_s puts 'number of classes: ' + @arr[:cl].length.to_s + ', unique: ' + @arr[:cl].uniq.length.to_s end def build_search_and_replace_method_for_modules_and_classes @f=nil @structure={} @arr={mod: [], cl: []} @files.each do |f| @new,@matched,@empty1,@empty2=true,false,false,false file=File.open(f,'r') cont=file.readlines file.close cont.each do |t| if f != @f @f=f @mod=nil #puts "---\n#{@f}" @structure[@f]={} end if t =~/^\s*module\s+\S+/ @mod=t.match(/^\s*module\s+(\S+)/)[1] #puts ' ' + @mod @arr[:mod] << @mod @structure[@f].store(@mod,[]) #@structure[@f] = {@mod => []} end if t =~/^\s*class\s+\S+/ cl=t.match(/^\s*class\s+(\S+)/)[1] #puts ' ' + cl @arr[:cl] << cl @structure[@f][@mod] << cl end end end puts 'number of modules: ' + @arr[:mod].length.to_s + ', unique: ' + @arr[:mod].uniq.length.to_s puts 'number of classes: ' + @arr[:cl].length.to_s + ', unique: ' + @arr[:cl].uniq.length.to_s method_modules_and_classes=[] method_modules_and_classes <<<<-WOK #module SiSU_MC class Extracted def modify WOK #% modules_and_classes method_modules_and_classes <<<<-WOK def modules_and_classes [ WOK @structure.sort.each do |fl,modules| method_modules_and_classes << ' '*8 + "##% -- " + fl modules.sort.each do |mod,classes| method_modules_and_classes << ' '*8 + '# ' + "[/#{mod}/," + ' '*(67 - mod.length) + "'#{mod}']," classes.uniq.sort.each do |cl| method_modules_and_classes << ' '*8 + '# ' + "[/#{cl}/," + ' '*(65 - cl.length) + "'#{cl}']," end end end method_modules_and_classes <<<<-WOK ] end WOK #% modules method_modules_and_classes <<<<-WOK def modules [ WOK method_modules_and_classes << ' '*8 + '# ' + 'number of modules: ' + @arr[:mod].length.to_s + ', unique: ' + @arr[:mod].uniq.length.to_s @arr[:mod].uniq.sort.each do |mod| method_modules_and_classes << ' '*8 + '# ' + "[/#{mod}/," + ' '*(67 - mod.length) + "'#{mod}']," end method_modules_and_classes <<<<-WOK ] end WOK #% classes method_modules_and_classes <<<<-WOK def classes [ WOK method_modules_and_classes << ' '*8 + '# ' + 'number of classes: ' + @arr[:cl].length.to_s + ', unique: ' + @arr[:cl].uniq.length.to_s @arr[:cl].uniq.sort.each do |cl| method_modules_and_classes << ' '*8 + '# ' + "[/#{cl}/," + ' '*(67 - cl.length) + "'#{cl}']," end method_modules_and_classes <<<<-WOK ] end WOK method_modules_and_classes <<<<-WOK self end end #end WOK #method_modules_and_classes.each{|x| puts x} if FileTest.file?(@modify_instructions_script) ==true message("WARNING << #{@mod_inst} >> exists (and may have been edited). The existing << #{@mod_inst} >> will be overwritten if you proceed.") end instructs=File.new(@modify_instructions_script,'w') method_modules_and_classes.each do |x| puts x instructs.puts x end instructs.close end def action if @files and @files.length > 0 p @files mr=nil #%% changes to make m match, r replace --------------------------> if @cf =~/--help/; help else case @cf when /--convert/; convert when /--report/; report_modules_and_classes when /--build-gsub/; build_search_and_replace_method_for_modules_and_classes else help end #act end else puts "this routine makes permanent changes to the contents of the files matched, as instructed within [no matches]" end end end end #% files to match for this conversion set -------------------------> f=$* #; p $* cf=f[0].to_s f.shift match_and_replace=Array.new unless f.length > 0 f=if cf == '--report' \ or cf == '--build-gsub' Dir.glob("[a-zA-Z]*.rb") #restrict to ruby files else Dir.glob("[a-zA-Z]*") end f=f.sort.delete_if { |x| x == __FILE__ or x == 'modify_instructions.rb' } end SiSU_Modify::Operations.new(cf,f).action __END__ #f=Dir.glob("{bin,conf,data,lib}/**/*.rb") #sisu development #f=Dir.glob("[^_]/**/*") #all files subdirectories beneath pwd except those starting with _