//v0.1 - o9/2o14 //- initial //v0.1.1 //- support for automatic updates/scriptwizard //v0.2 //- new option "PATH", to choose items from any folder //- new option "SETENVVAR", the given env-var will contain item-paths //- new option "SETTABVAR", the given tab-var will contain item-paths //todo: //- filter in/exclude filetypes by extensions /////////////////////////////////////////////////////////////////////////////// function OnInit(data){ //uid added via script wizard (do not change after publishing this script) var uid = "18C9CF48-05DB-4B9F-B293-9F5D692C266A"; //resource center url added via script wizard (required for updating) var url = "http://resource.dopus.com/viewtopic.php?f=35&t=23142"; data.name = "Command.Generic: SelectRandom"; data.desc = "Randomly retrieve/select a (random) number of items."; data.copyright = "tbone"; data.version = "0.2"; data.default_enable = true; data.min_version = "11"; var cmd = data.AddCommand(); cmd.name = "SelectRandom" cmd.method = "Command_SelectRandom"; cmd.desc = data.desc; cmd.template = "PATH/K,SETTABVAR/K,SETENVVAR/K,FOLDERS/S,FILES/S,NODESELECT/S,RANDOM/S,SINGLEFOLDER/S,SINGLEFOLDERMINCOUNT/K,ITEMCOUNT/K,ITEMCOUNTPERC/K,ACTION/K,COMMANDS/R"; /////////////////////////////////////////////////////////////////////////// function ConfigHelper(data){ 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("DebugOutput", false). des("Enable debug output in the script console."); } /////////////////////////////////////////////////////////////////////////////// var COMMAND_ABORTED = true; var COMMAND_SUCCEEDED = false; /////////////////////////////////////////////////////////////////////////////// function Command_SelectRandom(data){ Debug("SelectRandom():"); var cmd = data.func.command; cmd.ClearFiles(); var params = { path : GetParameter(data, "PATH", null, false), setTabVar : GetParameter(data, "SETTABVAR", null, ""), setEnvVar : GetParameter(data, "SETENVVAR", null, ""), folders : GetParameter(data, "FOLDERS", null, false), files : GetParameter(data, "FILES", null, false), noDeselect : GetParameter(data, "NODESELECT", null, false), random : GetParameter(data, "RANDOM", null, false), singleFol : GetParameter(data, "SINGLEFOLDER", null, false), singleFolMin : GetParameter(data, "SINGLEFOLDERMINCOUNT", null, 1), action : GetParameter(data, "ACTION", null, ""), itemCount : GetParameter(data, "ITEMCOUNT", null, 1), itemCountPerc : GetParameter(data, "ITEMCOUNTPERC", null, -1), commands : GetParameter(data, "COMMANDS", null, "") } var folderContent = { all : data.func.sourcetab.all, files : data.func.sourcetab.files, dirs : data.func.sourcetab.dirs}; var selectMode = true; if (params.path){ if (!DOpus.FSUtil.Exists(params.path)) throw "Path ["+params.path+"] not found"; var fEnum = DOpus.FSUtil.ReadDir(params.path); if (fEnum.error!=0 && fEnum.error!=18 && fEnum.error!=2 ) //18 = empty folder, 2=drive root throw "ReadDir ["+folderpath+"] failed, fEnum.error ["+fEnum.error+"]"; folderContent = { all : DOpus.Create.Vector(), files : DOpus.Create.Vector(), dirs : DOpus.Create.Vector()}; while (!fEnum.complete) { var item=fEnum.next(); folderContent.all.push_back(item); if (item.is_dir) folderContent.dirs.push_back(item); else folderContent.files.push_back(item); } selectMode = false; } if (params.singleFol && (params.singleFolMin <= folderContent.dirs.count)){ params.random = false; params.itemCount = 1; params.itemCountPerc = -1; var items = folderContent.dirs; } else if (params.folders) var items = folderContent.dirs; else if (params.files) var items = folderContent.files; else var items = folderContent.all; if (items.count==0){ if (setTabVar) data.func.sourcetab.vars.Set(params.setTabVar, ""); if (setEnvVar) data.func.sourcetab.vars.Set(params.setEnvVar, ""); Debug(" No items, aborting"); return COMMAND_ABORTED; } if (params.itemCountPerc>0) params.itemCount = items.count*(params.itemCountPerc/100); if (params.itemCount > items.count) params.itemCount = items.count; var maxSelItems = params.itemCount; if (params.random) if (params.itemCount>1) var maxSelItems = Math.floor((Math.random()*params.itemCount)+1); else var maxSelItems = Math.floor((Math.random()*items.count)+1); PrintParams(params); Debug(" Choosing items.."); var randomsUsed = { "dummy":true }; for (var i=0;i maxLen) maxLen = param.length; for(param in params){ var pad = ""; while (pad.length+param.length