Jarry1250 has uploaded a new change for review.
https://gerrit.wikimedia.org/r/213797
Change subject: Fiddle with makeTranslationReady()
......................................................................
Fiddle with makeTranslationReady()
I'm not sure why this suddenly wasn't working as intended, but in any case
rearrange a few code paths to fix. Also, use cloneNode() instead of clone
as there seems to have been a change in behaviour (maybe on HHVM vs Zend?).
Change-Id: I0b833e62f4728ebc492dfc827246b890a8513ad3
---
M SVGFile.php
1 file changed, 83 insertions(+), 60 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/TranslateSvg
refs/changes/97/213797/1
diff --git a/SVGFile.php b/SVGFile.php
index 609833b..214360e 100644
--- a/SVGFile.php
+++ b/SVGFile.php
@@ -159,6 +159,17 @@
}
}
+ // Reset $translatableNodes
+ $translatableNodes = array();
+ $tspans = $this->document->getElementsByTagName( 'tspan' );
+ $texts = $this->document->getElementsByTagName( 'text' );
+ foreach ( $tspans as $tspan ) {
+ array_push( $translatableNodes, $tspan );
+ }
+ foreach ( $texts as $text ) {
+ array_push( $translatableNodes, $text );
+ }
+
// Create id attributes for text, tspan nodes missing it
foreach ( $translatableNodes as $translatableNode ) {
if ( !$translatableNode->hasAttribute( 'id' ) ) {
@@ -171,7 +182,7 @@
$textLength = $this->document->getElementsByTagName( 'text'
)->length;
for ( $i = 0; $i < $textLength; $i++ ) {
/** @var DOMElement $text */
- $text = $texts->item( $i );
+ $text = $this->document->getElementsByTagName( 'text'
)->item( $i );
// Text strings like $1, $2 will cause problems later
because
// TranslateSvgUtils::replaceIndicesRecursive() will
try to replace them
@@ -181,56 +192,26 @@
}
// Sort out switches
- if ( $text->parentNode->nodeName === 'switch'
- || $text->parentNode->nodeName === 'svg:switch'
+ if ( $text->parentNode->nodeName !== 'switch'
+ && $text->parentNode->nodeName !== 'svg:switch'
) {
- // Existing but valid switch e.g. from previous
translations
- $switch = $text->parentNode;
- $siblings = $switch->childNodes;
- foreach ( $siblings as $sibling ) {
- /** @var DOMElement $sibling */
-
- $languagesPresent = array();
- if ( $sibling->nodeType ===
XML_TEXT_NODE ) {
- if ( trim(
$sibling->textContent ) !== '' ) {
- // Text content inside
switch but outside text tags is awkward.
- return false;
- }
- } elseif ( $sibling->nodeType ===
XML_ELEMENT_NODE ) {
- // Only text tags are allowed
inside switches
- if ( $sibling->nodeName !==
'text' && $sibling->nodeName !== 'svg:text' ) {
- return false;
- }
- $language =
$sibling->hasAttribute( 'systemLanguage' ) ?
- $sibling->getAttribute(
'systemLanguage' ) : 'fallback';
- $realLangs = preg_split( '/,
*/', $language );
- foreach( $realLangs as
$realLang ) {
- if( count( $realLangs )
> 1 ) {
- // Although the
SVG spec supports multi-language text tags (e.g. "en,fr,de")
- // these are a
really poor idea since (a) they are confusing to read and (b) the
- // desired
translations could diverge at any point. So get rid.
-
$singleLanguageNode = clone $sibling;
-
$singleLanguageNode->setAttribute( 'systemLanguage', $realLang );
-
$switch->appendChild( $singleLanguageNode );
- }
- if ( in_array(
$realLang, $languagesPresent ) ) {
- // Two tags for
the same language
- return false;
- }
- $languagesPresent[] =
$realLang;
- }
-
- if( count( $realLangs ) > 1 ) {
- // If still present,
remove the original multi-language
- $switch->removeChild(
$sibling );
- }
- }
- }
- } else {
+ // Every text should now be in a switch
$switch = $this->document->createElementNS(
$defaultNS, 'switch' );
$text->parentNode->insertBefore( $switch, $text
);
// Move node into new sibling <switch> element
$switch->appendChild( $text );
+ }
+
+ // Transforms on individual texts are particular
problematic, should move it to the <switch>
+ if ( $text->hasAttribute( 'transform' ) ) {
+ $text->parentNode->setAttribute( 'transform',
$text->getAttribute( 'transform' ) );
+ $text->removeAttribute( 'transform' );
+ }
+
+ // Non-translatable style elements on texts get lost,
so bump up to switch
+ if ( $text->hasAttribute( 'style' ) ) {
+ $style = $text->getAttribute( 'style' );
+ $text->parentNode->setAttribute( 'style',
$style );
}
$numChildren = $text->childNodes->length;
@@ -244,17 +225,59 @@
return false;
}
}
+ }
- // Transforms on individual texts are particular
problematic, should move it to the <switch>
- if ( $text->hasAttribute( 'transform' ) ) {
- $switch->setAttribute( 'transform',
$text->getAttribute( 'transform' ) );
- $text->removeAttribute( 'transform' );
- }
+ $switchLength = $this->document->getElementsByTagName( 'switch'
)->length;
+ for ( $i = 0; $i < $switchLength; $i++ ) {
+ $switch = $this->document->getElementsByTagName(
'switch' )->item( $i );
+ $siblings = $switch->childNodes;
+ foreach ( $siblings as $sibling ) {
+ /** @var DOMElement $sibling */
- // Non-translatable style elements on texts get lost,
so bump up to switch
- if ( $text->hasAttribute( 'style' ) ) {
- $style = $text->getAttribute( 'style' );
- $text->parentNode->setAttribute( 'style',
$style );
+ $languagesPresent = array();
+ if ( $sibling->nodeType === XML_TEXT_NODE ) {
+ if ( trim( $sibling->textContent ) !==
'' ) {
+ // Text content inside switch
but outside text tags is awkward.
+ return false;
+ }
+ continue;
+ } elseif ( $sibling->nodeType !==
XML_ELEMENT_NODE ) {
+ // Only text tags are allowed inside
switches
+ return false;
+ }
+
+ if ( $sibling->nodeName !== 'text' &&
$sibling->nodeName !== 'svg:text' ) {
+ return false;
+ }
+
+ $language = $sibling->hasAttribute(
'systemLanguage' ) ?
+ $sibling->getAttribute(
'systemLanguage' ) : 'fallback';
+ $realLangs = preg_split( '/, */', $language );
+ foreach ( $realLangs as $realLang ) {
+ if ( in_array( $realLang,
$languagesPresent ) ) {
+ // Two tags for the same
language
+ return false;
+ }
+ $languagesPresent[] = $realLang;
+ }
+ if ( count( $realLangs ) === 1 ) {
+ continue;
+ }
+ foreach ( $realLangs as $realLang ) {
+ // Although the SVG spec supports
multi-language text tags (e.g. "en,fr,de")
+ // these are a really poor idea since
(a) they are confusing to read and (b) the
+ // desired translations could diverge
at any point. So get rid.
+ $singleLanguageNode =
$sibling->cloneNode( true );
+ $singleLanguageNode->setAttribute(
'systemLanguage', $realLang );
+
+ // @todo: Should also go into tspans
and change their ids, too.
+ // $prefix = implode( '-', explode(
'-', $singleLanguageNode->getAttribute( 'id' ), -1 ) );
+ // $singleLanguageNode->setAttribute(
'id', "$prefix-$realLang" );
+
+ // Add in new element
+ $switch->appendChild(
$singleLanguageNode );
+ }
+ $switch->removeChild( $sibling );
}
}
@@ -296,13 +319,13 @@
/** @var DOMElement $fallbackText */
$fallbackText = $fallback->item( 0 );
- $textId = $fallbackText->getAttribute( 'id' );
+ $fallbackTextId = $fallbackText->getAttribute( 'id' );
for ( $j = 0; $j < $count; $j++ ) {
// Don't want to manipulate actual node
/** @var DOMElement $actualNode */
$actualNode = $texts->item( $j );
- $text = clone $actualNode;
+ $text = $actualNode->cloneNode( true );
$numChildren = $text->childNodes->length;
$hasActualTextContent =
TranslateSvgUtils::hasActualTextContent( $text );
$lang = $text->hasAttribute( 'systemLanguage' )
? $text->getAttribute( 'systemLanguage' ) : 'fallback';
@@ -320,7 +343,7 @@
$childId =
$childTspan->getAttribute( 'id' );
$translations[$childId][$langCode] = TranslateSvgUtils::nodeToArray( $child );
-
$translations[$childId][$langCode]['data-parent'] = $textId;
+
$translations[$childId][$langCode]['data-parent'] = $fallbackTextId;
if ( $text->hasAttribute(
'data-children' ) ) {
$existing =
$text->getAttribute( 'data-children' );
$text->setAttribute(
'data-children', "$existing|$childId" );
@@ -336,9 +359,9 @@
if ( $hasActualTextContent ) {
// If the <text> has *its own* text
content, rather than just <tspan>s, register it
// for translation.
- $translations[$textId][$langCode] =
TranslateSvgUtils::nodeToArray( $text );
+
$translations[$fallbackTextId][$langCode] = TranslateSvgUtils::nodeToArray(
$text );
} else {
-
$this->filteredTextNodes[$textId][$langCode] = TranslateSvgUtils::nodeToArray(
$text );
+
$this->filteredTextNodes[$fallbackTextId][$langCode] =
TranslateSvgUtils::nodeToArray( $text );
}
$savedLang = ( $langCode === 'fallback' ) ?
$this->fallbackLanguage : $langCode;
$this->savedLanguages[] = $savedLang;
--
To view, visit https://gerrit.wikimedia.org/r/213797
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0b833e62f4728ebc492dfc827246b890a8513ad3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/TranslateSvg
Gerrit-Branch: master
Gerrit-Owner: Jarry1250 <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits