Skip to content

Instantly share code, notes, and snippets.

@poppe1219
Created April 4, 2015 17:28
Show Gist options
  • Save poppe1219/9cfb99492ee70ecce7cb to your computer and use it in GitHub Desktop.
Save poppe1219/9cfb99492ee70ecce7cb to your computer and use it in GitHub Desktop.
A test for parsing CSS to a json structure
# -*- coding: utf-8 -*-
cssText = '''article, aside, details, figcaption, figure, footer, header, hgroup, nav, section, summary { display: block; }
audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
audio:not([controls]) { display: none; height: 0; }
[hidden] { display: none; }
html { font-size: 100%; }
html, button, input, select, textarea { font-family: sans-serif; }
body, body { margin: 0; }
a:focus { outline: thin dotted; }
a:active, a:hover { outline: 0; }
h1 { font-size: 2em; margin: 0.67em 0; }
h2 { font-size: 1.5em; margin: 0.83em 0; }
h3 { font-size: 1.17em; margin: 1em 0; }
h4 { font-size: 1em; margin: 1.33em 0; }
h5 { font-size: 0.83em; margin: 1.67em 0; }
h6 { font-size: 0.75em; margin: 2.33em 0; }
abbr[title] { border-bottom: 1px dotted; }
b, strong { font-weight: bold; }
blockquote { margin: 1em 40px; }
dfn { font-style: italic; }
mark { background: #ff0; color: #000; }
pre { margin: 1em 0; }
p { margin: 0; }
code, kbd, pre, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
q { quotes: none; }
q:before, q:after { content: ''; content: none; }
small { font-size: 80%; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
dl, menu, ol, ul { margin: 1em 0; }
dd { margin: 0 0 0 40px; }
menu, ol, ul { padding: 0 0 0 40px; }
nav ul, nav ol { list-style: none; list-style-image: none; }
img { border: 0; }
svg:not(:root) { overflow: hidden; }
figure { margin: 0; }
form { margin: 0; }
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
legend { border: 0; }
button, input, select, textarea { font-size: 100%; }
button, input { line-height: normal; }
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; }
button[disabled], input[disabled] { cursor: default; }
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; }
input[type="search"] { -webkit-appearance: textfield; box-sizing: content-box; }
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
textarea { overflow: auto; }
table { border-collapse: collapse; border-spacing: 0; }'''
import json
# (\/\*[^.]+\*\/\n+)?([\t]*[a-zA-Z0-9\.# -_:@]+[\t\s]*\{[^}]+\})
with open('bootstrap_source.css', 'w') as f:
sourceData = f.read()
data = []
try:
for line in sourceData.splitlines():
if not line:
return
line = line.strip()
#if line.startswith('/*')
lineParts = line.split('{')
names = lineParts[0].split(",")
rules = lineParts[1].replace("}", "").split(";")
declaration = ({
"name": names if type(names) == str else [name.strip()
for name in names]
})
for rule in rules:
rule = rule.strip()
if rule:
parts = rule.split(":")
declaration[parts[0].strip()] = parts[1].strip()
data.append(declaration)
with open('normalize_html5.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, sort_keys=True, indent=4, ensure_ascii=False))
except Exception as e:
pass
except:
pass
print(json.dumps(data, sort_keys=True, indent=4, ensure_ascii=False))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment