From 804a103722aa7731ca7f2062ee2ebf533607e6aa Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Wed, 3 Oct 2012 00:11:08 -0400 Subject: v4: 4.0.0 new branch & version & changelog "opened" --- data/sisu/v4/conf/convert/modify.rb | 376 ++++++++++++++++++++++++++++++++++++ 1 file changed, 376 insertions(+) create mode 100644 data/sisu/v4/conf/convert/modify.rb (limited to 'data/sisu/v4/conf/convert/modify.rb') diff --git a/data/sisu/v4/conf/convert/modify.rb b/data/sisu/v4/conf/convert/modify.rb new file mode 100644 index 00000000..8a4b9074 --- /dev/null +++ b/data/sisu/v4/conf/convert/modify.rb @@ -0,0 +1,376 @@ +#!/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 _ -- cgit v1.2.3