Use logger to control prints

This commit is contained in:
Marc Gilleron 2020-06-14 19:56:12 +01:00
parent bcad9cd60e
commit fafc6de569
8 changed files with 108 additions and 50 deletions

View File

@ -1,16 +1,16 @@
tool tool
# TODO Can't type nullable return value # TODO Can't type nullable return value
static func load_csv_translation(filepath: String): static func load_csv_translation(filepath: String, logger):
var f := File.new() var f := File.new()
var err := f.open(filepath, File.READ) var err := f.open(filepath, File.READ)
if err != OK: if err != OK:
printerr("Could not open ", filepath, " for read, code ", err) logger.error("Could not open {0} for read, code {1}".format([filepath, err]))
return null return null
var first_row := f.get_csv_line() var first_row := f.get_csv_line()
if first_row[0] != "id": if first_row[0] != "id":
printerr("Translation file is missing the `id` column") logger.error("Translation file is missing the `id` column")
return null return null
var languages := PoolStringArray() var languages := PoolStringArray()
@ -22,10 +22,10 @@ static func load_csv_translation(filepath: String):
while not f.eof_reached(): while not f.eof_reached():
var row := f.get_csv_line() var row := f.get_csv_line()
if len(row) < 1 or row[0].strip_edges() == "": if len(row) < 1 or row[0].strip_edges() == "":
printerr("Found an empty row") logger.error("Found an empty row")
continue continue
if len(row) < len(first_row): if len(row) < len(first_row):
print("Found row smaller than header, resizing") logger.debug("Found row smaller than header, resizing")
row.resize(len(first_row)) row.resize(len(first_row))
ids.append(row[0]) ids.append(row[0])
var trans = PoolStringArray() var trans = PoolStringArray()
@ -49,8 +49,8 @@ class _Sorter:
return a[0] < b[0] return a[0] < b[0]
static func save_csv_translation(filepath: String, data: Dictionary) -> Array: static func save_csv_translation(filepath: String, data: Dictionary, logger) -> Array:
print("Saving: ", data) logger.debug(str("Saving: ", data))
var languages_set := {} var languages_set := {}
for id in data: for id in data:
var s = data[id] var s = data[id]
@ -58,7 +58,7 @@ static func save_csv_translation(filepath: String, data: Dictionary) -> Array:
languages_set[language] = true languages_set[language] = true
if len(languages_set) == 0: if len(languages_set) == 0:
printerr("No language found, nothing to save") logger.error("No language found, nothing to save")
return [] return []
var languages := languages_set.keys() var languages := languages_set.keys()
@ -94,7 +94,7 @@ static func save_csv_translation(filepath: String, data: Dictionary) -> Array:
var f := File.new() var f := File.new()
var err := f.open(filepath, File.WRITE) var err := f.open(filepath, File.WRITE)
if err != OK: if err != OK:
printerr("Could not open ", filepath, " for write, code ", err) logger.error("Could not open {0} for write, code {1}".format([filepath, err]))
return [] return []
store_csv_line(f, first_row) store_csv_line(f, first_row)
@ -102,7 +102,7 @@ static func save_csv_translation(filepath: String, data: Dictionary) -> Array:
store_csv_line(f, row) store_csv_line(f, row)
f.close() f.close()
print("Saved ", filepath) logger.debug(str("Saved ", filepath))
var saved_languages := languages var saved_languages := languages
return saved_languages return saved_languages

View File

@ -1,4 +1,6 @@
const Logger = preload("./util/logger.gd")
const STATE_SEARCHING = 0 const STATE_SEARCHING = 0
const STATE_READING_TEXT = 1 const STATE_READING_TEXT = 1
@ -13,6 +15,7 @@ var _thread : Thread = null
var _time_before := 0.0 var _time_before := 0.0
var _ignored_paths := {} var _ignored_paths := {}
var _paths := [] var _paths := []
var _logger = Logger.get_for(self)
func extract_async(root: String, ignored_paths := []): func extract_async(root: String, ignored_paths := []):
@ -39,14 +42,14 @@ func _prepare(root: String, ignored_paths: Array):
func _extract(root: String): func _extract(root: String):
_walk(root, funcref(self, "_index_file"), funcref(self, "_filter")) _walk(root, funcref(self, "_index_file"), funcref(self, "_filter"), _logger)
for i in len(_paths): for i in len(_paths):
var fpath : String = _paths[i] var fpath : String = _paths[i]
var f := File.new() var f := File.new()
var err := f.open(fpath, File.READ) var err := f.open(fpath, File.READ)
if err != OK: if err != OK:
printerr("Could not open '", fpath, "', for read, error ", err) _logger.error("Could not open {0} for read, error {1}".format([fpath, err]))
continue continue
var ext := fpath.get_extension() var ext := fpath.get_extension()
match ext: match ext:
@ -71,7 +74,7 @@ func _finished():
_thread.wait_to_finish() _thread.wait_to_finish()
_thread = null _thread = null
var elapsed := float(OS.get_ticks_msec() - _time_before) / 1000.0 var elapsed := float(OS.get_ticks_msec() - _time_before) / 1000.0
print("Extraction took ", elapsed, " seconds") _logger.debug(str("Extraction took ", elapsed, " seconds"))
emit_signal("finished", _strings) emit_signal("finished", _strings)
@ -112,8 +115,9 @@ func _process_tscn(f: File, fpath: String):
if i != -1: if i != -1:
var begin_quote_index := line.find('"', i + len(pattern)) var begin_quote_index := line.find('"', i + len(pattern))
if begin_quote_index == -1: if begin_quote_index == -1:
printerr("Could not find begin quote after text property, in ", _logger.error(
fpath, " line ", line_number) "Could not find begin quote after text property, in {0}, line {1}" \
.format([fpath, line_number]))
continue continue
var end_quote_index := line.rfind('"') var end_quote_index := line.rfind('"')
@ -179,18 +183,18 @@ func _process_gd(f: File, fpath: String):
var begin_quote_index := line.find('"', call_index) var begin_quote_index := line.find('"', call_index)
if begin_quote_index == -1: if begin_quote_index == -1:
# Multiline or procedural strings not supported # Multiline or procedural strings not supported
printerr("Begin quote not found in ", fpath, " line ", line_number) _logger.error("Begin quote not found in {0}, line {1}".format([fpath, line_number]))
break break
var end_quote_index := find_unescaped_quote(line, begin_quote_index + 1) var end_quote_index := find_unescaped_quote(line, begin_quote_index + 1)
if end_quote_index == -1: if end_quote_index == -1:
# Multiline or procedural strings not supported # Multiline or procedural strings not supported
printerr("End quote not found in ", fpath, " line ", line_number) _logger.error("End quote not found in {0}, line {1}".format([fpath, line_number]))
break break
text = line.substr(begin_quote_index + 1, end_quote_index - begin_quote_index - 1) text = line.substr(begin_quote_index + 1, end_quote_index - begin_quote_index - 1)
var end_bracket_index := line.find(')', end_quote_index) var end_bracket_index := line.find(')', end_quote_index)
if end_bracket_index == -1: if end_bracket_index == -1:
# Multiline or procedural strings not supported # Multiline or procedural strings not supported
printerr("End bracket not found in ", fpath, " line ", line_number) _logger.error("End bracket not found in {0}, line {1}".format([fpath, line_number]))
break break
_add_string(fpath, line_number, text) _add_string(fpath, line_number, text)
search_index = end_bracket_index search_index = end_bracket_index
@ -217,12 +221,12 @@ func _add_string(file: String, line_number: int, text: String):
_strings[text][file] = line_number _strings[text][file] = line_number
static func _walk(folder_path: String, file_action: FuncRef, filter: FuncRef): static func _walk(folder_path: String, file_action: FuncRef, filter: FuncRef, logger):
#print("Walking dir ", folder_path) #print("Walking dir ", folder_path)
var d := Directory.new() var d := Directory.new()
var err := d.open(folder_path) var err := d.open(folder_path)
if err != OK: if err != OK:
printerr("Could not open directory '", folder_path, "', error ", err) logger.error("Could not open directory {0}, error {1}".format([folder_path, err]))
return return
d.list_dir_begin(true, true) d.list_dir_begin(true, true)
var fname := d.get_next() var fname := d.get_next()
@ -230,7 +234,7 @@ static func _walk(folder_path: String, file_action: FuncRef, filter: FuncRef):
var fullpath := folder_path.plus_file(fname) var fullpath := folder_path.plus_file(fname)
if filter == null or filter.call_func(fullpath) == true: if filter == null or filter.call_func(fullpath) == true:
if d.current_is_dir(): if d.current_is_dir():
_walk(fullpath, file_action, filter) _walk(fullpath, file_action, filter, logger)
else: else:
file_action.call_func(fullpath) file_action.call_func(fullpath)
fname = d.get_next() fname = d.get_next()

View File

@ -2,6 +2,7 @@ tool
extends WindowDialog extends WindowDialog
const Extractor = preload("./extractor.gd") const Extractor = preload("./extractor.gd")
const Logger = preload("./util/logger.gd")
signal import_selected(strings) signal import_selected(strings)
@ -17,6 +18,7 @@ var _extractor : Extractor = null
# { string => { fpath => line number } } # { string => { fpath => line number } }
var _results := {} var _results := {}
var _registered_string_filter : FuncRef = null var _registered_string_filter : FuncRef = null
var _logger = Logger.get_for(self)
func _ready(): func _ready():
@ -46,7 +48,7 @@ func _on_ExtractButton_pressed():
var root := _root_path_edit.text.strip_edges() var root := _root_path_edit.text.strip_edges()
var d := Directory.new() var d := Directory.new()
if not d.dir_exists(root): if not d.dir_exists(root):
printerr("Directory `", root, "` does not exist") _logger.error("Directory {0} does not exist".format([root]))
return return
var excluded_dirs := _excluded_dirs_edit.text.split(";", false) var excluded_dirs := _excluded_dirs_edit.text.split(";", false)
@ -82,7 +84,8 @@ func _on_Extractor_progress_reported(ratio):
func _on_Extractor_finished(results: Dictionary): func _on_Extractor_finished(results: Dictionary):
print("Extractor finished") _logger.debug("Extractor finished")
_progress_bar.value = 100 _progress_bar.value = 100
_progress_bar.hide() _progress_bar.hide()

View File

@ -3,12 +3,14 @@ extends EditorPlugin
const TranslationEditor = preload("./translation_editor.gd") const TranslationEditor = preload("./translation_editor.gd")
const TranslationEditorScene = preload("./translation_editor.tscn") const TranslationEditorScene = preload("./translation_editor.tscn")
const Logger = preload("./util/logger.gd")
var _main_control : TranslationEditor = null var _main_control : TranslationEditor = null
var _logger = Logger.get_for(self)
func _enter_tree(): func _enter_tree():
print("Translation editor plugin Enter tree") _logger.debug("Translation editor plugin Enter tree")
var editor_interface := get_editor_interface() var editor_interface := get_editor_interface()
var base_control := editor_interface.get_base_control() var base_control := editor_interface.get_base_control()
@ -20,7 +22,7 @@ func _enter_tree():
func _exit_tree(): func _exit_tree():
print("Translation editor plugin Exit tree") _logger.debug("Translation editor plugin Exit tree")
# The main control is not freed when the plugin is disabled # The main control is not freed when the plugin is disabled
_main_control.queue_free() _main_control.queue_free()
_main_control = null _main_control = null

View File

@ -5,15 +5,15 @@ const STATE_MSGID = 1
const STATE_MSGSTR = 2 const STATE_MSGSTR = 2
# TODO Can't type nullable result # TODO Can't type nullable result
static func load_po_translation(folder_path: String, valid_locales: Array): static func load_po_translation(folder_path: String, valid_locales: Array, logger):
var all_strings := {} var all_strings := {}
var config := {} var config := {}
# TODO Get languages from configs, not from filenames # TODO Get languages from configs, not from filenames
var languages := get_languages_in_folder(folder_path, valid_locales) var languages := get_languages_in_folder(folder_path, valid_locales, logger)
if len(languages) == 0: if len(languages) == 0:
printerr("No .po languages were found in ", folder_path) logger.error("No .po languages were found in {0}".format([folder_path]))
return all_strings return all_strings
for language in languages: for language in languages:
@ -22,7 +22,7 @@ static func load_po_translation(folder_path: String, valid_locales: Array):
var f := File.new() var f := File.new()
var err := f.open(filepath, File.READ) var err := f.open(filepath, File.READ)
if err != OK: if err != OK:
printerr("Could not open file ", filepath, " for read, error ", err) logger.error("Could not open file {0} for read, error {1}".format([filepath, err]))
return null return null
f.store_line("") f.store_line("")
@ -70,7 +70,7 @@ static func load_po_translation(folder_path: String, valid_locales: Array):
var s : Dictionary var s : Dictionary
if msgid == "": if msgid == "":
assert(len(msgstr) != 0) assert(len(msgstr) != 0)
config = _parse_config(msgstr) config = _parse_config(msgstr, logger)
else: else:
if not all_strings.has(msgid): if not all_strings.has(msgid):
s = { s = {
@ -90,7 +90,7 @@ static func load_po_translation(folder_path: String, valid_locales: Array):
state = STATE_NONE state = STATE_NONE
else: else:
print("Unhandled .po line: ", line) logger.warn("Unhandled .po line: {0}".format([line]))
continue continue
# TODO Return configs? # TODO Return configs?
@ -105,13 +105,13 @@ static func _parse_msg(s: String) -> String:
return msg.c_unescape().replace('\\"', '"') return msg.c_unescape().replace('\\"', '"')
static func _parse_config(text: String) -> Dictionary: static func _parse_config(text: String, logger) -> Dictionary:
var config := {} var config := {}
var lines := text.split("\n", false) var lines := text.split("\n", false)
print("Config lines: ", lines) logger.debug(str("Config lines: ", lines))
for line in lines: for line in lines:
var splits = line.split(":") var splits = line.split(":")
print("Splits: ", splits) logger.debug(str("Splits: ", splits))
config[splits[0]] = splits[1].strip_edges() config[splits[0]] = splits[1].strip_edges()
return config return config
@ -122,7 +122,7 @@ class _Sorter:
static func save_po_translations(folder_path: String, translations: Dictionary, static func save_po_translations(folder_path: String, translations: Dictionary,
languages_to_save: Array) -> Array: languages_to_save: Array, logger) -> Array:
var sorter := _Sorter.new() var sorter := _Sorter.new()
var saved_languages := [] var saved_languages := []
@ -132,7 +132,7 @@ static func save_po_translations(folder_path: String, translations: Dictionary,
var filepath := folder_path.plus_file(str(language, ".po")) var filepath := folder_path.plus_file(str(language, ".po"))
var err := f.open(filepath, File.WRITE) var err := f.open(filepath, File.WRITE)
if err != OK: if err != OK:
printerr("Could not open file ", filepath, " for write, error ", err) logger.error("Could not open file {0} for write, error {1}".format([filepath, err]))
continue continue
# TODO Take as argument # TODO Take as argument
@ -217,12 +217,12 @@ static func _write_msg(f: File, msgtype: String, msg: String):
f.store_line(str(" \"", lines[i], "\"")) f.store_line(str(" \"", lines[i], "\""))
static func get_languages_in_folder(folder_path: String, valid_locales: Array) -> Array: static func get_languages_in_folder(folder_path: String, valid_locales: Array, logger) -> Array:
var result := [] var result := []
var d := Directory.new() var d := Directory.new()
var err := d.open(folder_path) var err := d.open(folder_path)
if err != OK: if err != OK:
printerr("Could not open directory ", folder_path, ", error ", err) logger.error("Could not open directory {0}, error {1}".format([folder_path, err]))
return result return result
d.list_dir_begin() d.list_dir_begin()
var fname := d.get_next() var fname := d.get_next()

View File

@ -7,6 +7,8 @@ const Locales = preload("./locales.gd")
const StringEditionDialog = preload("./string_edition_dialog.gd") const StringEditionDialog = preload("./string_edition_dialog.gd")
const LanguageSelectionDialog = preload("./language_selection_dialog.gd") const LanguageSelectionDialog = preload("./language_selection_dialog.gd")
const ExtractorDialog = preload("./extractor_dialog.gd") const ExtractorDialog = preload("./extractor_dialog.gd")
const Util = preload("./util/util.gd")
const Logger = preload("./util/logger.gd")
const StringEditionDialogScene = preload("./string_edition_dialog.tscn") const StringEditionDialogScene = preload("./string_edition_dialog.tscn")
const LanguageSelectionDialogScene = preload("./language_selection_dialog.tscn") const LanguageSelectionDialogScene = preload("./language_selection_dialog.tscn")
@ -46,6 +48,7 @@ var _save_folder_dialog : FileDialog = null
var _base_control : Control = null var _base_control : Control = null
var _translation_edits := {} var _translation_edits := {}
var _dialogs_to_free_on_exit := [] var _dialogs_to_free_on_exit := []
var _logger = Logger.get_for(self)
var _data := {} var _data := {}
var _languages := [] var _languages := []
@ -56,7 +59,7 @@ var _modified_languages := {}
func _ready(): func _ready():
# I don't want any of this to run in the edited scene (because `tool`)... # I don't want any of this to run in the edited scene (because `tool`)...
if Engine.editor_hint and get_parent() is Viewport: if Util.is_in_edited_scene(self):
return return
_file_menu.get_popup().add_item("Open...", MENU_FILE_OPEN) _file_menu.get_popup().add_item("Open...", MENU_FILE_OPEN)
@ -234,16 +237,16 @@ func load_file(filepath: String):
if ext == "po": if ext == "po":
var valid_locales := Locales.get_all_locale_ids() var valid_locales := Locales.get_all_locale_ids()
_current_path = filepath.get_base_dir() _current_path = filepath.get_base_dir()
_data = PoLoader.load_po_translation(_current_path, valid_locales) _data = PoLoader.load_po_translation(_current_path, valid_locales, Logger.get_for(PoLoader))
_current_format = FORMAT_GETTEXT _current_format = FORMAT_GETTEXT
elif ext == "csv": elif ext == "csv":
_data = CsvLoader.load_csv_translation(filepath) _data = CsvLoader.load_csv_translation(filepath, Logger.get_for(CsvLoader))
_current_path = filepath _current_path = filepath
_current_format = FORMAT_CSV _current_format = FORMAT_CSV
else: else:
printerr("Unknown file format, cannot load ", filepath) _logger.error("Unknown file format, cannot load {0}".format([filepath]))
return return
_languages.clear() _languages.clear()
@ -365,13 +368,14 @@ func save_file(path: String, format: int):
languages_to_save = _languages languages_to_save = _languages
else: else:
languages_to_save = _modified_languages.keys() languages_to_save = _modified_languages.keys()
saved_languages = PoLoader.save_po_translations(path, _data, languages_to_save) saved_languages = PoLoader.save_po_translations(
path, _data, languages_to_save, Logger.get_for(PoLoader))
elif format == FORMAT_CSV: elif format == FORMAT_CSV:
saved_languages = CsvLoader.save_csv_translation(path, _data) saved_languages = CsvLoader.save_csv_translation(path, _data, Logger.get_for(CsvLoader))
else: else:
printerr("Unknown file format, cannot save ", path) _logger.error("Unknown file format, cannot save {0}".format([path]))
for language in saved_languages: for language in saved_languages:
_set_language_unmodified(language) _set_language_unmodified(language)
@ -429,7 +433,7 @@ func _on_RemoveButton_pressed():
func _on_RemoveStringConfirmationDialog_confirmed(): func _on_RemoveStringConfirmationDialog_confirmed():
var selected_items := _string_list.get_selected_items() var selected_items := _string_list.get_selected_items()
if len(selected_items) == 0: if len(selected_items) == 0:
printerr("No selected string??") _logger.error("No selected string??")
return return
var strid := _string_list.get_item_text(selected_items[0]) var strid := _string_list.get_item_text(selected_items[0])
_string_list.remove_item(selected_items[0]) _string_list.remove_item(selected_items[0])
@ -466,7 +470,7 @@ func _validate_new_string_id(str_id: String):
func add_new_string(strid: String): func add_new_string(strid: String):
print("Adding new string ", strid) _logger.debug(str("Adding new string ", strid))
assert(not _data.has(strid)) assert(not _data.has(strid))
var s := { var s := {
"translations": {}, "translations": {},
@ -499,7 +503,7 @@ func _add_language(language: String):
var menu_index := _file_menu.get_popup().get_item_index(MENU_FILE_REMOVE_LANGUAGE) var menu_index := _file_menu.get_popup().get_item_index(MENU_FILE_REMOVE_LANGUAGE)
_file_menu.get_popup().set_item_disabled(menu_index, false) _file_menu.get_popup().set_item_disabled(menu_index, false)
print("Added language ", language) _logger.debug(str("Added language ", language))
func _remove_language(language: String): func _remove_language(language: String):
@ -515,7 +519,7 @@ func _remove_language(language: String):
var menu_index = _file_menu.get_popup().get_item_index(MENU_FILE_REMOVE_LANGUAGE) var menu_index = _file_menu.get_popup().get_item_index(MENU_FILE_REMOVE_LANGUAGE)
_file_menu.get_popup().set_item_disabled(menu_index, true) _file_menu.get_popup().set_item_disabled(menu_index, true)
print("Removed language ", language) _logger.debug(str("Removed language ", language))
func _on_RemoveLanguageConfirmationDialog_confirmed(): func _on_RemoveLanguageConfirmationDialog_confirmed():
@ -526,7 +530,7 @@ func _on_RemoveLanguageConfirmationDialog_confirmed():
# Used as callback for filtering # Used as callback for filtering
func _is_string_registered(text: String) -> bool: func _is_string_registered(text: String) -> bool:
if _data == null: if _data == null:
print("No data") _logger.debug("No data")
return false return false
return _data.has(text) return _data.has(text)

View File

@ -0,0 +1,36 @@
class Base:
var _context := ""
func _init(p_context):
_context = p_context
func debug(msg: String):
pass
func warn(msg: String):
push_warning("{0}: {1}".format([_context, msg]))
func error(msg: String):
push_error("{0}: {1}".format([_context, msg]))
class Verbose extends Base:
func _init(p_context: String).(p_context):
pass
func debug(msg: String):
print(_context, ": ", msg)
static func get_for(owner: Object) -> Base:
# Note: don't store the owner. If it's a Reference, it could create a cycle
var context : String
if owner is Script:
context = owner.resource_path.get_file()
else:
context = owner.get_script().resource_path.get_file()
if OS.is_stdout_verbose():
return Verbose.new(context)
return Base.new(context)

View File

@ -0,0 +1,9 @@
tool
static func is_in_edited_scene(node: Node) -> bool:
if not node.is_inside_tree():
return false
var edited_scene = node.get_tree().edited_scene_root
if node == edited_scene:
return true
return edited_scene != null and edited_scene.is_a_parent_of(node)