[geany/geany-plugins] cdaa96: pohelper: Make sure to only replace header fields in the actual header
Colomban Wendling
git-noreply at xxxxx
Mon Feb 19 06:22:50 UTC 2018
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Mon, 19 Feb 2018 06:22:50 UTC
Commit: cdaa961ce6b441162d4f6bcb329d0307d8945e01
https://github.com/geany/geany-plugins/commit/cdaa961ce6b441162d4f6bcb329d0307d8945e01
Log Message:
-----------
pohelper: Make sure to only replace header fields in the actual header
The header should be first and both entries we replace should be
present, but be protective and make sure we find the header and only
actually replace existing header entries.
Modified Paths:
--------------
pohelper/src/gph-plugin.c
Modified: pohelper/src/gph-plugin.c
101 lines changed, 70 insertions(+), 31 deletions(-)
===================================================================
@@ -453,16 +453,24 @@ goto_next_untranslated_or_fuzzy (GeanyDocument *doc)
}
}
-/* basic regex search/replace without captures or back references */
+/* basic regex search/replace without captures or back references
+ *
+ * @sci A ScintillaObject
+ * @start Position where to start the search
+ * @end Position where to end the search, or -1 for the buffer's end
+ * @scire The Scintilla regular expression
+ * @repl The replacement text */
static gboolean
regex_replace (ScintillaObject *sci,
+ gint start,
+ gint end,
const gchar *scire,
const gchar *repl)
{
struct Sci_TextToFind ttf;
- ttf.chrg.cpMin = 0;
- ttf.chrg.cpMax = sci_get_length (sci);
+ ttf.chrg.cpMin = start;
+ ttf.chrg.cpMax = end >= 0 ? end : sci_get_length (sci);
ttf.lpstrText = (gchar *) scire;
if (sci_find_text (sci, SCFIND_REGEXP, &ttf) != -1) {
@@ -505,34 +513,6 @@ escape_string (const gchar *str)
return new;
}
-static void
-on_document_save (GObject *obj,
- GeanyDocument *doc,
- gpointer user_data)
-{
- if (doc_is_po (doc) && plugin.update_headers) {
- gchar *name = escape_string (geany_data->template_prefs->developer);
- gchar *mail = escape_string (geany_data->template_prefs->mail);
- gchar *date;
- gchar *translator;
-
- date = utils_get_date_time ("\"PO-Revision-Date: %Y-%m-%d %H:%M%z\\n\"",
- NULL);
- translator = g_strdup_printf ("\"Last-Translator: %s <%s>\\n\"",
- name, mail);
-
- sci_start_undo_action (doc->editor->sci);
- regex_replace (doc->editor->sci, "^\"PO-Revision-Date: .*\"$", date);
- regex_replace (doc->editor->sci, "^\"Last-Translator: .*\"$", translator);
- sci_end_undo_action (doc->editor->sci);
-
- g_free (date);
- g_free (translator);
- g_free (name);
- g_free (mail);
- }
-}
-
static void
update_menu_items_sensitivity (GeanyDocument *doc)
{
@@ -1212,6 +1192,65 @@ on_kb_toggle_fuzziness (guint key_id)
}
}
+static gint
+find_header_start (GeanyDocument *doc)
+{
+ if (doc_is_po (doc)) {
+ for (gint line = 0; line < sci_get_line_count (doc->editor->sci); line++) {
+ if (find_first_non_default_style_on_line (doc->editor->sci, line) == SCE_PO_MSGID) {
+ gint pos = sci_get_position_from_line (doc->editor->sci, line);
+ GString *str = get_msgid_text_at (doc, pos);
+
+ if (str) {
+ gboolean is_header = (*str->str == 0);
+
+ g_string_free (str, TRUE);
+ if (is_header) {
+ return pos;
+ }
+ }
+ }
+ }
+ }
+
+ return -1;
+}
+
+static void
+on_document_save (GObject *obj,
+ GeanyDocument *doc,
+ gpointer user_data)
+{
+ gint header_start;
+
+ if (doc_is_po (doc) && plugin.update_headers &&
+ (header_start = find_header_start (doc)) >= 0) {
+ gchar *name = escape_string (geany_data->template_prefs->developer);
+ gchar *mail = escape_string (geany_data->template_prefs->mail);
+ gchar *date;
+ gchar *translator;
+
+ date = utils_get_date_time ("\"PO-Revision-Date: %Y-%m-%d %H:%M%z\\n\"",
+ NULL);
+ translator = g_strdup_printf ("\"Last-Translator: %s <%s>\\n\"",
+ name, mail);
+
+ sci_start_undo_action (doc->editor->sci);
+ regex_replace (doc->editor->sci,
+ header_start, find_msgstr_end_at (doc, header_start) + 1,
+ "^\"PO-Revision-Date: .*\"$", date);
+ regex_replace (doc->editor->sci,
+ header_start, find_msgstr_end_at (doc, header_start) + 1,
+ "^\"Last-Translator: .*\"$", translator);
+ sci_end_undo_action (doc->editor->sci);
+
+ g_free (date);
+ g_free (translator);
+ g_free (name);
+ g_free (mail);
+ }
+}
+
typedef struct {
gdouble translated;
gdouble fuzzy;
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list