Check for visible viewport width, not the plotter width
[dygraphs.git] / generate-documentation.py
index 01dd495..f6d7d79 100755 (executable)
@@ -2,8 +2,9 @@
 
 # Generate docs/options.html
 
-import json
 import glob
+import json
+import os
 import re
 import sys
 
@@ -53,15 +54,24 @@ def search_files(type, files):
   # have the same name as a Dygraph option probably will be.
   prop_re = re.compile(r'\b([a-zA-Z0-9]+) *:')
   for test_file in files:
-    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][type]:
-        docs[opt][type].append(test_file)
+    if os.path.isfile(test_file): # Basically skips directories
+      text = file(test_file).read()
+
+      # Hack for slipping past gallery demos that have title in their attributes
+      # so they don't appear as reasons for the demo to have 'title' options.
+      if type == "gallery":
+        idx = text.find("function(")
+        if idx >= 0:
+          text = text[idx:]
+      braced_html = find_braces(text)
+      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][type]:
+          docs[opt][type].append(test_file)
 
 search_files("tests", glob.glob("tests/*.html"))
 search_files("gallery", glob.glob("gallery/*.js")) #TODO add grep "Gallery.register\("
@@ -70,52 +80,36 @@ if debug_tests: sys.exit(0)
 
 # Extract a labels list.
 labels = []
-for nu, opt in docs.iteritems():
+for _, opt in docs.iteritems():
   for label in opt['labels']:
     if label not in labels:
       labels.append(label)
 
-print """<!DOCTYPE HTML>
-<html>
-<head>
-  <title>Dygraphs Options Reference</title>
-  <link rel="stylesheet" href="style.css">
-  <style type="text/css">
-    p.option {
-      padding-left: 25px;
-    }
-    div.parameters {
-      padding-left: 15px;
-    }
-    #nav {
-      position: fixed;
-    }
-    #content {
-      max-width: 800px;
-    }
-  </style>
-</head>
-<body>
+print """
+<!--#include virtual="header.html" -->
+
+<!--
+  DO NOT EDIT THIS FILE!
+
+  This file is generated by generate-documentation.py.
+-->
+
+<link rel=stylesheet href="options.css" />
+
 """
 
 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>
+<div class="col-lg-3">
+<div class="dygraphs-side-nav affix-top" data-spy="affix" data-offset-top="0">
+<ul class='nav'>
   <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'
+print '</ul></div></div>\n\n'
 
 print """
-<div id='content'>
+<div id='content' class='col-lg-9'>
 <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>
 
@@ -136,14 +130,17 @@ print """
                   new_option2: value2
                 });
 </pre>
+
+<p>Some options can be set on a per-axis and per-series basis. See the docs on <a href="per-axis.html">per-axis and per-series options</a> to learn how to do this. The options which may be set in this way are marked as such on this page.</p>
+
 <p>And, without further ado, here's the complete list of options:</p>
 """
 
-def de_tests(f):
+def test_name(f):
   """Takes 'tests/demo.html' -> 'demo'"""
   return f.replace('tests/', '').replace('.html', '')
 
-def de_gallery(f):
+def gallery_name(f):
   """Takes 'gallery/demo.js' -> 'demo'"""
   return f.replace('gallery/', '').replace('.js', '')
 
@@ -163,14 +160,14 @@ for label in sorted(labels):
       examples_html = '<font color=red>NONE</font>'
     else:
       examples_html = ' '.join(
-        '<a href="%s">%s</a>' % (f, de_tests(f)) for f in tests)
+        '<a href="%s">%s</a>' % (f, test_name(f)) for f in tests)
 
     gallery = opt['gallery']
     if not gallery:
       gallery_html = '<font color=red>NONE</font>'
     else:
       gallery_html = ' '.join(
-        '<a href="%s">%s</a>' % (urlify_gallery(f), de_gallery(f)) for f in gallery)
+        '<a href="%s">%s</a>' % (urlify_gallery(f), gallery_name(f)) for f in gallery)
 
     if 'parameters' in opt:
       parameters = opt['parameters']
@@ -185,11 +182,11 @@ for label in sorted(labels):
 
     print """
   <div class='option'><a name="%(name)s"></a><b>%(name)s</b><br/>
-  %(desc)s<br/>
+  <p>%(desc)s</p>
   <i>Type: %(type)s</i><br/>%(parameters)s
-  <i>Default: %(default)s</i><br/>
-  Examples: %(examples_html)s<br/>
-  Gallery: %(gallery_html)s<br/>
+  <i>Default: %(default)s</i></p>
+  Gallery Samples: %(gallery_html)s<br/>
+  Other Examples: %(examples_html)s<br/>
   <br/></div>
   """ % { 'name': opt_name,
           'type': opt['type'],
@@ -208,9 +205,9 @@ Some callbacks take a point argument. Its properties are:<br/>
 <li>canvasx/canvasy: The canvas coordinates at which the point is drawn.</li>
 <li>name: The name of the data series to which the point belongs</li>
 </ul>
-</div>
-</body>
-</html>
+</div> <!-- #content -->
+
+<!--#include virtual="footer.html" -->
 """
 
 # This page was super-helpful: