{"version":3,"sources":["jsdelivr-header.js","/npm/scalra-wpa@0.0.4/modules/WPA.js"],"names":[],"mappings":"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","file":"/npm/scalra-wpa@0.0.4/modules/WPA.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/scalra-wpa@0.0.4/modules/WPA.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n\tWPA module - a module to perform Word Population Analysis (WPA)\n\t\n\thistory:\n\t\t2016-08-08\t\tinitial version started to convert Ruby version to JavaScript\n\t\t2017-09-05\t\tconvert into a scalra module\n\t\n*/\n\nvar l_name = 'WPA';\nvar kruskal = require('node-kruskal');\n\n// module object\nvar l_module = exports.module = {};\n\nvar l_freq_table = SR.State.get('FreqTable');\n\nvar distance_matrix = require(\"./distance_matrix.js\");\n//read .docx file url: https://www.npmjs.com/package/textract\nvar textract = require('textract');\n// \n// helper functions\n//\n\nvar getBridgingEdge = function (edges, authors) {\n\t\n\tvar count = 0;\n\tfor (var i=0; i < edges.length; i++) {\n\t\tvar edge = edges[i];\n\t\tif (authors[edge[0]] !== authors[edge[1]]) {\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn count;\n}\n\n//\n// exports\n//\n\n// group a list of input to closest groups\nexports.group = function (input, onDone) {\n\t\n\t// extract parameters\n\tvar para = input.para;\n\t\n\tvar results = [];\n\tfor (var i in input.data) {\n\t\tresults.push(input.data[i] + ' group');\n\t}\n\t\n\tonDone(null, results);\n}\n\n// NOTE: this could be accessed as: SR.Module['WPA'].analyze\n/*\nexample input:\n\tvar input = {\n\t\tnames:\t\t'string',\t\t\t\t// array of data labels (ex. filenames)\n\t\tdata: \t\t[string],\t\t\t\t// array of raw data (with puntuation marks)\n\t\tauthors:\t[string],\t\t\t\t// array of author names\n\t\twords: \t\t'number',\t\t\t\t// ex. 2\n\t\tR_CUT: \t\t'number',\t\t\t\t// ex. 70\n\t\tstat_scope: 'string',\t\t\t\t// ['R_cut', 'Full']\n\t\tset_type: \t'string',\t\t\t\t// when compare two articles, which word set to use: ['union', 'intersection']\n\t\twrite_freq_table:\t'boolean',\t\t// whether to output frequency table to file\n\t\twrite_raw:\t'boolean'\t\t\t\t// whether to output raw data to file\n\t};\n*/\nvar readPathFile = function (index, paths, dataAr, onDone) {\n\tvar path = paths[index];//\n\t//20171026-by Nicht\n\tvar l_lastName = \"\";\n\tl_lastName = path.slice((path.lastIndexOf(\".\") - 1 >>> 0) + 2);\n\t//LOG.warn('====================l_lastName = ', l_lastName);\n\t//--------------------------\n\tif(l_lastName == 'docx') {\n\t\ttextract.fromFileWithPath(path, function( error, text ) {\n\t\t\tdataAr[index] = text;\n\t\t\tif(++index < paths.length) {\n\t\t\t\treadPathFile(index, paths, dataAr, onDone);\n\t\t\t} else {\n\t\t\t\tonDone(dataAr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t//LOG.warn('====================txt path = ', path);\n\t\t/*\n\t\tdataAr[index] = SR.fs.readFileSync(path);\n\t\tif(++index < paths.length) {\n\t\t\treadPathFile(index, paths, dataAr, onDone);\n\t\t} else {\n\t\t\tonDone(dataAr);\n\t\t}\n\t\t*/\n\t\tSR.API.IS_UTF8({\n\t\t\tpath:\t\t\tpath,\n\t\t\treturn_data:\ttrue\n\t\t}, function (err, result) {\n\t\t\tif (err) {\n\t\t\t\treturn onDone(err); \n\t\t\t}\n\t\t\tvar is_utf8 = result.is_utf8;\n\t\t\tvar data = result.data;\n\t\t\tdataAr[index] = data;\n\t\t\tif(++index < paths.length) {\n\t\t\t\treadPathFile(index, paths, dataAr, onDone);\n\t\t\t} else {\n\t\t\t\tonDone(dataAr);\n\t\t\t}\n\t\t});\t\t\t\n\t}\n}\n\nexports.analyze = function (input, onDone) {\n\t// check if raw data exist or we need to read from file\n\tif (!input.data && input.file_paths instanceof Array) {\n\t\tLOG.warn('file_paths provided, read from files..', l_name);\n\t\t\n\t\tvar file_paths = input.file_paths;\n\t\tdelete input.file_paths;\n\n\t\t/*拆出去變成readPathFile()\n\t\tfor (var i=0; i < file_paths.length; i++) {\n\t\t\tvar path = file_paths[i];\n\t\t\t//20171026-by Nicht\n\t\t\tvar l_lastName = \"\";\n\t\t\tl_lastName = path.slice((path.lastIndexOf(\".\") - 1 >>> 0) + 2);\n\t\t\t//--------------------------\n\t\t\tif(l_lastName == 'docx') {\n\t\t\t\ttextract.fromFileWithPath(path, function( error, text ) {\n\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdata[i] = SR.fs.readFileSync(path);\n\t\t\t}\n\t\t}\n\t\tinput.data = data;\t\t\n\t\t*/\n\t\tvar data = [];\n\t\tvar l_index = 0;\n\t\treadPathFile(l_index, file_paths, data, function (result) {\n\t\t\tinput.data = result;\n\t\t\tanalyzeCount(input, onDone);\n\t\t});\n\t} else {\n\t\tanalyzeCount(input, onDone);\n\t}\n}\n\nvar analyzeCount = function (input, onDone) {\n\tif (input.data instanceof Array === false ||\n\t\tinput.names instanceof Array === false ||\n\t\tinput.data.length !== input.names.length) {\n\t\tvar errmsg = 'input parameter not consistent';\n\t\tLOG.error(errmsg, l_name);\n\t\treturn onDone(errmsg);\n\t}\n\n\t// TOFIX: need to 'new' every time?\n\tvar analyzer = new distance_matrix();\n\tanalyzer.generate(input, function (err, result) {\n\n\t\tif (err) {\n\t\t\tLOG.warn('generate有error');\n\t\t\treturn onDone(err);\t\n\t\t}\n\t\t//LOG.warn('WPA analysis result:', l_name);\n\t\t//LOG.warn(result, l_name);\n\n\t\t// convert result into table\n\t\tvar table = {\n\t\t\trowLabel: [],\n\t\t\tcolumnLabel: [],\n\t\t\tvalue: [],\n\t\t\tname: []\n\t\t};\n\n\t\tfor (var i = 0; i < result.length; i++) {\n\n\t\t\t// keep until the 7th digit\n\t\t\tif (typeof(table.value[result[i].i]) === \"undefined\") {\n\t\t\t\ttable.value[result[i].i] = [];\n\t\t\t\ttable.value[result[i].i][result[i].j] = Math.round((result[i].value * Math.pow(10, 7))) / Math.pow(10, 7);\n\t\t\t\ttable.name[result[i].i] = result[i].source;\n\t\t\t} else {\n\t\t\t\ttable.value[result[i].i][result[i].j] = Math.round((result[i].value * Math.pow(10, 7))) / Math.pow(10, 7);\n\t\t\t}\n\t\t\tif (typeof(table.value[result[i].j]) === \"undefined\") {\n\t\t\t\ttable.value[result[i].j] = [];\n\t\t\t\ttable.value[result[i].j][result[i].i] = Math.round((result[i].value * Math.pow(10, 7))) / Math.pow(10, 7);\n\t\t\t\ttable.name[result[i].j] = result[i].target;\n\t\t\t} else {\n\t\t\t\ttable.value[result[i].j][result[i].i] = Math.round((result[i].value * Math.pow(10, 7))) / Math.pow(10, 7);\n\t\t\t}\n\t\t}\n\t\t// console.log(table.value);\n\t\t// set diagnoal line (distance to self) all to 0\n\t\tfor (var i = 0; i < table.value.length; i++) {\n\t\t\ttable.value[i][i] = 0;\n\t\t\ttable.rowLabel[i] = i + 1;\n\t\t\ttable.columnLabel[i] = i + 1;\n\t\t}\n\t\t// calculate MST\n\t\tvar mst = get_mst(table.value);\n\t\t// kruskal.kruskalMST(table.value, function (mst) {\n\t\t\t//LOG.warn('MST:', l_name);\n\t\t\t//LOG.warn(mst, l_name);\n\n\t\t\t// calculate Bridging Edges (E_bridge) based on edge and author list\n\t\t\tvar E_bridge = getBridgingEdge(mst.mstArray, input.authors);\n\n\t\t\t// copy out frequency table\n\t\t\tvar freq_table = {};\n\n\t\t\tfor (var i = 0; i < input.names.length; i++) {\n\t\t\t\tfreq_table[input.names[i]] = l_freq_table[input.names[i]];\n\t\t\t}\n\n\t\t\tvar output = {table: table, MST: mst, E_bridge: E_bridge, freq: freq_table};\n\t\t\t//LOG.warn(output, l_name);\n\n\t\t\tLOG.warn('words: ' + input.words + ' R_cut: ' + input.R_CUT + ' Bridging Edges: ' + E_bridge, l_name);\n\n\t\t\tonDone(null, output);\t\t\t\n\t\t// });\n\t});\n}\nfunction get_mst(d) {\n\tvar edage = [];\n\tfor (var i = 0 ; i < d.length ; i++) \n\t\tfor (var j = i+1 ; j < d.length ; j++) \n\t\t\tedage.push({a: i, b: j, distance: d[i][j]});\n\tedage.sort(function (a, b) {\n\t\treturn a.distance > b.distance ? 1 : -1;\n\t});\n\tvar use = [];\n\tvar result = [];\n\tvar sum = 0;\n\tfor (var i in edage) \n\t\tif (use.indexOf(edage[i].a) === -1 || use.indexOf(edage[i].b) === -1) {\n\t\t\tresult.push([edage[i].a, edage[i].b, edage[i].distance]);\n\t\t\tsum += edage[i].distance;\n\t\t\tif (use.indexOf(edage[i].a) === -1)\n\t\t\t\tuse.push(edage[i].a)\n\t\t\tif (use.indexOf(edage[i].b) === -1)\n\t\t\t\tuse.push(edage[i].b)\n\t\t}\n\treturn {mst: sum, mstArray: result};\n}\n// module init\nl_module.start = function (config, onDone) {\n\tLOG.warn('WPA module started...', l_name);\n\t// ensure directory exists\n\tUTIL.validatePath(SR.path.resolve(SR.Settings.PROJECT_PATH, 'output'));\n\tUTIL.safeCall(onDone);\n}\n\n// module shutdown\nl_module.stop = function (onDone) {\n\tUTIL.safeCall(onDone);\n}\n\n// register this module\nSR.Module.add('WPA', l_module);\n\nSR.Callback.onStart(function () {\n})\n"]}