On Mon, Jul 22, 2024 at 10:42 AM jian he <jian.universal...@gmail.com> wrote:
>
hi. this time everything should be ok!


step1. python3  split_func_sgml.py
step2. git apply
v6-0001-all-filelist-for-directory-doc-src-sgml-func.patch (step2,
cannot use "git am").


what v7_split_func_sgml.py did:
1. The new file only has 2 occurrences of "sect1"
2. Each new sgml file has its own unique identifier, e.g. for
func-logical.sgml unique string is "<sect1 id="functions-logical">"
3. sed copy,  inplace delete command string will be printed out.
you can check the line number in func.sgml to verify the sed command.
From d123a7c9ef6ad45e3b697aa20bcfc831f594b45d Mon Sep 17 00:00:00 2001
From: jian he <jian.universal...@gmail.com>
Date: Sun, 21 Jul 2024 20:43:45 +0800
Subject: [PATCH v6 1/1] all filelist for directory doc/src/sgml/func

---
 doc/src/sgml/filelist.sgml      |  5 ++++-
 doc/src/sgml/func/allfiles.sgml | 40 +++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 doc/src/sgml/func/allfiles.sgml

diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index a7ff5f82..d9f36933 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -17,7 +17,10 @@
 <!ENTITY datatype   SYSTEM "datatype.sgml">
 <!ENTITY ddl        SYSTEM "ddl.sgml">
 <!ENTITY dml        SYSTEM "dml.sgml">
-<!ENTITY func       SYSTEM "func.sgml">
+
+<!ENTITY % allfiles_func   SYSTEM "func/allfiles.sgml">
+%allfiles_func;
+
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
diff --git a/doc/src/sgml/func/allfiles.sgml b/doc/src/sgml/func/allfiles.sgml
new file mode 100644
index 00000000..34eec608
--- /dev/null
+++ b/doc/src/sgml/func/allfiles.sgml
@@ -0,0 +1,40 @@
+<!--
+doc/src/sgml/func/allfiles.sgml
+PostgreSQL documentation
+Complete list of usable sgml source files in this directory.
+-->
+
+<!-- function references -->
+
+<!ENTITY func                       SYSTEM "func.sgml">
+<!ENTITY func-logical               SYSTEM "func-logical.sgml">
+<!ENTITY func-comparison            SYSTEM "func-comparison.sgml">
+<!ENTITY func-math                  SYSTEM "func-math.sgml">
+<!ENTITY func-string                SYSTEM "func-string.sgml">
+<!ENTITY func-binarystring          SYSTEM "func-binarystring.sgml">
+<!ENTITY func-bitstring             SYSTEM "func-bitstring.sgml">
+<!ENTITY func-matching              SYSTEM "func-matching.sgml">
+<!ENTITY func-formatting            SYSTEM "func-formatting.sgml">
+<!ENTITY func-datetime              SYSTEM "func-datetime.sgml">
+<!ENTITY func-enum                  SYSTEM "func-enum.sgml">
+<!ENTITY func-geometry              SYSTEM "func-geometry.sgml">
+<!ENTITY func-net                   SYSTEM "func-net.sgml">
+<!ENTITY func-textsearch            SYSTEM "func-textsearch.sgml">
+<!ENTITY func-uuid                  SYSTEM "func-uuid.sgml">
+<!ENTITY func-xml                   SYSTEM "func-xml.sgml">
+<!ENTITY func-json                  SYSTEM "func-json.sgml">
+<!ENTITY func-sequence              SYSTEM "func-sequence.sgml">
+<!ENTITY func-conditional           SYSTEM "func-conditional.sgml">
+<!ENTITY func-array                 SYSTEM "func-array.sgml">
+<!ENTITY func-range                 SYSTEM "func-range.sgml">
+<!ENTITY func-aggregate             SYSTEM "func-aggregate.sgml">
+<!ENTITY func-window                SYSTEM "func-window.sgml">
+<!ENTITY func-merge-support         SYSTEM "func-merge-support.sgml">
+<!ENTITY func-subquery              SYSTEM "func-subquery.sgml">
+<!ENTITY func-comparisons           SYSTEM "func-comparisons.sgml">
+<!ENTITY func-srf                   SYSTEM "func-srf.sgml">
+<!ENTITY func-info                  SYSTEM "func-info.sgml">
+<!ENTITY func-admin                 SYSTEM "func-admin.sgml">
+<!ENTITY func-trigger               SYSTEM "func-trigger.sgml">
+<!ENTITY func-event-triggers        SYSTEM "func-event-triggers.sgml">
+<!ENTITY func-statistics            SYSTEM "func-statistics.sgml">
\ No newline at end of file
-- 
2.34.1

import subprocess
import os
import re
top_dir = subprocess.check_output(["git", "rev-parse", "--show-toplevel"])
top_dir = top_dir.decode().rstrip('\n')
top_src_dir = top_dir + "/doc/src/sgml"
os.chdir(top_src_dir)
#
func_logical="func-logical.sgml"
func_comparison="func-comparison.sgml"
func_math="func-math.sgml"
func_string="func-string.sgml"
func_binarystring="func-binarystring.sgml"
func_bitstring="func-bitstring.sgml"
func_matching="func-matching.sgml"
func_formatting="func-formatting.sgml"
func_datetime="func-datetime.sgml"
func_enum="func-enum.sgml"
func_geometry="func-geometry.sgml"
func_net="func-net.sgml"
func_textsearch="func-textsearch.sgml"
func_uuid="func-uuid.sgml"
func_xml="func-xml.sgml"
func_json="func-json.sgml"
func_sequence="func-sequence.sgml"
func_conditional="func-conditional.sgml"
func_array="func-array.sgml"
func_range="func-range.sgml"
func_aggregate="func-aggregate.sgml"
func_window="func-window.sgml"
func_merge_support ="func-merge-support.sgml"
func_subquery="func-subquery.sgml"
func_comparisons="func-comparisons.sgml"
func_srf="func-srf.sgml"
func_info="func-info.sgml"
func_admin="func-admin.sgml"
func_trigger="func-trigger.sgml"
func_event_triggers="func-event-triggers.sgml"
func_statistics="func-statistics.sgml"
#
func_filenames = list()
func_filenames.append(func_logical)
func_filenames.append(func_comparison)
func_filenames.append(func_math)
func_filenames.append(func_string)
func_filenames.append(func_binarystring)
func_filenames.append(func_bitstring)
func_filenames.append(func_matching)
func_filenames.append(func_formatting)
func_filenames.append(func_datetime)
func_filenames.append(func_enum)
func_filenames.append(func_geometry)
func_filenames.append(func_net)
func_filenames.append(func_textsearch)
func_filenames.append(func_uuid)
func_filenames.append(func_xml)
func_filenames.append(func_json)
func_filenames.append(func_sequence)
func_filenames.append(func_conditional)
func_filenames.append(func_array)
func_filenames.append(func_range)
func_filenames.append(func_aggregate)
func_filenames.append(func_window)
func_filenames.append(func_merge_support )
func_filenames.append(func_subquery)
func_filenames.append(func_comparisons)
func_filenames.append(func_srf)
func_filenames.append(func_info)
func_filenames.append(func_admin)
func_filenames.append(func_trigger)
func_filenames.append(func_event_triggers)
func_filenames.append(func_statistics)
#
func_string_begin_lineno= -1
func_logical_begin_lineno=-1
func_comparison_begin_lineno=-1
func_math_begin_lineno=-1
func_string_begin_lineno=-1
func_binarystring_begin_lineno=-1
func_bitstring_begin_lineno=-1
func_matching_begin_lineno=-1
func_formatting_begin_lineno=-1
func_datetime_begin_lineno=-1
func_enum_begin_lineno=-1
func_geometry_begin_lineno=-1
func_net_begin_lineno=-1
func_textsearch_begin_lineno=-1
func_uuid_begin_lineno=-1
func_xml_begin_lineno=-1
func_json_begin_lineno=-1
func_sequence_begin_lineno=-1
func_conditional_begin_lineno=-1
func_array_begin_lineno=-1
func_range_begin_lineno=-1
func_aggregate_begin_lineno=-1
func_window_begin_lineno=-1
func_merge_support_begin_lineno=-1
func_subquery_begin_lineno=-1
func_comparisons_begin_lineno=-1
func_srf_begin_lineno=-1
func_info_begin_lineno=-1
func_admin_begin_lineno=-1
func_trigger_begin_lineno=-1
func_event_triggers_begin_lineno=-1
func_statistics_begin_lineno=-1
#
func_logical_end_lineno=-1
func_comparison_end_lineno=-1
func_math_end_lineno=-1
func_string_end_lineno=-1
func_binarystring_end_lineno=-1
func_bitstring_end_lineno=-1
func_matching_end_lineno=-1
func_formatting_end_lineno=-1
func_datetime_end_lineno=-1
func_enum_end_lineno=-1
func_geometry_end_lineno=-1
func_net_end_lineno=-1
func_textsearch_end_lineno=-1
func_uuid_end_lineno=-1
func_xml_end_lineno=-1
func_json_end_lineno=-1
func_sequence_end_lineno=-1
func_conditional_end_lineno=-1
func_array_end_lineno=-1
func_range_end_lineno=-1
func_aggregate_end_lineno=-1
func_window_end_lineno=-1
func_merge_support_end_lineno=-1
func_subquery_end_lineno=-1
func_comparisons_end_lineno=-1
func_srf_end_lineno=-1
func_info_end_lineno=-1
func_admin_end_lineno=-1
func_trigger_end_lineno=-1
func_event_triggers_end_lineno=-1
#that's the last sect1 location in the original func.sgml, we need hardcode it.
func_statistics_end_lineno=31446

def get_line_number(file_name: str):
    global func_logical_begin_lineno
    global func_comparison_begin_lineno
    global func_math_begin_lineno
    global func_string_begin_lineno
    global func_binarystring_begin_lineno
    global func_bitstring_begin_lineno
    global func_matching_begin_lineno
    global func_formatting_begin_lineno
    global func_datetime_begin_lineno
    global func_enum_begin_lineno
    global func_geometry_begin_lineno
    global func_net_begin_lineno
    global func_textsearch_begin_lineno
    global func_uuid_begin_lineno
    global func_xml_begin_lineno
    global func_json_begin_lineno
    global func_sequence_begin_lineno
    global func_conditional_begin_lineno
    global func_array_begin_lineno
    global func_range_begin_lineno
    global func_aggregate_begin_lineno
    global func_window_begin_lineno
    global func_merge_support_begin_lineno
    global func_subquery_begin_lineno
    global func_comparisons_begin_lineno
    global func_srf_begin_lineno
    global func_info_begin_lineno
    global func_admin_begin_lineno
    global func_trigger_begin_lineno
    global func_event_triggers_begin_lineno
    global func_statistics_begin_lineno
    global func_logical_end_lineno
    global func_comparison_end_lineno
    global func_math_end_lineno
    global func_string_end_lineno
    global func_binarystring_end_lineno
    global func_bitstring_end_lineno
    global func_matching_end_lineno
    global func_formatting_end_lineno
    global func_datetime_end_lineno
    global func_enum_end_lineno
    global func_geometry_end_lineno
    global func_net_end_lineno
    global func_textsearch_end_lineno
    global func_uuid_end_lineno
    global func_xml_end_lineno
    global func_json_end_lineno
    global func_sequence_end_lineno
    global func_conditional_end_lineno
    global func_array_end_lineno
    global func_range_end_lineno
    global func_aggregate_end_lineno
    global func_window_end_lineno
    global func_merge_support_end_lineno
    global func_subquery_end_lineno
    global func_comparisons_end_lineno
    global func_srf_end_lineno
    global func_info_end_lineno
    global func_admin_end_lineno
    global func_trigger_end_lineno
    global func_event_triggers_end_lineno
    global func_statistics_end_lineno
    with open(file_name, 'r+') as f:
        for i, line in enumerate(f, 1):
            if r'<sect1 id="functions-logical">' in line :
                func_logical_begin_lineno = i
            elif r'<sect1 id="functions-comparison">' in line :
                func_comparison_begin_lineno = i
                func_logical_end_lineno = i - 1
            elif r'<sect1 id="functions-math">' in line :
                func_comparison_end_lineno = i - 1
                func_math_begin_lineno = i
            elif r'<sect1 id="functions-string">' in line :
                func_math_end_lineno = i - 1
                func_string_begin_lineno = i
            elif r'<sect1 id="functions-binarystring">' in line :
                func_string_end_lineno = i - 1
                func_binarystring_begin_lineno = i
            elif r'<sect1 id="functions-bitstring">' in line :
                func_binarystring_end_lineno = i - 1
                func_bitstring_begin_lineno = i
            elif r'<sect1 id="functions-matching">' in line :
                func_bitstring_end_lineno = i - 1
                func_matching_begin_lineno = i
            elif r'<sect1 id="functions-formatting">' in line :
                func_matching_end_lineno = i - 1
                func_formatting_begin_lineno = i
            elif r'<sect1 id="functions-datetime">' in line :
                func_formatting_end_lineno = i - 1
                func_datetime_begin_lineno = i
            elif r'<sect1 id="functions-enum">' in line :
                func_datetime_end_lineno = i - 1
                func_enum_begin_lineno = i
            elif r'<sect1 id="functions-geometry">' in line :
                func_enum_end_lineno = i - 1
                func_geometry_begin_lineno = i
            elif r'<sect1 id="functions-net">' in line :
                func_geometry_end_lineno = i - 1
                func_net_begin_lineno = i
            elif r'<sect1 id="functions-textsearch">' in line :
                func_net_end_lineno = i - 1
                func_textsearch_begin_lineno = i
            elif r'<sect1 id="functions-uuid">' in line :
                func_textsearch_end_lineno = i - 1
                func_uuid_begin_lineno = i
            elif r'<sect1 id="functions-xml">' in line :
                func_uuid_end_lineno = i - 1
                func_xml_begin_lineno = i
            elif r'<sect1 id="functions-json">' in line :
                func_xml_end_lineno = i - 1
                func_json_begin_lineno = i
            elif r'<sect1 id="functions-sequence">' in line :
                func_json_end_lineno = i - 1
                func_sequence_begin_lineno = i
            elif r'<sect1 id="functions-conditional">' in line :
                func_sequence_end_lineno = i - 1
                func_conditional_begin_lineno = i
            elif r'<sect1 id="functions-array">' in line :
                func_conditional_end_lineno = i - 1
                func_array_begin_lineno = i
            elif r'<sect1 id="functions-range">' in line :
                func_array_end_lineno = i - 1
                func_range_begin_lineno = i
            elif r'<sect1 id="functions-aggregate">' in line :
                func_range_end_lineno = i - 1
                func_aggregate_begin_lineno = i
            elif r'<sect1 id="functions-window">' in line :
                func_aggregate_end_lineno = i - 1
                func_window_begin_lineno = i
            elif r'<sect1 id="functions-merge-support">' in line :
                func_window_end_lineno = i - 1
                func_merge_support_begin_lineno = i
            elif r'<sect1 id="functions-subquery">' in line :
                func_merge_support_end_lineno = i - 1
                func_subquery_begin_lineno = i
            elif r'<sect1 id="functions-comparisons">' in line :
                func_subquery_end_lineno = i - 1
                func_comparisons_begin_lineno = i
            elif r'<sect1 id="functions-srf">' in line :
                func_comparisons_end_lineno = i - 1
                func_srf_begin_lineno = i
            elif r'<sect1 id="functions-info">' in line :
                func_srf_end_lineno = i - 1
                func_info_begin_lineno = i
            elif r'<sect1 id="functions-admin">' in line :
                func_info_end_lineno = i - 1
                func_admin_begin_lineno = i
            elif r'<sect1 id="functions-trigger">' in line :
                func_admin_end_lineno = i - 1
                func_trigger_begin_lineno = i
            elif r'<sect1 id="functions-event-triggers">' in line :
                func_trigger_end_lineno = i - 1
                func_event_triggers_begin_lineno = i
            elif r'<sect1 id="functions-statistics">' in line :
                func_event_triggers_end_lineno = i - 1
                func_statistics_begin_lineno = i

#line number is important property.
#line number begin with "<sect1 id=", end with "</sect1>"
def precheck_line_no_begin():
        if ((func_logical_begin_lineno < 0)    or (func_comparison_begin_lineno < 0) or
            (func_math_begin_lineno < 0)       or (func_string_begin_lineno < 0) or
            (func_binarystring_begin_lineno < 0) or (func_bitstring_begin_lineno < 0) or
            (func_matching_begin_lineno < 0)   or (func_formatting_begin_lineno < 0) or
            (func_datetime_begin_lineno < 0)   or (func_enum_begin_lineno < 0) or
            (func_geometry_begin_lineno < 0)   or (func_net_begin_lineno < 0) or
            (func_textsearch_begin_lineno < 0) or (func_uuid_begin_lineno < 0) or
            (func_xml_begin_lineno < 0)        or (func_json_begin_lineno < 0) or
            (func_sequence_begin_lineno < 0)   or (func_conditional_begin_lineno < 0) or
            (func_array_begin_lineno < 0) or (func_range_begin_lineno < 0) or
            (func_aggregate_begin_lineno < 0) or (func_window_begin_lineno < 0) or
            (func_merge_support_begin_lineno < 0) or (func_subquery_begin_lineno < 0) or
            (func_comparisons_begin_lineno < 0) or (func_srf_begin_lineno < 0) or
            (func_info_begin_lineno < 0) or (func_admin_begin_lineno < 0) or
            (func_trigger_begin_lineno < 0) or (func_event_triggers_begin_lineno < 0) or
            (func_statistics_begin_lineno < 0)):
                ValueError("don't have related file")
                print("quiting line numbers begin is invalid")
                quit()
def precheck_line_no_end():
        if ((func_logical_end_lineno < 0) or (func_comparison_end_lineno < 0) or
            (func_math_end_lineno < 0) or (func_string_end_lineno < 0) or
            (func_binarystring_end_lineno < 0) or (func_bitstring_end_lineno < 0) or
            (func_matching_end_lineno < 0) or (func_formatting_end_lineno < 0) or
            (func_datetime_end_lineno < 0) or (func_enum_end_lineno < 0) or
            (func_geometry_end_lineno < 0) or (func_net_end_lineno < 0) or
            (func_textsearch_end_lineno < 0) or (func_uuid_end_lineno < 0) or
            (func_xml_end_lineno < 0) or (func_json_end_lineno < 0) or
            (func_sequence_end_lineno < 0) or (func_conditional_end_lineno < 0) or
            (func_array_end_lineno < 0) or (func_range_end_lineno < 0) or
            (func_aggregate_end_lineno < 0) or (func_window_end_lineno < 0) or
            (func_merge_support_end_lineno < 0) or (func_subquery_end_lineno < 0) or
            (func_comparisons_end_lineno < 0) or (func_srf_end_lineno < 0) or
            (func_info_end_lineno < 0) or (func_admin_end_lineno < 0) or
            (func_trigger_end_lineno < 0) or  (func_event_triggers_end_lineno < 0) or
            (func_statistics_end_lineno < 0)):
                ValueError("don't have related file")
                print("quiting line numbers end is invalid")                
                quit()
#--------------------------step1. create func  directory and move original func.sgml to func directory.
target_file="func.sgml"
os.mkdir(top_src_dir+ "/func") #make func directory
os.chdir(top_src_dir+ "/func")
print ("Updated directory:" , os.getcwd())
subprocess.call(["git", "add", "."])
subprocess.call(["mv","../func.sgml", "func.sgml"])
for x in func_filenames:
    subprocess.call(["touch",  x])

# get the line number info and validate it.
get_line_number(target_file)
precheck_line_no_begin()
precheck_line_no_end()
#--------------------------step2 construct sed commands and execute it
sed_copy_commands = list()
sed_copy_commands.append(
    f"sed -n '{func_logical_begin_lineno}, {func_logical_end_lineno}p' {target_file} > {func_logical}")
sed_copy_commands.append(
    f"sed -n '{func_comparison_begin_lineno}, {func_comparison_end_lineno}p' {target_file} > {func_comparison}")
sed_copy_commands.append(
    f"sed -n '{func_math_begin_lineno}, {func_math_end_lineno}p' {target_file} > {func_math}")
sed_copy_commands.append(
    f"sed -n '{func_string_begin_lineno}, {func_string_end_lineno}p' {target_file} > {func_string}")
sed_copy_commands.append(
    f"sed -n '{func_binarystring_begin_lineno}, {func_binarystring_end_lineno}p' {target_file} > {func_binarystring}")
sed_copy_commands.append(
    f"sed -n '{func_bitstring_begin_lineno}, {func_bitstring_end_lineno}p' {target_file} > {func_bitstring}")
sed_copy_commands.append(
    f"sed -n '{func_matching_begin_lineno}, {func_matching_end_lineno}p' {target_file} > {func_matching}")
sed_copy_commands.append(
    f"sed -n '{func_formatting_begin_lineno}, {func_formatting_end_lineno}p' {target_file} > {func_formatting}")
sed_copy_commands.append(
    f"sed -n '{func_datetime_begin_lineno}, {func_datetime_end_lineno}p' {target_file} > {func_datetime}")
sed_copy_commands.append(
    f"sed -n '{func_enum_begin_lineno}, {func_enum_end_lineno}p' {target_file} > {func_enum}")
sed_copy_commands.append(
    f"sed -n '{func_geometry_begin_lineno}, {func_geometry_end_lineno}p' {target_file} > {func_geometry}")
sed_copy_commands.append(
    f"sed -n '{func_net_begin_lineno}, {func_net_end_lineno}p' {target_file} > {func_net}")
sed_copy_commands.append(
    f"sed -n '{func_textsearch_begin_lineno}, {func_textsearch_end_lineno}p' {target_file} > {func_textsearch}")
sed_copy_commands.append(
    f"sed -n '{func_uuid_begin_lineno}, {func_uuid_end_lineno}p' {target_file} > {func_uuid}")
sed_copy_commands.append(
    f"sed -n '{func_xml_begin_lineno}, {func_xml_end_lineno}p' {target_file} > {func_xml}")
sed_copy_commands.append(
    f"sed -n '{func_json_begin_lineno}, {func_json_end_lineno}p' {target_file} > {func_json}")
sed_copy_commands.append(
    f"sed -n '{func_sequence_begin_lineno}, {func_sequence_end_lineno}p' {target_file} > {func_sequence}")
sed_copy_commands.append(
    f"sed -n '{func_conditional_begin_lineno}, {func_conditional_end_lineno}p' {target_file} > {func_conditional}")
sed_copy_commands.append(
    f'sed -n \'{func_array_begin_lineno}, {func_array_end_lineno}p\' {target_file} > {func_array}')
sed_copy_commands.append(
    f'sed -n \'{func_range_begin_lineno}, {func_range_end_lineno}p\' {target_file} > {func_range}')
sed_copy_commands.append(
    f'sed -n \'{func_aggregate_begin_lineno}, {func_aggregate_end_lineno}p\' {target_file} > {func_aggregate}')
sed_copy_commands.append(
    f'sed -n \'{func_window_begin_lineno}, {func_window_end_lineno}p\' {target_file} > {func_window}')
sed_copy_commands.append(
    f'sed -n \'{func_merge_support_begin_lineno}, {func_merge_support_end_lineno}p\' {target_file} > {func_merge_support}')
sed_copy_commands.append(
    f'sed -n \'{func_subquery_begin_lineno}, {func_subquery_end_lineno}p\' {target_file} > {func_subquery}')
sed_copy_commands.append(
    f'sed -n \'{func_comparisons_begin_lineno}, {func_comparisons_end_lineno}p\' {target_file} > {func_comparisons}')
sed_copy_commands.append(
    f'sed -n \'{func_srf_begin_lineno}, {func_srf_end_lineno}p\' {target_file} > {func_srf}')
sed_copy_commands.append(
    f'sed -n \'{func_info_begin_lineno}, {func_info_end_lineno}p\' {target_file} > {func_info}')
sed_copy_commands.append(
    f'sed -n \'{func_admin_begin_lineno}, {func_admin_end_lineno}p\' {target_file} > {func_admin}')
sed_copy_commands.append(
    f'sed -n \'{func_trigger_begin_lineno}, {func_trigger_end_lineno}p\' {target_file} > {func_trigger}')
sed_copy_commands.append(
    f'sed -n \'{func_event_triggers_begin_lineno}, {func_event_triggers_end_lineno}p\' {target_file} > {func_event_triggers}')
sed_copy_commands.append(
    f'sed -n \'{func_statistics_begin_lineno}, {func_statistics_end_lineno}p\' {target_file} > {func_statistics}')
# sed -n '31362, 31269p' func.sgml > func-statistics.sgml
print(f'sed command for copying func.sgml content to new sgml file')
for x in sed_copy_commands:
        print(f'{x}')
        subprocess.call([x], shell=True)
#--------------------------step3 validate new file only have 2 "sect1".
#validate new file have 2 occurences of "sect1"
def validate_new_file_sect1(file_name: str, pattern: str):
    matches_all = []
    with open(file_name, 'r+') as f:
        for i, line in enumerate(f, 1):
            matches = re.findall(pattern, line)
            if (len(matches) > 0):
                matches_all = matches_all + matches
        if (len(matches_all) != 2):
            print(f'{file_name} should only have 2 \"{pattern}\" attribute. now quit')
            quit()

for x in func_filenames:
    validate_new_file_sect1(x, "sect1")

def validate_new_file_sect1id(file_name: str, pattern: str):
    matches_all = []
    with open(file_name, 'r+') as f:
        for i, line in enumerate(f, 1):
            matches = re.findall(pattern, line)
            if (len(matches) > 0):
                matches_all = matches_all + matches
        if (len(matches_all) != 1):
            print(f'{file_name} should only have 1 \"{pattern}\" attribute. now quit')
            quit()
#-------- validate new files "<sect1 id.*"is unique.".
validate_new_file_sect1id(func_logical,r'<sect1 id="functions-logical">')
validate_new_file_sect1id(func_comparison,r'<sect1 id="functions-comparison">')
validate_new_file_sect1id(func_math,r'<sect1 id="functions-math">')
validate_new_file_sect1id(func_string, r'<sect1 id="functions-string">')
validate_new_file_sect1id(func_binarystring,r'<sect1 id="functions-binarystring">')
validate_new_file_sect1id(func_bitstring,r'<sect1 id="functions-bitstring">')
validate_new_file_sect1id(func_matching,r'<sect1 id="functions-matching">')
validate_new_file_sect1id(func_formatting,r'<sect1 id="functions-formatting">')
validate_new_file_sect1id(func_datetime,r'<sect1 id="functions-datetime">')
validate_new_file_sect1id(func_enum,r'<sect1 id="functions-enum">')
validate_new_file_sect1id(func_geometry,r'<sect1 id="functions-geometry">')
validate_new_file_sect1id(func_net,r'<sect1 id="functions-net">')
validate_new_file_sect1id(func_textsearch,r'<sect1 id="functions-textsearch">')
validate_new_file_sect1id(func_uuid,r'<sect1 id="functions-uuid">')
validate_new_file_sect1id(func_xml,r'<sect1 id="functions-xml">')
validate_new_file_sect1id(func_json,r'<sect1 id="functions-json">')
validate_new_file_sect1id(func_sequence,r'<sect1 id="functions-sequence">')
validate_new_file_sect1id(func_conditional,r'<sect1 id="functions-conditional">')
validate_new_file_sect1id(func_array,r'<sect1 id="functions-array">')
validate_new_file_sect1id(func_range,r'<sect1 id="functions-range">')
validate_new_file_sect1id(func_aggregate,r'<sect1 id="functions-aggregate">')
validate_new_file_sect1id(func_window,r'<sect1 id="functions-window">')
validate_new_file_sect1id(func_merge_support,r'<sect1 id="functions-merge-support">')
validate_new_file_sect1id(func_subquery,r'<sect1 id="functions-subquery">')
validate_new_file_sect1id(func_comparisons,r'<sect1 id="functions-comparisons">')
validate_new_file_sect1id(func_srf,r'<sect1 id="functions-srf">')
validate_new_file_sect1id(func_info,r'<sect1 id="functions-info">')
validate_new_file_sect1id(func_admin,r'<sect1 id="functions-admin">')
validate_new_file_sect1id(func_trigger,r'<sect1 id="functions-trigger">')
validate_new_file_sect1id(func_event_triggers,r'<sect1 id="functions-event-triggers">')
validate_new_file_sect1id(func_statistics,r'<sect1 id="functions-statistics">')

sed_in_place_delete_all = \
'sed --in-place "{0},{1}d ; {2},{3}d ; {4},{5}d ; {6},{7}d ; {8},{9}d ; \
{10},{11}d ; {12},{13}d ; {14},{15}d ; {16},{17}d ; {18},{19}d ; {20},{21}d ; \
{22},{23}d ; {24},{25}d ; {26},{27}d ; {28},{29}d ; {30},{31}d ; \
{32},{33}d ; {34},{35}d ; {36},{37}d ; {38},{39}d ; {40},{41}d ; \
{42},{43}d ; {44},{45}d ; {46},{47}d ; {48},{49}d ; {50},{51}d ; \
{52},{53}d ; {54},{55}d ; {56},{57}d ; {58},{59}d; {60},{61}d" '.format(
                    func_logical_begin_lineno,
                    func_logical_end_lineno,
                    func_comparison_begin_lineno,
                    func_comparison_end_lineno,
                    func_math_begin_lineno,
                    func_math_end_lineno,
                    func_string_begin_lineno,
                    func_string_end_lineno,
                    func_binarystring_begin_lineno,
                    func_binarystring_end_lineno,
                    func_bitstring_begin_lineno,
                    func_bitstring_end_lineno,
                    func_matching_begin_lineno,
                    func_matching_end_lineno,
                    func_formatting_begin_lineno,
                    func_formatting_end_lineno,
                    func_datetime_begin_lineno,
                    func_datetime_end_lineno,
                    func_enum_begin_lineno,
                    func_enum_end_lineno,
                    func_geometry_begin_lineno,
                    func_geometry_end_lineno,
                    func_net_begin_lineno,
                    func_net_end_lineno,
                    func_textsearch_begin_lineno,
                    func_textsearch_end_lineno,
                    func_uuid_begin_lineno,
                    func_uuid_end_lineno,
                    func_xml_begin_lineno,
                    func_xml_end_lineno,
                    func_json_begin_lineno,
                    func_json_end_lineno,
                    func_sequence_begin_lineno,
                    func_sequence_end_lineno,
                    func_conditional_begin_lineno,
                    func_conditional_end_lineno,
                    func_array_begin_lineno,
                    func_array_end_lineno,
                    func_range_begin_lineno,
                    func_range_end_lineno,
                    func_aggregate_begin_lineno,
                    func_aggregate_end_lineno,
                    func_window_begin_lineno,
                    func_window_end_lineno,
                    func_merge_support_begin_lineno,
                    func_merge_support_end_lineno,
                    func_subquery_begin_lineno,
                    func_subquery_end_lineno,
                    func_comparisons_begin_lineno,
                    func_comparisons_end_lineno,
                    func_srf_begin_lineno,
                    func_srf_end_lineno,
                    func_info_begin_lineno,
                    func_info_end_lineno,
                    func_admin_begin_lineno,
                    func_admin_end_lineno,
                    func_trigger_begin_lineno,
                    func_trigger_end_lineno,
                    func_event_triggers_begin_lineno,
                    func_event_triggers_end_lineno,
                    func_statistics_begin_lineno,
                    func_statistics_end_lineno
                    )

sed_in_place_delete_all = sed_in_place_delete_all + target_file
#print out sed in-place delete command
print(f'sed_in_place_delete_all: {sed_in_place_delete_all}')
#and run the delete command
subprocess.call([sed_in_place_delete_all], shell=True)

all_func_sgml_place_holder = """&func-logical;
&func-comparison;
&func-math;
&func-string;
&func-binarystring;
&func-bitstring;
&func-matching;
&func-formatting;
&func-datetime;
&func-enum;
&func-geometry;
&func-net;
&func-textsearch;
&func-uuid;
&func-xml;
&func-json;
&func-sequence;
&func-conditional;
&func-array;
&func-range;
&func-aggregate;
&func-window;
&func-merge-support;
&func-subquery;
&func-comparisons;
&func-srf;
&func-info;
&func-admin;
&func-trigger;
&func-event-triggers;
&func-statistics;
"""

# insert content before line X in file_name
def write_line(file_name:str, line:int, content:str):
  line -= 1 # Python starts counting at 0, but people start counting at one. This accounts for that.
  with open(file_name, "r") as file: # Open the file in read mode
    lines = file.readlines() # Assign the file as a list to a variable
    lines[line] = lines[line] + content  # concatenate the content
  with open(file_name, "w") as file: # Open the file in write mode
    file.write("".join(lines))      # Write the modified content to the file

#write the all_func_sgml_place_holder string to func.sgml after line 50.
write_line("func.sgml", 50, all_func_sgml_place_holder)
#git related commmand.
os.chdir(top_src_dir+ "/func")
print ("Updated directory:" , os.getcwd())
subprocess.call(["git", "add", "./*"])

Reply via email to