mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-23 00:02:38 -05:00
138 lines
4.8 KiB
Python
138 lines
4.8 KiB
Python
"""
|
|
***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************
|
|
"""
|
|
|
|
import re
|
|
from dataclasses import (
|
|
dataclass,
|
|
field
|
|
)
|
|
from pathlib import Path
|
|
from typing import (
|
|
Optional,
|
|
List,
|
|
Dict
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class ParsedDescription:
|
|
"""
|
|
Results of parsing a description file
|
|
"""
|
|
|
|
GROUP_ID_REGEX = re.compile(r'^[^\s(]+')
|
|
|
|
grass_command: Optional[str] = None
|
|
short_description: Optional[str] = None
|
|
name: Optional[str] = None
|
|
display_name: Optional[str] = None
|
|
group: Optional[str] = None
|
|
group_id: Optional[str] = None
|
|
|
|
ext_path: Optional[str] = None
|
|
|
|
hardcoded_strings: List[str] = field(default_factory=list)
|
|
param_strings: List[str] = field(default_factory=list)
|
|
|
|
def as_dict(self) -> Dict:
|
|
"""
|
|
Returns a JSON serializable dictionary representing the parsed
|
|
description
|
|
"""
|
|
return {
|
|
'name': self.name,
|
|
'display_name': self.display_name,
|
|
'command': self.grass_command,
|
|
'short_description': self.short_description,
|
|
'group': self.group,
|
|
'group_id': self.group_id,
|
|
'ext_path': self.ext_path,
|
|
'hardcoded_strings': self.hardcoded_strings,
|
|
'parameters': self.param_strings
|
|
}
|
|
|
|
@staticmethod
|
|
def from_dict(description: Dict) -> 'ParsedDescription':
|
|
"""
|
|
Parses a dictionary as a description and returns the result
|
|
"""
|
|
|
|
from qgis.PyQt.QtCore import QCoreApplication
|
|
|
|
result = ParsedDescription()
|
|
result.name = description.get('name')
|
|
result.display_name = description.get('display_name')
|
|
result.grass_command = description.get('command')
|
|
result.short_description = QCoreApplication.translate(
|
|
"GrassAlgorithm",
|
|
description.get('short_description')
|
|
)
|
|
result.group = QCoreApplication.translate("GrassAlgorithm",
|
|
description.get('group'))
|
|
result.group_id = description.get('group_id')
|
|
result.ext_path = description.get('ext_path')
|
|
result.hardcoded_strings = description.get('hardcoded_strings', [])
|
|
result.param_strings = description.get('parameters', [])
|
|
|
|
return result
|
|
|
|
@staticmethod
|
|
def parse_description_file(
|
|
description_file: Path,
|
|
translate: bool = True) -> 'ParsedDescription':
|
|
"""
|
|
Parses a description file and returns the result
|
|
"""
|
|
|
|
result = ParsedDescription()
|
|
|
|
with description_file.open() as lines:
|
|
# First line of the file is the Grass algorithm name
|
|
line = lines.readline().strip('\n').strip()
|
|
result.grass_command = line
|
|
# Second line if the algorithm name in Processing
|
|
line = lines.readline().strip('\n').strip()
|
|
result.short_description = line
|
|
if " - " not in line:
|
|
result.name = result.grass_command
|
|
else:
|
|
result.name = line[:line.find(' ')].lower()
|
|
if translate:
|
|
from qgis.PyQt.QtCore import QCoreApplication
|
|
result.short_description = QCoreApplication.translate(
|
|
"GrassAlgorithm", line)
|
|
else:
|
|
result.short_description = line
|
|
|
|
result.display_name = result.name
|
|
# Read the grass group
|
|
line = lines.readline().strip('\n').strip()
|
|
if translate:
|
|
from qgis.PyQt.QtCore import QCoreApplication
|
|
result.group = QCoreApplication.translate("GrassAlgorithm",
|
|
line)
|
|
else:
|
|
result.group = line
|
|
|
|
result.group_id = ParsedDescription.GROUP_ID_REGEX.search(
|
|
line).group(0).lower()
|
|
|
|
# Then you have parameters/output definition
|
|
line = lines.readline().strip('\n').strip()
|
|
while line != '':
|
|
line = line.strip('\n').strip()
|
|
if line.startswith('Hardcoded'):
|
|
result.hardcoded_strings.append(
|
|
line[len('Hardcoded|'):])
|
|
result.param_strings.append(line)
|
|
line = lines.readline().strip('\n').strip()
|
|
return result
|