-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathtextgrid.min.js
More file actions
5 lines (4 loc) · 4.56 KB
/
textgrid.min.js
File metadata and controls
5 lines (4 loc) · 4.56 KB
1
2
3
4
5
/*! textgrid - v2.2.0 - 2025-10-17
* https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS
* Copyright (c) 2025 OpenSourceFieldLinguistics Contribs; Licensed Apache 2.0 */
!function(e){"use strict";function p(e){for(var t,n,i={},r=0;r<e.length;r++)t=(n=e[r].split(" = "))[0].trim().replace(/ /g,"_"),n=n[1].trim().replace(/"/g,""),i[t]=n;return i}var t={init:function(){return"init"}};t.textgridToJSON=function(e,t){for(var n,i,r,s,a,l,m=e.split("\n"),o={items:[]},f=null,x="Unknown",g=[];0<m.length;)(l=m.shift())?0!==l.search(/ /)&&0!==l.search(/\t/)?2===(s=l.split(" = ")).length&&(n=s[0].trim().replace(/ /g,"_"),i=s[1].trim().replace(/"/g,""),o[n]=i,"File_name"===n&&(x=i+"",console.log(" Found a file name "+x),g.push(x))):-1!==l.search(/\[[\0-9]+\]/)?"item"===(a=(s=l.split("["))[0].trim())?(console.log(" Found an item for "+x),f&&(f.fileName=x,o.items.push(f)),f={}):"points"===a?(r=p([m.shift(),m.shift()]),f[a]=f[a]||[],f[a].push(r)):"intervals"===a&&(r=p([m.shift(),m.shift(),m.shift()]),f[a]=f[a]||[],f[a].push(r)):2===(s=l.split(" = ")).length&&(n=s[0].trim().replace(/ /g,"_"),i=s[1].trim().replace(/"/g,""),-1<n.indexOf(":_size")&&(n=n.replace(":_","_"),i=parseInt(i,10)),f[n]=i):(l=m.shift())||(f&&(f.fileName=x,o.items.push(f)),f=null,x="Unknown",console.log("Reset filename if there is are two empty lines"));return f&&(f.fileName=x,o.items.push(f)),o.fileNames=g,o},t.textgridToIGT=function(e,t){return this.jsonToIGT(this.textgridToJSON(e,t),t)},t.jsonToIGT=function(e,t){var n,i,r={};e.intervalsByXmin={};var s,a,l,m=!(e.intervalsByText={}),o=0,f=/[ #?!'".,\/\(\)\*\#0-9-]/g;if(e.items.map(function(e){return-1<e.name.indexOf("@")&&(e.speaker=e.name.substring(e.name.indexOf("@")+1).trim(),e.name=e.name.substring(0,e.name.indexOf("@")).trim(),o++),t&&(e.speaker=e.name),"silences"===e.name&&(e.name="utterances"),e.name}).length-o==0&&(m=!0),!e||!e.items)return e;for(n=0;n<e.items.length;n++)if(r[e.items[n].name]=e.items[n].intervals_size||e.items[n].points_size,e.items[n].intervals)for(i=0;i<e.items[n].intervals.length;i++)l=this.marginForConsideringIntervalsMatching(e.items[n].intervals[i].xmin),a=this.marginForConsideringIntervalsMatching(e.items[n].intervals[i].xmax),(s=e.items[n].intervals[i]).fileName=e.items[n].fileName,s.tierName=e.items[n].name,s.speaker=e.items[n].speaker,e.intervalsByXmin[l=l+":"+a]=e.intervalsByXmin[l]||[],e.intervalsByXmin[l].push(s),(a=s.text?s.text.trim().toLocaleLowerCase().replace(f,""):"")&&("utterance"===a&&e.items[n].intervals.length<3&&(a=(a=-1<(a=s.fileName).indexOf(".")?a.substring(0,s.fileName.lastIndexOf(".")):a).trim().replace(/_/g," "),s.text=a),e.intervalsByText[a]=e.intervalsByText[a]||[],l=e.intervalsByText[a].length,e.intervalsByText[a][l]=s);return e.probablyFromElanWithSpeakerEncodedInTierName=m,e.isIGTNestedOrAlignedOrBySpeaker=this.isIGTNestedOrAlignedOrBySpeaker(e),e},t.isIGTNestedOrAlignedOrBySpeaker=function(e){var t,n,i,r=e.intervalsByXmin,s={},a=0,l=!1,m=!1;for(i in e.items)e.items.hasOwnProperty(i)&&e.items[i].speaker&&(l=!0);for(n in r)s[r[n].length]=s[r[n].length]?s[r[n].length]+1:1,a++;for(t in s)s[t]=s[t]/a,1<t&&.1<s[t]&&(m=!0);return{histogram:s,probablyAligned:m=e.fileNames&&4<e.fileNames.length?!1:m,probablyBySpeaker:l}},t.marginForConsideringIntervalsMatching=function(e,t){return t=t?100/t:5,(Math.round(e*t)/t).toFixed(2)},t.printIGT=function(e){function t(e){return e.xmin+","+e.xmax+","+e.text}for(var n in e)console.log(n),e.hasOwnProperty(n)&&console.log(e[n].map(t))},t.jsonToTextgrid=function(e){var t="";if(t+='File type = "ooTextFile"\n',t+='Object class = "TextGrid"\n\n',t+="xmin = "+(e.xmin||0)+"\n",t+="xmax = "+(e.xmax||0)+"\n",t+="tiers? <exists>\n",t+="size = "+(e.items?e.items.length:0)+"\n",t+="item []:\n",e.items)for(var n=0;n<e.items.length;n++){var i=e.items[n];if(t+=" item ["+(n+1)+"]:\n",t+=' class = "'+(i.class||"IntervalTier")+'"\n',t+=' name = "'+(i.name||"")+'"\n',t+=" xmin = "+(i.xmin||0)+"\n",t+=" xmax = "+(i.xmax||0)+"\n","IntervalTier"===i.class&&i.intervals){t+=" intervals: size = "+i.intervals.length+"\n";for(var r=0;r<i.intervals.length;r++){var s=i.intervals[r];t+=" intervals ["+(r+1)+"]:\n",t+=" xmin = "+(s.xmin||0)+"\n",t+=" xmax = "+(s.xmax||0)+"\n",t+=' text = "'+(s.text||"")+'"\n'}}else if("TextTier"===i.class&&i.points){t+=" points: size = "+i.points.length+"\n";for(var a=0;a<i.points.length;a++){var l=i.points[a];t+=" points ["+(a+1)+"]:\n",t+=" number = "+(l.number||0)+"\n",t+=' text = "'+(l.text||"")+'"\n'}}}return t},e.TextGrid=t}("object"==typeof exports&&exports||this);