1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
# module : base/merge
# copyright : PRAGMA Advanced Document Engineering
# version : 2006
# author : Hans Hagen
#
# project : ConTeXt / eXaMpLe
# concept : Hans Hagen
# info : j.hagen@xs4all.nl
# www : www.pragma-ade.com
# --selfmerg ewill create stand alone script (--selfcleanup does the opposite)
# this module will package all the used modules in the file itself
# so that we can relocate the file at wish, usage:
#
# merge:
#
# unless SelfMerge::ok? && SelfMerge::merge then
# puts("merging should happen on the path were the base inserts reside")
# end
#
# cleanup:
#
# unless SelfMerge::cleanup then
# puts("merging should happen on the path were the base inserts reside")
# end
module SelfMerge
@@kpsemergestart = "\# kpse_merge_start"
@@kpsemergestop = "\# kpse_merge_stop"
@@kpsemergefile = "\# kpse_merge_file: "
@@kpsemergedone = "\# kpse_merge_done: "
@@filename = File.basename($0)
@@ownpath = File.expand_path(File.dirname($0))
@@modroot = '(base|graphics|rslb|www)' # needed in regex in order not to mess up SelfMerge
@@modules = $".collect do |file| File.expand_path(file) end
@@modules.delete_if do |file|
file !~ /^#{@@ownpath}\/#{@@modroot}.*$/i
end
def SelfMerge::ok?
begin
@@modules.each do |file|
return false unless FileTest.file?(file)
end
rescue
return false
else
return true
end
end
def SelfMerge::merge
begin
if SelfMerge::ok? && rbfile = IO.read(@@filename) then
begin
inserts = "#{@@kpsemergestart}\n\n"
@@modules.each do |file|
inserts << "#{@@kpsemergefile}'#{file}'\n\n"
inserts << IO.read(file).gsub(/^#.*?\n$/,'')
inserts << "\n\n"
end
inserts << "#{@@kpsemergestop}\n\n"
# no gsub! else we end up in SelfMerge
rbfile.sub!(/#{@@kpsemergestart}\s*#{@@kpsemergestop}/moi) do
inserts
end
rbfile.gsub!(/^(.*)(require [\"\'].*?#{@@modroot}.*)$/) do
pre, post = $1, $2
if pre =~ /#{@@kpsemergedone}/ then
"#{pre}#{post}"
else
"#{pre}#{@@kpsemergedone}#{post}"
end
end
rescue
return false
else
begin
File.open(@@filename,'w') do |f|
f << rbfile
end
rescue
return false
end
end
end
rescue
return false
else
return true
end
end
def SelfMerge::cleanup
begin
if rbfile = IO.read(@@filename) then
begin
rbfile.sub!(/#{@@kpsemergestart}(.*)#{@@kpsemergestop}\s*/moi) do
"#{@@kpsemergestart}\n\n#{@@kpsemergestop}\n\n"
end
rbfile.gsub!(/^(.*#{@@kpsemergedone}.*)$/) do
str = $1
if str =~ /require [\"\']/ then
str.gsub(/#{@@kpsemergedone}/, '')
else
str
end
end
rescue
return false
else
begin
File.open(@@filename,'w') do |f|
f << rbfile
end
rescue
return false
end
end
end
rescue
return false
else
return true
end
end
def SelfMerge::replace
if SelfMerge::ok? then
SelfMerge::cleanup
SelfMerge::merge
end
end
end
|