//v0.1 - o5/2o15 //- initial //v0.1.1 - o5/2o15 //- unwanted output fixed //- padding error fixed /////////////////////////////////////////////////////////////////////////////// var template = //main features.. "NUMBER/O,"+ //number "REMOVENUM/S,"+ "FILEINFO/S,"+ "FROM/K,"+ "TO/K,"+ "PATTERN/K,"+ "BY/K[<1>],"+ "VARS/S["+ "{total} Total item count,"+ "{totalfiles} Total file count,"+ "{totaldirs} Total dir count,"+ "{totalsel} Selected item count,"+ "{totalselfiles} Selected file count,"+ "{totalseldirs} Selected dir count"+ "],"+ "PAD/O[,1,2,3,4,5],"+ "PADWITH/K,"+ //shared misc "NODESELECT/S,XLOG/O[off,xit,err,inf,warn,,trace,dump],PT/R"; /////////////////////////////////////////////////////////////////////////////// function OnInit(data){ //uid added via script wizard (do not change after publishing this script) var uid = "641228BF-DBE7-4C09-BE38-6B229EDCB3A3"; //resource center url added via script wizard (required for updating) var url = "http://resource.dopus.com/viewtopic.php?f=35&t=24543"; data.name = "Command.Generic: RenameEx"; data.log_prefix = "RenameEx"; data.desc = "Extended Rename command."; data.copyright = "tbone"; data.version = "0.1.1"; data.min_version = "11.5"; data.default_enable = true; var cmd = data.AddCommand(); cmd.name = "RenameEx"; cmd.method = "Command_RenameEx"; cmd.desc = data.desc; cmd.label = "RenameEx"; cmd.template = template; /////////////////////////////////////////////////////////////////////////// function ConfigHelper(data){ //v1.0 this.data=data; this.descriptions=null; this.last=null; this.add = function(name, val, description){ this.data.config[name]=val; this.last=[this.data.config[name],name]; if (description!=undefined) this.des(description); return this;} this.des = function(description){ if (!(description && DOpus.version.AtLeast("11.6.1"))) return this; if (!this.descriptions){ this.descriptions=DOpus.NewMap(); data.config._descriptions=this.descriptions; } this.descriptions(this.last[1])=description; return this;} this.val = function(val){ if (typeof this.last[0]=="object") this.last[0].push_back(val); else this.last[0]=val; return this;} }////////////////////////////////////////////////////////////////////////// var cfg = new ConfigHelper(data); cfg.add('XLog', DOpus.Create.Vector()). val(5).val("Disabled").val("Exception").val("Error").val("Warning").val("Info").val("Normal").val("Trace").val("Dump"). des('Console output level. The higher, the more output will be visible in the console window. '); } /////////////////////////////////////////////////////////////////////////////// var COMMAND_FAILURE = true; var COMMAND_USERABORT = true; var COMMAND_BADPARAMS = true; var COMMAND_SUCCESS = false; var gThis = this; /////////////////////////////////////////////////////////////////////////////// String.prototype.lTrim = function(chr){chr=chr||"\\s";return new String(this.replace(new RegExp("^"+chr+"*"),''));} String.prototype.rTrim = function(chr){chr=chr||"\\s";return new String(this.replace(new RegExp(chr+"*$"),''));} String.prototype.trim = function(chr){return this.lTrim(chr).rTrim(chr);} String.prototype.left = function(chrs){return this.substring(0,chrs);} String.prototype.right = function(chrs){return this.substring(this.length-chrs);} /////////////////////////////////////////////////////////////////////////////// function Command_RenameEx(data){ var args = ArgsMagic(data, null, template), result = null; //DumpObject(args); //return; if (args["XLOG"].exists) XLOG = args["XLOG"].value; else XLOG="normal"; Debug("CmdLine: " + data.cmdline,"D"); if (args["NODESELECT"].exists) data.func.command.deselect = false; if (0); else if (args["NUMBER"].exists) return RenameEx_NUMBER(data.func.command, data.func.sourcetab, args); if (result===null){ Debug("Bad/incomplete params.","X"); return COMMAND_BADPARAMS; } return result; } /////////////////////////////////////////////////////////////////////////////// function RenameEx_NUMBER(cmd, sourcetab, args){ Debug("RenameEx_NUMBER():","T",1); /////////////////////////////////////////////////////////////////////////// function Pad(value, padding, padStr){ var len = String(value).length; if (len > padding) return value; len = padding-len+1; return (padding?new Array(len).join(padStr)+value:value); } /////////////////////////////////////////////////////////////////////////// function ReplaceVars(str,vars,padding,padWith){ return ""+ str.replace('{total}', Pad(vars.total, padding, padWith)). replace('{totalfiles}', Pad(vars.totalfiles, padding, padWith)). replace('{totaldirs}', Pad(vars.totaldirs, padding, padWith)). replace('{totalsel}', Pad(vars.totalsel, padding, padWith)). replace('{totalselfiles}', Pad(vars.totalselfiles, padding, padWith)). replace('{totalseldirs}', Pad(vars.totalseldirs, padding, padWith)); } /////////////////////////////////////////////////////////////////////////// var vars = { total : sourcetab.all.count, totalfiles : sourcetab.files.count, totaldirs : sourcetab.dirs.count, totalsel : sourcetab.selected.count, totalselfiles : sourcetab.selected_files.count, totalseldirs : sourcetab.selected_dirs.count } /////////////////////////////////////////////////////////////////////////// var padding = args["PAD"].exists ?args["PAD"].value :"0"; var padWith = args["PADWITH"].exists ?args["PADWITH"].value :"0"; var to = args["TO"].exists ?args["TO"].value :"{stem} {num}{ext}"; var pattern = args["PATTERN"].exists ?args["PATTERN"].value: "(.*?)((?:[^A-z0-9]*|\\s*)?\\D?\\d+.*?)?($|\\..*)"; padding = ((""+padding).toLowerCase()=="auto"?(""+vars.totalsel).length:padding)*1; //remove native NUMBER switch from commandline, as it makes the rename //malfunction if no numbering shall take place (just adding {total..} e.g.) if (to.indexOf("{num}")==-1){ args["NUMBER"].exists = false; args["NUMBER"].value = ""; } Debug("NUMBER : " + args["NUMBER"].value,"D"); Debug("PATTERN: " + pattern,"D"); Debug("FROM : " + args["FROM"].value,"D"); Debug("TO : " + to,"D"); Debug("PAD : " + padding,"D"); var cmdline = 'Rename PATTERN="'+pattern+'" '+ ('TO="'+ReplaceVars(to, vars, padding, padWith)+'" '). replace('{stem}','\\1'+(!args["REMOVENUM"].exists?'\\2':'')). replace('{num}','[#'+padding+']'). replace('{ext}','\\3')+ 'REGEXP'+ (args["NUMBER"].exists && args["NUMBER"].value==""?' NUMBER':'')+ (args["NUMBER"].exists && args["NUMBER"].value!=""?' NUMBER="'+args["NUMBER"].value+'"':'')+ (args["FILEINFO"].exists?' FILEINFO':'')+ (args["FROM"].exists?' FROM="'+args["FROM"].value+'"':'')+ (args["BY"].exists?' BY="'+args["BY"].value+'"':'')+ (args["PT"].exists?' '+args["PT"].value:''); Debug("Cmdline: " + cmdline,"D"); cmd.RunCommand(cmdline); Debug("-","T",-1); return COMMAND_SUCCESS; } /////////////////////////////////////////////////////////////////////////////// function ArgsMagic(data, jsonData, template){ this.version = 0.42; /////////////////////////////////////////////////////////////////////////// function Arg(name, type, exists, value, subOpsTemplate){ this.name = name; this.exists = exists; this.type = type; this.value = value; this.options = []; if (!this.exists) return; switch (type){ case "switch":; case "numeric":; case "multiple": return;} if (this.type=="optional" && this.value===true) this.value=""; var op,ops=this.value!=""?new String(this.value).split(","):null, match; if (ops && ops.length) for(op in ops) { var opName = ops[op].replace('"',''); var opValue = true, parts = opName.split("="); opName = parts[0].trim("<").trim(">"); if (parts.length>1) opValue = parts.slice(1).join(""); this.options[opName] = opValue; } if (!(!this.value && subOpsTemplate)) return; if (!(match = subOpsTemplate.match(/\<(.+?)\>/))) return; this.options[match[1]] = true; this.value = match[1]; } /////////////////////////////////////////////////////////////////////////// var types = {s:"switch",k:"keyword",o:"optional",n:"numeric",m:"multiple",r:"raw"}; var names = template.replace(/\/(.)\,/g,"/$1;").replace(/\]\,/g,"];").split(";"), args = []; for(arg in names) { var parts = names[arg].split("/"); var name=parts[0].toUpperCase(), subOpsTemplate=null; var parts2 = parts[1].split("["); var type=parts2[0].toLowerCase(); if (parts2.length>1) subOpsTemplate = parts2[1].substring(0,parts2[1].length-1); var exists=(data&&data.func.args.got_arg[name])||(jsonData&&(jsonData[name]!=undefined))||false; var value = (data && data.func.args[name]) || (jsonData && jsonData[name]) || undefined; args.push( args[name] = new Arg(name, types[type], exists, value, subOpsTemplate )); } /////////////////////////////////////////////////////////////////////////// args.Get = function( argName, configName, noneValue){ var arg = this[argName = argName.toUpperCase()]; if (!arg) throw new Error(0, "Unknown parameter ["+argName+"]"); if (arg.exists) return arg.value; //DOpus.Output("argName: " + argName); //DOpus.Output("configName: " + configName); if (!configName) return noneValue; if (typeof Script.config[configName] == "string") return new String(""+Script.config[configName]); return Script.config[configName]; } return args; } /////////////////////////////////////////////////////////////////////////////// function Debug(text,level,indent){ //v0.22 //DOpus.Output(text+","+level+","+indent); var levels={o:0,x:1,e:2,w:3,i:4,n:5,t:6,d:7}, indis=["","X","E","W","I","","",""]; try{ if (XLOG!==undefined && XLOG.paused===undefined){ XLOG={paused:false,indent:0,level:(XLOG===true?5:levels[XLOG.substring(0,1)])};} }catch(e){ XLOG={paused:false,indent:0,level:0}; try{var lsc=(""+Script.Config.XLog);}catch(e){var lsc="o";} if (!XLOG.level && lsc) XLOG.level=lsc===true?5:levels[lsc.substring(0,1)];} level=level==undefined?5:levels[level.substring(0,1).toLowerCase()]; if (!(level && XLOG.level && !XLOG.paused && (level<=XLOG.level))) return; var pad = XLOG.indent==0?"":new Array(XLOG.indent+1).join(" "); indent = ((indent!==undefined) && indent) || 0; XLOG.indent += indent; if (XLOG.indent<0) throw new Error("Indent subzero"); if (indis[level]){if(!pad)pad=" ";else pad=pad.substring(1);} pad = indis[level]+pad; if (text!="-") DOpus.Output(pad+text,(level==1||level==2)?true:false); } /////////////////////////////////////////////////////////////////////////////// function OnAboutScript(data){ //v0.1 var cmd = DOpus.Create.Command(); if (!cmd.Commandlist('s').exists("ScriptWizard")){ if (DOpus.Dlg.Request("The 'ScriptWizard' add-in has not been found.\n\n"+ "Install 'ScriptWizard' from [resource.dopus.com].\nThe add-in enables this dialog and also offers "+ "easy updating of scripts and many more.","Yes, take me there!|Cancel", "No About.. ", data.window)) cmd.RunCommand('http://resource.dopus.com/viewtopic.php?f=35&t=23179');} else cmd.RunCommand('ScriptWizard ABOUT WIN='+data.window+' FILE="'+Script.File+'"'); } //MD5 = "3dd7327eba487174b48d0b3cb7f7591e"; DATE = "2015.05.24 - 02:43:55"