Skip to content

Commit 3ca0c09

Browse files
committed
Update handling of parens and brackets in transcript
Parens and brackets have no special significance in WebVTT However, they're recommended in the DCMP Captioning Key for: - identifying speakers (parens) http://www.captioningkey.org/speaker_identification.html - identifying sound effects and music (brackets) http://www.captioningkey.org/sound_effects.html This commit fixes bugs and introduces new content handling for repurposing captions into a transcript, with the following effect: - Content within parens and brackets is wrapped in a span with class="able-unspoken" - If brackets or parens occur within a single caption, line breaks are added to force the parenthetical or bracketed content onto a new line
1 parent e5a4f16 commit 3ca0c09

6 files changed

Lines changed: 201 additions & 120 deletions

File tree

build/ableplayer.dist.js

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9783,9 +9783,9 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
97839783
else if (this.chapters.length > 0) {
97849784
// Try and match the caption language.
97859785
if (this.transcriptLang) {
9786-
for (var ii = 0; ii < this.chapters.length; ii++) {
9787-
if (this.chapters[ii].language === this.transcriptLang) {
9788-
chapters = this.chapters[ii].cues;
9786+
for (var i = 0; i < this.chapters.length; i++) {
9787+
if (this.chapters[i].language === this.transcriptLang) {
9788+
chapters = this.chapters[i].cues;
97899789
}
97909790
}
97919791
}
@@ -9801,9 +9801,9 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
98019801
else if (this.descriptions.length > 0) {
98029802
// Try and match the caption language.
98039803
if (this.transcriptLang) {
9804-
for (var ii = 0; ii < this.descriptions.length; ii++) {
9805-
if (this.descriptions[ii].language === this.transcriptLang) {
9806-
descriptions = this.descriptions[ii].cues;
9804+
for (var i = 0; i < this.descriptions.length; i++) {
9805+
if (this.descriptions[i].language === this.transcriptLang) {
9806+
descriptions = this.descriptions[i].cues;
98079807
}
98089808
}
98099809
}
@@ -9965,8 +9965,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
99659965
result.push(comp.value);
99669966
}
99679967
else {
9968-
for (var ii = 0; ii < comp.children.length; ii++) {
9969-
result = result.concat(flattenComponentForChapter(comp.children[ii]));
9968+
for (var i = 0; i < comp.children.length; i++) {
9969+
result = result.concat(flattenComponentForChapter(comp.children[i]));
99709970
}
99719971
}
99729972
return result;
@@ -9975,8 +9975,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
99759975
var $chapSpan = $('<span>',{
99769976
'class': 'able-transcript-seekpoint'
99779977
});
9978-
for (var ii = 0; ii < chap.components.children.length; ii++) {
9979-
var results = flattenComponentForChapter(chap.components.children[ii]);
9978+
for (var i = 0; i < chap.components.children.length; i++) {
9979+
var results = flattenComponentForChapter(chap.components.children[i]);
99809980
for (var jj = 0; jj < results.length; jj++) {
99819981
$chapSpan.append(results[jj]);
99829982
}
@@ -10006,8 +10006,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1000610006
result.push(comp.value);
1000710007
}
1000810008
else {
10009-
for (var ii = 0; ii < comp.children.length; ii++) {
10010-
result = result.concat(flattenComponentForDescription(comp.children[ii]));
10009+
for (var i = 0; i < comp.children.length; i++) {
10010+
result = result.concat(flattenComponentForDescription(comp.children[i]));
1001110011
}
1001210012
}
1001310013
return result;
@@ -10016,8 +10016,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1001610016
var $descSpan = $('<span>',{
1001710017
'class': 'able-transcript-seekpoint'
1001810018
});
10019-
for (var ii = 0; ii < desc.components.children.length; ii++) {
10020-
var results = flattenComponentForDescription(desc.components.children[ii]);
10019+
for (var i = 0; i < desc.components.children.length; i++) {
10020+
var results = flattenComponentForDescription(desc.components.children[i]);
1002110021
for (var jj = 0; jj < results.length; jj++) {
1002210022
$descSpan.append(results[jj]);
1002310023
}
@@ -10039,11 +10039,18 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1003910039

1004010040
var result = [];
1004110041

10042+
var parts = 0;
10043+
1004210044
var flattenString = function (str) {
10045+
10046+
parts++;
10047+
10048+
var flatStr;
1004310049
var result = [];
1004410050
if (str === '') {
1004510051
return result;
1004610052
}
10053+
1004710054
var openBracket = str.indexOf('[');
1004810055
var closeBracket = str.indexOf(']');
1004910056
var openParen = str.indexOf('(');
@@ -10052,23 +10059,43 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1005210059
var hasBrackets = openBracket !== -1 && closeBracket !== -1;
1005310060
var hasParens = openParen !== -1 && closeParen !== -1;
1005410061

10055-
if ((hasParens && hasBrackets && openBracket < openParen) || hasBrackets) {
10056-
result = result.concat(flattenString(str.substring(0, openBracket)));
10057-
var $silentSpan = $('<span>',{
10058-
'class': 'able-unspoken'
10059-
});
10060-
$silentSpan.text(str.substring(openBracket, closeBracket + 1));
10061-
result.push($silentSpan);
10062-
result = result.concat(flattenString(str.substring(openParen, closeParen + 1)));
10063-
}
10064-
else if (hasParens) {
10065-
result = result.concat(flattenString(str.substring(0, openParen)));
10066-
var $silentSpan = $('<span>',{
10067-
'class': 'able-unspoken'
10068-
});
10069-
$silentSpan.text(str.substring(openBracket, closeBracket + 1));
10070-
result.push($silentSpan);
10071-
result = result.concat(flattenString(str.substring(closeParen + 1)));
10062+
if (hasParens || hasBrackets) {
10063+
if (parts > 1) {
10064+
// force a line break between sections that contain parens or brackets
10065+
var silentSpanBreak = '<br/>';
10066+
}
10067+
else {
10068+
var silentSpanBreak = '';
10069+
}
10070+
var silentSpanOpen = silentSpanBreak + '<span class="able-unspoken">';
10071+
var silentSpanClose = '</span>';
10072+
if (hasParens && hasBrackets) {
10073+
// string has both!
10074+
if (openBracket < openParen) {
10075+
// brackets come first. Parse parens separately
10076+
hasParens = false;
10077+
}
10078+
else {
10079+
// parens come first. Parse brackets separately
10080+
hasBrackets = false;
10081+
}
10082+
}
10083+
}
10084+
if (hasParens) {
10085+
flatStr = str.substring(0, openParen);
10086+
flatStr += silentSpanOpen;
10087+
flatStr += str.substring(openParen, closeParen + 1);
10088+
flatStr += silentSpanClose;
10089+
flatStr += flattenString(str.substring(closeParen + 1));
10090+
result.push(flatStr);
10091+
}
10092+
else if (hasBrackets) {
10093+
flatStr = str.substring(0, openBracket);
10094+
flatStr += silentSpanOpen;
10095+
flatStr += str.substring(openBracket, closeBracket + 1);
10096+
flatStr += silentSpanClose;
10097+
flatStr += flattenString(str.substring(closeBracket + 1));
10098+
result.push(flatStr);
1007210099
}
1007310100
else {
1007410101
result.push(str);
@@ -10085,8 +10112,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1008510112
});
1008610113
$vSpan.text('(' + comp.value + ')');
1008710114
result.push($vSpan);
10088-
for (var ii = 0; ii < comp.children.length; ii++) {
10089-
var subResults = flattenComponentForCaption(comp.children[ii]);
10115+
for (var i = 0; i < comp.children.length; i++) {
10116+
var subResults = flattenComponentForCaption(comp.children[i]);
1009010117
for (var jj = 0; jj < subResults.length; jj++) {
1009110118
result.push(subResults[jj]);
1009210119
}
@@ -10099,8 +10126,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1009910126
else if (comp.type === 'i') {
1010010127
var $tag = $('<em>');
1010110128
}
10102-
for (var ii = 0; ii < comp.children.length; ii++) {
10103-
var subResults = flattenComponentForCaption(comp.children[ii]);
10129+
for (var i = 0; i < comp.children.length; i++) {
10130+
var subResults = flattenComponentForCaption(comp.children[i]);
1010410131
for (var jj = 0; jj < subResults.length; jj++) {
1010510132
$tag.append(subResults[jj]);
1010610133
}
@@ -10110,15 +10137,15 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1011010137
}
1011110138
}
1011210139
else {
10113-
for (var ii = 0; ii < comp.children.length; ii++) {
10114-
result = result.concat(flattenComponentForCaption(comp.children[ii]));
10140+
for (var i = 0; i < comp.children.length; i++) {
10141+
result = result.concat(flattenComponentForCaption(comp.children[i]));
1011510142
}
1011610143
}
1011710144
return result;
1011810145
};
1011910146

10120-
for (var ii = 0; ii < cap.components.children.length; ii++) {
10121-
var results = flattenComponentForCaption(cap.components.children[ii]);
10147+
for (var i = 0; i < cap.components.children.length; i++) {
10148+
var results = flattenComponentForCaption(cap.components.children[i]);
1012210149
for (var jj = 0; jj < results.length; jj++) {
1012310150
var result = results[jj];
1012410151
if (typeof result === 'string') {

build/ableplayer.js

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9783,9 +9783,9 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
97839783
else if (this.chapters.length > 0) {
97849784
// Try and match the caption language.
97859785
if (this.transcriptLang) {
9786-
for (var ii = 0; ii < this.chapters.length; ii++) {
9787-
if (this.chapters[ii].language === this.transcriptLang) {
9788-
chapters = this.chapters[ii].cues;
9786+
for (var i = 0; i < this.chapters.length; i++) {
9787+
if (this.chapters[i].language === this.transcriptLang) {
9788+
chapters = this.chapters[i].cues;
97899789
}
97909790
}
97919791
}
@@ -9801,9 +9801,9 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
98019801
else if (this.descriptions.length > 0) {
98029802
// Try and match the caption language.
98039803
if (this.transcriptLang) {
9804-
for (var ii = 0; ii < this.descriptions.length; ii++) {
9805-
if (this.descriptions[ii].language === this.transcriptLang) {
9806-
descriptions = this.descriptions[ii].cues;
9804+
for (var i = 0; i < this.descriptions.length; i++) {
9805+
if (this.descriptions[i].language === this.transcriptLang) {
9806+
descriptions = this.descriptions[i].cues;
98079807
}
98089808
}
98099809
}
@@ -9965,8 +9965,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
99659965
result.push(comp.value);
99669966
}
99679967
else {
9968-
for (var ii = 0; ii < comp.children.length; ii++) {
9969-
result = result.concat(flattenComponentForChapter(comp.children[ii]));
9968+
for (var i = 0; i < comp.children.length; i++) {
9969+
result = result.concat(flattenComponentForChapter(comp.children[i]));
99709970
}
99719971
}
99729972
return result;
@@ -9975,8 +9975,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
99759975
var $chapSpan = $('<span>',{
99769976
'class': 'able-transcript-seekpoint'
99779977
});
9978-
for (var ii = 0; ii < chap.components.children.length; ii++) {
9979-
var results = flattenComponentForChapter(chap.components.children[ii]);
9978+
for (var i = 0; i < chap.components.children.length; i++) {
9979+
var results = flattenComponentForChapter(chap.components.children[i]);
99809980
for (var jj = 0; jj < results.length; jj++) {
99819981
$chapSpan.append(results[jj]);
99829982
}
@@ -10006,8 +10006,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1000610006
result.push(comp.value);
1000710007
}
1000810008
else {
10009-
for (var ii = 0; ii < comp.children.length; ii++) {
10010-
result = result.concat(flattenComponentForDescription(comp.children[ii]));
10009+
for (var i = 0; i < comp.children.length; i++) {
10010+
result = result.concat(flattenComponentForDescription(comp.children[i]));
1001110011
}
1001210012
}
1001310013
return result;
@@ -10016,8 +10016,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1001610016
var $descSpan = $('<span>',{
1001710017
'class': 'able-transcript-seekpoint'
1001810018
});
10019-
for (var ii = 0; ii < desc.components.children.length; ii++) {
10020-
var results = flattenComponentForDescription(desc.components.children[ii]);
10019+
for (var i = 0; i < desc.components.children.length; i++) {
10020+
var results = flattenComponentForDescription(desc.components.children[i]);
1002110021
for (var jj = 0; jj < results.length; jj++) {
1002210022
$descSpan.append(results[jj]);
1002310023
}
@@ -10039,11 +10039,18 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1003910039

1004010040
var result = [];
1004110041

10042+
var parts = 0;
10043+
1004210044
var flattenString = function (str) {
10045+
10046+
parts++;
10047+
10048+
var flatStr;
1004310049
var result = [];
1004410050
if (str === '') {
1004510051
return result;
1004610052
}
10053+
1004710054
var openBracket = str.indexOf('[');
1004810055
var closeBracket = str.indexOf(']');
1004910056
var openParen = str.indexOf('(');
@@ -10052,23 +10059,43 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1005210059
var hasBrackets = openBracket !== -1 && closeBracket !== -1;
1005310060
var hasParens = openParen !== -1 && closeParen !== -1;
1005410061

10055-
if ((hasParens && hasBrackets && openBracket < openParen) || hasBrackets) {
10056-
result = result.concat(flattenString(str.substring(0, openBracket)));
10057-
var $silentSpan = $('<span>',{
10058-
'class': 'able-unspoken'
10059-
});
10060-
$silentSpan.text(str.substring(openBracket, closeBracket + 1));
10061-
result.push($silentSpan);
10062-
result = result.concat(flattenString(str.substring(openParen, closeParen + 1)));
10063-
}
10064-
else if (hasParens) {
10065-
result = result.concat(flattenString(str.substring(0, openParen)));
10066-
var $silentSpan = $('<span>',{
10067-
'class': 'able-unspoken'
10068-
});
10069-
$silentSpan.text(str.substring(openBracket, closeBracket + 1));
10070-
result.push($silentSpan);
10071-
result = result.concat(flattenString(str.substring(closeParen + 1)));
10062+
if (hasParens || hasBrackets) {
10063+
if (parts > 1) {
10064+
// force a line break between sections that contain parens or brackets
10065+
var silentSpanBreak = '<br/>';
10066+
}
10067+
else {
10068+
var silentSpanBreak = '';
10069+
}
10070+
var silentSpanOpen = silentSpanBreak + '<span class="able-unspoken">';
10071+
var silentSpanClose = '</span>';
10072+
if (hasParens && hasBrackets) {
10073+
// string has both!
10074+
if (openBracket < openParen) {
10075+
// brackets come first. Parse parens separately
10076+
hasParens = false;
10077+
}
10078+
else {
10079+
// parens come first. Parse brackets separately
10080+
hasBrackets = false;
10081+
}
10082+
}
10083+
}
10084+
if (hasParens) {
10085+
flatStr = str.substring(0, openParen);
10086+
flatStr += silentSpanOpen;
10087+
flatStr += str.substring(openParen, closeParen + 1);
10088+
flatStr += silentSpanClose;
10089+
flatStr += flattenString(str.substring(closeParen + 1));
10090+
result.push(flatStr);
10091+
}
10092+
else if (hasBrackets) {
10093+
flatStr = str.substring(0, openBracket);
10094+
flatStr += silentSpanOpen;
10095+
flatStr += str.substring(openBracket, closeBracket + 1);
10096+
flatStr += silentSpanClose;
10097+
flatStr += flattenString(str.substring(closeBracket + 1));
10098+
result.push(flatStr);
1007210099
}
1007310100
else {
1007410101
result.push(str);
@@ -10085,8 +10112,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1008510112
});
1008610113
$vSpan.text('(' + comp.value + ')');
1008710114
result.push($vSpan);
10088-
for (var ii = 0; ii < comp.children.length; ii++) {
10089-
var subResults = flattenComponentForCaption(comp.children[ii]);
10115+
for (var i = 0; i < comp.children.length; i++) {
10116+
var subResults = flattenComponentForCaption(comp.children[i]);
1009010117
for (var jj = 0; jj < subResults.length; jj++) {
1009110118
result.push(subResults[jj]);
1009210119
}
@@ -10099,8 +10126,8 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1009910126
else if (comp.type === 'i') {
1010010127
var $tag = $('<em>');
1010110128
}
10102-
for (var ii = 0; ii < comp.children.length; ii++) {
10103-
var subResults = flattenComponentForCaption(comp.children[ii]);
10129+
for (var i = 0; i < comp.children.length; i++) {
10130+
var subResults = flattenComponentForCaption(comp.children[i]);
1010410131
for (var jj = 0; jj < subResults.length; jj++) {
1010510132
$tag.append(subResults[jj]);
1010610133
}
@@ -10110,15 +10137,15 @@ console.log('swapSource; sourceIndex: ' + sourceIndex);
1011010137
}
1011110138
}
1011210139
else {
10113-
for (var ii = 0; ii < comp.children.length; ii++) {
10114-
result = result.concat(flattenComponentForCaption(comp.children[ii]));
10140+
for (var i = 0; i < comp.children.length; i++) {
10141+
result = result.concat(flattenComponentForCaption(comp.children[i]));
1011510142
}
1011610143
}
1011710144
return result;
1011810145
};
1011910146

10120-
for (var ii = 0; ii < cap.components.children.length; ii++) {
10121-
var results = flattenComponentForCaption(cap.components.children[ii]);
10147+
for (var i = 0; i < cap.components.children.length; i++) {
10148+
var results = flattenComponentForCaption(cap.components.children[i]);
1012210149
for (var jj = 0; jj < results.length; jj++) {
1012310150
var result = results[jj];
1012410151
if (typeof result === 'string') {

0 commit comments

Comments
 (0)