# Improv distribution assessment # Currently only for files # Ignores tags!!! The assessment could be above real value. CSON = require 'cson' glob = require('glob-fs')({ builtins: false }) # params # Точки старта start = [ "description" "loctitle" ] # end params template = (phrase) -> if phrase == undefined or phrase == '' return [] [openBracket, closeBracket] = [phrase.indexOf('['), phrase.indexOf(']')] if openBracket == -1 return phrase if closeBracket == -1 throw new Error("Missing close bracket in phrase: #{phrase}") before = phrase.slice(0, openBracket) after = phrase.slice(closeBracket + 1) directive = phrase.substring(openBracket + 1, closeBracket) return [directive, after] parseGroup = (group) -> groups = [] occurence = {} for phrase in group.phrases nexttpl = null templates = [] while nexttpl != undefined [nexttpl, after] = template (phrase) if nexttpl != undefined templates.push(nexttpl) phrase = after for tpl in templates directive = tpl.slice(0, 1) grp = tpl.substring(1, tpl.length) if groups.indexOf(grp) == -1 groups.push grp if directive == ':' occurence[grp] ?= 0 occurence[grp] += 1 for filename, value of occurence distribution[filename] ?= 1 distribution[filename] *= value/group.phrases.length for filename in groups if spec[filename]? for groupdata in spec[filename].groups parseGroup(groupdata) filedir = './game/procgen/*' languages = glob.readdirSync(filedir) for language in languages console.log language console.log '---------------' files = glob.readdirSync(language+'/*.cson') # unset first element, it's current folder files.shift() spec = {} for file in files data = CSON.parseCSONFile(file) if not data.groups? data.groups = [] if data.phrases? data.groups.push({ tags: [], phrases: data.phrases }) delete data.phrases key = file.substr(0, file.lastIndexOf('.')) || file key = key.replace(filedir, '') spec[key] = data for startPoint in start start_file = language+'/'+startPoint distribution = {} if spec[start_file]? for group in spec[start_file].groups parseGroup(group) for filename, value of distribution distribution[filename] = Math.round(value * 1000) / 1000 console.log startPoint console.log distribution