Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 0 additions & 32 deletions .github/workflows/node.js.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@ build
# Deployed apps should consider commenting this line out:
# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git
node_modules
.vscode
.github
61 changes: 59 additions & 2 deletions dist/textgrid.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*! textgrid - v2.2.0 - 2021-12-14
/*! textgrid - v2.2.0 - 2025-10-17
* https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS
* Copyright (c) 2021 OpenSourceFieldLinguistics Contribs; Licensed Apache 2.0 */
* Copyright (c) 2025 OpenSourceFieldLinguistics Contribs; Licensed Apache 2.0 */
(function(exports) {

'use strict';
Expand Down Expand Up @@ -270,6 +270,63 @@
}
};

TextGrid.jsonToTextgrid = function(json) {
var textgrid = '';

// 写入文件头
textgrid += 'File type = "ooTextFile"\n';
textgrid += 'Object class = "TextGrid"\n\n';

// 写入基本属性
textgrid += 'xmin = ' + (json.xmin || 0) + '\n';
textgrid += 'xmax = ' + (json.xmax || 0) + '\n';
textgrid += 'tiers? <exists>\n';
textgrid += 'size = ' + (json.items ? json.items.length : 0) + '\n';
textgrid += 'item []:\n';

// 处理每个层级
if (json.items) {
for (var i = 0; i < json.items.length; i++) {
var item = json.items[i];

// 写入层级头
textgrid += ' item [' + (i + 1) + ']:\n';

// 写入层级属性
textgrid += ' class = "' + (item.class || 'IntervalTier') + '"\n';
textgrid += ' name = "' + (item.name || '') + '"\n';
textgrid += ' xmin = ' + (item.xmin || 0) + '\n';
textgrid += ' xmax = ' + (item.xmax || 0) + '\n';

// 处理区间层级
if (item.class === 'IntervalTier' && item.intervals) {
textgrid += ' intervals: size = ' + item.intervals.length + '\n';

for (var j = 0; j < item.intervals.length; j++) {
var interval = item.intervals[j];
textgrid += ' intervals [' + (j + 1) + ']:\n';
textgrid += ' xmin = ' + (interval.xmin || 0) + '\n';
textgrid += ' xmax = ' + (interval.xmax || 0) + '\n';
textgrid += ' text = "' + (interval.text || '') + '"\n';
}
}
// 处理点层级
else if (item.class === 'TextTier' && item.points) {
textgrid += ' points: size = ' + item.points.length + '\n';

for (var k = 0; k < item.points.length; k++) {
var point = item.points[k];
textgrid += ' points [' + (k + 1) + ']:\n';
textgrid += ' number = ' + (point.number || 0) + '\n';
textgrid += ' text = "' + (point.text || '') + '"\n';
}
}
}
}

return textgrid;
};

exports.TextGrid = TextGrid;

}(typeof exports === "object" && exports || this));
6 changes: 3 additions & 3 deletions dist/textgrid.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions lib/textgrid.js
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,63 @@
}
};

TextGrid.jsonToTextgrid = function(json) {
var textgrid = '';

// 写入文件头
textgrid += 'File type = "ooTextFile"\n';
textgrid += 'Object class = "TextGrid"\n\n';

// 写入基本属性
textgrid += 'xmin = ' + (json.xmin || 0) + '\n';
textgrid += 'xmax = ' + (json.xmax || 0) + '\n';
textgrid += 'tiers? <exists>\n';
textgrid += 'size = ' + (json.items ? json.items.length : 0) + '\n';
textgrid += 'item []:\n';

// 处理每个层级
if (json.items) {
for (var i = 0; i < json.items.length; i++) {
var item = json.items[i];

// 写入层级头
textgrid += ' item [' + (i + 1) + ']:\n';

// 写入层级属性
textgrid += ' class = "' + (item.class || 'IntervalTier') + '"\n';
textgrid += ' name = "' + (item.name || '') + '"\n';
textgrid += ' xmin = ' + (item.xmin || 0) + '\n';
textgrid += ' xmax = ' + (item.xmax || 0) + '\n';

// 处理区间层级
if (item.class === 'IntervalTier' && item.intervals) {
textgrid += ' intervals: size = ' + item.intervals.length + '\n';

for (var j = 0; j < item.intervals.length; j++) {
var interval = item.intervals[j];
textgrid += ' intervals [' + (j + 1) + ']:\n';
textgrid += ' xmin = ' + (interval.xmin || 0) + '\n';
textgrid += ' xmax = ' + (interval.xmax || 0) + '\n';
textgrid += ' text = "' + (interval.text || '') + '"\n';
}
}
// 处理点层级
else if (item.class === 'TextTier' && item.points) {
textgrid += ' points: size = ' + item.points.length + '\n';

for (var k = 0; k < item.points.length; k++) {
var point = item.points[k];
textgrid += ' points [' + (k + 1) + ']:\n';
textgrid += ' number = ' + (point.number || 0) + '\n';
textgrid += ' text = "' + (point.text || '') + '"\n';
}
}
}
}

return textgrid;
};

exports.TextGrid = TextGrid;

}(typeof exports === "object" && exports || this));
16 changes: 16 additions & 0 deletions test/textgrid-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,20 @@ describe("lib/textgrid", function() {
console.log(json.items.length);
expect(json.items.length).toEqual(1);
});

it("TextGrid to json and json to TextGrid", function() {
var sampleUtterancesTextGrid = fs.readFileSync(__dirname + "/../data/sampleUtterances.TextGrid", {
encoding: "UTF-8"
});
var json = textgrid.textgridToJSON(sampleUtterancesTextGrid);

var str = textgrid.jsonToTextgrid(json);
expect(typeof str).toBe("string");

var json2 = textgrid.textgridToJSON(sampleUtterancesTextGrid);
expect(typeof json2).toBe("object");

console.log("json 2 success yes!!!! this is my first commit in github");
})

});