]> granicus.if.org Git - graphviz/commitdiff
port svgcolor_lib generation script to Python
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 10 Apr 2022 21:07:36 +0000 (14:07 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Mon, 2 May 2022 14:34:28 +0000 (07:34 -0700)
Note that this does not introduce an extra build dependency in any of the three
build systems:

  1. Autotools: these steps are done during construction of the portable source
     tarball, during which Python 3 is already required (see autogen.sh).

  2. CMake: Python 3 is already required by and used in the top level
     CMakeLists.txt.

  3. MS Build: Python 3 is already used in version generation in
     lib/version/version.vcxproj.

This change is motivated by the goal of removing a dependency on Awk. Though it
also conveniently side steps some line ending portability issues that were being
worked around with `AWK_OPTIONS`. In Python, this is unnecessary because reading
a file in text mode accounts for both flavors of line endings.

Gitlab: #2118

awk/svgcolor.awk [deleted file]
lib/common/CMakeLists.txt
lib/common/Makefile.am
lib/common/make_svgcolor_lib.py [new file with mode: 0644]
lib/gvc.vcxproj

diff --git a/awk/svgcolor.awk b/awk/svgcolor.awk
deleted file mode 100644 (file)
index ab4d146..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-# 
-# /*************************************************************************
-# * Copyright (c) 2011 AT&T Intellectual Property 
-# * All rights reserved. This program and the accompanying materials
-# * are made available under the terms of the Eclipse Public License v1.0
-# * which accompanies this distribution, and is available at
-# * http://www.eclipse.org/legal/epl-v10.html
-# *
-# * Contributors: Details at http://www.graphviz.org/
-# *************************************************************************/
-# 
-# Convert SVG-1.1 color data to same RGBA format used in color_names.
-# See svgcolor_names for input format.
-#
-# All colors assumed opaque, so A = 255 in all colors
-BEGIN {
-       FS = "[ ,()]*";
-}
-/^[    ]*$/    { next; }
-/^#/    { next; }
-{
-       printf ("/svg/%s %s %s %s 255\n", $1, $5, $6, $7);
-}
index 3ce347d6b98b34c1ac21388dd255b9e9ce35e911..8b050df525c812f16939fd63bacf5ea8679ff249 100644 (file)
@@ -3,19 +3,14 @@ BISON_TARGET(HTMLparse ${CMAKE_CURRENT_SOURCE_DIR}/htmlparse.y
 
 add_definitions(-DGVC_EXPORTS)
 
-if(CYGWIN)
-  set(AWK_OPTIONS, -v RS="\\r*\\n")
-endif()
-
 # Generate colortbl.h from sources
 add_custom_command(
   OUTPUT svgcolor_lib
-  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/svgcolor_names
-          ${CMAKE_SOURCE_DIR}/awk/svgcolor.awk
-  COMMAND ${AWK_EXECUTABLE} ${AWK_OPTIONS} -f
-          ${CMAKE_SOURCE_DIR}/awk/svgcolor.awk
+  MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/svgcolor_names
+  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/make_svgcolor_lib.py
+  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/make_svgcolor_lib.py
           ${CMAKE_CURRENT_SOURCE_DIR}/svgcolor_names
-          >${CMAKE_CURRENT_BINARY_DIR}/svgcolor_lib
+          ${CMAKE_CURRENT_BINARY_DIR}/svgcolor_lib
   COMMENT "generate SVG color library"
 )
 add_custom_command(
index fd07f1149e5d7d640b44313105c662d4f594dc0c..8cdf4b45e8346234416c253f2589cd741af5ae44 100644 (file)
@@ -46,12 +46,9 @@ color_lib : brewer_lib svgcolor_lib $(top_srcdir)/lib/common/color_names
 brewer_lib : $(top_srcdir)/lib/common/brewer_colors $(top_srcdir)/awk/brewer.awk
        $(AWK) -f $(top_srcdir)/awk/brewer.awk $(top_srcdir)/lib/common/brewer_colors > brewer_lib
 
-if WITH_CYGWIN
-AWK_OPTIONS=-v RS="\r*\n"
-endif
-
-svgcolor_lib : $(top_srcdir)/lib/common/svgcolor_names $(top_srcdir)/awk/svgcolor.awk
-       $(AWK) $(AWK_OPTIONS) -f $(top_srcdir)/awk/svgcolor.awk $(top_srcdir)/lib/common/svgcolor_names > svgcolor_lib
+svgcolor_lib: $(top_srcdir)/lib/common/svgcolor_names \
+              $(top_srcdir)/lib/common/make_svgcolor_lib.py
+       python3 $(top_srcdir)/lib/common/make_svgcolor_lib.py "$<" "$@"
 
 htmllex.o htmllex.lo: htmllex.c htmllex.h htmlparse.h
 htmlparse.o htmlparse.lo: htmlparse.c htmlparse.h
@@ -66,4 +63,5 @@ EXTRA_DIST = README.imap \
        htmlparse.c htmlparse.h \
        entities.html entities.tcl \
        brewer_colors brewer_lib svgcolor_names svgcolor_lib \
-       color_names color_lib colortbl.h
+       color_names color_lib colortbl.h \
+       make_svgcolor_lib.py
diff --git a/lib/common/make_svgcolor_lib.py b/lib/common/make_svgcolor_lib.py
new file mode 100644 (file)
index 0000000..61d08f2
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/python3
+
+"""
+svgcolor_names → svgcolor_lib generator
+"""
+
+import argparse
+import re
+import sys
+from typing import List
+
+def main(args: List[str]) -> int:
+  """entry point"""
+
+  # parse command line arguments
+  parser = argparse.ArgumentParser(description=__doc__)
+  parser.add_argument("input", type=argparse.FileType("rt"),
+                      help="input SVG data")
+  parser.add_argument("output", type=argparse.FileType("wt"),
+                      help="output color table entries")
+  options = parser.parse_args(args[1:])
+
+  for line in options.input:
+
+    # skip comments and empty lines
+    if line.startswith("#") or line.strip() == "":
+      continue
+
+    # split the line into columns
+    items = re.split(r"[ \t,()]+", line)
+    assert len(items) == 8, f"unexpected line {line}"
+
+    # write this as a color table entry
+    options.output.write(f"/svg/{items[0]} {items[4]} {items[5]} {items[6]} 255\n")
+
+  return 0
+
+
+if __name__ == "__main__":
+  sys.exit(main(sys.argv))
index dfa61a7e8dd22d2d9b7ac40d7393e7726038b012..6c7e6410b58b139140690b78bb2fa8e375aa4e90 100644 (file)
@@ -72,7 +72,7 @@
     </Link>
     <PreBuildEvent>
       <Command>win_bison -dy -Wno-yacc common\htmlparse.y -o common\htmlparse.c
-awk -f $(SolutionDir)awk\svgcolor.awk common\svgcolor_names &gt; common\svgcolor_lib
+python common\make_svgcolor_lib.py common\svgcolor_names common\svgcolor_lib
 awk -f $(SolutionDir)awk\brewer.awk common\brewer_colors &gt; common\brewer_lib
 type common\brewer_lib common\svgcolor_lib common\color_names | sort /L C &gt; color_lib
 awk -f $(SolutionDir)awk\colortbl.awk color_lib &gt; common\colortbl.h</Command>
@@ -103,7 +103,7 @@ awk -f $(SolutionDir)awk\colortbl.awk color_lib &gt; common\colortbl.h</Command>
     </Link>
     <PreBuildEvent>
       <Command>win_bison -dy -Wno-yacc common\htmlparse.y -o common\htmlparse.c
-awk -f $(SolutionDir)awk\svgcolor.awk common\svgcolor_names &gt; common\svgcolor_lib
+python common\make_svgcolor_lib.py common\svgcolor_names common\svgcolor_lib
 awk -f $(SolutionDir)awk\brewer.awk common\brewer_colors &gt; common\brewer_lib
 type common\brewer_lib common\svgcolor_lib common\color_names | sort /L C &gt; color_lib
 awk -f $(SolutionDir)awk\colortbl.awk color_lib &gt; common\colortbl.h</Command>