Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kf6-ktexttemplate for 
openSUSE:Leap:16.0 checked in at 2025-04-23 10:08:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:16.0/kf6-ktexttemplate (Old)
 and      /work/SRC/openSUSE:Leap:16.0/.kf6-ktexttemplate.new.30101 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kf6-ktexttemplate"

Wed Apr 23 10:08:52 2025 rev:3 rq:1271482 version:6.13.0

Changes:
--------
--- /work/SRC/openSUSE:Leap:16.0/kf6-ktexttemplate/kf6-ktexttemplate.changes    
2025-03-19 11:47:55.664774903 +0100
+++ 
/work/SRC/openSUSE:Leap:16.0/.kf6-ktexttemplate.new.30101/kf6-ktexttemplate.changes
 2025-04-23 10:11:58.028541805 +0200
@@ -1,0 +2,73 @@
+Sat Apr  5 12:33:59 UTC 2025 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.13.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.13.0
+- Changes since 6.12.0:
+  * Add missing include mocs
+  * Update dependency version to 6.13.0
+
+-------------------------------------------------------------------
+Tue Mar 11 09:29:25 UTC 2025 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.12.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.12.0
+- Changes since 6.11.0:
+  * Update dependency version to 6.12.0
+  * Update version to 6.12.0
+
+-------------------------------------------------------------------
+Sat Feb  8 12:16:56 UTC 2025 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.11.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.11.0
+- Changes since 6.10.0:
+  * Update dependency version to 6.11.0
+  * Add xml/yaml linting
+  * CI: Add linux-qt6-next build
+  * Update version to 6.11.0
+
+-------------------------------------------------------------------
+Thu Jan  9 17:12:40 UTC 2025 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.10.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.10.0
+- Changes since 6.9.0:
+  * Update dependency version to 6.10.0
+  * Remove unimplemented methods
+  * Fix build with Qt 6.10 (dev)
+  * Update version to 6.10.0
+
+-------------------------------------------------------------------
+Sun Dec  8 10:09:28 UTC 2024 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.9.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.9.0
+- Changes since 6.8.0:
+  * Update dependency version to 6.9.0
+  * Bump KF and QT versions in ecm_set_disabled_deprecation_versions
+  * Update version to 6.9.0
+
+-------------------------------------------------------------------
+Mon Nov  4 11:18:19 UTC 2024 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.8.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.8.0
+- Changes since 6.7.0:
+  * Update dependency version to 6.8.0
+  * Import i18n scripts from grantlee (kde#492237)
+  * Fix "now" tag to allow single quoted strings
+  * Update version to 6.8.0
+
+-------------------------------------------------------------------

Old:
----
  ktexttemplate-6.7.0.tar.xz
  ktexttemplate-6.7.0.tar.xz.sig

New:
----
  ktexttemplate-6.13.0.tar.xz
  ktexttemplate-6.13.0.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kf6-ktexttemplate.spec ++++++
--- /var/tmp/diff_new_pack.rDb6IB/_old  2025-04-23 10:11:58.484560873 +0200
+++ /var/tmp/diff_new_pack.rDb6IB/_new  2025-04-23 10:11:58.488561040 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package kf6-ktexttemplate
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,13 +19,13 @@
 %define qt6_version 6.7.0
 
 %define rname ktexttemplate
-# Full KF6 version (e.g. 6.7.0)
+# Full KF6 version (e.g. 6.13.0)
 %{!?_kf6_version: %global _kf6_version %{version}}
 # Last major and minor KF6 version (e.g. 6.0)
 %{!?_kf6_bugfix_version: %define _kf6_bugfix_version %(echo %{_kf6_version} | 
awk -F. '{print $1"."$2}')}
 %bcond_without released
 Name:           kf6-ktexttemplate
-Version:        6.7.0
+Version:        6.13.0
 Release:        0
 Summary:        String template library
 License:        LGPL-2.1-or-later

++++++ ktexttemplate-6.7.0.tar.xz -> ktexttemplate-6.13.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/.gitlab-ci.yml 
new/ktexttemplate-6.13.0/.gitlab-ci.yml
--- old/ktexttemplate-6.7.0/.gitlab-ci.yml      2024-10-04 17:09:54.000000000 
+0200
+++ new/ktexttemplate-6.13.0/.gitlab-ci.yml     2025-04-04 16:03:14.000000000 
+0200
@@ -5,6 +5,9 @@
   - project: sysadmin/ci-utilities
     file:
       - /gitlab-templates/linux-qt6.yml
+      - /gitlab-templates/linux-qt6-next.yml
       - /gitlab-templates/freebsd-qt6.yml
       - /gitlab-templates/windows-qt6.yml
       - /gitlab-templates/alpine-qt6.yml
+      - /gitlab-templates/xml-lint.yml
+      - /gitlab-templates/yaml-lint.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/.kde-ci.yml 
new/ktexttemplate-6.13.0/.kde-ci.yml
--- old/ktexttemplate-6.7.0/.kde-ci.yml 2024-10-04 17:09:54.000000000 +0200
+++ new/ktexttemplate-6.13.0/.kde-ci.yml        2025-04-04 16:03:14.000000000 
+0200
@@ -2,9 +2,9 @@
 # SPDX-License-Identifier: CC0-1.0
 
 Dependencies:
-- 'on': ['Linux', 'FreeBSD', 'Windows', 'Android']
-  'require':
+ - 'on': ['Linux', 'FreeBSD', 'Windows', 'Android']
+   'require':
     'frameworks/extra-cmake-modules': '@same'
 
 Options:
-  require-passing-tests-on: ['Linux', 'FreeBSD', 'Windows']
+ require-passing-tests-on: ['Linux', 'FreeBSD', 'Windows']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/CMakeLists.txt 
new/ktexttemplate-6.13.0/CMakeLists.txt
--- old/ktexttemplate-6.7.0/CMakeLists.txt      2024-10-04 17:09:54.000000000 
+0200
+++ new/ktexttemplate-6.13.0/CMakeLists.txt     2025-04-04 16:03:14.000000000 
+0200
@@ -1,10 +1,10 @@
 cmake_minimum_required(VERSION 3.16)
 
-set(KF_VERSION "6.7.0") # handled by release scripts
+set(KF_VERSION "6.13.0") # handled by release scripts
 project(KTextTemplate VERSION ${KF_VERSION})
 
 include(FeatureSummary)
-find_package(ECM 6.7.0  CONFIG)
+find_package(ECM 6.13.0  CONFIG)
 set_package_properties(ECM PROPERTIES
   TYPE REQUIRED
   DESCRIPTION "Extra CMake Modules."
@@ -19,7 +19,7 @@
 include(KDECMakeSettings)
 include(KDEGitCommitHooks)
 
-set(REQUIRED_QT_VERSION 6.5.0)
+set(REQUIRED_QT_VERSION 6.6.0)
 find_package(Qt6Core ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE)
 find_package(Qt6Qml ${REQUIRED_QT_VERSION} NO_MODULE)
 
@@ -50,7 +50,7 @@
 endif()
 
 ecm_set_disabled_deprecation_versions(
-    QT 6.5
+    QT 6.8.0
 )
 
 kde_enable_exceptions()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/LICENSES/BSD-2-Clause.txt 
new/ktexttemplate-6.13.0/LICENSES/BSD-2-Clause.txt
--- old/ktexttemplate-6.7.0/LICENSES/BSD-2-Clause.txt   1970-01-01 
01:00:00.000000000 +0100
+++ new/ktexttemplate-6.13.0/LICENSES/BSD-2-Clause.txt  2025-04-04 
16:03:14.000000000 +0200
@@ -0,0 +1,9 @@
+Copyright (c) <year> <owner> 
+
+Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this 
list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, 
this list of conditions and the following disclaimer in the documentation 
and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/autotests/testgenerictypes.cpp 
new/ktexttemplate-6.13.0/autotests/testgenerictypes.cpp
--- old/ktexttemplate-6.7.0/autotests/testgenerictypes.cpp      2024-10-04 
17:09:54.000000000 +0200
+++ new/ktexttemplate-6.13.0/autotests/testgenerictypes.cpp     2025-04-04 
16:03:14.000000000 +0200
@@ -87,6 +87,13 @@
     int uid;
 };
 
+QDebug operator<<(QDebug debug, const Person &person)
+{
+    QDebugStateSaver saver(debug);
+    debug.nospace() << "Person(" << person.uid << ", name:" << person.name << 
", age: " << person.age << ')';
+    return debug;
+}
+
 class PersonGadget
 {
     Q_GADGET
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ktexttemplate-6.7.0/examples/htmlapps/customplugin.cpp 
new/ktexttemplate-6.13.0/examples/htmlapps/customplugin.cpp
--- old/ktexttemplate-6.7.0/examples/htmlapps/customplugin.cpp  2024-10-04 
17:09:54.000000000 +0200
+++ new/ktexttemplate-6.13.0/examples/htmlapps/customplugin.cpp 2025-04-04 
16:03:14.000000000 +0200
@@ -8,3 +8,5 @@
 */
 
 #include "customplugin.h"
+
+#include "moc_customplugin.cpp"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/metainfo.yaml 
new/ktexttemplate-6.13.0/metainfo.yaml
--- old/ktexttemplate-6.7.0/metainfo.yaml       2024-10-04 17:09:54.000000000 
+0200
+++ new/ktexttemplate-6.13.0/metainfo.yaml      2025-04-04 16:03:14.000000000 
+0200
@@ -13,7 +13,7 @@
 public_source_dirs:
     - src/lib
 libraries:
- - cmake: "KF6::TextTemplate"
+    - cmake: "KF6::TextTemplate"
 cmakename: KF6TextTemplate
 
 public_lib: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ktexttemplate-6.7.0/scripts/extract_strings_gettext.py 
new/ktexttemplate-6.13.0/scripts/extract_strings_gettext.py
--- old/ktexttemplate-6.7.0/scripts/extract_strings_gettext.py  1970-01-01 
01:00:00.000000000 +0100
+++ new/ktexttemplate-6.13.0/scripts/extract_strings_gettext.py 2025-04-04 
16:03:14.000000000 +0200
@@ -0,0 +1,28 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# SPDX-FileCopyrightText: 2010 Stephen Kelly <steve...@gmail.com>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+##
+
+
+from strings_extractor_gettext import GettextExtractStrings
+import os, sys, glob, operator
+
+if __name__ == "__main__":
+  ex = GettextExtractStrings()
+
+  outputfile = sys.stdout
+
+  files = reduce(operator.add, map(glob.glob, sys.argv[1:]))
+
+  for filename in files:
+    f = open(filename, "r")
+    ex.translate(f, outputfile)
+
+  outputfile.write("\n")
+
+
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ktexttemplate-6.7.0/scripts/extract_strings_linguist.py 
new/ktexttemplate-6.13.0/scripts/extract_strings_linguist.py
--- old/ktexttemplate-6.7.0/scripts/extract_strings_linguist.py 1970-01-01 
01:00:00.000000000 +0100
+++ new/ktexttemplate-6.13.0/scripts/extract_strings_linguist.py        
2025-04-04 16:03:14.000000000 +0200
@@ -0,0 +1,27 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# SPDX-FileCopyrightText: 2010 Stephen Kelly <steve...@gmail.com>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+##
+
+from strings_extractor_linguist import LinguistExtractStrings
+import os, sys, glob, operator
+
+if __name__ == "__main__":
+  ex = LinguistExtractStrings()
+
+  outputfile = sys.stdout
+
+  files = reduce(operator.add, map(glob.glob, sys.argv[1:]))
+
+  for filename in files:
+    f = open(filename, "r")
+    ex.translate(f, outputfile)
+
+  outputfile.write("\n")
+
+
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/scripts/strings_extractor.py 
new/ktexttemplate-6.13.0/scripts/strings_extractor.py
--- old/ktexttemplate-6.7.0/scripts/strings_extractor.py        1970-01-01 
01:00:00.000000000 +0100
+++ new/ktexttemplate-6.13.0/scripts/strings_extractor.py       2025-04-04 
16:03:14.000000000 +0200
@@ -0,0 +1,346 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# SPDX-FileCopyrightText: 2010, 2011 Stephen Kelly <steve...@gmail.com>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+##
+
+## Parts of this file are reproduced from the Django framework. The Django 
licence appears below.
+
+##
+# Copyright (c) Django Software Foundation and individual contributors.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without 
modification,
+# are permitted provided that the following conditions are met:
+#
+#     1. Redistributions of source code must retain the above copyright notice,
+#        this list of conditions and the following disclaimer.
+#
+#     2. Redistributions in binary form must reproduce the above copyright
+#        notice, this list of conditions and the following disclaimer in the
+#        documentation and/or other materials provided with the distribution.
+#
+#     3. Neither the name of Django nor the names of its contributors may be 
used
+#        to endorse or promote products derived from this software without
+#        specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 
FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+##
+
+import re
+import os.path
+
+# == Introduction to the template syntax ==
+#
+# The template syntax looks like this:
+# (For more see here: http://grantlee.org/apidox/for_themers.html )
+#
+# This is plain text
+# This is text with a {{ value }} substitution
+# This is {% if condition_is_met %}a conditional{% endif %}
+# {# This is a comment #}
+# This is a {% comment %} multi-line
+# comment
+# {% endcomment %}
+#
+# That is, we have plain text.
+# We have value substitution with {{ }}
+# We have comments with {# #}
+# We have control tags with {% %}
+#
+# The first token inside {% %} syntax is called a tag name. Above, we have
+# an if tag and a comment tag.
+#
+# The 'value' in {{ value }} is called a filter expression. In the above case
+# the filter expression is a simple value which was inserted into the context.
+# In other cases it can be {{ value|upper }}, that is the value can be passed
+# through a filter called 'upper' with the '|', or filter expression can
+# be {{ value|join:"-" }}, that is it can be passed through the join filter
+# which takes an argument. In this case, the 'value' would actually be a list,
+# and the join filter would concatenate them with a dash. A filter can have
+# either no arguments, like upper, or it can take one argument, delimited by
+# a colon (';'). A filter expression can consist of a value followed by a
+# chain of filters, such as {{ value|join:"-"|upper }}. A filter expression
+# can appear one time inside {{ }} but may appear multiple times inside {% %}
+# For example {% cycle foo|upper bar|join:"-" bat %} contains 3 filter
+# expressions, 'foo|upper', 'bar|join:"-"' and 'bat'.
+#
+# Comments are ignored in the templates.
+#
+# == i18n in templates ==
+#
+# The purpose of this script is to extract translatable strings from templates
+# The aim is to allow template authors to write templates like this:
+#
+# This is a {{ _("translatable string") }} in the template.
+# This is a {% i18n "translatable string about %1" something %}
+# This is a {% i18nc "Some context information" "string about %1" something %}
+# This is a {% i18np "%1 string about %2" numthings something %}
+# This is a {% i18ncp "some context" "%1 string about %2" numthings something 
%}
+#
+# That is, simple translation with _(), and i18n* tags to allow for variable
+# substitution, context messages and plurals. Translatable strings may appear
+# in a filter expression, either as the value begin filtered, or as the 
argument
+# or both:
+#
+# {{ _("hello")|upper }}
+# {{ list|join:_("and") }}
+#
+# == How the strings are extracted ==
+#
+# The strings are extracted by parsing the template with regular expressions.
+# The tag_re regular expression breaks the template into a stream of tokens
+# containing plain text, {{ values }} and {% tags %}.
+# That work is done by the tokenize method with the create_token method.
+# Each token is then processed to extract the translatable strings from
+# the filter expressions.
+
+
+# The original context of much of this script is in the django template system:
+# http://code.djangoproject.com/browser/django/trunk/django/template/base.py
+
+
+TOKEN_TEXT = 0
+TOKEN_VAR = 1
+TOKEN_BLOCK = 2
+TOKEN_COMMENT = 3
+
+# template syntax constants
+FILTER_SEPARATOR = '|'
+FILTER_ARGUMENT_SEPARATOR = ':'
+BLOCK_TAG_START = '{%'
+BLOCK_TAG_END = '%}'
+VARIABLE_TAG_START = '{{'
+VARIABLE_TAG_END = '}}'
+COMMENT_TAG_START = '{#'
+COMMENT_TAG_END = '#}'
+
+# match a variable or block tag and capture the entire tag, including 
start/end delimiters
+tag_re = re.compile('(%s.*?%s|%s.*?%s)' % (re.escape(BLOCK_TAG_START), 
re.escape(BLOCK_TAG_END),
+                                          re.escape(VARIABLE_TAG_START), 
re.escape(VARIABLE_TAG_END)))
+
+
+# Expression to match some_token and some_token="with spaces" (and similarly
+# for single-quoted strings).
+smart_split_re = re.compile(r"""
+    ((?:
+        [^\s'"]*
+        (?:
+            (?:"(?:[^"\\]|\\.)*" | '(?:[^'\\]|\\.)*')
+            [^\s'"]*
+        )+
+    ) | \S+)
+""", re.VERBOSE)
+
+def smart_split(text):
+    r"""
+    Generator that splits a string by spaces, leaving quoted phrases together.
+    Supports both single and double quotes, and supports escaping quotes with
+    backslashes. In the output, strings will keep their initial and trailing
+    quote marks and escaped quotes will remain escaped (the results can then
+    be further processed with unescape_string_literal()).
+
+    >>> list(smart_split(r'This is "a person\'s" test.'))
+    [u'This', u'is', u'"a person\\\'s"', u'test.']
+    >>> list(smart_split(r"Another 'person\'s' test."))
+    [u'Another', u"'person\\'s'", u'test.']
+    >>> list(smart_split(r'A "\"funky\" style" test.'))
+    [u'A', u'"\\"funky\\" style"', u'test.']
+    """
+    for bit in smart_split_re.finditer(text):
+        yield bit.group(0)
+
+
+# This only matches constant *strings* (things in quotes or marked for
+# translation).
+
+constant_string = r"(?:%(strdq)s|%(strsq)s)" % {
+    'strdq': r'"[^"\\]*(?:\\.[^"\\]*)*"', # double-quoted string
+    'strsq': r"'[^'\\]*(?:\\.[^'\\]*)*'", # single-quoted string
+    }
+
+filter_raw_string = 
r"""^%(i18n_open)s(?P<l10nable>%(constant_string)s)%(i18n_close)s""" % {
+    'constant_string': constant_string,
+    'i18n_open' : re.escape("_("),
+    'i18n_close' : re.escape(")"),
+  }
+
+filter_re = re.compile(filter_raw_string, re.UNICODE|re.VERBOSE)
+
+class TemplateSyntaxError(Exception):
+    pass
+
+class TranslatableString:
+    _string = ''
+    context = ''
+    plural = ''
+
+    def __repr__(self):
+        return "String('%s', '%s', '%s')" % (self._string, self.context, 
self.plural)
+
+class Token(object):
+    def __init__(self, token_type, contents):
+        # token_type must be TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK or 
TOKEN_COMMENT.
+        self.token_type, self.contents = token_type, contents
+
+    def __str__(self):
+        return '<%s token: "%s...">' % \
+            ({TOKEN_TEXT: 'Text', TOKEN_VAR: 'Var', TOKEN_BLOCK: 'Block', 
TOKEN_COMMENT: 'Comment'}[self.token_type],
+            self.contents[:20].replace('\n', ''))
+
+def create_token(token_string, in_tag):
+    """
+    Convert the given token string into a new Token object and return it.
+    If in_tag is True, we are processing something that matched a tag,
+    otherwise it should be treated as a literal string.
+    """
+    if in_tag:
+        if token_string.startswith(VARIABLE_TAG_START):
+            token = Token(TOKEN_VAR, 
token_string[len(VARIABLE_TAG_START):-len(VARIABLE_TAG_END)].strip())
+        elif token_string.startswith(BLOCK_TAG_START):
+            token = Token(TOKEN_BLOCK, 
token_string[len(BLOCK_TAG_START):-len(BLOCK_TAG_END)].strip())
+        elif token_string.startswith(COMMENT_TAG_START):
+            token = Token(TOKEN_COMMENT, '')
+    else:
+        token = Token(TOKEN_TEXT, token_string)
+    return token
+
+def tokenize(template_string):
+
+    in_tag = False
+    result = []
+    for bit in tag_re.split(template_string):
+        if bit:
+            result.append(create_token(bit, in_tag))
+        in_tag = not in_tag
+    return result
+
+class TranslationOutputter:
+    translatable_strings = []
+
+    def get_translatable_filter_args(self, token):
+        """
+        Find the filter expressions in token and extract the strings in it.
+        """
+        matches = filter_re.finditer(token)
+        upto = 0
+        var_obj = False
+        for match in matches:
+            l10nable = match.group("l10nable")
+
+            if l10nable:
+                # Make sure it's a quoted string
+                if l10nable.startswith('"') and l10nable.endswith('"') \
+                        or l10nable.startswith("'") and l10nable.endswith("'"):
+                    ts = TranslatableString()
+                    ts._string = l10nable[1:-1]
+                    self.translatable_strings.append(ts)
+
+    def get_contextual_strings(self, token):
+        split = []
+        _bits = smart_split(token.contents)
+        _bit = _bits.next()
+        if _bit =="i18n" or _bit == "i18n_var":
+            # {% i18n "A one %1, a two %2, a three %3" var1 var2 var3 %}
+            # {% i18n_var "A one %1, a two %2, a three %3" var1 var2 var3 as 
result %}
+            _bit = _bits.next()
+            if not _bit.startswith("'") and not _bit.startswith('"'):
+                return
+
+            sentinal = _bit[0]
+            if not _bit.endswith(sentinal):
+                return
+
+            translatable_string = TranslatableString()
+            translatable_string._string = _bit[1:-1]
+            self.translatable_strings.append(translatable_string)
+        elif _bit =="i18nc" or _bit == "i18nc_var":
+            # {% i18nc "An email send operation failed." "%1 Failed!" var1 %}
+            # {% i18nc_var "An email send operation failed." "%1 Failed!" var1 
as result %}
+            _bit = _bits.next()
+            if not _bit.startswith("'") and not _bit.startswith('"'):
+                return
+
+            sentinal = _bit[0]
+            if not _bit.endswith(sentinal):
+                return
+
+            translatable_string = TranslatableString()
+            translatable_string.context = _bit[1:-1]
+            _bit = _bits.next()
+            translatable_string._string = _bit[1:-1]
+            self.translatable_strings.append(translatable_string)
+        elif _bit =="i18np" or _bit =="i18np_var":
+            # {% i18np "An email send operation failed." "%1 email send 
operations failed. Error : % 2." count count errorMsg %}
+            # {% i18np_var "An email send operation failed." "%1 email send 
operations failed. Error : % 2." count count errorMsg as result %}
+            _bit = _bits.next()
+            if not _bit.startswith("'") and not _bit.startswith('"'):
+                return
+
+            sentinal = _bit[0]
+            if not _bit.endswith(sentinal):
+                return
+
+            translatable_string = TranslatableString()
+            translatable_string._string = _bit[1:-1]
+            _bit = _bits.next()
+            translatable_string.plural = _bit[1:-1]
+            self.translatable_strings.append(translatable_string)
+        elif _bit =="i18ncp" or _bit =="i18ncp_var":
+            # {% i18np "The user tried to send an email, but that failed." "An 
email send operation failed." "%1 email send operation failed." count count %}
+            # {% i18np_var "The user tried to send an email, but that failed." 
"An email send operation failed." "%1 email send operation failed." count count 
as result %}
+
+            _bit = _bits.next()
+            if not _bit.startswith("'") and not _bit.startswith('"'):
+                return
+
+            sentinal = _bit[0]
+            if not _bit.endswith(sentinal):
+                return
+
+            translatable_string = TranslatableString()
+            translatable_string.context = _bit[1:-1]
+            _bit = _bits.next()
+            translatable_string._string = _bit[1:-1]
+            _bit = _bits.next()
+            translatable_string.plural = _bit[1:-1]
+            self.translatable_strings.append(translatable_string)
+        else:
+          return
+
+        for _bit in _bits:
+
+            if (_bit == "as"):
+                return
+            self.get_translatable_filter_args(_bit)
+
+    def get_plain_strings(self, token):
+        split = []
+        bits = iter(smart_split(token.contents))
+        for bit in bits:
+            self.get_translatable_filter_args(bit)
+
+    def translate(self, template_file, outputfile):
+        template_string = template_file.read()
+        self.translatable_strings = []
+        for token in tokenize(template_string):
+            if token.token_type == TOKEN_VAR or token.token_type == 
TOKEN_BLOCK:
+                self.get_plain_strings(token)
+            if token.token_type == TOKEN_BLOCK:
+                self.get_contextual_strings(token)
+        self.createOutput(os.path.relpath(template_file.name), 
self.translatable_strings, outputfile)
+
+    def createOutput(self, template_filename, translatable_strings, 
outputfile):
+      pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ktexttemplate-6.7.0/scripts/strings_extractor_gettext.py 
new/ktexttemplate-6.13.0/scripts/strings_extractor_gettext.py
--- old/ktexttemplate-6.7.0/scripts/strings_extractor_gettext.py        
1970-01-01 01:00:00.000000000 +0100
+++ new/ktexttemplate-6.13.0/scripts/strings_extractor_gettext.py       
2025-04-04 16:03:14.000000000 +0200
@@ -0,0 +1,27 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# SPDX-FileCopyrightText: 2010 Stephen Kelly <steve...@gmail.com>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+##
+
+from strings_extractor import TranslationOutputter
+
+class GettextExtractStrings(TranslationOutputter):
+  def createOutput(self, template_filename, context_strings, outputfile):
+    for context_string in context_strings:
+      outputfile.write("// i18n: file: " + template_filename + "\n")
+      if context_string.context:
+        if not context_string.plural:
+          outputfile.write("pgettext(\"" + context_string.context + "\", \"" + 
context_string._string + "\");\n")
+        else:
+          outputfile.write("npgettext(\"" + context_string.context + "\", \"" 
+ context_string._string + "\", \"" + context_string.plural + "\");\n")
+      else:
+        if context_string.plural:
+          outputfile.write("ngettext(\"" + context_string._string + "\", \"" + 
context_string.plural + "\");\n")
+        else:
+          outputfile.write("gettext(\"" + context_string._string + "\");\n")
+
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ktexttemplate-6.7.0/scripts/strings_extractor_linguist.py 
new/ktexttemplate-6.13.0/scripts/strings_extractor_linguist.py
--- old/ktexttemplate-6.7.0/scripts/strings_extractor_linguist.py       
1970-01-01 01:00:00.000000000 +0100
+++ new/ktexttemplate-6.13.0/scripts/strings_extractor_linguist.py      
2025-04-04 16:03:14.000000000 +0200
@@ -0,0 +1,28 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# SPDX-FileCopyrightText: 2010 Stephen Kelly <steve...@gmail.com>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+##
+
+from strings_extractor import TranslationOutputter
+
+class LinguistExtractStrings(TranslationOutputter):
+  def createOutput(self, template_filename, context_strings, outputfile):
+
+    #for plain_string in plain_strings:
+      #outputfile.write("QCoreApplication::translate(\"GR_FILENAME\", \"" + 
plain_string + "\");\n")
+    for context_string in context_strings:
+      if context_string.context:
+        if not context_string.plural:
+          outputfile.write("QCoreApplication::translate(\"GR_FILENAME\", \"" + 
context_string._string + "\", \"" + context_string.context + "\");\n")
+        else:
+          outputfile.write("QCoreApplication::translate(\"GR_FILENAME\", \"" + 
context_string._string + "\", \"" + context_string.context + "\", count );\n")
+      else:
+        if context_string.plural:
+          outputfile.write("QCoreApplication::translate(\"GR_FILENAME\", \"" + 
context_string._string + "\", \"\", count);\n")
+        else:
+          outputfile.write("QCoreApplication::translate(\"GR_FILENAME\", \"" + 
context_string._string + "\");\n")
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/src/defaulttags/now.cpp 
new/ktexttemplate-6.13.0/src/defaulttags/now.cpp
--- old/ktexttemplate-6.7.0/src/defaulttags/now.cpp     2024-10-04 
17:09:54.000000000 +0200
+++ new/ktexttemplate-6.13.0/src/defaulttags/now.cpp    2025-04-04 
16:03:14.000000000 +0200
@@ -21,7 +21,10 @@
     auto expr = tagContent.split(QLatin1Char('"'), Qt::KeepEmptyParts);
 
     if (expr.size() != 3) {
-        throw KTextTemplate::Exception(TagSyntaxError, QStringLiteral("now tag 
takes one argument"));
+        expr = tagContent.split(QLatin1Char('\''), Qt::KeepEmptyParts);
+        if (expr.size() != 3) {
+            throw KTextTemplate::Exception(TagSyntaxError, QStringLiteral("now 
tag takes one string argument"));
+        }
     }
 
     auto formatString = expr.at(1);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.7.0/src/loadertags/block.h 
new/ktexttemplate-6.13.0/src/loadertags/block.h
--- old/ktexttemplate-6.7.0/src/loadertags/block.h      2024-10-04 
17:09:54.000000000 +0200
+++ new/ktexttemplate-6.13.0/src/loadertags/block.h     2025-04-04 
16:03:14.000000000 +0200
@@ -40,14 +40,8 @@
 
     void render(OutputStream *stream, Context *c) const override;
 
-    BlockNode *takeNodeParent();
-
     QString name() const;
 
-    void setNodeParent(BlockNode *);
-
-    void addParent(NodeList);
-
     NodeList nodeList() const;
 
     // Q_SLOTS

++++++ ktexttemplate-6.7.0.tar.xz.sig -> ktexttemplate-6.13.0.tar.xz.sig ++++++
--- 
/work/SRC/openSUSE:Leap:16.0/kf6-ktexttemplate/ktexttemplate-6.7.0.tar.xz.sig   
    2025-03-19 11:47:55.768779273 +0100
+++ 
/work/SRC/openSUSE:Leap:16.0/.kf6-ktexttemplate.new.30101/ktexttemplate-6.13.0.tar.xz.sig
   2025-04-23 10:11:58.184548328 +0200
@@ -1,7 +1,7 @@
 -----BEGIN PGP SIGNATURE-----
 
-iHUEABYKAB0WIQSQqWisqEU3zCe5nq8sjfWHptSqwQUCZwAFQwAKCRAsjfWHptSq
-waTNAP0aSfBZ1K/HP+nzi3IHar53cVe0lVfTH5fTUjd9GgSGVgD+JTpajzKCghp7
-yRuj+qQn9VeXthvrD7JlVoq1xbZOCAs=
-=mbdl
+iHUEABYKAB0WIQSQqWisqEU3zCe5nq8sjfWHptSqwQUCZ+/mowAKCRAsjfWHptSq
+wblUAP9wmEqQ21Zr9PAVFTruykBV7i+dakEsVWPr4tp+Kh8o7AD9FdG67Q6Tq6b2
+PIdZwV/l+QZgZH9xV0m5nyFecnYvvQc=
+=mmXc
 -----END PGP SIGNATURE-----

Reply via email to