From bb5de7bfcc61a654ddd842de83305a8a76a272b3 Mon Sep 17 00:00:00 2001
From: Miguel Angel Reina Ortega <miguelangel.reinaortega@etsi.org>
Date: Fri, 13 Sep 2024 14:53:05 +0200
Subject: [PATCH] Support to convert all svg figures to png for pandoc
 conversion

---
 .gitlab-ci.yml                        |  1 +
 generateChangemarks/dockerfile        |  1 +
 generateChangemarks/dockerfile.pandoc |  2 +-
 generateChangemarks/pandocFilter.py   | 21 +++++++++++++++++++++
 generateChangemarks/requirements.txt  |  3 ++-
 generateChangemarks/setup.py          |  1 +
 generateChangemarks/svg2png.py        | 19 +++++++++++++++++++
 publish_spec.sh                       |  7 ++++++-
 8 files changed, 52 insertions(+), 3 deletions(-)
 create mode 100644 generateChangemarks/svg2png.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f68badc..d7909ad 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -28,6 +28,7 @@ Build pythonForPandocFilter docker image:
         - generateChangemarks/changemarks.py
         - generateChangemarks/addTrackedChanges.py
         - generateChangemarks/generateTOC.py
+        - generateChangemarks/svg2png.py
 
 Build Pandoc docker image:
   stage: build
diff --git a/generateChangemarks/dockerfile b/generateChangemarks/dockerfile
index 5c80471..020792e 100644
--- a/generateChangemarks/dockerfile
+++ b/generateChangemarks/dockerfile
@@ -2,6 +2,7 @@ FROM python:3.9-slim-bullseye
 
 ADD . /generateChangemarks/
 RUN apt-get update -y && \
+    apt-get install -y libcairo2 && \
     rm -rf /var/lib/apt/lists/* &&\
     pip install -e generateChangemarks/ &&\
 	pip install -r generateChangemarks/requirements.txt
diff --git a/generateChangemarks/dockerfile.pandoc b/generateChangemarks/dockerfile.pandoc
index bb9d0bf..54dae98 100644
--- a/generateChangemarks/dockerfile.pandoc
+++ b/generateChangemarks/dockerfile.pandoc
@@ -1,4 +1,4 @@
-FROM pandoc/core:3-ubuntu
+FROM pandoc/core:3.4.0-ubuntu
 
 RUN apt-get update -y && \
     apt-get install -y npm &&\
diff --git a/generateChangemarks/pandocFilter.py b/generateChangemarks/pandocFilter.py
index 19294e3..23e6a25 100644
--- a/generateChangemarks/pandocFilter.py
+++ b/generateChangemarks/pandocFilter.py
@@ -127,6 +127,26 @@ def replaceFigureCaptions(progress:Progress, mdLines:list[str]) -> list[str]:
 	return _lines
 
 
+def replaceFiguresPathSvgToPng(progress: Progress, mdLines: list[str]) -> list[str]:
+	"""	Replace figure extensions from svg to png.
+	"""
+	_taskID = progress.add_task('[blue]Replacing figure captions', total=0)
+	# progress.update()
+	figurePathRegex = re.compile('media\/.*\.svg')
+
+	_lines: list[str] = []
+	for line in mdLines:
+		matches = re.findall(figurePathRegex, line)
+		if matches:
+			# Replace figure path to png
+			_lines.append(re.sub(r'\.svg', f'.png', line))
+		else:
+			_lines.append(line)
+
+	progress.stop_task(_taskID)
+	return _lines
+
+
 def replaceLineBreaks(progress: Progress, mdLines: list[str]) -> list[str]:
 	"""	Replace <br /> linebreaks by pandoc escaped_line_breaks extension \(newline).
 	"""
@@ -162,6 +182,7 @@ def process(document:str, outDirectory:str) -> None:
 		mdLines = correctTOC(progress, mdLines)
 		mdLines = replaceTableCaptions(progress, mdLines)
 		mdLines = replaceFigureCaptions(progress, mdLines)
+		mdLines = replaceFiguresPathSvgToPng(progress, mdLines)
 		mdLines = replaceLineBreaks(progress, mdLines)
 		writeMDFile(progress, mdLines, document, outDirectory)
 
diff --git a/generateChangemarks/requirements.txt b/generateChangemarks/requirements.txt
index 6aa5ec7..e993258 100644
--- a/generateChangemarks/requirements.txt
+++ b/generateChangemarks/requirements.txt
@@ -15,4 +15,5 @@ pygments==2.15.1
 rich==13.4.2
     # via oneM2M-markdown-to-pandoc-filter (setup.py)
 requests==2.31.0
-unidiff==0.7.5
\ No newline at end of file
+unidiff==0.7.5
+cairosvg==2.7.1
\ No newline at end of file
diff --git a/generateChangemarks/setup.py b/generateChangemarks/setup.py
index 7353e00..4d8e8ed 100644
--- a/generateChangemarks/setup.py
+++ b/generateChangemarks/setup.py
@@ -16,6 +16,7 @@ setup(
 								'changemarks=changemarks:main',
 								'addTrackedChanges=addTrackedChanges:main',
 								'generateTOC=generateTOC:main',
+								'svg2png=svg2png:main',
 			]
             }
 
diff --git a/generateChangemarks/svg2png.py b/generateChangemarks/svg2png.py
new file mode 100644
index 0000000..5b0d0c3
--- /dev/null
+++ b/generateChangemarks/svg2png.py
@@ -0,0 +1,19 @@
+import argparse, sys
+import cairosvg
+import os
+
+def svg_to_png(input_svg_path, output_png_path):
+    cairosvg.svg2png(url=input_svg_path, write_to=output_png_path)
+
+# Example usage
+
+def main(args=None):
+	# Parse command line arguments
+	parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+	parser.add_argument('image',  help = 'image to convert')
+	args = parser.parse_args()
+
+	svg_to_png(args.image, f'{args.image.removesuffix(".svg")}.png')
+
+if __name__ == '__main__':
+    sys.exit(main())
\ No newline at end of file
diff --git a/publish_spec.sh b/publish_spec.sh
index faaa51e..70d912d 100755
--- a/publish_spec.sh
+++ b/publish_spec.sh
@@ -27,9 +27,14 @@ if [ ! $specs ] ; then
     exit 0
 fi
 
+for i in media/*.svg ; do
+  echo "\n------ Converting SVG to PNG for pandoc --------"
+	docker run --rm -v $(pwd):/tmp/ -u $(id -u):$(id -g) "$TOOLS_DOCKER_IMAGE" svg2png "/tmp/$i"
+done
+
 for i in *.md ;  do
     if [ $i != 'README.md' ]; then
-        echo "\n------ Adding TOC to spec --------"
+      echo "\n------ Adding TOC to spec --------"
 	    docker run --rm -v $(pwd):/tmp/ -u $(id -u):$(id -g) "$TOOLS_DOCKER_IMAGE" generateTOC --add-content "/tmp/$i"
 	    echo "\n------ Preparaing spec --------"
 	    docker run --rm -v $(pwd):/tmp/ -u $(id -u):$(id -g) "$TOOLS_DOCKER_IMAGE" pandocFilter -o "/tmp/" "/tmp/$i"
-- 
GitLab