@pretextbook/pretext-html 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -2
- package/assets/upstream.json +1 -1
- package/assets/xsl/LICENSE-pretext +1 -1
- package/assets/xsl/README.md +19 -0
- package/assets/xsl/entities.ent +15 -4
- package/assets/xsl/extract-asymptote.xsl +5 -5
- package/assets/xsl/extract-biblio-csl.xsl +1 -1
- package/assets/xsl/extract-datafile.xsl +1 -1
- package/assets/xsl/extract-dynamic.xsl +1 -1
- package/assets/xsl/extract-identity.xsl +5 -5
- package/assets/xsl/extract-interactive.xsl +1 -1
- package/assets/xsl/extract-latex-image.xsl +5 -5
- package/assets/xsl/extract-mermaid.xsl +1 -1
- package/assets/xsl/extract-mom.xsl +5 -5
- package/assets/xsl/extract-pg.xsl +1 -1
- package/assets/xsl/extract-prefigure.xsl +5 -5
- package/assets/xsl/extract-qrcode.xsl +1 -1
- package/assets/xsl/extract-runestone-page-template.xsl +1 -1
- package/assets/xsl/extract-sageplot.xsl +5 -5
- package/assets/xsl/extract-stack.xsl +1 -1
- package/assets/xsl/extract-trace.xsl +1 -1
- package/assets/xsl/extract-youtube.xsl +5 -5
- package/assets/xsl/latex/pretext-latex-AIM.xsl +1 -1
- package/assets/xsl/latex/pretext-latex-chaos.xsl +1 -1
- package/assets/xsl/latex/pretext-latex-dyslexic-font.xsl +1 -1
- package/assets/xsl/latex/pretext-latex-guide.xsl +1 -1
- package/assets/xsl/localizations/README.md +1 -1
- package/assets/xsl/localizations/af-ZA.xml +1 -1
- package/assets/xsl/localizations/bg-BG.xml +1 -1
- package/assets/xsl/localizations/ca-ES.xml +1 -1
- package/assets/xsl/localizations/cs-CZ.xml +1 -1
- package/assets/xsl/localizations/de-DE.xml +1 -1
- package/assets/xsl/localizations/en-US.xml +1 -1
- package/assets/xsl/localizations/es-ES.xml +1 -1
- package/assets/xsl/localizations/fi-FI.xml +1 -1
- package/assets/xsl/localizations/fr-CA.xml +1 -1
- package/assets/xsl/localizations/fr-FR.xml +1 -1
- package/assets/xsl/localizations/hu-HU.xml +1 -1
- package/assets/xsl/localizations/it-IT.xml +1 -1
- package/assets/xsl/localizations/ku-CKB.xml +1 -1
- package/assets/xsl/localizations/localizations.xml +1 -1
- package/assets/xsl/localizations/nl-NL.xml +1 -1
- package/assets/xsl/localizations/pt-BR.xml +1 -1
- package/assets/xsl/localizations/pt-PT.xml +1 -1
- package/assets/xsl/localizations/zh-HANS.xml +1 -1
- package/assets/xsl/pretext-assembly.xsl +66 -7
- package/assets/xsl/pretext-basic-html.xsl +5 -5
- package/assets/xsl/pretext-braille-preprint.xsl +5 -5
- package/assets/xsl/pretext-common.xsl +123 -32
- package/assets/xsl/pretext-dynamic.xsl +1 -1
- package/assets/xsl/pretext-epub.xsl +94 -85
- package/assets/xsl/pretext-fo.xsl +18 -20
- package/assets/xsl/pretext-html.xsl +260 -74
- package/assets/xsl/pretext-json-manifest.xsl +1 -1
- package/assets/xsl/pretext-jupyter.xsl +5 -5
- package/assets/xsl/pretext-latex-classic.xsl +1 -1
- package/assets/xsl/pretext-latex-common.xsl +35 -22
- package/assets/xsl/pretext-latex.xsl +3 -3
- package/assets/xsl/pretext-litprog.xsl +9 -2
- package/assets/xsl/pretext-markdown.xsl +1 -1
- package/assets/xsl/pretext-numbers.xsl +1 -1
- package/assets/xsl/pretext-revealjs.xsl +1 -3
- package/assets/xsl/pretext-runestone-fitb.xsl +18 -0
- package/assets/xsl/pretext-runestone-static.xsl +13 -1
- package/assets/xsl/pretext-runestone.xsl +39 -27
- package/assets/xsl/pretext-sage-doctest.xsl +18 -0
- package/assets/xsl/pretext-solution-manual-latex.xsl +4 -4
- package/assets/xsl/pretext-text-utilities.xsl +1 -1
- package/assets/xsl/pretext-text.xsl +5 -5
- package/assets/xsl/pretext-units.xsl +5 -5
- package/assets/xsl/pretext-view-source.xsl +1 -1
- package/assets/xsl/pretext-ww-problem-sets.xsl +15 -12
- package/assets/xsl/publisher-variables.xsl +160 -133
- package/assets/xsl/support/README.md +19 -0
- package/assets/xsl/support/extract-math.xsl +1 -1
- package/assets/xsl/support/package-math.xsl +1 -1
- package/assets/xsl/support/webpack_static_imports.xml +19 -0
- package/assets/xsl/tests/README.md +19 -0
- package/assets/xsl/tests/null.xml +19 -0
- package/assets/xsl/tests/pretext-text-utilities-test.xsl +1 -1
- package/assets/xsl/utilities/README.md +19 -0
- package/assets/xsl/utilities/author-report.xsl +1 -1
- package/assets/xsl/utilities/fix-deprecations.xsl +5 -5
- package/assets/xsl/utilities/pretext-enhanced-source.xsl +1 -1
- package/assets/xsl/utilities/report-publisher-variables.xsl +5 -5
- package/assets/xsl/xml-to-json.xsl +4 -4
- package/assets/xsl-bundle.json +1 -1
- package/dist/banner.d.ts +51 -0
- package/dist/{cli-DF7XOWN7.js → cli-Bcn4t3B1.js} +387 -240
- package/dist/cli.js +2 -2
- package/dist/html-static.d.ts +20 -0
- package/dist/index.browser.d.ts +2 -0
- package/dist/index.browser.js +554 -407
- package/dist/index.d.ts +2 -0
- package/dist/index.js +28 -25
- package/dist/renderer.d.ts +18 -1
- package/package.json +2 -1
- package/assets/xsl/pretext-smc.xsl +0 -492
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
<?xml version='1.0'?> <!-- As XML file -->
|
|
2
2
|
|
|
3
3
|
<!--********************************************************************
|
|
4
|
-
Copyright 2013
|
|
4
|
+
Copyright (C) 2013-2026 Robert A. Beezer
|
|
5
5
|
|
|
6
|
-
This file is part of
|
|
6
|
+
This file is part of PreTeXt.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
PreTeXt is free software: you can redistribute it and/or modify
|
|
9
9
|
it under the terms of the GNU General Public License as published by
|
|
10
10
|
the Free Software Foundation, either version 2 or version 3 of the
|
|
11
11
|
License (at your option).
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
PreTeXt is distributed in the hope that it will be useful,
|
|
14
14
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
15
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
16
|
GNU General Public License for more details.
|
|
17
17
|
|
|
18
18
|
You should have received a copy of the GNU General Public License
|
|
19
|
-
along with
|
|
19
|
+
along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
|
|
20
20
|
*********************************************************************-->
|
|
21
21
|
|
|
22
22
|
<!-- http://pimpmyxslt.com/articles/entity-tricks-part2/ -->
|
|
@@ -505,8 +505,9 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
505
505
|
<xsl:with-param name="heading-level" select="$chunk-heading-level"/>
|
|
506
506
|
</xsl:apply-templates>
|
|
507
507
|
</xsl:with-param>
|
|
508
|
-
<!-- Set b-has-printout to true if the structural node is or contains a
|
|
509
|
-
|
|
508
|
+
<!-- Set b-has-printout to true if the structural node is or contains a -->
|
|
509
|
+
<!-- worksheet or handout, or a PROJECT-LIKE acting as its own printout. -->
|
|
510
|
+
<xsl:with-param name="b-has-printout" select="descendant-or-self::worksheet or descendant-or-self::handout or descendant::*[&PROJECT-FILTER;][not(ancestor::worksheet|ancestor::handout)][@workspace|.//@workspace]"/>
|
|
510
511
|
</xsl:apply-templates>
|
|
511
512
|
</xsl:template>
|
|
512
513
|
|
|
@@ -754,10 +755,10 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
754
755
|
<xsl:with-param name="heading-level" select="$next-level"/>
|
|
755
756
|
</xsl:apply-templates>
|
|
756
757
|
|
|
757
|
-
<!--
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
758
|
+
<!-- Groupwork submission items are not emitted here. They belong -->
|
|
759
|
+
<!-- above the Runestone progress indicator, which the various -->
|
|
760
|
+
<!-- "structural-division-inner-content" templates emit as their last -->
|
|
761
|
+
<!-- act, so each of those emits the submission items just before it. -->
|
|
761
762
|
|
|
762
763
|
<!-- Include permalink for the section as last child -->
|
|
763
764
|
<xsl:apply-templates select="." mode="permalink"/>
|
|
@@ -813,9 +814,8 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
813
814
|
<xsl:when test="$b-is-groupwork">
|
|
814
815
|
<!-- the actual list of exercises -->
|
|
815
816
|
<xsl:copy-of select="$the-exercises"/>
|
|
816
|
-
<!--
|
|
817
|
-
|
|
818
|
-
<!-- template (early and late in "section") -->
|
|
817
|
+
<!-- and the group selection and submission items -->
|
|
818
|
+
<xsl:apply-templates select="." mode="runestone-groupwork"/>
|
|
819
819
|
<!-- No progress indicator in this case -->
|
|
820
820
|
</xsl:when>
|
|
821
821
|
<!-- some extra wrapping for timed exercises -->
|
|
@@ -845,6 +845,13 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
845
845
|
<xsl:apply-templates select="*">
|
|
846
846
|
<xsl:with-param name="heading-level" select="$heading-level"/>
|
|
847
847
|
</xsl:apply-templates>
|
|
848
|
+
<!-- A "worksheet" electing group work arrives here, and its submission -->
|
|
849
|
+
<!-- items go above the progress indicator: Runestone attaches the "mark -->
|
|
850
|
+
<!-- as completed" control to that indicator, and a reader chooses their -->
|
|
851
|
+
<!-- group before declaring the page done, not after. -->
|
|
852
|
+
<xsl:if test="$b-host-runestone and (@groupwork = 'yes') and (self::worksheet or self::exercises) and (parent::chapter or parent::appendix)">
|
|
853
|
+
<xsl:apply-templates select="." mode="runestone-groupwork"/>
|
|
854
|
+
</xsl:if>
|
|
848
855
|
<!-- only at "section" level. only when building for a Runestone server -->
|
|
849
856
|
<xsl:apply-templates select="." mode="runestone-progress-indicator"/>
|
|
850
857
|
</xsl:template>
|
|
@@ -1019,7 +1026,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
1019
1026
|
<!-- print previews. A simple button with printer icon that reloads -->
|
|
1020
1027
|
<!-- the page with a url parameter that tells javascript to switch -->
|
|
1021
1028
|
<!-- to printout css and format all the pages and workspace. -->
|
|
1022
|
-
<xsl:template match="&PRINTOUT;" mode="standalone-printout-links">
|
|
1029
|
+
<xsl:template match="&PRINTOUT;|&PROJECT-LIKE;" mode="standalone-printout-links">
|
|
1023
1030
|
<xsl:variable name="printout-id">
|
|
1024
1031
|
<xsl:apply-templates select="." mode="html-id"/>
|
|
1025
1032
|
</xsl:variable>
|
|
@@ -4040,17 +4047,42 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
4040
4047
|
</xsl:template>
|
|
4041
4048
|
|
|
4042
4049
|
<!-- And its CSS class -->
|
|
4050
|
+
<!-- A project acting as a standalone printout is marked as such, so the -->
|
|
4051
|
+
<!-- stylesheet can treat it as the printable thing it is (for one, its -->
|
|
4052
|
+
<!-- title gets a line of its own rather than running into the text). -->
|
|
4043
4053
|
<xsl:template match="&PROJECT-LIKE;" mode="body-css-class">
|
|
4044
4054
|
<xsl:value-of select="local-name()"/>
|
|
4045
4055
|
<xsl:text> project-like</xsl:text>
|
|
4056
|
+
<xsl:variable name="b-standalone-printout">
|
|
4057
|
+
<xsl:apply-templates select="." mode="is-standalone-printout"/>
|
|
4058
|
+
</xsl:variable>
|
|
4059
|
+
<xsl:if test="$b-standalone-printout = 'true'">
|
|
4060
|
+
<xsl:text> standalone-printout</xsl:text>
|
|
4061
|
+
</xsl:if>
|
|
4046
4062
|
</xsl:template>
|
|
4047
4063
|
|
|
4048
4064
|
<!-- When born use this heading -->
|
|
4065
|
+
<!-- A standalone printout earns a print preview icon. Unlike a printout, -->
|
|
4066
|
+
<!-- whose icon lives inside its heading, a project's icon is a sibling -->
|
|
4067
|
+
<!-- following the heading: a project's title is a styled thing in its own -->
|
|
4068
|
+
<!-- right in several themes (a boxed legend, a filled bar), and the icon -->
|
|
4069
|
+
<!-- has no business inside that. As a floated sibling it lands just -->
|
|
4070
|
+
<!-- below the title at the right, clear of the title's decoration. -->
|
|
4071
|
+
<!-- NB: a project born hidden as a knowl (the publisher's knowl-project) -->
|
|
4072
|
+
<!-- also comes through here, putting the icon in the knowl's "summary", -->
|
|
4073
|
+
<!-- the only place it is visible while the knowl is closed. The preview -->
|
|
4074
|
+
<!-- javascript ("flattenKnowledPrintout") knows how to unpack that. -->
|
|
4049
4075
|
<xsl:template match="&PROJECT-LIKE;" mode="heading-birth">
|
|
4050
4076
|
<xsl:param name="heading-level"/>
|
|
4051
4077
|
<xsl:apply-templates select="." mode="heading-full">
|
|
4052
4078
|
<xsl:with-param name="heading-level" select="$heading-level"/>
|
|
4053
4079
|
</xsl:apply-templates>
|
|
4080
|
+
<xsl:variable name="b-standalone-printout">
|
|
4081
|
+
<xsl:apply-templates select="." mode="is-standalone-printout"/>
|
|
4082
|
+
</xsl:variable>
|
|
4083
|
+
<xsl:if test="$b-standalone-printout = 'true'">
|
|
4084
|
+
<xsl:apply-templates select="." mode="standalone-printout-links"/>
|
|
4085
|
+
</xsl:if>
|
|
4054
4086
|
</xsl:template>
|
|
4055
4087
|
|
|
4056
4088
|
<!-- When used in solutions -->
|
|
@@ -5418,6 +5450,10 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
5418
5450
|
<xsl:if test="$b-original and not($block-type = 'hidden')">
|
|
5419
5451
|
<xsl:apply-templates select="." mode="html-id-attribute"/>
|
|
5420
5452
|
</xsl:if>
|
|
5453
|
+
<!-- Both are empty unless this block is a standalone printout, -->
|
|
5454
|
+
<!-- ie a PROJECT-LIKE with workspace outside of any printout. -->
|
|
5455
|
+
<xsl:apply-templates select="." mode="page-margins-attribute"/>
|
|
5456
|
+
<xsl:apply-templates select="." mode="page-header-footer-attributes"/>
|
|
5421
5457
|
<!-- If visible, heading interior to article -->
|
|
5422
5458
|
<xsl:if test="$block-type = 'visible'">
|
|
5423
5459
|
<xsl:apply-templates select="." mode="heading-birth">
|
|
@@ -6416,16 +6452,14 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6416
6452
|
<!-- $base-pathname needed later for archive links -->
|
|
6417
6453
|
<xsl:variable name="base-pathname">
|
|
6418
6454
|
<xsl:value-of select="$generated-directory"/>
|
|
6419
|
-
<xsl:
|
|
6420
|
-
<xsl:
|
|
6421
|
-
<xsl:
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
<xsl:
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
</xsl:choose>
|
|
6428
|
-
</xsl:if>
|
|
6455
|
+
<xsl:choose>
|
|
6456
|
+
<xsl:when test="latex-image">
|
|
6457
|
+
<xsl:text>latex-image/</xsl:text>
|
|
6458
|
+
</xsl:when>
|
|
6459
|
+
<xsl:when test="pf:prefigure">
|
|
6460
|
+
<xsl:text>prefigure/</xsl:text>
|
|
6461
|
+
</xsl:when>
|
|
6462
|
+
</xsl:choose>
|
|
6429
6463
|
<!-- NB: node-set in @select will have exactly -->
|
|
6430
6464
|
<!-- one (child) node, given @match above -->
|
|
6431
6465
|
<xsl:apply-templates select="latex-image|pf:prefigure" mode="image-source-basename"/>
|
|
@@ -6481,9 +6515,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6481
6515
|
<!-- $base-pathname needed later for archive links -->
|
|
6482
6516
|
<xsl:variable name="base-pathname">
|
|
6483
6517
|
<xsl:value-of select="$generated-directory"/>
|
|
6484
|
-
<xsl:
|
|
6485
|
-
<xsl:text>sageplot/</xsl:text>
|
|
6486
|
-
</xsl:if>
|
|
6518
|
+
<xsl:text>sageplot/</xsl:text>
|
|
6487
6519
|
<xsl:apply-templates select="sageplot" mode="image-source-basename"/>
|
|
6488
6520
|
</xsl:variable>
|
|
6489
6521
|
<!-- 2d are SVG, 3d are HTML -->
|
|
@@ -6521,9 +6553,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6521
6553
|
<!-- for source analysis. -->
|
|
6522
6554
|
<xsl:variable name="base-pathname">
|
|
6523
6555
|
<xsl:value-of select="$generated-directory"/>
|
|
6524
|
-
<xsl:
|
|
6525
|
-
<xsl:text>asymptote/</xsl:text>
|
|
6526
|
-
</xsl:if>
|
|
6556
|
+
<xsl:text>asymptote/</xsl:text>
|
|
6527
6557
|
<xsl:apply-templates select="asymptote" mode="image-source-basename"/>
|
|
6528
6558
|
</xsl:variable>
|
|
6529
6559
|
<xsl:variable name="html-filename" select="concat($base-pathname, '.html')" />
|
|
@@ -6532,9 +6562,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6532
6562
|
<!-- insert correctly as a scaled instance -->
|
|
6533
6563
|
<xsl:variable name="html-source-filename">
|
|
6534
6564
|
<xsl:value-of select="$generated-directory-source"/>
|
|
6535
|
-
<xsl:
|
|
6536
|
-
<xsl:text>asymptote/</xsl:text>
|
|
6537
|
-
</xsl:if>
|
|
6565
|
+
<xsl:text>asymptote/</xsl:text>
|
|
6538
6566
|
<xsl:apply-templates select="asymptote" mode="image-source-basename"/>
|
|
6539
6567
|
<xsl:text>.html</xsl:text>
|
|
6540
6568
|
</xsl:variable>
|
|
@@ -6673,16 +6701,14 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6673
6701
|
<!-- Get the filename of the generated svg file -->
|
|
6674
6702
|
<xsl:variable name="svg-source-filename">
|
|
6675
6703
|
<xsl:value-of select="$generated-directory-source" />
|
|
6676
|
-
<xsl:
|
|
6677
|
-
<xsl:
|
|
6678
|
-
<xsl:
|
|
6679
|
-
|
|
6680
|
-
|
|
6681
|
-
<xsl:
|
|
6682
|
-
|
|
6683
|
-
|
|
6684
|
-
</xsl:choose>
|
|
6685
|
-
</xsl:if>
|
|
6704
|
+
<xsl:choose>
|
|
6705
|
+
<xsl:when test="latex-image">
|
|
6706
|
+
<xsl:text>latex-image/</xsl:text>
|
|
6707
|
+
</xsl:when>
|
|
6708
|
+
<xsl:when test="pf:prefigure">
|
|
6709
|
+
<xsl:text>prefigure/</xsl:text>
|
|
6710
|
+
</xsl:when>
|
|
6711
|
+
</xsl:choose>
|
|
6686
6712
|
<xsl:apply-templates select="latex-image|pf:prefigure" mode="image-source-basename"/>
|
|
6687
6713
|
<xsl:text>.svg</xsl:text>
|
|
6688
6714
|
</xsl:variable>
|
|
@@ -6920,7 +6946,9 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6920
6946
|
<!-- 2. Author must ensure the versions are next to file employed -->
|
|
6921
6947
|
<!-- 3. Formatting and case of suffixes is author's choice -->
|
|
6922
6948
|
<!-- 4. Order in suffix list is respected in output -->
|
|
6923
|
-
<!-- 5. Per-image, with global spec in
|
|
6949
|
+
<!-- 5. Per-image, with global spec in the publication file -->
|
|
6950
|
+
<!-- ("/publication/html/images/archive"); the old location -->
|
|
6951
|
+
<!-- within "docinfo" is honored while the former is silent -->
|
|
6924
6952
|
<!-- -->
|
|
6925
6953
|
<!-- The originating image template knows/computes the filename, -->
|
|
6926
6954
|
<!-- so this template accepts the filename, sans period and -->
|
|
@@ -6942,28 +6970,42 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
6942
6970
|
<!-- last in list that contains the image wins -->
|
|
6943
6971
|
<!-- Documented heavily as first "mid-range" specification -->
|
|
6944
6972
|
<!-- A single @from puts us in mid-range mode -->
|
|
6945
|
-
<xsl:when test="$
|
|
6946
|
-
<!--
|
|
6947
|
-
<!-- so
|
|
6973
|
+
<xsl:when test="$image-archives[@from]">
|
|
6974
|
+
<!-- An "archive" node may live in the publication file, -->
|
|
6975
|
+
<!-- so the id() lookup for its @from must be evaluated -->
|
|
6976
|
+
<!-- with the context switched into the (assembled) -->
|
|
6977
|
+
<!-- source, where the present "image" lives. -->
|
|
6948
6978
|
<xsl:variable name="the-image" select="." />
|
|
6949
|
-
<!--
|
|
6950
|
-
<!--
|
|
6951
|
-
<!-- Form two subtrees of all desendant nodes, rooted at -->
|
|
6979
|
+
<!-- Test each "archive" with @from, in document order: -->
|
|
6980
|
+
<!-- Form two subtrees of all descendant nodes, rooted at -->
|
|
6952
6981
|
<!-- (1) the image node -->
|
|
6953
6982
|
<!-- (2) the node pointed to by @from -->
|
|
6954
6983
|
<!-- The pipe forms a union of the nodes in the subtrees -->
|
|
6955
6984
|
<!-- "image" is on the subtree @from iff union is no larger -->
|
|
6956
|
-
|
|
6957
|
-
|
|
6985
|
+
<!-- Each containing "archive" records its formats, so the -->
|
|
6986
|
+
<!-- effective (last) one can be read off the collection. -->
|
|
6987
|
+
<xsl:variable name="containing-archives-rtf">
|
|
6988
|
+
<xsl:for-each select="$image-archives[@from]">
|
|
6989
|
+
<xsl:variable name="the-formats" select="string(.)"/>
|
|
6990
|
+
<xsl:variable name="the-from" select="string(@from)"/>
|
|
6991
|
+
<xsl:for-each select="$the-image">
|
|
6992
|
+
<xsl:if test="count($the-image/descendant-or-self::node()|id($the-from)/descendant-or-self::node())=count(id($the-from)/descendant-or-self::node())">
|
|
6993
|
+
<pi:archive-formats>
|
|
6994
|
+
<xsl:value-of select="$the-formats"/>
|
|
6995
|
+
</pi:archive-formats>
|
|
6996
|
+
</xsl:if>
|
|
6997
|
+
</xsl:for-each>
|
|
6998
|
+
</xsl:for-each>
|
|
6999
|
+
</xsl:variable>
|
|
6958
7000
|
<!-- We mimic XSL and the last applicable "archive" is effective -->
|
|
6959
7001
|
<!-- This way, big subtrees go first, included subtrees refine -->
|
|
6960
7002
|
<!-- @from can be an empty string and turn off the behavior -->
|
|
6961
7003
|
<!-- We grab the content of the last "archive" to be the formats -->
|
|
6962
|
-
<xsl:value-of select="$containing-archives[last()]
|
|
7004
|
+
<xsl:value-of select="exsl:node-set($containing-archives-rtf)/pi:archive-formats[last()]" />
|
|
6963
7005
|
</xsl:when>
|
|
6964
7006
|
<!-- global, presumes one only, ignores subtree versions -->
|
|
6965
|
-
<xsl:when test="$
|
|
6966
|
-
<xsl:value-of select="normalize-space($
|
|
7007
|
+
<xsl:when test="$image-archives[not(@from)]">
|
|
7008
|
+
<xsl:value-of select="normalize-space($image-archives)" />
|
|
6967
7009
|
</xsl:when>
|
|
6968
7010
|
<!-- nothing begets nothing -->
|
|
6969
7011
|
<xsl:otherwise />
|
|
@@ -10741,11 +10783,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
10741
10783
|
<xsl:when test="substring($raw-location,1,4) = 'http'">
|
|
10742
10784
|
<xsl:value-of select="$raw-location"/>
|
|
10743
10785
|
</xsl:when>
|
|
10744
|
-
<xsl:when test="not($b-managed-directories)">
|
|
10745
|
-
<xsl:value-of select="$raw-location"/>
|
|
10746
|
-
</xsl:when>
|
|
10747
10786
|
<xsl:otherwise>
|
|
10748
|
-
<!-- empty when not using managed directories -->
|
|
10749
10787
|
<xsl:value-of select="$external-directory"/>
|
|
10750
10788
|
<xsl:value-of select="$raw-location"/>
|
|
10751
10789
|
</xsl:otherwise>
|
|
@@ -10775,11 +10813,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
10775
10813
|
<xsl:when test="substring($raw-location,1,4) = 'http'">
|
|
10776
10814
|
<xsl:value-of select="$raw-location"/>
|
|
10777
10815
|
</xsl:when>
|
|
10778
|
-
<xsl:when test="not($b-managed-directories)">
|
|
10779
|
-
<xsl:value-of select="$raw-location"/>
|
|
10780
|
-
</xsl:when>
|
|
10781
10816
|
<xsl:otherwise>
|
|
10782
|
-
<!-- empty when not using managed directories -->
|
|
10783
10817
|
<xsl:value-of select="$external-directory"/>
|
|
10784
10818
|
<xsl:value-of select="$raw-location"/>
|
|
10785
10819
|
</xsl:otherwise>
|
|
@@ -11341,6 +11375,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
11341
11375
|
<xsl:value-of select="$external-directory"/>
|
|
11342
11376
|
<xsl:value-of select="@source"/>
|
|
11343
11377
|
</xsl:attribute>
|
|
11378
|
+
<xsl:apply-templates select="." mode="html-id-attribute"/>
|
|
11344
11379
|
<xsl:if test="@qname != ''">
|
|
11345
11380
|
<xsl:attribute name="data-qname">
|
|
11346
11381
|
<xsl:value-of select="@qname" />
|
|
@@ -11805,7 +11840,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
11805
11840
|
</xsl:call-template>
|
|
11806
11841
|
</xsl:if>
|
|
11807
11842
|
<!-- image (og,twitter) - if its URL can be constructed -->
|
|
11808
|
-
<xsl:if test="$b-has-baseurl and $
|
|
11843
|
+
<xsl:if test="$b-has-baseurl and $b-brandlogo">
|
|
11809
11844
|
<xsl:call-template name="social-meta-element">
|
|
11810
11845
|
<xsl:with-param name="og" select="true()"/>
|
|
11811
11846
|
<xsl:with-param name="twitter" select="true()"/>
|
|
@@ -11815,7 +11850,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
11815
11850
|
<!-- empty when not using managed directories -->
|
|
11816
11851
|
<xsl:value-of select="$baseurl"/>
|
|
11817
11852
|
<xsl:value-of select="$external-directory"/>
|
|
11818
|
-
<xsl:value-of select="$
|
|
11853
|
+
<xsl:value-of select="$brandlogo-source"/>
|
|
11819
11854
|
</xsl:with-param>
|
|
11820
11855
|
</xsl:call-template>
|
|
11821
11856
|
<!-- alttext -->
|
|
@@ -11866,7 +11901,7 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
11866
11901
|
<xsl:with-param name="property" select="'card'"/>
|
|
11867
11902
|
<xsl:with-param name="content">
|
|
11868
11903
|
<xsl:choose>
|
|
11869
|
-
<xsl:when test="$b-has-baseurl and $
|
|
11904
|
+
<xsl:when test="$b-has-baseurl and $b-brandlogo">
|
|
11870
11905
|
<xsl:text>summary_large_image</xsl:text>
|
|
11871
11906
|
</xsl:when>
|
|
11872
11907
|
<xsl:otherwise>
|
|
@@ -12564,6 +12599,116 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
12564
12599
|
</dialog>
|
|
12565
12600
|
</xsl:template>
|
|
12566
12601
|
|
|
12602
|
+
<!-- Read-aloud (embedded text-to-speech): a toolbar button, a minimal -->
|
|
12603
|
+
<!-- expanding player (prev, play/pause, next, continue, settings), and the -->
|
|
12604
|
+
<!-- settings dialog that button opens. -->
|
|
12605
|
+
<!-- -->
|
|
12606
|
+
<!-- The words below are literal English rather than localization -->
|
|
12607
|
+
<!-- string-ids. xsl/localizations is for content that reaches more than -->
|
|
12608
|
+
<!-- one output format, and this is an HTML-only control surface. Nothing -->
|
|
12609
|
+
<!-- here has a LaTeX or EPUB counterpart. The strings the player *speaks* -->
|
|
12610
|
+
<!-- live in js/src/read-aloud/strings.js for the same reason; a -->
|
|
12611
|
+
<!-- JavaScript-side translation layer will eventually address both halves. -->
|
|
12612
|
+
<xsl:template name="read-aloud-controls">
|
|
12613
|
+
<button id="ptx-read-aloud-button" class="ptx-read-aloud-button button" title="Read aloud" aria-expanded="false">
|
|
12614
|
+
<xsl:call-template name="insert-symbol">
|
|
12615
|
+
<xsl:with-param name="name" select="'text_to_speech'"/>
|
|
12616
|
+
</xsl:call-template>
|
|
12617
|
+
<span class="name">Read aloud</span>
|
|
12618
|
+
</button>
|
|
12619
|
+
<!-- player-ui.js retitles the toolbar and play/pause buttons as their -->
|
|
12620
|
+
<!-- states change; the titles here are the pre-JavaScript defaults. -->
|
|
12621
|
+
<div id="ptx-read-aloud-player" class="ptx-read-aloud-player" hidden="hidden" role="group" aria-label="Read aloud">
|
|
12622
|
+
<button id="ptx-read-aloud-prev" class="button" title="Previous sentence">
|
|
12623
|
+
<xsl:call-template name="insert-symbol">
|
|
12624
|
+
<xsl:with-param name="name" select="'skip_previous'"/>
|
|
12625
|
+
</xsl:call-template>
|
|
12626
|
+
</button>
|
|
12627
|
+
<button id="ptx-read-aloud-toggle" class="ptx-read-aloud-toggle button" title="Play">
|
|
12628
|
+
<span class="ptx-read-aloud-icon-play">
|
|
12629
|
+
<xsl:call-template name="insert-symbol">
|
|
12630
|
+
<xsl:with-param name="name" select="'play_arrow'"/>
|
|
12631
|
+
</xsl:call-template>
|
|
12632
|
+
</span>
|
|
12633
|
+
<span class="ptx-read-aloud-icon-pause">
|
|
12634
|
+
<xsl:call-template name="insert-symbol">
|
|
12635
|
+
<xsl:with-param name="name" select="'pause'"/>
|
|
12636
|
+
</xsl:call-template>
|
|
12637
|
+
</span>
|
|
12638
|
+
</button>
|
|
12639
|
+
<button id="ptx-read-aloud-next" class="button" title="Next sentence">
|
|
12640
|
+
<xsl:call-template name="insert-symbol">
|
|
12641
|
+
<xsl:with-param name="name" select="'skip_next'"/>
|
|
12642
|
+
</xsl:call-template>
|
|
12643
|
+
</button>
|
|
12644
|
+
<a id="ptx-read-aloud-continue" class="ptx-read-aloud-continue button" hidden="hidden">
|
|
12645
|
+
<xsl:text>Continue</xsl:text>
|
|
12646
|
+
<xsl:call-template name="insert-symbol">
|
|
12647
|
+
<xsl:with-param name="name" select="'play_arrow'"/>
|
|
12648
|
+
</xsl:call-template>
|
|
12649
|
+
</a>
|
|
12650
|
+
<button id="ptx-read-aloud-settings-button" class="ptx-read-aloud-settings-button button" title="Reading settings">
|
|
12651
|
+
<xsl:call-template name="insert-symbol">
|
|
12652
|
+
<xsl:with-param name="name" select="'tune'"/>
|
|
12653
|
+
</xsl:call-template>
|
|
12654
|
+
</button>
|
|
12655
|
+
<!-- No close button: the toolbar button that opened the player is -->
|
|
12656
|
+
<!-- a disclosure toggle and collapses it again, so a second -->
|
|
12657
|
+
<!-- dismissal control would only cost space in the navbar row. -->
|
|
12658
|
+
</div>
|
|
12659
|
+
<!-- Read-aloud settings, opened from the player's own settings button. -->
|
|
12660
|
+
<!-- Deliberately a sibling of the player rather than a child: the player -->
|
|
12661
|
+
<!-- is a flex row, and a dialog inside it would be a flex item. -->
|
|
12662
|
+
<dialog class="ptx-dialog ptx-read-aloud-settings-popup" id="ptx-read-aloud-settings-popup">
|
|
12663
|
+
<div class="ptx-readability-options-popup-controls">
|
|
12664
|
+
<h2 class="heading">Read aloud settings</h2>
|
|
12665
|
+
<button class="ptx-read-aloud-settings-close-button button" id="ptx-read-aloud-settings-close-button" title="Close">
|
|
12666
|
+
<xsl:call-template name="insert-symbol">
|
|
12667
|
+
<xsl:with-param name="name" select="'close'"/>
|
|
12668
|
+
</xsl:call-template>
|
|
12669
|
+
</button>
|
|
12670
|
+
</div>
|
|
12671
|
+
<div class="ptx-readability-options-group">
|
|
12672
|
+
<label for="ptx-read-aloud-voice">
|
|
12673
|
+
<xsl:call-template name="insert-symbol">
|
|
12674
|
+
<xsl:with-param name="name" select="'record_voice_over'"/>
|
|
12675
|
+
</xsl:call-template>
|
|
12676
|
+
<span>Voice</span>
|
|
12677
|
+
</label>
|
|
12678
|
+
<!-- options populated by settings.js from speechSynthesis.getVoices() -->
|
|
12679
|
+
<select id="ptx-read-aloud-voice"></select>
|
|
12680
|
+
<label class="ptx-readability-slider-label" for="ptx-read-aloud-rate">
|
|
12681
|
+
<xsl:call-template name="insert-symbol">
|
|
12682
|
+
<xsl:with-param name="name" select="'speed'"/>
|
|
12683
|
+
</xsl:call-template>
|
|
12684
|
+
<span>Reading speed</span>
|
|
12685
|
+
<output id="ptx-read-aloud-rate-value" for="ptx-read-aloud-rate">1×</output>
|
|
12686
|
+
</label>
|
|
12687
|
+
<input type="range" id="ptx-read-aloud-rate" min="0.5" max="2" step="0.1" value="1"/>
|
|
12688
|
+
<label for="ptx-read-aloud-asides">
|
|
12689
|
+
<xsl:call-template name="insert-symbol">
|
|
12690
|
+
<xsl:with-param name="name" select="'unfold_more'"/>
|
|
12691
|
+
</xsl:call-template>
|
|
12692
|
+
<span>Collapsed content</span>
|
|
12693
|
+
</label>
|
|
12694
|
+
<!-- What happens to a knowl's body once its title is read. -->
|
|
12695
|
+
<select id="ptx-read-aloud-asides">
|
|
12696
|
+
<option value="skip">Announce, do not read</option>
|
|
12697
|
+
<option value="read">Read automatically</option>
|
|
12698
|
+
</select>
|
|
12699
|
+
<label for="ptx-read-aloud-autoscroll">
|
|
12700
|
+
<input type="checkbox" id="ptx-read-aloud-autoscroll" checked="checked"/>
|
|
12701
|
+
<span>Follow along (auto-scroll)</span>
|
|
12702
|
+
</label>
|
|
12703
|
+
<!-- Unchecked by default: this one navigates, so it is opt-in. -->
|
|
12704
|
+
<label for="ptx-read-aloud-autocontinue">
|
|
12705
|
+
<input type="checkbox" id="ptx-read-aloud-autocontinue"/>
|
|
12706
|
+
<span>Continue to the next page automatically</span>
|
|
12707
|
+
</label>
|
|
12708
|
+
</div>
|
|
12709
|
+
</dialog>
|
|
12710
|
+
</xsl:template>
|
|
12711
|
+
|
|
12567
12712
|
<xsl:template name="embed-button">
|
|
12568
12713
|
<xsl:variable name="embed-localization">
|
|
12569
12714
|
<xsl:apply-templates select="." mode="type-name">
|
|
@@ -12839,6 +12984,10 @@ along with MathBook XML. If not, see <http://www.gnu.org/licenses/>.
|
|
|
12839
12984
|
<xsl:if test="$b-has-embed-button">
|
|
12840
12985
|
<xsl:call-template name="embed-button" />
|
|
12841
12986
|
</xsl:if>
|
|
12987
|
+
<!-- Read-aloud button and expanding player -->
|
|
12988
|
+
<xsl:if test="$b-read-aloud">
|
|
12989
|
+
<xsl:call-template name="read-aloud-controls" />
|
|
12990
|
+
</xsl:if>
|
|
12842
12991
|
<xsl:call-template name="readability-options" />
|
|
12843
12992
|
</span>
|
|
12844
12993
|
</xsl:template>
|
|
@@ -13725,6 +13874,8 @@ TODO:
|
|
|
13725
13874
|
<xsl:text>hasSage: </xsl:text><xsl:value-of select="$b-has-sage"/><xsl:text>,
</xsl:text>
|
|
13726
13875
|
<xsl:text>isReact: </xsl:text><xsl:value-of select="$b-debug-react"/><xsl:text>,
</xsl:text>
|
|
13727
13876
|
<xsl:text>htmlPresentation: </xsl:text><xsl:value-of select="$b-html-presentation"/><xsl:text>,
</xsl:text>
|
|
13877
|
+
<!-- Added to support read-aloud functionality; shouldn't hurt anything else -->
|
|
13878
|
+
<xsl:text>lang: "</xsl:text><xsl:value-of select="$document-language"/><xsl:text>",
</xsl:text>
|
|
13728
13879
|
<xsl:text>});
</xsl:text>
|
|
13729
13880
|
</script>
|
|
13730
13881
|
<!-- MathJax 4 CDN -->
|
|
@@ -14296,6 +14447,11 @@ TODO:
|
|
|
14296
14447
|
?v= query string busts the browser cache when the CLI version changes,
|
|
14297
14448
|
restoring the cache-busting that pretext_add_on.js?x=1 previously provided. -->
|
|
14298
14449
|
<script src="{$html.js.dir}/pretext-core.js?v={$cli.version}"></script>
|
|
14450
|
+
<!-- Read-aloud bundle: only when the publication option is on,
|
|
14451
|
+
so an opted-out build ships zero text-to-speech bytes. -->
|
|
14452
|
+
<xsl:if test="$b-read-aloud">
|
|
14453
|
+
<script src="{$html.js.dir}/pretext-read-aloud.js?v={$cli.version}"></script>
|
|
14454
|
+
</xsl:if>
|
|
14299
14455
|
</xsl:when>
|
|
14300
14456
|
<xsl:when test="$b-debug-react-local">
|
|
14301
14457
|
<script type="module" defer="" src="./static/js/main.js"></script>
|
|
@@ -14545,22 +14701,22 @@ TODO:
|
|
|
14545
14701
|
<!-- Brand Logo -->
|
|
14546
14702
|
<!-- Place image in masthead -->
|
|
14547
14703
|
<!-- We either create a link with an image, or just an image. -->
|
|
14548
|
-
<!-- NB: This template does nothing unless
|
|
14549
|
-
<!--
|
|
14550
|
-
<!--
|
|
14704
|
+
<!-- NB: This template does nothing unless a brand logo has -->
|
|
14705
|
+
<!-- been elected (publication file, or the deprecated -->
|
|
14706
|
+
<!-- "docinfo" location), which requires its @source. -->
|
|
14551
14707
|
<xsl:template name="brand-logo">
|
|
14552
|
-
<xsl:if test="$
|
|
14708
|
+
<xsl:if test="$b-brandlogo">
|
|
14553
14709
|
<xsl:variable name="location">
|
|
14554
14710
|
<!-- empty when not using managed directories -->
|
|
14555
14711
|
<xsl:value-of select="$external-directory"/>
|
|
14556
|
-
<xsl:value-of select="$
|
|
14712
|
+
<xsl:value-of select="$brandlogo-source"/>
|
|
14557
14713
|
</xsl:variable>
|
|
14558
14714
|
|
|
14559
14715
|
<xsl:choose>
|
|
14560
|
-
<xsl:when test="$
|
|
14716
|
+
<xsl:when test="not($brandlogo-url = '')">
|
|
14561
14717
|
<a id="logo-link" class="logo-link" target="_blank" >
|
|
14562
14718
|
<xsl:attribute name="href">
|
|
14563
|
-
<xsl:value-of select="$
|
|
14719
|
+
<xsl:value-of select="$brandlogo-url"/>
|
|
14564
14720
|
</xsl:attribute>
|
|
14565
14721
|
<img src="{$location}" alt="Logo image"/>
|
|
14566
14722
|
</a>
|
|
@@ -14694,7 +14850,24 @@ TODO:
|
|
|
14694
14850
|
<!-- We put page-margins-attributes only on printout sections -->
|
|
14695
14851
|
<xsl:template match="*" mode="page-margins-attribute"/>
|
|
14696
14852
|
|
|
14853
|
+
<!-- A PROJECT-LIKE acting as a standalone printout is paginated by the -->
|
|
14854
|
+
<!-- same javascript, so it needs the same data. It has no margin -->
|
|
14855
|
+
<!-- attributes of its own, so "printout-margin" falls through to the -->
|
|
14856
|
+
<!-- publisher's worksheet defaults for all four sides. -->
|
|
14857
|
+
<xsl:template match="&PROJECT-LIKE;" mode="page-margins-attribute">
|
|
14858
|
+
<xsl:variable name="b-standalone-printout">
|
|
14859
|
+
<xsl:apply-templates select="." mode="is-standalone-printout"/>
|
|
14860
|
+
</xsl:variable>
|
|
14861
|
+
<xsl:if test="$b-standalone-printout = 'true'">
|
|
14862
|
+
<xsl:call-template name="printout-margins-attribute"/>
|
|
14863
|
+
</xsl:if>
|
|
14864
|
+
</xsl:template>
|
|
14865
|
+
|
|
14697
14866
|
<xsl:template match="&PRINTOUT;" mode="page-margins-attribute">
|
|
14867
|
+
<xsl:call-template name="printout-margins-attribute"/>
|
|
14868
|
+
</xsl:template>
|
|
14869
|
+
|
|
14870
|
+
<xsl:template name="printout-margins-attribute">
|
|
14698
14871
|
<xsl:attribute name="data-margins">
|
|
14699
14872
|
<!-- A space-separated list for top, right, bottom, and left margins -->
|
|
14700
14873
|
<xsl:apply-templates select="." mode="printout-margin">
|
|
@@ -14722,7 +14895,20 @@ TODO:
|
|
|
14722
14895
|
<!-- Add data-* attributes for headers and footers -->
|
|
14723
14896
|
<xsl:template match="*" mode="page-header-footer-attributes"/>
|
|
14724
14897
|
|
|
14898
|
+
<xsl:template match="&PROJECT-LIKE;" mode="page-header-footer-attributes">
|
|
14899
|
+
<xsl:variable name="b-standalone-printout">
|
|
14900
|
+
<xsl:apply-templates select="." mode="is-standalone-printout"/>
|
|
14901
|
+
</xsl:variable>
|
|
14902
|
+
<xsl:if test="$b-standalone-printout = 'true'">
|
|
14903
|
+
<xsl:call-template name="printout-header-footer-attributes"/>
|
|
14904
|
+
</xsl:if>
|
|
14905
|
+
</xsl:template>
|
|
14906
|
+
|
|
14725
14907
|
<xsl:template match="&PRINTOUT;" mode="page-header-footer-attributes">
|
|
14908
|
+
<xsl:call-template name="printout-header-footer-attributes"/>
|
|
14909
|
+
</xsl:template>
|
|
14910
|
+
|
|
14911
|
+
<xsl:template name="printout-header-footer-attributes">
|
|
14726
14912
|
<xsl:if test="not($ws-header-first-left = '')">
|
|
14727
14913
|
<xsl:attribute name="data-header-first-left">
|
|
14728
14914
|
<xsl:value-of select="normalize-space($ws-header-first-left)"/>
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
<?xml version='1.0'?> <!-- As XML file -->
|
|
2
2
|
|
|
3
3
|
<!--********************************************************************
|
|
4
|
-
Copyright 2015
|
|
4
|
+
Copyright (C) 2015-2026 Robert A. Beezer
|
|
5
5
|
|
|
6
|
-
This file is part of
|
|
6
|
+
This file is part of PreTeXt.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
PreTeXt is free software: you can redistribute it and/or modify
|
|
9
9
|
it under the terms of the GNU General Public License as published by
|
|
10
10
|
the Free Software Foundation, either version 2 or version 3 of the
|
|
11
11
|
License (at your option).
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
PreTeXt is distributed in the hope that it will be useful,
|
|
14
14
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
15
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
16
|
GNU General Public License for more details.
|
|
17
17
|
|
|
18
18
|
You should have received a copy of the GNU General Public License
|
|
19
|
-
along with
|
|
19
|
+
along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
|
|
20
20
|
*********************************************************************-->
|
|
21
21
|
|
|
22
22
|
<!-- http://pimpmyxslt.com/articles/entity-tricks-part2/ -->
|