Check in CSS rewriter scripts

This CL adds a set of Python scripts that have been used to help
rewrite CrosAdapta.

Files:
- util.py - Helper functions to make processing/splitting up CSS more easy.
- rewriter.py - Contains a model for rewrites to CSS code as well as
tools for applying rewrites expressed in that model.
- example.py - A set of example rewrites as well as the boiler plate
for running the rewrites from the command line.

Bug: 822495
Change-Id: I8f5502ed077fbe2cf61bedb95c480e9728bdc9e7
Reviewed-on: https://chromium-review.googlesource.com/1134635
Commit-Ready: Josh Pratt <jopra@chromium.org>
Tested-by: Josh Pratt <jopra@chromium.org>
Reviewed-by: Raymes Khoury <raymes@chromium.org>
diff --git a/tools/rewriter/example.py b/tools/rewriter/example.py
new file mode 100644
index 0000000..e35877d
--- /dev/null
+++ b/tools/rewriter/example.py
@@ -0,0 +1,101 @@
+"""An example script applying rewrite rules files passed in as arguments.
+
+Usage: example.py "gtk-3.*/*.css"
+"""
+
+from __future__ import print_function
+import sys
+from rewriter import background_color
+from rewriter import border_color
+from rewriter import color
+from rewriter import Mod
+from rewriter import rewrite_files
+
+mods = [
+    Mod(r'button',
+        remove=r' *box-shadow:[^;]*;',
+        enabled=True),
+    Mod(r'button\.suggested-action',
+        anti=[r'\.destructive-action'],
+        remove=color(),
+        replace=r'\1@theme_base_color\3',
+        enabled=False),
+    Mod(r'button\.suggested-action',
+        anti=[r'\.destructive-action'],
+        remove=background_color(),
+        replace=r'\1@suggestion_color\3',
+        enabled=False),
+    Mod(r'button',
+        anti=[r'\..*\-action'],
+        remove=color(),
+        replace=r'\1@suggestion_color\3',
+        enabled=False),
+    Mod(r'button',
+        anti=[r'\..*\-action'],
+        remove=background_color(),
+        replace=r'\1@theme_base_color\3',
+        enabled=False),
+    Mod(r'menuitem.*button',
+        anti=[r'\..*\-action'],
+        remove=color(),
+        replace=r'\1@theme_text_color\3',
+        enabled=True),
+    Mod(r'text-button',
+        anti=[r'\..*\-action'],
+        remove=color(),
+        replace=r'\1@theme_text_color\3',
+        enabled=True),
+    Mod(r'menuitem.*button',
+        anti=[r'\..*\-action'],
+        remove=background_color(),
+        replace=r'\1@theme_base_color\3',
+        enabled=True),
+    Mod(r'text-button',
+        anti=[r'\..*\-action'],
+        remove=background_color(),
+        replace=r'\1@theme_base_color\3',
+        enabled=True),
+    Mod(r'button.*:disabled',
+        anti=[r'-action'],
+        remove=border_color(),
+        replace=r'\1@insensitive_bg_color\3',
+        enabled=True),
+    Mod(r'button.*:disabled',
+        anti=[r'-action'],
+        remove=border_color(),
+        replace=r'\1@insensitive_bg_color\3',
+        enabled=True),
+    Mod(r'button.*:disabled',
+        anti=[r'-action'],
+        remove=background_color(),
+        replace=r'\1@theme_base_color\3',
+        enabled=True),
+    Mod(r'button.*:disabled',
+        anti=[r'-action'],
+        remove=color(),
+        replace=r'\1@insensitive_fg_color\3',
+        enabled=True),
+
+    Mod(r'button.suggested-action.*:disabled',
+        anti=[r'\.destructive-action'],
+        remove=color(),
+        replace=r'\1@insensitive_fg_color\3',
+        enabled=True),
+    Mod(r'button.suggested-action.*:disabled',
+        anti=[r'\.destructive-action'],
+        remove=background_color(),
+        replace=r'\1@suggestion_color\3',
+        enabled=True),
+    Mod(r'.*',  # Fixes rgba(@color, .*)
+        remove=r'rgba(\(@[a-z_]*), .*(, [01]\.[0-9]*\))',
+        replace=r'alpha\1\2'),
+    Mod(r'.*',  # Fixes alpha(currentColor, @var.*
+        remove=r'alpha\(currentColor, (@[a-z][^\.]*)([\.0-9]*)\)',
+        replace=r'alpha(\1, 0\2)')
+]
+
+if len(sys.argv) > 1:
+  rewrite_files(sys.argv[1:], mods)
+else:
+  print('No files were passed in.')
+  exit()