Another Ocaml script (although, I suppose it isn't a script, because I compile it). I really like to write in Ocaml, because it's a different kind of thought process.This one is just a little tool that I sometimes like to use, when I have to go through a file and change the name of some array or similar. Granted, this can be done automatically through many text editors, but sometimes it's a hassle to even open a file, especially if it's biggish.Besides, I found this bugger on my desktop today, in...
GPL comment generator
I have the problem of having to insert those comments into tons of files, especially, when I need to document a new project from scratch - inserting the little comment marks by hand is never fun. Technically, If I kept some older project I could skip this part and copy the comment from that earlier project, but I can never find it, or simply cannot be buggered. Therefore, this is a script which generates GPL comments, that are easy to insert into all sorts of code. Just run the AWK script with a...
Translate Properties
This is a tool for translating Java properties files, where there are sources in many languages. I needed to translate some of these properties at work, so I knocked up this script to help me out. And it was pretty useful. I will not go into the details of the code - you can check it out yourself if you're interested. It's pretty clean as code goes, although not so well commented as per usual.Also, beware, it's GPL-ed! The full text of the license is available at the GNU site.Anyway, the sources:1 #!/usr/bin/python2 # 3 # Copyright 2008 Konrad Siek 4 #5 # This program is free software: you can redistribute it and/or modify6 # it under the terms of the GNU General Public License as published by7 # the Free Software Foundation, either version 3 of the License, or8 # (at your option) any later version.9 #10 # This program is distributed in the hope that it will be useful,11 # but WITHOUT ANY WARRANTY; without even the implied warranty of12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13 # GNU General Public License for more details.14 #15 # You should have received a copy of the GNU General Public License16 # along with this program. If not, see <http://www.gnu.org/licenses/>.17 #18 19 import os.path;20 import getopt;21 import sys;22 23 sources = [];24 empty = ["", "*", None];25 startAt = 1;26 output = sys.stdout;27 sort = False;28 ignore = False;29 quiet = False;30 31 def addSource (source):32 if os.path.exists(source):33 sources.append(source);34 elif not quiet:35 sys.stderr.write("Source: '" + source + 36 "' does not exist. Skipping...\n");37 38 def setLine (line):39 global startAt;40 try:41 number = int(line);42 except ValueError:43 if not quiet:44 sys.stderr.write("Line value: " + line + 45 " is not a number. Ignoring...\n");46 return;47 if number <= 0:48 if not quiet:49 sys.stderr.write("Line value: " + line + 50 " must be greater than 0. Ignoring...\n");51 return;52 startAt = number;53 return startAt;54 55 def setOutput (path):56 """57 Sets the file, which will be used throughout the program to 58 write results. If this is not done, the module will write to59 sys.stdout instead.60 61 @param path: is the path to the file. 62 """63 global output;64 output = open(path, 'w'); 65 66 def setSort():67 global sort;68 sort = True;69 70 def setQuiet():71 global quiet;72 quiet = True;73 74 def setIgnore():75 global ignore;76 ignore = True;77 78 def printUsage ():79 """80 Print usage information for the script.81 """82 83 sys.stdout.write("Usage:\n");84 sys.stdout.write("\t"+ sys.argv[0]85 +" -s source [-s source ... ] "86 +"[-l line ] target\n");87 sys.stdout.write("\t"+ sys.argv[0] +" -h\n");88 sys.stdout.write("\t-s source\t\t"89 +"Select an output file to write to.\n");90 sys.stdout.write("\t-l line\t\t"91 +"Select a line in the target to start from.\n");92 sys.stdout.write("\t-o path\t\t"93 +"Output results to file, instead of stdout.\n");94 sys.stdout.write("\t-i \t\t\t"95 +"Ignore if all sources have no values "96 +"(or value of '*').\n");97 sys.stdout.write("\t-a \t\t\t"98 +"Sort results.\n");99 sys.stdout.write("\t-q \t\t\t"100 +"Quiet mode.\n");101 sys.stdout.write("\t-h \t\t\t"102 +"Show this message.\n");103 sys.stdout.write("");104 sys.exit(0);105 106def fileToList(path):107 file = open(path, 'r');108 lines = file.readlines();109 file.close(); 110 list = [];111 counter = 1;112 for line in lines:113 if (not line.startswith("#") and (len(line.strip())) > 0):114 line = line.rstrip("\n");115 key, separator, value = line.partition("="); 116 if value.find("=") >= 0:117 sys.stderr.write("Warning: value of line " 118 +str(counter) + " in " + path);119 sys.stderr.write(" contains an equals sign '=' (" 120 +line + ")\n");121 list.append((counter, key, value));122 counter += 1; 123 return list;124 125def loadSources():126 lists = {};127 for source in sources:128 lists[source] = fileToList(source);129 return lists;130131def popByKey(target, list):132 for i in range(0, len(list)):133 line, key, value = list[i];134 if key == target:135 del list[i];136 return line, key, value;137 return None, None, None;138139def dialog(property, sources):140 sys.stdout.write(property+"\n");141 for source, line, value in sources:142 sys.stdout.write("\t"+source+"\t("+str(line)+"): "143 +str(value)+"\n");144 sys.stdout.write("$("+property+"):"); 145 146def save(results):147 if sort:148 results.sort();149 150 printout(results);151 152def control(property, value, results):153 line = sys.stdin.readline().strip();154 if line == "=stop":155 save(results);156 exit(0);157 elif line == "=skip": 158 pass159 elif line == "": 160 results.append((property, value));161 pass162 else:163 results.append((property, line));164 165def printout(list):166 global output;167 for key, value in list:168 output.write(key+"="+value+"\n");169 170def outOfScope(target, list):171 for i in range(0, len(list)):172 line, key, value = list[i];173 if key == target:174 return (line < startAt);175 return False;176177def absent(occurances):178 for key, line, value in occurances:179 if empty.count(value.strip()) == 0:180 return False;181 return True;182 183def parse (target):184 sources = loadSources();185 workspace = fileToList(target);186 results = [];187 188 # Translate the lines, which were in the target 189 for line, key, value in workspace:190 if line < startAt:191 continue;192 occurances = [(target, line, value)]; 193 for s in sources:194 list = sources[s];195 l, k, v = popByKey(key, list);196 occurances.append((s, l, v));197 if ignore and absent(occurances):198 continue;199 dialog(key, occurances);200 control(key, value, results);201 202 # Translate the lines, which were in the sources, but not the target203 for source in sources:204 for line, key, value in sources[source]:205 if not outOfScope(key, workspace):206 occurances = [(target, line, value)]; 207 for s in sources:208 if source != s:209 list = sources[s];210 l, k, v = popByKey(key, list);211 occurances.append((s, l, v));212 dialog(key, occurances);213 control(key, results);214 215 save(results);216217def resolveOptions (optionHandling, argumentHandler):218 """219 Handles all the options and parameters for the script with the 220 provided functions. 221 222 @param optionHandling: a dictionary, translating an option string 223 to a function.Depending on whether the function is parameterless 224 or has one parameter the option string will be just a letter or a 225 letter ending in a colon.226 227 @param argumentHandler: a function used to handle all the arguments 228 - it takes one parameter.229 """230 231 string = "".join(["%s" % (i) for i in optionHandling.keys()]);232 options, arguments = getopt.getopt(sys.argv[1:], string);233 234 # Handle options.235 for key, value in options : 236 if value != '':237 optionHandling[key[1:]+":"](value);238 else:239 optionHandling[key[1:]]();240 241 # Handle arguments. 242 if len(arguments) > 0 :243 for argument in arguments:244 argumentHandler(argument);245246if __name__ == "__main__":247 options = {"s:": addSource, 248 "h": printUsage, 249 "l:": setLine, 250 "o:": setOutput,251 "a": setSort,252 "q": setQuiet, 253 "i": setIgnore} 254 255 resolveOptions(options, parse);The...
Inscription à :
Articles (Atom)