Skip to content

Commit 54fbf4a

Browse files
authored
Add support for xml:lang and HTML lang (#160)
1 parent ff4e60d commit 54fbf4a

File tree

3 files changed

+62
-24
lines changed

3 files changed

+62
-24
lines changed

src/main/js/doc.js

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@
206206

207207
var s = new AnonymousSpan();
208208

209-
s.initFromText(doc, estack[0], str, xmlspacestack[0], errorHandler);
209+
s.initFromText(doc, estack[0], str, xmllangstack[0], xmlspacestack[0], errorHandler);
210210

211211
estack[0].contents.push(s);
212212

@@ -286,7 +286,7 @@
286286

287287
doc = new TT();
288288

289-
doc.initFromNode(node, errorHandler);
289+
doc.initFromNode(node, xmllangstack[0], errorHandler);
290290

291291
estack.unshift(doc);
292292

@@ -393,7 +393,7 @@
393393

394394
var r = new Region();
395395

396-
r.initFromNode(doc, node, errorHandler);
396+
r.initFromNode(doc, node, xmllangstack[0], errorHandler);
397397

398398
if (!r.id || r.id in doc.head.layout.regions) {
399399

@@ -423,7 +423,7 @@
423423

424424
var b = new Body();
425425

426-
b.initFromNode(doc, node, errorHandler);
426+
b.initFromNode(doc, node, xmllangstack[0], errorHandler);
427427

428428
doc.body = b;
429429

@@ -439,7 +439,7 @@
439439

440440
var d = new Div();
441441

442-
d.initFromNode(doc, estack[0], node, errorHandler);
442+
d.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);
443443

444444
/* transform smpte:backgroundImage to TTML2 image element */
445445

@@ -464,7 +464,7 @@
464464

465465
var img = new Image();
466466

467-
img.initFromNode(doc, estack[0], node, errorHandler);
467+
img.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);
468468

469469
estack[0].contents.push(img);
470470

@@ -480,7 +480,7 @@
480480

481481
var p = new P();
482482

483-
p.initFromNode(doc, estack[0], node, errorHandler);
483+
p.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);
484484

485485
estack[0].contents.push(p);
486486

@@ -496,7 +496,7 @@
496496

497497
var ns = new Span();
498498

499-
ns.initFromNode(doc, estack[0], node, xmlspacestack[0], errorHandler);
499+
ns.initFromNode(doc, estack[0], node, xmllangstack[0], xmlspacestack[0], errorHandler);
500500

501501
estack[0].contents.push(ns);
502502

@@ -512,7 +512,7 @@
512512

513513
var nb = new Br();
514514

515-
nb.initFromNode(doc, estack[0], node, errorHandler);
515+
nb.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);
516516

517517
estack[0].contents.push(nb);
518518

@@ -618,7 +618,7 @@
618618

619619
/* create default region */
620620

621-
var dr = Region.prototype.createDefaultRegion();
621+
var dr = Region.prototype.createDefaultRegion(doc.lang);
622622

623623
doc.head.layout.regions[dr.id] = dr;
624624

@@ -809,7 +809,7 @@
809809
this.body = null;
810810
}
811811

812-
TT.prototype.initFromNode = function (node, errorHandler) {
812+
TT.prototype.initFromNode = function (node, xmllang, errorHandler) {
813813

814814
/* compute cell resolution */
815815

@@ -872,7 +872,12 @@
872872
this.dimensions = {
873873
'h': new imscUtils.ComputedLength(0, 1),
874874
'w': new imscUtils.ComputedLength(1, 0)
875-
};
875+
876+
};
877+
878+
/* xml:lang */
879+
880+
this.lang = xmllang;
876881

877882
};
878883

@@ -1008,7 +1013,7 @@
10081013
this.type = type;
10091014
}
10101015

1011-
Image.prototype.initFromNode = function (doc, parent, node, errorHandler) {
1016+
Image.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {
10121017
this.src = 'src' in node.attributes ? node.attributes.src.value : null;
10131018

10141019
if (! this.src) {
@@ -1025,6 +1030,8 @@
10251030
TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
10261031
AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
10271032
LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
1033+
1034+
this.lang = xmllang;
10281035
};
10291036

10301037
/*
@@ -1109,12 +1116,14 @@
11091116
}
11101117

11111118

1112-
Body.prototype.initFromNode = function (doc, node, errorHandler) {
1119+
Body.prototype.initFromNode = function (doc, node, xmllang, errorHandler) {
11131120
StyledElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
11141121
TimedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
11151122
AnimatedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
11161123
LayoutElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
11171124
ContainerElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
1125+
1126+
this.lang = xmllang;
11181127
};
11191128

11201129
/*
@@ -1125,12 +1134,14 @@
11251134
ContentElement.call(this, 'div');
11261135
}
11271136

1128-
Div.prototype.initFromNode = function (doc, parent, node, errorHandler) {
1137+
Div.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {
11291138
StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11301139
TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11311140
AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11321141
LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11331142
ContainerElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
1143+
1144+
this.lang = xmllang;
11341145
};
11351146

11361147
/*
@@ -1141,12 +1152,14 @@
11411152
ContentElement.call(this, 'p');
11421153
}
11431154

1144-
P.prototype.initFromNode = function (doc, parent, node, errorHandler) {
1155+
P.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {
11451156
StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11461157
TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11471158
AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11481159
LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11491160
ContainerElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
1161+
1162+
this.lang = xmllang;
11501163
};
11511164

11521165
/*
@@ -1157,14 +1170,15 @@
11571170
ContentElement.call(this, 'span');
11581171
}
11591172

1160-
Span.prototype.initFromNode = function (doc, parent, node, xmlspace, errorHandler) {
1173+
Span.prototype.initFromNode = function (doc, parent, node, xmllang, xmlspace, errorHandler) {
11611174
StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11621175
TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11631176
AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11641177
LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11651178
ContainerElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11661179

11671180
this.space = xmlspace;
1181+
this.lang = xmllang;
11681182
};
11691183

11701184
/*
@@ -1175,11 +1189,12 @@
11751189
ContentElement.call(this, 'span');
11761190
}
11771191

1178-
AnonymousSpan.prototype.initFromText = function (doc, parent, text, xmlspace, errorHandler) {
1192+
AnonymousSpan.prototype.initFromText = function (doc, parent, text, xmllang, xmlspace, errorHandler) {
11791193
TimedElement.prototype.initFromNode.call(this, doc, parent, null, errorHandler);
11801194

11811195
this.text = text;
11821196
this.space = xmlspace;
1197+
this.lang = xmllang;
11831198
};
11841199

11851200
/*
@@ -1190,9 +1205,11 @@
11901205
ContentElement.call(this, 'br');
11911206
}
11921207

1193-
Br.prototype.initFromNode = function (doc, parent, node, errorHandler) {
1208+
Br.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {
11941209
LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
11951210
TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);
1211+
1212+
this.lang = xmllang;
11961213
};
11971214

11981215
/*
@@ -1203,18 +1220,20 @@
12031220
function Region() {
12041221
}
12051222

1206-
Region.prototype.createDefaultRegion = function () {
1223+
Region.prototype.createDefaultRegion = function (xmllang) {
12071224
var r = new Region();
12081225

12091226
IdentifiedElement.call(r, '');
12101227
StyledElement.call(r, {});
12111228
AnimatedElement.call(r, []);
12121229
TimedElement.call(r, 0, Number.POSITIVE_INFINITY, null);
12131230

1231+
this.lang = xmllang;
1232+
12141233
return r;
12151234
};
12161235

1217-
Region.prototype.initFromNode = function (doc, node, errorHandler) {
1236+
Region.prototype.initFromNode = function (doc, node, xmllang, errorHandler) {
12181237
IdentifiedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
12191238
TimedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
12201239
AnimatedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);
@@ -1226,6 +1245,10 @@
12261245
/* remember referential styles for merging after nested styling is processed*/
12271246

12281247
this.styleRefs = elementGetStyleRefs(node);
1248+
1249+
/* xml:lang */
1250+
1251+
this.lang = xmllang;
12291252
};
12301253

12311254
/*

src/main/js/html.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,15 @@
140140

141141
for (var i in isd.contents) {
142142

143-
processElement(context, rootcontainer, isd.contents[i]);
143+
processElement(context, rootcontainer, isd.contents[i], isd);
144144

145145
}
146146

147147
return context.currentISDState;
148148

149149
};
150150

151-
function processElement(context, dom_parent, isd_element) {
151+
function processElement(context, dom_parent, isd_element, isd_parent) {
152152

153153
var e;
154154

@@ -240,6 +240,16 @@
240240

241241
}
242242

243+
/* set language */
244+
245+
if (isd_element.lang) {
246+
247+
if (isd_element.kind === 'region' || isd_element.lang !== isd_parent.lang) {
248+
e.lang = isd_element.lang;
249+
}
250+
251+
}
252+
243253
/* add to parent */
244254

245255
dom_parent.appendChild(e);
@@ -437,7 +447,7 @@
437447

438448
for (var k in isd_element.contents) {
439449

440-
processElement(context, proc_e, isd_element.contents[k]);
450+
processElement(context, proc_e, isd_element.contents[k], isd_element);
441451

442452
}
443453

src/main/js/isd.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,7 @@
643643
function ISD(tt) {
644644
this.contents = [];
645645
this.aspectRatio = tt.aspectRatio;
646+
this.lang = tt.lang;
646647
}
647648

648649
function ISDContentElement(ttelem) {
@@ -651,6 +652,10 @@
651652

652653
this.kind = ttelem.kind || 'region';
653654

655+
/* copy lang */
656+
657+
this.lang = ttelem.lang;
658+
654659
/* copy id */
655660

656661
if (ttelem.id) {

0 commit comments

Comments
 (0)