|
17 | 17 | ***************************************************************************/ |
18 | 18 | """ |
19 | 19 |
|
20 | | -import re |
21 | | -import shutil |
22 | 20 | import tempfile |
23 | 21 | from enum import Enum |
24 | | -from glob import glob |
25 | 22 | from pathlib import Path |
26 | 23 | from typing import Dict, List, Optional, TypedDict, Union, cast |
27 | 24 |
|
|
52 | 49 | from .offliners import BaseOffliner |
53 | 50 | from .project import ProjectConfiguration, ProjectProperties |
54 | 51 | from .utils.file_utils import ( |
| 52 | + copy_additional_project_files, |
55 | 53 | copy_attachments, |
| 54 | + get_project_like_files, |
56 | 55 | set_relative_embed_layer_symbols_on_project, |
57 | 56 | ) |
58 | 57 | from .utils.logger import logger |
@@ -198,16 +197,14 @@ def _get_additional_project_files(self, project: QgsProject) -> List[str]: |
198 | 197 | ): |
199 | 198 | additional_project_files.append(str(image_decoration_path)) |
200 | 199 |
|
201 | | - # Check for project plugin asset |
202 | | - plugin_file = Path("{}.qml".format(str(self.original_filename)[:-4])) # noqa: UP032 |
203 | | - if plugin_file.exists(): |
204 | | - additional_project_files.append(str(plugin_file)) |
205 | | - |
206 | | - # Check for project translations asset |
207 | | - for translation_file in glob( |
208 | | - f"{str(self.original_filename)[:-4]}_[A-Za-z][A-Za-z].qm" |
209 | | - ): |
210 | | - additional_project_files.append(str(translation_file)) |
| 200 | + # Get project plugin asset |
| 201 | + additional_project_files += get_project_like_files( |
| 202 | + self.original_filename, ".qml" |
| 203 | + ) |
| 204 | + # Get project translations assets |
| 205 | + additional_project_files += get_project_like_files( |
| 206 | + self.original_filename, "_[A-Za-z][A-Za-z].qm" |
| 207 | + ) |
211 | 208 |
|
212 | 209 | return additional_project_files |
213 | 210 |
|
@@ -362,49 +359,11 @@ def _convert(self, project: QgsProject) -> None: # noqa: PLR0912, PLR0915 |
362 | 359 |
|
363 | 360 | # copy additional project files (e.g. layout images, symbology images, etc) |
364 | 361 | if additional_project_files: |
365 | | - project_path = Path(project.fileName()).parent |
366 | | - for additional_project_file in additional_project_files: |
367 | | - additional_project_file_path = Path(additional_project_file) |
368 | | - additional_project_file_name = additional_project_file_path.name |
369 | | - additional_project_file_relative_path = ( |
370 | | - additional_project_file_path.relative_to(project_path) |
371 | | - ) |
372 | | - |
373 | | - destination_file = self._export_filename.parent.joinpath( |
374 | | - additional_project_file_relative_path |
375 | | - ).resolve() |
376 | | - destination_file.parent.mkdir(parents=True, exist_ok=True) |
377 | | - |
378 | | - # Project plugins and translation files require for their file name |
379 | | - # to match that of their associated project file (e.g myproject.qgs, |
380 | | - # myproject_bg.qm for a translation file and myproject.qml for a |
381 | | - # project plugin). We must therefore adapt these file names to match |
382 | | - # the generated project file name |
383 | | - original_project_filename_without_extension = str( |
384 | | - self.original_filename |
385 | | - )[:-4] |
386 | | - export_project_filename_without_extension = str( |
387 | | - export_project_filename.name |
388 | | - )[:-4] |
389 | | - if ( |
390 | | - str(additional_project_file_path) |
391 | | - == f"{original_project_filename_without_extension}.qml" |
392 | | - ): |
393 | | - destination_file = destination_file.parent.joinpath( |
394 | | - f"{export_project_filename_without_extension}.qml" |
395 | | - ) |
396 | | - |
397 | | - elif additional_project_file_name.endswith(".qm"): |
398 | | - match = re.match( |
399 | | - rf"^{re.escape(original_project_filename_without_extension)}(_[A-Za-z]{{2}}\.qm)$", |
400 | | - str(additional_project_file_path), |
401 | | - ) |
402 | | - if match: |
403 | | - destination_file = destination_file.parent.joinpath( |
404 | | - f"{export_project_filename_without_extension}{match.group(1)}" |
405 | | - ) |
406 | | - |
407 | | - shutil.copy(additional_project_file, str(destination_file)) |
| 362 | + copy_additional_project_files( |
| 363 | + project.fileName(), |
| 364 | + self._export_filename, |
| 365 | + additional_project_files, |
| 366 | + ) |
408 | 367 |
|
409 | 368 | # save the offline project twice so that the offline plugin can "know" that it's a relative path |
410 | 369 | QgsProject.instance().write(str(export_project_filename)) |
|
0 commit comments