// CustomtextColumn // By wowbagger // -------------------- Options var LogLevel = { Trace: 0, Debug: 1, Info: 2, Warning: 3, Error: 4 }; var gbUseLogging=false; var logLevel = LogLevel.Info; var scriptName = "RegExp Columns"; //Default values for extendedConfig var defaultCustomColumns = { columns: [{ //Column settings // Columns setting details https://www.gpsoft.com.au/help/opus12/index.html#!Documents/Scripting/ScriptColumn.htm name:"RegExp1", label:"RegExp1", header: "", type: "string", defwidth: "", //int or string. //grouporder:, //"Never Modified;Modified" justify: "left", //"left", "right", "center" or "path". The default is "left". //Not implemented yet infotiponly: false, //Not available for column //Not implemented yet maxstars: 5, // int datetimeformat: "yyyy-mm-dd", //Date Format used to parse the extracted date information (time not realy supported at the moment!) //Not implemented yet nogroup: false, grouporder: "", //enableAutoGroup: true,// true (default) //Not implemented yet sorting:"normal", //enableSort: false,//flag (true/false) as described in the DOpus documentation //defsort: true, //0 default, -1 reverse sort. //Regexp settings regexp: "(.*)", // Will select everyting inputItemProperty: "name_stem", // name_stem, realpath, name, ext, contents firstValid: false, //(true/false) output: "$1",// $1$2 //Not implemented yet filter: "all", // all, files, folders graphLowerColor: "", graphUpperColor: "", graphColorThreshhold: "" }] }; // Functions var doVars = DOpus.vars; var doLogCmd = DOpus.NewCommand; var configVarKey = "RegexpCustomColumnsConfig"; function OnInit(initData) { // Provide basic information about the script by initializing the properties of the ScriptInitData object initData.name = scriptName; initData.desc = "Adds columns and displays values matched by regexp against filename."; initData.copyright = "2017 wowbagger"; initData.min_version = "12.7.3" initData.version = "1.11 test"; initData.default_enable = true; // variable for enabling debug, so as to enable debug via a button initData.config_desc = DOpus.NewMap(); initData.config.DEBUG = true; initData.config_desc("DEBUG") = "Set DEBUG flag to true in order to enable logging messages to the Opus Output Window"; } function OnAddCommands(addCmdData) { var cmd = addCmdData.AddCommand(); cmd.name = "RegExpColumnsConfigure"; cmd.method = "OnRegExpColumnsConfigure"; cmd.desc = "Configure the RegExp columns"; cmd.label = "RegExpColumnsConfigure"; } function OnAddColumns(addColData) { //LogDebugMessage("OnAddColumns called", true) var customColumns = LoadCustomColumns(); if(customColumns && customColumns.columns.length > 0) { //var customColumns = JSON.parse(Script.config.CustomColumns); for(i=0;i 0) { var selectedColumn = columnsList.GetItemAt((index > 0) ? index -1 : 0); selectedColumn.selected = true; } } function AddToColumnsList(dlg, name, setSelected) { var columnsList = dlg.Control("columnsList"); var location = columnsList.AddItem(name); if(setSelected) { var item = columnsList.GetItemAt(location); item.selected = true; } } function GetSelectedItem(dlg, controlName) { LogTraceMessage("GetSelectedItem", controlName); var listItems = dlg.Control(controlName); for(var i = 0; i < listItems.count; ++i) { var column = listItems.GetItemAt(i); LogTraceMessage("GetSelectedItem" , controlName + " " + i + " of " + listItems.count + " is" + (column.selected ? "selected" : "not selected")); if(column && column.selected) { LogTraceMessage("GetSelectedItem", "found " + column.name); return column; } } } function SetSelectedItem(dlg, controlName, value) { var listItems = dlg.Control(controlName); if(typeof(value) == "undefined") { var item = listItems.GetItemAt(0); LogTraceMessage("SetSelectedItem: " + controlName + ":defaulted to " + item.name); item.selected = true; return; } for(var i = 0; i < listItems.count; ++i) { var item = listItems.GetItemAt(i); LogTraceMessage("SetSelectedItem", controlName + " " + i + " of " + listItems.count + " is " + item.name + " looking for " + value); if(item && item.name == value) { LogTraceMessage("SetSelectedItem", controlName + ":found " + item.name); item.selected = true; } } } function CopyToClipboard(){ var customColumns = LoadCustomColumns(); var config = JSON.stringify(customColumns, undefined, 2).replace(/(\n)+/g,"\r\n"); var doCmd = DOpus.NewCommand; var cmd = "Clipboard SET " + config; doCmd.RunCommand(cmd); } function SaveCustomColumns(customColumns){ var newList = new Array(); for(var i = 0; i < customColumns.columns.length; ++i) { if(customColumns.columns[i]) { newList.push(customColumns.columns[i]); } } customColumns.columns = newList; var config = JSON.stringify(customColumns, undefined, 2).replace(/(\n)+/g,"\r\n"); LogTraceMessage("SaveCustomColumns: " + config); doVars(configVarKey) = config; doVars(configVarKey).persist = true; Script.InitColumns; } function ClearCustomColumns(){ if(doVars.Exists(configVarKey)) { doVars(configVarKey).Delete() } } function LoadCustomColumns(){ LogTraceMessage("LoadCustomColumns", "from var"); //return JSON.parse(Script.config.CustomColumns); var config = doVars.Exists(configVarKey) ? JSON.parse(doVars.Get(configVarKey)) : null; if(!config) { config = defaultCustomColumns; } return config } function GetRegexpColumnConfig(name) { var customColumns = LoadCustomColumns(); for(var i = 0; i < customColumns.columns.length; ++i) { if(customColumns.columns[i].name.toLowerCase() == name.toLowerCase()) { return customColumns.columns[i]; } } } function IsDebugEnabled() { if(Script) return gbUseLogging || Script.config.DEBUG || doLogCmd.IsSet(Script.config.DebugEnableVar); return gbUseLogging; } function LogMessage(message, force) { if (force || IsDebugEnabled()) { DOpus.OutputString(message)}; } function LogDebugMessage(functionName, message, force) { LogMessage(functionName + ": " + "Error: " + message, force) } function LogWarningMessage(functionName, message, force) { if (LogLevel.Warning >= logLevel) { LogMessage(functionName + ": " + "Warning: " + message, force) } } function LogInfoMessage(functionName, message, force) { if (LogLevel.Info >= logLevel) { LogMessage(functionName + ": " + "Info: " + message, force) } } function LogDebugMessage(functionName, message, force) { if (LogLevel.Debug >= logLevel) { LogMessage(functionName + ": " + "Debug: " + message, force) } } function LogTraceMessage(functionName, message, force) { if (LogLevel.Trace >= logLevel) { LogMessage(functionName + ": " + "Trace: " + message, force) } } // Implement the OnCustomText column (this entry point is an OnScriptColumn event). function OnCustomText(scriptColData) { var itemPath = scriptColData.item.path + "\\" + scriptColData.item.name; LogInfoMessage("OnCustomText", "script primary target column='" + scriptColData.col + "' itempPath=" + scriptColData.item.name); // get column's config var customColumnsConfig = LoadCustomColumns(); var columnsConfig = customColumnsConfig.columns; LogDebugMessage("OnCustomText", "Total configured custom columns=" + columnsConfig.length); LogDebugMessage("OnCustomText", "Total requested columns (scriptColData.columns)=" + scriptColData.columns.length); //Log out the columns we were provided var colEnum = new Enumerator(scriptColData.columns); for (;!colEnum.atEnd(); colEnum.moveNext()){ var col = colEnum.item(); LogTraceMessage("OnCustomText", "scriptColData available script column='" + col); } var tabColEnum = new Enumerator(scriptColData.tab.format.columns); for (;!tabColEnum.atEnd(); tabColEnum.moveNext()){ var col = tabColEnum.item(); LogTraceMessage("OnCustomText", "scriptColData available tab column='" + col); } /* for(var i = 0; i < columnsConfig.length; ++i) { LogDebugMessage("OnCustomText: checking if column='" + columnsConfig[i].name + "' exists:" + scriptColData.columns.exists(columnsConfig[i].name)); if(!(scriptColData.columns.exists(columnsConfig[i].name))) { LogDebugMessage("OnCustomText: Removing column='" + columnsConfig[i].name + "'"); delete columnsConfig[i]; } } */ var columnsToCalculate = new Array(); //Remove columns from configuredColumns that we dont need to calculate. //Usefull if this is not the first call and columns value has lready been caculated. for(var i = 0; i < columnsConfig.length; ++i) { if(columnsConfig[i] != undefined) { LogTraceMessage("OnCustomText", i + ":" + columnsConfig[i].name + " Verify if should calculate column value"); if(scriptColData.columns.exists(columnsConfig[i].name) && InCollection(GetGlobalColumnName(columnsConfig[i].name), scriptColData.tab.format.columns)) { LogTraceMessage("OnCustomText", i + ":" +columnsConfig[i].name+" Calcualtion Required."); columnsToCalculate.push(columnsConfig[i]); } else { if(!scriptColData.columns.exists(columnsConfig[i].name)) { LogTraceMessage("OnCustomText", i + ":" +columnsConfig[i].name+" was not requested."); } if(!InCollection(GetGlobalColumnName(columnsConfig[i].name), scriptColData.tab.format.columns)) { LogTraceMessage("OnCustomText", i + ":" +columnsConfig[i].name+" is not displayed in tab."); } } } else { LogTraceMessage("OnCustomText", i + ": column is undefined"); } } LogInfoMessage("OnCustomText", "Calculation required for " + columnsToCalculate.length + " out of " +columnsConfig.length + " configured columns"); if (InArray(scriptColData.col, columnsToCalculate)) { var results = RunRegExpOnItem(scriptColData.Item, columnsToCalculate); if (results){ for ( i = 0; i < columnsToCalculate.length; i++) { if (typeof(columnsToCalculate[i].name) != "undefined") { var result = results[columnsToCalculate[i].name]; LogTraceMessage("OnCustomText", "checking if column='" + columnsToCalculate[i].name + "' exists:" + scriptColData.columns.exists(columnsToCalculate[i].name)); if (scriptColData.columns.exists(columnsToCalculate[i].name)) { switch (columnsToCalculate[i].type) { case "date" : case "time" : case "datetime" : LogTraceMessage("OnCustomText", "Datetime for " + columnsToCalculate[i].name + "[" + columnsToCalculate[i].type + "]:" + result); var parsedDate = parseDate(results[columnsToCalculate[i].name], columnsToCalculate[i].datetimeformat); scriptColData.columns(columnsToCalculate[i].name).value = parsedDate ? parsedDate.getVarDate() : null; break; case "graph" : case "graphrel" : case "graphrel0" : case "igraph" : case "igraphrel" : case "igraphrel0" : case "percent" : case "percentrel" : case "percentrel0" : case "stars" : LogTraceMessage("OnCustomText", "number for " + columnsToCalculate[i].name + "[" + columnsToCalculate[i].type +"]:" + result); scriptColData.columns(columnsToCalculate[i].name).value = (isNaN(result) ? 0 : result); break; default : LogTraceMessage("OnCustomText", "results for " + columnsToCalculate[i].name + "[" + columnsToCalculate[i].type +"]:" + result); scriptColData.columns(columnsToCalculate[i].name).value = result; break; } } else { LogTraceMessage("OnCustomText", "column not loaded " +columnsToCalculate[i].name + "["+columnsToCalculate[i].type +"]:" + result); } } } } } else { LogTraceMessage("OnCustomText", "Skipping Calculation as current column '" + scriptColData.col + "' does not require calculation."); } LogTraceMessage("OnCustomText", "Finished item=" + itemPath); } function RunRegExpOnItem(item, columnConfigurations) { LogTraceMessage("RunRegExpOnItem", "Calculating for item=" + item.path + "\\" + item.name); var results = {}; if(!item) return; for ( colIndex = 0; colIndex < columnConfigurations.length; colIndex++) { var currentCol = columnConfigurations[colIndex]; var fileContents; var subject; var regexMatch; switch (currentCol.inputItemProperty) { case "contents" : if(!item.is_dir) { try { if(!(fileContents)) { LogDebugMessage("RunRegExpOnItem", "loading file contents item=" + item.path + "\\" + item.name); var fso = new ActiveXObject("Scripting.FileSystemObject"); var fileStream = fso.openTextFile(item.path + "\\" + item.name); fileContents = fileStream.readAll(); fileStream.Close(); } } catch(ex) { LogWarningMessage("RunRegExpOnItem", "Failed reading text file item=" + item.path + "\\" + item.name); fileContents = "" } subject = fileContents; } else { subject = ""; } break; case "ext" : subject = item.ext; break; case "name" : subject = item.name; break; case "realpath" : subject = item.realpath; break; case "" : case "name_stem" : subject = item.name_stem; break; default: subject = findprop(item, currentCol.inputItemProperty); break; } var columnValue="" var re = new RegExp(currentCol.regexp); if(re.test(subject)) { if(currentCol.firstValid) { regexMatch = re.exec(subject); if (regexMatch != null) { for(i = 1; i < regexMatch.length + 1; i++) { if (regexMatch[i] != '') { columnValue = regexMatch[i]; break; } } } } else { var output = (currentCol.output == "") ? "$1" : currentCol.output; columnValue = subject.replace(re, output); } } LogDebugMessage("RunRegExpOnItem", colIndex + " '" + currentCol.name + "' target='" + currentCol.inputItemProperty + "' result='" + columnValue + "'"); results[currentCol.name] = columnValue; } return results; } function findprop(obj, path) { // thanks to andersonnnunes LogTraceMessage("findprop", "'" + path + "' on item=" + obj.path + "\\" + obj.name); var matched = false; var args = path.split('.'), i, l; for (i = 0, l = args.length; i < l; i++) { if (!obj[args[i]]){ break; matched = false; } obj = obj[args[i]]; matched = true; } if(!matched) return ""; try { return (typeof(obj) != "undefined") ? obj.toString() : ""; } catch(e) { return ""; } } function parseDate(input, format) { if(!input) return; var parsedDate = new Date(Date.parse(input)); if(!parsedDate || parsedDate == "NaN") { format = format || 'yyyy-mm-dd'; // default format var parts = input.match(/(\d+)/g), i = 0, fmt = {}; if(parts) { // extract date-part indexes from the format format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; }); parsedDate = new Date(parts[fmt['yyyy']], parts[fmt['mm']]-1, parts[fmt['dd']]); } } return (!parsedDate || parsedDate == "NaN") ? null : parsedDate; } function InArray(col,arr){ for (var i=0;i