mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.7 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
 |