Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 15
CRAP
0.00% covered (danger)
0.00%
0 / 1
PageMoveCollection
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 15
600
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 getTranslatablePage
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getTranslationPagesPair
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getUnitPagesPair
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSubpagesPair
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getTranslatableSubpages
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getTranslationPages
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getUnitPages
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSubpages
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getListOfPages
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
 getListOfPagesToRedirect
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 getOldPagesFromList
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getPagePairFromList
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 getLeaveRedirectPairFromList
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
20
 getTalkpages
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\PageTranslation;
5
6use MediaWiki\Title\Title;
7
8/**
9 * Collection of pages potentially affected by a page move operation.
10 * @author Abijeet Patro
11 * @license GPL-2.0-or-later
12 * @since 2021.09
13 */
14class PageMoveCollection {
15    private PageMoveOperation $translatablePage;
16    /** @var PageMoveOperation[] */
17    private array $translationPagePairs;
18    /** @var PageMoveOperation[] */
19    private array $unitPagesPairs;
20    /** @var PageMoveOperation[] */
21    private array $subpagesPairs;
22    /** @var PageMoveOperation[] */
23    private array $talkpagesPairs;
24    /** @var Title[] */
25    private array $translatableSubpages;
26
27    /**
28     * @param PageMoveOperation $translatablePage
29     * @param PageMoveOperation[] $translationPagePairs Translation pages
30     * @param PageMoveOperation[] $unitPagesPairs Translation unit pages
31     * @param PageMoveOperation[] $subpagesPairs Non translatable sub pages
32     * @param Title[] $translatableSubpages
33     */
34    public function __construct(
35        PageMoveOperation $translatablePage,
36        array $translationPagePairs,
37        array $unitPagesPairs,
38        array $subpagesPairs,
39        array $translatableSubpages
40    ) {
41        $this->translatablePage = $translatablePage;
42        $this->translationPagePairs = $translationPagePairs;
43        $this->unitPagesPairs = $unitPagesPairs;
44        $this->subpagesPairs = $subpagesPairs;
45        $this->translatableSubpages = $translatableSubpages;
46
47        // Populate the talk pages from the various inputs.
48        $this->talkpagesPairs = $this->getTalkpages(
49            $this->translatablePage, ...$translationPagePairs, ...$unitPagesPairs, ...$subpagesPairs
50        );
51    }
52
53    public function getTranslatablePage(): PageMoveOperation {
54        return $this->translatablePage;
55    }
56
57    /** @return PageMoveOperation[] */
58    public function getTranslationPagesPair(): array {
59        return $this->translationPagePairs;
60    }
61
62    /** @return PageMoveOperation[] */
63    public function getUnitPagesPair(): array {
64        return $this->unitPagesPairs;
65    }
66
67    /** @return PageMoveOperation[] */
68    public function getSubpagesPair(): array {
69        return $this->subpagesPairs;
70    }
71
72    /** @return Title[] */
73    public function getTranslatableSubpages(): array {
74        return $this->translatableSubpages;
75    }
76
77    /** @return Title[] */
78    public function getTranslationPages(): array {
79        return $this->getOldPagesFromList( $this->translationPagePairs );
80    }
81
82    /** @return Title[] */
83    public function getUnitPages(): array {
84        return $this->getOldPagesFromList( $this->unitPagesPairs );
85    }
86
87    /** @return Title[] */
88    public function getSubpages(): array {
89        return $this->getOldPagesFromList( $this->subpagesPairs );
90    }
91
92    /** @return string[] */
93    public function getListOfPages(): array {
94        $pageList = [
95            $this->translatablePage->getOldTitle()->getPrefixedText() =>
96                $this->translatablePage->getNewTitle() ?
97                    $this->translatablePage->getNewTitle()->getPrefixedText() : null
98        ];
99        $pageList = array_merge( $pageList, $this->getPagePairFromList( $this->translationPagePairs ) );
100        $pageList = array_merge( $pageList, $this->getPagePairFromList( $this->unitPagesPairs ) );
101        $pageList = array_merge( $pageList, $this->getPagePairFromList( $this->subpagesPairs ) );
102        $pageList = array_merge( $pageList, $this->getPagePairFromList( $this->talkpagesPairs ) );
103
104        return $pageList;
105    }
106
107    /** @return array<string,bool> */
108    public function getListOfPagesToRedirect(): array {
109        $redirects = [
110            $this->translatablePage->getOldTitle()->getPrefixedText() =>
111                    $this->translatablePage->shouldLeaveRedirect()
112        ];
113
114        $redirects = array_merge( $redirects, $this->getLeaveRedirectPairFromList( $this->translationPagePairs ) );
115        $redirects = array_merge( $redirects, $this->getLeaveRedirectPairFromList( $this->unitPagesPairs ) );
116        $redirects = array_merge( $redirects, $this->getLeaveRedirectPairFromList( $this->subpagesPairs ) );
117        $redirects = array_merge( $redirects, $this->getLeaveRedirectPairFromList( $this->talkpagesPairs ) );
118
119        return $redirects;
120    }
121
122    /**
123     * @param PageMoveOperation[] $pagePairs
124     * @return Title[]
125     */
126    private function getOldPagesFromList( array $pagePairs ): array {
127        $oldTitles = [];
128        foreach ( $pagePairs as $pair ) {
129            $oldTitles[] = $pair->getOldTitle();
130        }
131
132        return $oldTitles;
133    }
134
135    /** @return string[] */
136    private function getPagePairFromList( array $pagePairs ): array {
137        $pairs = [];
138        foreach ( $pagePairs as $pair ) {
139            $pairs[ $pair->getOldTitle()->getPrefixedText() ] =
140                $pair->getNewTitle() ? $pair->getNewTitle()->getPrefixedText() : null;
141        }
142
143        return $pairs;
144    }
145
146    /** @return array<string,bool> */
147    private function getLeaveRedirectPairFromList( array $pagePairs ): array {
148        $pairs = [];
149        foreach ( $pagePairs as $pair ) {
150            if ( $pair->shouldLeaveRedirect() ) {
151                $pairs[ $pair->getOldTitle()->getPrefixedText() ] = true;
152                $talkpage = $pair->getOldTalkPage();
153                if ( $talkpage ) {
154                    $pairs[ $talkpage->getPrefixedText() ] = true;
155                }
156            }
157        }
158
159        return $pairs;
160    }
161
162    /** @return PageMoveOperation[] */
163    private function getTalkpages( PageMoveOperation ...$allMoveOperations ): array {
164        $talkpagesPairs = [];
165        foreach ( $allMoveOperations as $moveOperation ) {
166            if ( $moveOperation->hasTalkpage() ) {
167                $talkpagesPairs[] = new PageMoveOperation(
168                    $moveOperation->getOldTalkpage(), $moveOperation->getNewTalkpage()
169                );
170            }
171        }
172        return $talkpagesPairs;
173    }
174}