Description: Add lacking file doc/mkqhcp.py
 This is needed, in order to build the documentation from sources.
Author: Rafael Laboissière <rafael@debian.org>
Origin: upstream, https://sourceforge.net/p/octave/sockets/ci/default/tree/doc/mkqhcp.py
Bug: https://savannah.gnu.org/bugs/?65174
Forwarded: not-needed
Last-Update: 2024-02-11

--- /dev/null
+++ octave-sockets-1.4.1/doc/mkqhcp.py
@@ -0,0 +1,150 @@
+#!/usr/bin/python3
+
+## mkqhcp.py
+## Version 1.0.2
+
+## Copyright 2022-2023 John Donoghue
+##
+## 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 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see
+## <https://www.gnu.org/licenses/>.
+
+import sys
+import os
+import re
+
+def process(name):
+  with open(name + ".qhcp", 'wt') as f:
+    f.write ('<?xml version="1.0" encoding="UTF-8"?>\n')
+    f.write ('<QHelpCollectionProject version="1.0">\n')
+    f.write ('  <docFiles>\n')
+    f.write ('    <generate>\n')
+    f.write ('      <file>\n')
+    f.write ('        <input>{0}.qhp</input>\n'.format(name))
+    f.write ('        <output>{0}.qch</output>\n'.format(name))
+    f.write ('      </file>\n')
+    f.write ('    </generate>\n')
+    f.write ('    <register>\n')
+    f.write ('      <file>{0}.qch</file>\n'.format(name))
+    f.write ('    </register>\n')
+    f.write ('  </docFiles>\n')
+    f.write ('</QHelpCollectionProject>\n')
+
+  title = name
+  pat_match = re.compile(".*<title>(?P<title>[^<]+)</title>.*")
+  with open(name + ".html", 'rt') as fin:
+    # find html
+    for line in fin:
+      line = line.strip()
+      e = pat_match.match(line)
+      if e:
+          title = e.group("title")
+          break
+
+  h2_match = re.compile('.*<h2 class="chapter"[^>]*>(?P<title>[^<]+)</h2>.*')
+  h3_match = re.compile('.*<h3 class="section"[^>]*>(?P<title>[^<]+)</h3>.*')
+  h4_match = re.compile('.*<h4 class="subsection"[^>]*>(?P<title>[^<]+)</h4>.*')
+  tag_match1 = re.compile('.*<span id="(?P<tag>[^"]+)"[^>]*></span>.*')
+  #tag_match2 = re.compile('.*<div class="[sub]*section" id="(?P<tag>[^"]+)"[^>]*>.*')
+  tag_match2 = re.compile('.*<div class="[sub]*section[^"]*" id="(?P<tag>[^"]+)"[^>]*>.*')
+  tag_match3 = re.compile('.*<div class="chapter-level-extent" id="(?P<tag>[^"]+)"[^>]*>.*')
+  index_match = re.compile('.*<h4 class="subsection"[^>]*>[\d\.\s]*(?P<name>[^<]+)</h4>.*')
+
+  tag = "top"
+  has_h2 = False 
+  has_h3 = False 
+
+  #pat_match = re.compile('.*<span id="(?P<tag>[^"])"></span>(?P<title>[.]+)$')
+  with open(name + ".html", 'rt') as fin:
+    with open(name + ".qhp", 'wt') as f:
+      f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
+      f.write('<QtHelpProject version="1.0">\n')
+      f.write('  <namespace>octave.community.{}</namespace>\n'.format(name))
+      f.write('  <virtualFolder>doc</virtualFolder>\n')
+      f.write('  <filterSection>\n')
+      f.write('    <toc>\n')
+      f.write('      <section title="{} Manual" ref="{}.html">\n'.format(title, name))
+      # chapters here
+      for line in fin:
+          line = line.strip()
+          e = tag_match1.match(line)
+          if not e:
+              e = tag_match2.match(line)
+          if not e:
+              e = tag_match3.match(line)
+          if e:
+              tag = e.group("tag")
+
+          e = h2_match.match(line)
+          if e:
+              if has_h3:
+                  f.write('          </section>\n')
+                  has_h3 = False
+              if has_h2:
+                  f.write('        </section>\n')
+              has_h2 = True
+              f.write('        <section title="{}" ref="{}.html#{}">\n'.format(e.group("title"), name, tag))
+
+          e = h3_match.match(line)
+          if e:
+              if has_h3:
+                  f.write('          </section>\n')
+              has_h3 = True
+
+              f.write('          <section title="{}" ref="{}.html#{}">\n'.format(e.group("title"), name, tag))
+
+          e = h4_match.match(line)
+          if e:
+              f.write('            <section title="{}" ref="{}.html#{}"></section>\n'.format(e.group("title"), name, tag))
+
+
+      if has_h3:
+        f.write('          </section>\n')
+      if has_h2:
+        f.write('        </section>\n')
+
+      f.write('      </section>\n')
+      f.write('    </toc>\n')
+      f.write('    <keywords>\n')
+      
+      fin.seek(0)
+      for line in fin:
+          line = line.strip()
+          e = tag_match1.match(line)
+          if not e:
+              e = tag_match2.match(line)
+          if e:
+              tag = e.group("tag")
+
+          e = index_match.match(line)
+          if e:
+              f.write('      <keyword name="{}" ref="{}.html#{}"></keyword>\n'.format(e.group("name"), name, tag))
+
+      f.write('    </keywords>\n')
+      f.write('    <files>\n')
+      f.write('      <file>{}.html</file>\n'.format(name))
+      f.write('      <file>{}.css</file>\n'.format(name))
+      f.write('    </files>\n')
+      f.write('  </filterSection>\n')
+      f.write('</QtHelpProject>\n')
+
+
+def show_usage():
+  print (sys.argv[0], "projname")
+
+if __name__ == "__main__":
+  if len(sys.argv) > 1:
+    status = process(sys.argv[1])
+    sys.exit(status)
+  else:
+    show_usage()
