27 private WikiImporterFactory $wikiImporterFactory;
29 private RevisionLookup $revisionLookup;
30 private ?Title $bundleTitle;
31 private ?Closure $importCompleteCallback;
33 public function __construct(
34 WikiImporterFactory $wikiImporterFactory,
36 RevisionLookup $revisionLookup
38 $this->wikiImporterFactory = $wikiImporterFactory;
39 $this->translatablePageParser = $translatablePageParser;
40 $this->revisionLookup = $revisionLookup;
43 public function import(
44 string $importFilePath,
45 string $interwikiPrefix,
46 bool $assignKnownUsers,
50 $importSource = ImportStreamSource::newFromFile( $importFilePath );
51 if ( !$importSource->isOK() ) {
53 "Error while reading import file '$importFilePath': " . $importSource->getMessage()->text()
57 $wikiImporter = $this->wikiImporterFactory->getWikiImporter( $importSource->value );
58 $wikiImporter->setUsernamePrefix( $interwikiPrefix, $assignKnownUsers );
59 $wikiImporter->setPageOutCallback( [ $this,
'pageCallback' ] );
63 $this->bundleTitle =
null;
64 $importResult = $wikiImporter->doImport();
65 }
catch ( Exception $e ) {
73 if ( $importResult ===
false ) {
77 if ( !$this->bundleTitle ) {
81 if ( $this->importCompleteCallback ) {
83 call_user_func( $this->importCompleteCallback, $this->bundleTitle );
88 $this->addReadyTagForTranslatablePage( $this->bundleTitle );
89 $this->logImport( $user, $this->bundleTitle, $comment );
91 return $this->bundleTitle;
94 public function pageCallback( PageIdentity $pageIdentity ):
void {
96 $this->bundleTitle ??= Title::newFromPageIdentity( $pageIdentity );
99 public function setImportCompleteCallback( callable $callable ):
void {
100 $this->importCompleteCallback = Closure::fromCallable( $callable );
103 private function logImport( UserIdentity $user, Title $bundle, ?
string $comment ):
void {
104 $entry =
new ManualLogEntry(
'import',
'translatable-bundle' );
105 $entry->setPerformer( $user );
106 $entry->setTarget( $bundle );
107 $logId = $entry->insert();
109 $entry->setComment( $comment );
111 $entry->publish( $logId );
115 private function addReadyTagForTranslatablePage( Title $translatablePageTitle ) {
116 $revisionRecord = $this->revisionLookup->getRevisionByTitle( $translatablePageTitle );
117 if ( !$revisionRecord ) {
119 "Revision record could not be found for imported page: {$translatablePageTitle}"
123 $content = $revisionRecord->getContent( SlotRecord::MAIN );
124 if ( !$content instanceof TextContent ) {
126 "Content in revision record for {$translatablePageTitle} is not of type TextContent"
130 if ( $this->translatablePageParser->containsMarkup( $content->getText() ) ) {
132 $page = TranslatablePage::newFromTitle( Title::newFromLinkTarget( $translatablePageTitle ) );
133 $page->addReadyTag( $revisionRecord->getId() );