Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 35ca7c9806
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

executable file 175 lines (152 sloc) 4.553 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
#!/usr/bin/python
import json
import glob
import re
import sys

# Set this to the path to a test file to get debug output for just that test
# file. Can be helpful to figure out why a test is not being shown for a
# particular option.
debug_tests = [] # [ 'tests/zoom.html' ]

# Pull options reference JSON out of dygraph.js
js = ''
in_json = False
for line in file('dygraph.js'):
  if '<JSON>' in line:
    in_json = True
  elif '</JSON>' in line:
    in_json = False
  elif in_json:
    js += line

# TODO(danvk): better errors here.
assert js
docs = json.loads(js)

# Go through the tests and find uses of each option.
for opt in docs:
  docs[opt]['tests'] = []

# This is helpful for differentiating uses of options like 'width' and 'height'
# from appearances of identically-named options in CSS.
def find_braces(txt):
  """Really primitive method to find text inside of {..} braces.
Doesn't work if there's an unmatched brace in a string, e.g. '{'. """
  out = ''
  level = 0
  for char in txt:
    if char == '{':
      level += 1
    if level >= 1:
      out += char
    if char == '}':
      level -= 1
  return out

# Find text followed by a colon. These won't all be options, but those that
# have the same name as a Dygraph option probably will be.
prop_re = re.compile(r'\b([a-zA-Z0-9]+) *:')
tests = debug_tests or glob.glob('tests/*.html')
for test_file in tests:
  braced_html = find_braces(file(test_file).read())
  if debug_tests:
    print braced_html

  ms = re.findall(prop_re, braced_html)
  for opt in ms:
    if debug_tests: print '\n'.join(ms)
    if opt in docs and test_file not in docs[opt]['tests']:
      docs[opt]['tests'].append(test_file)

if debug_tests: sys.exit(0)

# Extract a labels list.
labels = []
for nu, opt in docs.iteritems():
  for label in opt['labels']:
    if label not in labels:
      labels.append(label)

print """
<html>
<head>
<title>Dygraphs Options Reference</title>
<link rel="stylesheet" href="style.css">
<style type="text/css">
p.option {
padding-left: 25px;
}
#nav {
position: fixed;
}
#content {
max-width: 800px;
}
</style>
</head>
<body>
"""

print """
<div id=nav>
<h2>Dygraphs</h2>
<ul>
<li><a href="index.html">Home</a>
<li><a href="data.html">Data Formats</a></li>
<li><a href="annotations.html">Annotations</a></li>
</ul>
<h2>Options Reference</h2>
<ul>
<li><a href="#usage">Usage</a>
"""
for label in sorted(labels):
  print ' <li><a href="#%s">%s</a>\n' % (label, label)
print '</ul>\n</div>\n\n'

def name(f):
  """Takes 'tests/demo.html' -> 'demo'"""
  return f.replace('tests/', '').replace('.html', '')

print """
<div id=content>
<h2>Options Reference</h2>
<p>Dygraphs tries to do a good job of displaying your data without any further configuration. But inevitably, you're going to want to tinker. Dygraphs provides a rich set of options for configuring its display and behavior.</p>

<a name="usage"><h3>Usage</h3>
<p>You specify options in the third parameter to the dygraphs constructor:
<pre>g = new Dygraph(div,
data,
{
option1: value1,
option2: value2,
...
});
</pre>

After you've created a Dygraph, you can change an option by calling the <code>updateOptions</code> method:
<pre>g.updateOptions({
new_option1: value1,
new_option2: value2
});
</pre>

<p>And, without further ado, here's the complete list of options:</p>
"""
for label in sorted(labels):
  print '<a name="%s"><h3>%s</h3>\n' % (label, label)

  for opt_name in sorted(docs.keys()):
    opt = docs[opt_name]
    if label not in opt['labels']: continue
    tests = opt['tests']
    if not tests:
      examples_html = '<font color=red>NONE</font>'
    else:
      examples_html = ' '.join(
        '<a href="%s">%s</a>' % (f, name(f)) for f in tests)

    if not opt['type']: opt['type'] = '(missing)'
    if not opt['default']: opt['default'] = '(missing)'
    if not opt['description']: opt['description'] = '(missing)'

    print """
<p class='option'><a name="%(name)s"/><b>%(name)s</b><br/>
%(desc)s<br/>
<i>Type: %(type)s<br/>
Default: %(default)s</i><br/>
Examples: %(examples_html)s<br/>
<br/>
""" % { 'name': opt_name,
          'type': opt['type'],
          'default': opt['default'],
          'desc': opt['description'],
          'examples_html': examples_html}


print """
</div>
</body>
</html>
"""

# This page was super-helpful:
# http://jsbeautifier.org/
Something went wrong with that request. Please try again.