summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'MLEB/Translate/src/Validation/Validators/NewlineValidator.php')
-rw-r--r--MLEB/Translate/src/Validation/Validators/NewlineValidator.php102
1 files changed, 102 insertions, 0 deletions
diff --git a/MLEB/Translate/src/Validation/Validators/NewlineValidator.php b/MLEB/Translate/src/Validation/Validators/NewlineValidator.php
new file mode 100644
index 00000000..36525569
--- /dev/null
+++ b/MLEB/Translate/src/Validation/Validators/NewlineValidator.php
@@ -0,0 +1,102 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Validation\Validators;
+
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
+use TMessage;
+
+/**
+ * Ensures that the translation has the same number of newlines as the source
+ * message at the beginning of the string.
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2019.09
+ */
+class NewlineValidator implements MessageValidator {
+ public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues {
+ $translation = $message->translation();
+ $definition = $message->definition();
+
+ $definitionStartNewline = $this->getStartingNewLinesCount( $definition );
+ $translationStartNewline = $this->getStartingNewLinesCount( $translation );
+
+ $failingChecks = $this->validateStartingNewline(
+ $definitionStartNewline, $translationStartNewline
+ );
+
+ return $this->createIssues( $failingChecks );
+ }
+
+ protected function getStartingNewLinesCount( string $str ): int {
+ return strspn( $str, "\n" );
+ }
+
+ protected function getEndingNewLineCount( string $str ): int {
+ return strspn( strrev( $str ), "\n" );
+ }
+
+ protected function validateStartingNewline(
+ int $definitionStartNewline,
+ int $translationStartNewline
+ ): array {
+ $failingChecks = [];
+ if ( $definitionStartNewline < $translationStartNewline ) {
+ // Extra whitespace at beginning
+ $failingChecks[] = [
+ 'extra-start',
+ $translationStartNewline - $definitionStartNewline
+ ];
+ } elseif ( $definitionStartNewline > $translationStartNewline ) {
+ // Missing whitespace at beginning
+ $failingChecks[] = [
+ 'missing-start',
+ $definitionStartNewline - $translationStartNewline
+ ];
+ }
+
+ return $failingChecks;
+ }
+
+ protected function validateEndingNewline(
+ int $definitionEndNewline,
+ int $translationEndNewline
+ ): array {
+ $failingChecks = [];
+ if ( $definitionEndNewline < $translationEndNewline ) {
+ // Extra whitespace at end
+ $failingChecks[] = [
+ 'extra-end',
+ $translationEndNewline - $definitionEndNewline
+ ];
+ } elseif ( $definitionEndNewline > $translationEndNewline ) {
+ // Missing whitespace at end
+ $failingChecks[] = [
+ 'missing-end',
+ $definitionEndNewline - $translationEndNewline
+ ];
+ }
+
+ return $failingChecks;
+ }
+
+ protected function createIssues( array $failingChecks ): ValidationIssues {
+ $issues = new ValidationIssues();
+ foreach ( $failingChecks as [ $subType, $count ] ) {
+ $issue = new ValidationIssue(
+ 'newline',
+ $subType,
+ "translate-checks-newline-$subType",
+ [ 'COUNT', $count ]
+ );
+
+ $issues->add( $issue );
+ }
+
+ return $issues;
+ }
+}
+
+class_alias( NewlineValidator::class, '\MediaWiki\Extensions\Translate\NewlineValidator' );