QGIS/scripts/dump_babel_formats.py
2024-12-02 10:34:06 +01:00

135 lines
4.5 KiB
Python

#!/usr/bin/env python3
"""
***************************************************************************
dump_babel_formats.py
---------------------
Date : July 2021
Copyright : (C) 2021 by Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* 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. *
* *
***************************************************************************
"""
"""
Dumps a list of babel formats for inclusion in QgsBabelFormatRegistry::QgsBabelFormatRegistry()
"""
__author__ = "Nyall Dawson"
__date__ = "July 2021"
__copyright__ = "(C) 2021, Nyall Dawson"
import re
import subprocess
def process_lines(lines):
"""
Processes lines from gpsbabel -^3 output
"""
current_line = 0
format_out = {}
while current_line < len(lines):
line = lines[current_line]
fields = line.split("\t")
assert len(fields) >= 5, fields
current_line += 1
html_pages = []
while lines[current_line].startswith("http"):
html_pages.append(lines[current_line])
current_line += 1
while current_line < len(lines) and lines[current_line].startswith("option"):
options = lines[current_line].split("\t")
assert len(options) >= 9, options
(
name,
description,
option_type,
option_def,
option_min,
option_max,
option_html,
) = options[:7]
# print(name, description, option_type, option_def, option_min, option_max, option_html)
option_http_pages = []
current_line += 1
while current_line < len(lines) and lines[current_line].startswith("http"):
option_http_pages.append(lines[current_line])
current_line += 1
name = fields[2]
description = fields[4]
# remove odd comment from description!
description = description.replace(" [ Get Jonathon Johnson to describe", "")
read_waypoints = fields[1][0] == "r"
read_tracks = fields[1][2] == "r"
read_routes = fields[1][4] == "r"
write_waypoints = fields[1][1] == "w"
write_tracks = fields[1][3] == "w"
write_routes = fields[1][5] == "w"
is_file_format = fields[0] == "file"
is_device_format = fields[0] == "serial"
extensions = fields[3].split("/")
if is_file_format and any([read_routes, read_tracks, read_waypoints]):
capabilities = []
if read_waypoints:
capabilities.append("Qgis::BabelFormatCapability::Waypoints")
if read_routes:
capabilities.append("Qgis::BabelFormatCapability::Routes")
if read_tracks:
capabilities.append("Qgis::BabelFormatCapability::Tracks")
capabilities_string = " | ".join(capabilities)
extensions_string = (
"{"
+ ", ".join(
[
f'QStringLiteral( "{ext.strip()}" )'
for ext in extensions
if ext.strip()
]
)
+ "}"
)
format_out[name] = (
f'mImporters[QStringLiteral( "{name}" )] = new QgsBabelSimpleImportFormat( QStringLiteral( "{name}" ), QStringLiteral( "{description}" ), {capabilities_string}, {extensions_string} );'
)
for format_name in sorted(format_out.keys(), key=lambda x: x.lower()):
print(format_out[format_name])
CMD = "gpsbabel -^3"
START_FORMATS_RX = re.compile("^file|serial")
result = subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
found_first_line = False
input_lines = []
for input_line in result.stdout.readlines():
input_str = input_line.decode()
if not found_first_line:
if START_FORMATS_RX.match(input_str):
found_first_line = True
else:
continue
if input_str.strip():
input_lines.append(input_str.strip())
process_lines(input_lines)