From e0d87452da86dd8a57838bcaa8b8c817def194b0 Mon Sep 17 00:00:00 2001 From: Christoph Lohmann <20h@r-36.net> Date: Sun, 13 Jun 2021 14:41:14 +0200 Subject: [PATCH] Add pptx2md converter. --- Makefile | 1 + bin/pptx2md | 55 +++++++++++++++++++++++++++++++++++++ examples/pptx/example.pptx | Bin 0 -> 24618 bytes 3 files changed, 56 insertions(+) create mode 100755 bin/pptx2md create mode 100644 examples/pptx/example.pptx diff --git a/Makefile b/Makefile index 424b340..f591f20 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ install: install -m 755 bin/dir2point $(DESTDIR)$(PREFIX)/bin/dir2point install -m 755 bin/md2point $(DESTDIR)$(PREFIX)/bin/md2point install -m 755 bin/point2pdf $(DESTDIR)$(PREFIX)/bin/point2pdf + install -m 755 bin/pptx2md $(DESTDIR)$(PREFIX)/bin/pptx2md mkdir -p $(DESTDIR)$(MANPREFIX)/man1 install -m 644 md2point.1 $(DESTDIR)$(MANPREFIX)/man1/md2point.1 diff --git a/bin/pptx2md b/bin/pptx2md new file mode 100755 index 0000000..50b7be0 --- /dev/null +++ b/bin/pptx2md @@ -0,0 +1,55 @@ +#!/bin/sh +# +# See LICENSE for license details. +# +# This is based on: +# https://github.com/revan/pptx2md +# +# The algorithm was simplified to the essence of what the ugly +# pptx format is capable of. Microsoft amateurs are unable to use +# XML properly. +# +# Requires: xml2tsv (git://bitreich.org/xml2tsv) +# + +if [ $# -lt 1 ]; +then + printf "usage: %s file.pptx\n" "$(basename "$0")" >&2 + exit 1 +fi + +pptxfile="$1" +mdfile="$1.md" +tmpdir="$(mktemp -u)" + +unzip -oq -d "${tmpdir}" "${pptxfile}" +if [ $? -ne 0 ]; +then + printf "Failed to extract %s.\n" "${pptxfile}" + exit 1 +fi + +for slidefile in ${tmpdir}/ppt/slides/*.xml; +do + linenum=0 + cat "${slidefile}" \ + | xml2tsv 2>/dev/null \ + | grep a:r/a:t \ + | cut -s -f 2 \ + | while read -r line; + do + if [ $linenum -eq 0 ]; + then + printf "## %s\n" "${line}" >> "${mdfile}" + else + printf "%s\n" "${line}" >> "${mdfile}" + fi + linenum=1 + done + printf "\n" >> "${mdfile}" +done + + +rm -r "$tmpdir" +exit 0 + diff --git a/examples/pptx/example.pptx b/examples/pptx/example.pptx new file mode 100644 index 0000000000000000000000000000000000000000..9b161ec3a1409d4284d82179264e0b4cbfa2526f GIT binary patch literal 24618 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