summaryrefslogtreecommitdiff
path: root/extras/appengine/sqlformat/templates
diff options
context:
space:
mode:
authorAndi Albrecht <albrecht.andi@gmail.com>2011-07-29 21:03:28 +0200
committerAndi Albrecht <albrecht.andi@gmail.com>2011-07-29 21:03:28 +0200
commit92c142623d9b4ad806f51dd79e3842396ac464d8 (patch)
treee56384484801edcd417901e485474914a98ea4a1 /extras/appengine/sqlformat/templates
parentc918cc9dc30b3a7684a96feae95fc5c05638360e (diff)
downloadsqlparse-92c142623d9b4ad806f51dd79e3842396ac464d8.tar.gz
Replace Django by Flask in App Engine frontend (fixes issue11).
--HG-- rename : extras/appengine/Makefile => extras/appengine-django/Makefile rename : extras/appengine/README => extras/appengine-django/README rename : extras/appengine/__init__.py => extras/appengine-django/__init__.py rename : extras/appengine/app.yaml => extras/appengine-django/app.yaml rename : extras/appengine/examples/customers.sql => extras/appengine-django/examples/customers.sql rename : extras/appengine/examples/multiple_inserts.sql => extras/appengine-django/examples/multiple_inserts.sql rename : extras/appengine/examples/pg_view.sql => extras/appengine-django/examples/pg_view.sql rename : extras/appengine/examples/subquery.sql => extras/appengine-django/examples/subquery.sql rename : extras/appengine/examples/subquery2.sql => extras/appengine-django/examples/subquery2.sql rename : extras/appengine/index.yaml => extras/appengine-django/index.yaml rename : extras/appengine/main.py => extras/appengine-django/main.py rename : extras/appengine/settings.py => extras/appengine-django/settings.py rename : extras/appengine/sqlformat/__init__.py => extras/appengine-django/sqlformat/__init__.py rename : extras/appengine/sqlformat/urls.py => extras/appengine-django/sqlformat/urls.py rename : extras/appengine/sqlformat/views.py => extras/appengine-django/sqlformat/views.py rename : extras/appengine/static/bg_options.png => extras/appengine-django/static/bg_options.png rename : extras/appengine/static/bgfieldset.png => extras/appengine-django/static/bgfieldset.png rename : extras/appengine/static/bgfooter.png => extras/appengine-django/static/bgfooter.png rename : extras/appengine/static/bgtop.png => extras/appengine-django/static/bgtop.png rename : extras/appengine/static/blank.gif => extras/appengine-django/static/blank.gif rename : extras/appengine/static/canvas.html => extras/appengine-django/static/canvas.html rename : extras/appengine/static/hotkeys.js => extras/appengine-django/static/hotkeys.js rename : extras/appengine/static/img_loading.gif => extras/appengine-django/static/img_loading.gif rename : extras/appengine/static/jquery.textarearesizer.compressed.js => extras/appengine-django/static/jquery.textarearesizer.compressed.js rename : extras/appengine/static/loading.gif => extras/appengine-django/static/loading.gif rename : extras/appengine/static/lynx_screenshot.png => extras/appengine-django/static/lynx_screenshot.png rename : extras/appengine/static/pygments.css => extras/appengine-django/static/pygments.css rename : extras/appengine/static/resize-grip.png => extras/appengine-django/static/resize-grip.png rename : extras/appengine/static/robots.txt => extras/appengine-django/static/robots.txt rename : extras/appengine/static/rpc_relay.html => extras/appengine-django/static/rpc_relay.html rename : extras/appengine/static/script.js => extras/appengine-django/static/script.js rename : extras/appengine/static/sitemap.xml => extras/appengine-django/static/sitemap.xml rename : extras/appengine/static/sqlformat_client_example.py => extras/appengine-django/static/sqlformat_client_example.py rename : extras/appengine/static/styles.css => extras/appengine-django/static/styles.css rename : extras/appengine/templates/404.html => extras/appengine-django/templates/404.html rename : extras/appengine/templates/500.html => extras/appengine-django/templates/500.html rename : extras/appengine/templates/about.html => extras/appengine-django/templates/about.html rename : extras/appengine/templates/api.html => extras/appengine-django/templates/api.html rename : extras/appengine/templates/index.html => extras/appengine-django/templates/index.html rename : extras/appengine/templates/master.html => extras/appengine-django/templates/master.html rename : extras/appengine/templates/python-client-example.html => extras/appengine-django/templates/python-client-example.html rename : extras/appengine/templates/source.html => extras/appengine-django/templates/source.html
Diffstat (limited to 'extras/appengine/sqlformat/templates')
-rw-r--r--extras/appengine/sqlformat/templates/about.html46
-rw-r--r--extras/appengine/sqlformat/templates/api.html52
-rw-r--r--extras/appengine/sqlformat/templates/index.html120
-rw-r--r--extras/appengine/sqlformat/templates/master.html103
-rw-r--r--extras/appengine/sqlformat/templates/python-client-example.html17
-rw-r--r--extras/appengine/sqlformat/templates/source.html60
6 files changed, 398 insertions, 0 deletions
diff --git a/extras/appengine/sqlformat/templates/about.html b/extras/appengine/sqlformat/templates/about.html
new file mode 100644
index 0000000..2d4e03e
--- /dev/null
+++ b/extras/appengine/sqlformat/templates/about.html
@@ -0,0 +1,46 @@
+{% extends "master.html" %}
+
+{% block title %}About{% endblock %}
+
+{% block main %}
+<h1>About this Application</h1>
+<p>
+ This application is a online SQL formatting tool.
+</p>
+<p>
+ Basically it's a playground for a Python module to parse and format
+ SQL statements. Sometimes it's easier to combine the available
+ options and to see the resulting output using a web front-end than
+ on the command line ;-)
+</p>
+<p>
+ To get started, enter a SQL statement in the text box on the top,
+ choose some options and click on &quot;Format SQL&quot; (Ctrl+F)
+ to see the result.
+</p>
+<p>
+ <em>Note:</em> The SQL formatter and parser is in an early stage
+ of development. If you're looking for a mature tool, try one of
+ <a href="http://www.google.com/search?q=online+sql+formatter">these</a>.
+</p>
+<h2>Using it from the Command Line</h2>
+<p>
+ There are three ways to use this SQL formatter from the command line:
+</p>
+<ol>
+ <li>Grab the <a href="/source/">sources</a> and use the module in your
+ Python scripts.</li>
+ <li>
+ Write a little script in your favorite language that sends a POST
+ request to this application.<br/>
+ Read the <a href="/api/">API Documentation</a> for more information.
+ </li>
+ <li>Use
+ <a href="/static/lynx_screenshot.png"
+ alt="Lynx Screenshot" target="_blank"
+ title="Screenshot: sqlformat.appspot.com on Lynx">Lynx
+ </a>
+ </li>
+</ol>
+
+{% endblock %}
diff --git a/extras/appengine/sqlformat/templates/api.html b/extras/appengine/sqlformat/templates/api.html
new file mode 100644
index 0000000..79bf118
--- /dev/null
+++ b/extras/appengine/sqlformat/templates/api.html
@@ -0,0 +1,52 @@
+{% extends "master.html" %}
+
+{% block title %}API{% endblock %}
+
+{% block main %}
+<h1>API Documentation</h1>
+
+<p>
+ Using the API for this application is pretty simple. Just send a
+ <code>POST</code> request to
+</p>
+<p>
+ <code>http://sqlformat.appspot.com/format/</code>
+</p>
+
+<h2>Options</h2>
+<p>
+ The <code>POST</code> request accepts various options to control
+ formatting. Only the <em>data</em> option is required. All others
+ are optional.
+</p>
+
+<dl>
+ <dt>data</dt>
+ <dd>The SQL statement to format.</dd>
+ <dt>remove_comments</dt>
+ <dd>Set to 1 to remove comments.</dd>
+ <dt>keyword_case</dt>
+ <dd>How to convert keywords. Allowed values are 'lower', 'upper',
+ 'capitalize'.</dd>
+ <dt>identifier_case</dt>
+ <dd>How to convert identifiers. Allowed values are 'lower', 'upper',
+ 'capitalize'.</dd>
+ <dt>n_indents</dt>
+ <dd>An integer indicating the indendation depth.</dd>
+ <dt>right_margin</dt>
+ <dd>An integer indicating the maximum line length.</dd>
+ <dt>output_format</dt>
+ <dd>Transfer the statement into another programming language.
+ Allowed values are 'python', 'php'</dd>
+</dl>
+
+<h2>Example</h2>
+<p>
+ Here's a example in Python:
+</p>
+{% include "python-client-example.html" %}
+<p>
+ <a href="/static/sqlformat_client_example.py">Download sqlformat_example_client.py</a>
+</p>
+
+{% endblock %}
diff --git a/extras/appengine/sqlformat/templates/index.html b/extras/appengine/sqlformat/templates/index.html
new file mode 100644
index 0000000..22d6fdb
--- /dev/null
+++ b/extras/appengine/sqlformat/templates/index.html
@@ -0,0 +1,120 @@
+{% extends "master.html" %}
+
+{% block main %}
+
+{% if output %}
+ <a href="#output" class="skip">Jump to formatted query</a>
+{% endif %}
+
+<form method="post" action="" id="form_options" enctype="multipart/form-data">
+ <div id="input">
+ <div>
+ <strong>Type your SQL here:</strong><br />
+ <textarea id="id_data" rows="10" cols="40" name="data" class="resizable">{{ sql_orig }}</textarea>
+ </div>
+ <div style="margin-top: .5em;">
+ <strong>...or upload a file:</strong>
+ <input type="file" name="datafile" id="id_datafile" />
+ </div>
+ <div id="examples" style="margin-top: .5em;"></div>
+ <div id="actions" style="margin-top: .5em;">
+ <input type="submit" value="Format SQL" id="btn_format" />
+ </div>
+ {% if output %}<a name="output"></a>
+ <div id="response">{{output|safe}}</div>
+ {% else %}
+ <div id="response"></div>
+ {% endif %}
+ <div id="proc_time">
+ {% if proc_time %}Processed in {{proc_time}} seconds.{% endif %}
+ </div>
+ <div style="margin-top: 1em;">
+ <script type="text/javascript">
+ <!--
+ google_ad_client = "pub-8870624642249726";
+ /* 468x60, Erstellt 07.03.09 */
+ google_ad_slot = "9840041509";
+ google_ad_width = 468;
+ google_ad_height = 60;
+ //-->
+ </script>
+ <script type="text/javascript"
+ src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+ </script>
+ </div>
+
+ </div>
+ <div id="options">
+ <h1 class="skip">Options</h1>
+ <fieldset><legend id="general"><strong>General Options</strong></legend>
+ <div id="general_content" class="content">
+ <input type="checkbox" id="id_remove_comments" name="remove_comments" value="1" {% if extra.comments %}checked="checked"{% endif %}/>
+ <label for="id_remove_comments">Remove comments</label>
+ <br />
+ <input type="checkbox" id="id_highlight" name="highlight" value="1" {% if extra.highlight %}checked="checked"{% endif %} />
+ <label for="id_highlight">Enable syntax highlighting</label>
+ </div>
+ </fieldset>
+ <fieldset><legend id="kwcase">
+ <strong>Keywords &amp; Identifiers</strong></legend>
+ <div>
+ Keywords: <select id="id_keyword_case" name="keyword_case">
+ <option value="">Unchanged</option>
+ <option value="lower" {% if extra.keywords == 'lower' %}selected="selected"{% endif %}>Lower case</option>
+ <option value="upper" {% if extra.keywords == 'upper' %}selected="selected"{% endif %}>Upper case</option>
+ <option value="capitalize" {% if extra.keywords == 'capitalize' %}selected="selected"{% endif %}>Capitalize</option>
+ </select>
+ </div>
+ <div>
+ Identifiers: <select name="identifier_case" id="id_identifier_case">
+ <option value="">Unchanged</option>
+ <option value="lower" {% if extra.idcase == 'lower' %}selected="selected"{% endif %}>Lower case</option>
+ <option value="upper" {% if extra.idcase == 'upper' %}selected="selected"{% endif %}>Upper case</option>
+ <option value="capitalize" {% if extra.idcase == 'capitalize' %}selected="selected"{% endif %}>Capitalize</option>
+ </select>
+ </div>
+ </fieldset>
+ <fieldset><legend id="indent"><strong>Indentation &amp; Margins</strong>
+ </legend>
+ <div id="indent_content" class="content">
+ <label for="id_n_indents">Indentation: </label>
+ <input name="n_indents" value="{{extra.n_indents}}" maxlength="2" type="text" id="id_n_indents" size="2" /> spaces
+ <div class="help">Empty field means leave indentation unchanged.</div>
+ </div>
+ </fieldset>
+ <fieldset><legend id="output"><strong>Output Format</strong></legend>
+ <label for="id_output_format">Language: </label>
+ <select name="output_format" id="id_output_format">
+ <option value="sql" {% if extra.lang == 'sql' %}selected="selected"{% endif %}>SQL</option>
+ <option value="python" {% if extra.lang == 'python' %}selected="selected"{% endif %}>Python</option>
+ <option value="php" {% if extra.lang == 'php' %}selected="selected"{% endif %}>PHP</option>
+ </select>
+ </fieldset>
+
+ <div class="dev">This software is in development.</div>
+
+ <div>
+ <g:plusone size="medium"></g:plusone>
+ <a href="http://flattr.com/thing/350724/SQLFormat-Online-SQL-formatting-service" target="_blank">
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" />
+ </a>
+ </div>
+ <div style="padding-top: 15px;">
+ <a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="andialbrecht">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
+ </div>
+ </div>
+ <div class="clearfix"></div>
+</form>
+
+<script language="javascript">
+html = '<strong>...or select an example:</strong> ';
+html = html + '<select onchange="load_example();" id="sel_example">';
+html = html + '<option value="">-- Choose Example --</option>';
+{% for ex in examples %}
+ html = html + '<option value="{{ex}}">{{ex}}</option>';
+{% endfor %}
+html = html + '</select>';
+$('#examples').html(html);
+</script>
+{% endblock %}
+
diff --git a/extras/appengine/sqlformat/templates/master.html b/extras/appengine/sqlformat/templates/master.html
new file mode 100644
index 0000000..88a9d36
--- /dev/null
+++ b/extras/appengine/sqlformat/templates/master.html
@@ -0,0 +1,103 @@
+<html>
+ <head>
+ <title>{% block title %}SQLFormat - Online SQL Formatter{% endblock %}</title>
+ <meta name="keywords" content="SQL, format, parse, python, beautify, pretty, online, formatting, formatter" />
+ <meta name="description" content="Easy to use web service to format SQL statements." />
+ <link rel="stylesheet" href="/static/pygments.css" />
+ <link rel="stylesheet" href="/static/styles.css" />
+ <script src="http://www.google.com/jsapi"></script>
+ <script>
+ google.load("jquery", "1.2.6");
+ </script>
+ <script src="/static/hotkeys.js"></script>
+ <script src="/static/script.js"></script>
+ </head>
+ <body>
+
+ <div id="help">
+ <p>Keyboard Shortcuts</p>
+ <p>
+ <span class="shortcut">H</span> - Show / hide this help window<br/>
+ <span class="shortcut">Ctrl+F</span> - Format SQL and display result<br/>
+ <span class="shortcut">O</span> - Show / hide options<br/>
+ <span class="shortcut">T</span> - Set focus on SQL input<br/>
+ </p>
+ </div>
+
+ <div id="header">
+ <div id="header-inner">
+ {% if user %}<img src="{{userimg}}" border="0" align="right" style="padding-top:.4em;"/>{% endif %}
+ <h1>
+ <a href="/">
+ <span class="q">S<span class="q2">Q</span>L</span>Format
+ </a>
+ </h1>
+ <div id="slogan">Online SQL formatting service</div>
+ <div id="topmenu">
+ <a href="/">Home</a>
+ |
+ <a href="/about/">About</a>
+ |
+ <a href="/source/">Source Code</a>
+ |
+ <a href="/api/">API</a>
+<!--
+ |
+ {% if user %}
+ <a href="{{logout_url}}">Sign out</a>
+ {% else %}
+ <a href="{{login_url}}">Sign in</a>
+ <span style="color: #babdb6;">with your Google account
+ to save preferred settings.</span>
+ {% endif %}
+-->
+ </div>
+ </div>
+ </div>
+
+ <div id="main">
+ <div id="main-inner">
+ {% block main %}MAIN CONTENT GOES HERE{% endblock %}
+ </div>
+ </div>
+
+ <div id="footer">
+ <div id="footer-inner">
+ <div style="float: left; font-size: .85em;">
+ <div>&copy; 2011 Andi Albrecht&nbsp;&nbsp;
+ <code>&lt;albrecht dot andi gmail&gt;</code>
+ </div>
+ <div>
+ <a href="/">Home</a>
+ |
+ <a href="/about/">About</a>
+ |
+ <a href="/source/">Source Code</a>
+ |
+ <a href="/api/">API</a>
+ |
+ <a href="http://andialbrecht.wordpress.com/">Blog</a>
+ </div>
+ </div>
+ <div style="float: right;">
+ <img src="http://code.google.com/appengine/images/appengine-silver-120x30.gif"
+ alt="Powered by Google App Engine" />
+ </div>
+ <div class="clearfix"></div>
+ </div>
+ </div>
+
+ <script type="text/javascript">
+ var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+ </script>
+ <script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-3535525-2");
+ pageTracker._trackPageview();
+ } catch(err) {}</script>
+ <script>init();</script>
+ <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
+
+ </body>
+</html>
diff --git a/extras/appengine/sqlformat/templates/python-client-example.html b/extras/appengine/sqlformat/templates/python-client-example.html
new file mode 100644
index 0000000..68bf820
--- /dev/null
+++ b/extras/appengine/sqlformat/templates/python-client-example.html
@@ -0,0 +1,17 @@
+<div class="highlight example"><pre><span class="c">#!/usr/bin/env python</span>
+
+<span class="k">import</span> <span class="nn">urllib</span>
+<span class="k">import</span> <span class="nn">urllib2</span>
+
+<span class="n">payload</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="p">(</span><span class="s">&#39;data&#39;</span><span class="p">,</span> <span class="s">&#39;select * from foo join bar on val1 = val2 where id = 123;&#39;</span><span class="p">),</span>
+ <span class="p">(</span><span class="s">&#39;format&#39;</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">),</span>
+ <span class="p">(</span><span class="s">&#39;keyword_case&#39;</span><span class="p">,</span> <span class="s">&#39;upper&#39;</span><span class="p">),</span>
+ <span class="p">(</span><span class="s">&#39;reindent&#39;</span><span class="p">,</span> <span class="bp">True</span><span class="p">),</span>
+ <span class="p">(</span><span class="s">&#39;n_indents&#39;</span><span class="p">,</span> <span class="mf">2</span><span class="p">),</span>
+ <span class="p">)</span>
+
+<span class="n">response</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="s">&#39;http://sqlformat.appspot.com/format/&#39;</span><span class="p">,</span>
+ <span class="n">urllib</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">payload</span><span class="p">))</span>
+<span class="k">print</span> <span class="n">response</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+</pre></div>
diff --git a/extras/appengine/sqlformat/templates/source.html b/extras/appengine/sqlformat/templates/source.html
new file mode 100644
index 0000000..a0ed89d
--- /dev/null
+++ b/extras/appengine/sqlformat/templates/source.html
@@ -0,0 +1,60 @@
+{% extends "master.html" %}
+
+{% block title %}Source code{% endblock %}
+
+{% block main %}
+<div id="response">
+ <h1>Source Code</h1>
+
+ <h2>Python Module</h2>
+ <p>
+ The sources for the SQL parser and formatter module are
+ hosted on Google Code.
+ To clone the repository run:
+ <p>
+ <code class="pre"> hg clone http://python-sqlparse.googlecode.com/hg/ python-sqlparse</code>
+ </p>
+ <p>
+ <a href="http://python-sqlparse.googlecode.com">Visit the project page</a>
+ |
+ <a href="http://code.google.com/p/python-sqlparse/source/browse/">Browse the sources online</a>
+ |
+ <a href="http://python-sqlparse.googlecode.com/svn/docs/api/index.html"> API Documentation</a>
+ </p>
+ <p>
+ Some relevant parts of the Python module contain code from the
+ <a href="http://pygments.org/">pygments</a> syntax highlighter.
+ The underlying Python module uses a non-validating SQL parser.
+ This approach makes it possible to parse even syntactically incorrect
+ SQL statements.
+ </p>
+
+ <p>
+ Currently the parser module is used by
+ <a href="http://crunchyfrog.googlecode.com/">CrunchyFrog</a> - a
+ database front-end for Gnome.
+ </p>
+
+ <p>
+ The <code>sqlparse</code> module is released under the terms of the
+ <a href="http://www.opensource.org/licenses/bsd-license.php">New BSD License</a>.
+ </p>
+
+ <h2>App Engine Application</h2>
+ <p>
+ The source code for this App Engine application is available in the
+ <code>examples</code> directory of the Python module
+ (but it's really nothing special ;-).
+ </p>
+
+ <h2>Contributing</h2>
+ <p>
+ Please file bug reports and feature requests on the project site at
+ <a href="http://code.google.com/p/python-sqlparse/issues/entry">http://code.google.com/p/python-sqlparse/issues/entry</a>
+ or if you have code to contribute upload it to
+ <a href="http://codereview.appspot.com">http://codereview.appspot.com</a>
+ and add albrecht.andi@googlemail.com as reviewer.
+ </p>
+
+</div>
+{% endblock %}