# HG changeset patch # User Steve Losh # Date 1318603123 14400 # Node ID 9ae2223d1010942731c356922fe3c8da27c3d89b # Parent 0679f03c8b496bdcb9bdc2c146b12f0dac47adcc flask-csrf: Update documentation. diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/.buildinfo --- a/flask-csrf/.buildinfo Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/.buildinfo Fri Oct 14 10:38:43 2011 -0400 @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: ca00ce7948463a43d72de0bc0fcd8360 +config: 443fbab3ec780c2dec010228b9779b05 tags: fbb0d17656682115ca4d033fb2f83ba1 diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/.index.html.swp Binary file flask-csrf/.index.html.swp has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_sources/index.txt --- a/flask-csrf/_sources/index.txt Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/_sources/index.txt Fri Oct 14 10:38:43 2011 -0400 @@ -46,7 +46,7 @@ Once you do that you'll need to add a CSRF token to every form on your site that makes an HTTP ``POST`` request:: - + If you have certain views that need to be excluded from this protection (perhaps they receive ``POST`` requests from a third-party site) you can use diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/ajax-loader.gif Binary file flask-csrf/_static/ajax-loader.gif has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/basic.css --- a/flask-csrf/_static/basic.css Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/_static/basic.css Fri Oct 14 10:38:43 2011 -0400 @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -79,6 +79,14 @@ font-size: 1em; } +div.sphinxsidebar input[type="text"] { + width: 170px; +} + +div.sphinxsidebar input[type="submit"] { + width: 30px; +} + img { border: 0; } @@ -213,12 +221,29 @@ font-weight: bold; } +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + .align-left { text-align: left; } .align-center { - clear: both; text-align: center; } @@ -395,7 +420,7 @@ } .footnote:target { - background-color: #ffa + background-color: #ffa; } .line-block { @@ -422,10 +447,16 @@ font-style: oblique; } +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { @@ -506,4 +537,4 @@ #top-link { display: none; } -} +} \ No newline at end of file diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/comment-bright.png Binary file flask-csrf/_static/comment-bright.png has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/comment-close.png Binary file flask-csrf/_static/comment-close.png has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/comment.png Binary file flask-csrf/_static/comment.png has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/doctools.js --- a/flask-csrf/_static/doctools.js Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/_static/doctools.js Fri Oct 14 10:38:43 2011 -0400 @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilties for all documentation. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -185,9 +185,9 @@ body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); - $('') - .appendTo($('.sidebar .this-page-menu')); + $('') + .appendTo($('#searchbox')); } }, @@ -213,7 +213,7 @@ * helper function to hide the search marks again */ hideSearchWords : function() { - $('.sidebar .this-page-menu li.highlight-link').fadeOut(300); + $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/down-pressed.png Binary file flask-csrf/_static/down-pressed.png has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/down.png Binary file flask-csrf/_static/down.png has changed diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/pygments.css --- a/flask-csrf/_static/pygments.css Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/_static/pygments.css Fri Oct 14 10:38:43 2011 -0400 @@ -1,69 +1,70 @@ -.hll { background-color: #ffffcc } -.c { color: #8f5902; font-style: italic } /* Comment */ -.err { color: #a40000; border: 1px solid #ef2929 } /* Error */ -.g { color: #000000 } /* Generic */ -.k { color: #004461; font-weight: bold } /* Keyword */ -.l { color: #000000 } /* Literal */ -.n { color: #000000 } /* Name */ -.o { color: #582800 } /* Operator */ -.x { color: #000000 } /* Other */ -.p { color: #000000; font-weight: bold } /* Punctuation */ -.cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ -.cp { color: #8f5902 } /* Comment.Preproc */ -.c1 { color: #8f5902; font-style: italic } /* Comment.Single */ -.cs { color: #8f5902; font-style: italic } /* Comment.Special */ -.gd { color: #a40000 } /* Generic.Deleted */ -.ge { color: #000000; font-style: italic } /* Generic.Emph */ -.gr { color: #ef2929 } /* Generic.Error */ -.gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.gi { color: #00A000 } /* Generic.Inserted */ -.go { color: #808080 } /* Generic.Output */ -.gp { color: #745334 } /* Generic.Prompt */ -.gs { color: #000000; font-weight: bold } /* Generic.Strong */ -.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ -.kc { color: #004461; font-weight: bold } /* Keyword.Constant */ -.kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ -.kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ -.kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ -.kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ -.kt { color: #004461; font-weight: bold } /* Keyword.Type */ -.ld { color: #000000 } /* Literal.Date */ -.m { color: #990000 } /* Literal.Number */ -.s { color: #4e9a06 } /* Literal.String */ -.na { color: #c4a000 } /* Name.Attribute */ -.nb { color: #004461 } /* Name.Builtin */ -.nc { color: #000000 } /* Name.Class */ -.no { color: #000000 } /* Name.Constant */ -.nd { color: #808080 } /* Name.Decorator */ -.ni { color: #ce5c00 } /* Name.Entity */ -.ne { color: #cc0000; font-weight: bold } /* Name.Exception */ -.nf { color: #000000 } /* Name.Function */ -.nl { color: #f57900 } /* Name.Label */ -.nn { color: #000000 } /* Name.Namespace */ -.nx { color: #000000 } /* Name.Other */ -.py { color: #000000 } /* Name.Property */ -.nt { color: #004461; font-weight: bold } /* Name.Tag */ -.nv { color: #000000 } /* Name.Variable */ -.ow { color: #004461; font-weight: bold } /* Operator.Word */ -.w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ -.mf { color: #990000 } /* Literal.Number.Float */ -.mh { color: #990000 } /* Literal.Number.Hex */ -.mi { color: #990000 } /* Literal.Number.Integer */ -.mo { color: #990000 } /* Literal.Number.Oct */ -.sb { color: #4e9a06 } /* Literal.String.Backtick */ -.sc { color: #4e9a06 } /* Literal.String.Char */ -.sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ -.s2 { color: #4e9a06 } /* Literal.String.Double */ -.se { color: #4e9a06 } /* Literal.String.Escape */ -.sh { color: #4e9a06 } /* Literal.String.Heredoc */ -.si { color: #4e9a06 } /* Literal.String.Interpol */ -.sx { color: #4e9a06 } /* Literal.String.Other */ -.sr { color: #4e9a06 } /* Literal.String.Regex */ -.s1 { color: #4e9a06 } /* Literal.String.Single */ -.ss { color: #4e9a06 } /* Literal.String.Symbol */ -.bp { color: #3465a4 } /* Name.Builtin.Pseudo */ -.vc { color: #000000 } /* Name.Variable.Class */ -.vg { color: #000000 } /* Name.Variable.Global */ -.vi { color: #000000 } /* Name.Variable.Instance */ -.il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #808080 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #808080 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/searchtools.js --- a/flask-csrf/_static/searchtools.js Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/_static/searchtools.js Fri Oct 14 10:38:43 2011 -0400 @@ -1,10 +1,10 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~ + * searchtools.js_t + * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -36,10 +36,11 @@ return rv; } + /** * Porter Stemmer */ -var PorterStemmer = function() { +var Stemmer = function() { var step2list = { ational: 'ate', @@ -300,20 +301,20 @@ }, query : function(query) { - var stopwords = ['and', 'then', 'into', 'it', 'as', 'are', 'in', - 'if', 'for', 'no', 'there', 'their', 'was', 'is', - 'be', 'to', 'that', 'but', 'they', 'not', 'such', - 'with', 'by', 'a', 'on', 'these', 'of', 'will', - 'this', 'near', 'the', 'or', 'at']; + var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"]; - // stem the searchterms and add them to the correct list - var stemmer = new PorterStemmer(); + // Stem the searchterms and add them to the correct list + var stemmer = new Stemmer(); var searchterms = []; var excluded = []; var hlterms = []; var tmp = query.split(/\s+/); - var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null; + var objectterms = []; for (var i = 0; i < tmp.length; i++) { + if (tmp[i] != "") { + objectterms.push(tmp[i].toLowerCase()); + } + if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) || tmp[i] == "") { // skip this "word" @@ -344,9 +345,6 @@ var filenames = this._index.filenames; var titles = this._index.titles; var terms = this._index.terms; - var objects = this._index.objects; - var objtypes = this._index.objtypes; - var objnames = this._index.objnames; var fileMap = {}; var files = null; // different result priorities @@ -357,40 +355,19 @@ $('#search-progress').empty(); // lookup as object - if (object != null) { - for (var prefix in objects) { - for (var name in objects[prefix]) { - var fullname = (prefix ? prefix + '.' : '') + name; - if (fullname.toLowerCase().indexOf(object) > -1) { - match = objects[prefix][name]; - descr = objnames[match[1]] + _(', in ') + titles[match[0]]; - // XXX the generated anchors are not generally correct - // XXX there may be custom prefixes - result = [filenames[match[0]], fullname, '#'+fullname, descr]; - switch (match[2]) { - case 1: objectResults.push(result); break; - case 0: importantResults.push(result); break; - case 2: unimportantResults.push(result); break; - } - } - } - } + for (var i = 0; i < objectterms.length; i++) { + var others = [].concat(objectterms.slice(0,i), + objectterms.slice(i+1, objectterms.length)) + var results = this.performObjectSearch(objectterms[i], others); + // Assume first word is most likely to be the object, + // other words more likely to be in description. + // Therefore put matches for earlier words first. + // (Results are eventually used in reverse order). + objectResults = results[0].concat(objectResults); + importantResults = results[1].concat(importantResults); + unimportantResults = results[2].concat(unimportantResults); } - // sort results descending - objectResults.sort(function(a, b) { - return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); - }); - - importantResults.sort(function(a, b) { - return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); - }); - - unimportantResults.sort(function(a, b) { - return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); - }); - - // perform the search on the required terms for (var i = 0; i < searchterms.length; i++) { var word = searchterms[i]; @@ -456,10 +433,23 @@ if (results.length) { var item = results.pop(); var listItem = $('
  • '); - listItem.append($('').attr( - 'href', - item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX + - highlightstring + item[2]).html(item[1])); + if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') { + // dirhtml builder + var dirname = item[0] + '/'; + if (dirname.match(/\/index\/$/)) { + dirname = dirname.substring(0, dirname.length-6); + } else if (dirname == 'index/') { + dirname = ''; + } + listItem.append($('').attr('href', + DOCUMENTATION_OPTIONS.URL_ROOT + dirname + + highlightstring + item[2]).html(item[1])); + } else { + // normal html builders + listItem.append($('').attr('href', + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX + + highlightstring + item[2]).html(item[1])); + } if (item[3]) { listItem.append($(' (' + item[3] + ')')); Search.output.append(listItem); @@ -472,11 +462,11 @@ if (data != '') { listItem.append($.makeSearchSummary(data, searchterms, hlterms)); Search.output.append(listItem); - listItem.slideDown(5, function() { - displayNextItem(); - }); } - }); + listItem.slideDown(5, function() { + displayNextItem(); + }); + }, "text"); } else { // no source available, just display title Search.output.append(listItem); @@ -497,9 +487,74 @@ } } displayNextItem(); + }, + + performObjectSearch : function(object, otherterms) { + var filenames = this._index.filenames; + var objects = this._index.objects; + var objnames = this._index.objnames; + var titles = this._index.titles; + + var importantResults = []; + var objectResults = []; + var unimportantResults = []; + + for (var prefix in objects) { + for (var name in objects[prefix]) { + var fullname = (prefix ? prefix + '.' : '') + name; + if (fullname.toLowerCase().indexOf(object) > -1) { + var match = objects[prefix][name]; + var objname = objnames[match[1]][2]; + var title = titles[match[0]]; + // If more than one term searched for, we require other words to be + // found in the name/title/description + if (otherterms.length > 0) { + var haystack = (prefix + ' ' + name + ' ' + + objname + ' ' + title).toLowerCase(); + var allfound = true; + for (var i = 0; i < otherterms.length; i++) { + if (haystack.indexOf(otherterms[i]) == -1) { + allfound = false; + break; + } + } + if (!allfound) { + continue; + } + } + var descr = objname + _(', in ') + title; + anchor = match[3]; + if (anchor == '') + anchor = fullname; + else if (anchor == '-') + anchor = objnames[match[1]][1] + '-' + fullname; + result = [filenames[match[0]], fullname, '#'+anchor, descr]; + switch (match[2]) { + case 1: objectResults.push(result); break; + case 0: importantResults.push(result); break; + case 2: unimportantResults.push(result); break; + } + } + } + } + + // sort results descending + objectResults.sort(function(a, b) { + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); + }); + + importantResults.sort(function(a, b) { + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); + }); + + unimportantResults.sort(function(a, b) { + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); + }); + + return [importantResults, objectResults, unimportantResults] } } $(document).ready(function() { Search.init(); -}); +}); \ No newline at end of file diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/_static/underscore.js --- a/flask-csrf/_static/underscore.js Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/_static/underscore.js Fri Oct 14 10:38:43 2011 -0400 @@ -1,3 +1,10 @@ +// Underscore.js 0.5.5 +// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the terms of the MIT license. +// Portions of Underscore are inspired by or borrowed from Prototype.js, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore/ (function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e 0) { + var start = document.cookie.indexOf('sortBy='); + if (start != -1) { + start = start + 7; + var end = document.cookie.indexOf(";", start); + if (end == -1) { + end = document.cookie.length; + by = unescape(document.cookie.substring(start, end)); + } + } + } + setComparator(); + } + + /** + * Show a comment div. + */ + function show(id) { + $('#ao' + id).hide(); + $('#ah' + id).show(); + var context = $.extend({id: id}, opts); + var popup = $(renderTemplate(popupTemplate, context)).hide(); + popup.find('textarea[name="proposal"]').hide(); + popup.find('a.by' + by).addClass('sel'); + var form = popup.find('#cf' + id); + form.submit(function(event) { + event.preventDefault(); + addComment(form); + }); + $('#s' + id).after(popup); + popup.slideDown('fast', function() { + getComments(id); + }); + } + + /** + * Hide a comment div. + */ + function hide(id) { + $('#ah' + id).hide(); + $('#ao' + id).show(); + var div = $('#sc' + id); + div.slideUp('fast', function() { + div.remove(); + }); + } + + /** + * Perform an ajax request to get comments for a node + * and insert the comments into the comments tree. + */ + function getComments(id) { + $.ajax({ + type: 'GET', + url: opts.getCommentsURL, + data: {node: id}, + success: function(data, textStatus, request) { + var ul = $('#cl' + id); + var speed = 100; + $('#cf' + id) + .find('textarea[name="proposal"]') + .data('source', data.source); + + if (data.comments.length === 0) { + ul.html('
  • No comments yet.
  • '); + ul.data('empty', true); + } else { + // If there are comments, sort them and put them in the list. + var comments = sortComments(data.comments); + speed = data.comments.length * 100; + appendComments(comments, ul); + ul.data('empty', false); + } + $('#cn' + id).slideUp(speed + 200); + ul.slideDown(speed); + }, + error: function(request, textStatus, error) { + showError('Oops, there was a problem retrieving the comments.'); + }, + dataType: 'json' + }); + } + + /** + * Add a comment via ajax and insert the comment into the comment tree. + */ + function addComment(form) { + var node_id = form.find('input[name="node"]').val(); + var parent_id = form.find('input[name="parent"]').val(); + var text = form.find('textarea[name="comment"]').val(); + var proposal = form.find('textarea[name="proposal"]').val(); + + if (text == '') { + showError('Please enter a comment.'); + return; + } + + // Disable the form that is being submitted. + form.find('textarea,input').attr('disabled', 'disabled'); + + // Send the comment to the server. + $.ajax({ + type: "POST", + url: opts.addCommentURL, + dataType: 'json', + data: { + node: node_id, + parent: parent_id, + text: text, + proposal: proposal + }, + success: function(data, textStatus, error) { + // Reset the form. + if (node_id) { + hideProposeChange(node_id); + } + form.find('textarea') + .val('') + .add(form.find('input')) + .removeAttr('disabled'); + var ul = $('#cl' + (node_id || parent_id)); + if (ul.data('empty')) { + $(ul).empty(); + ul.data('empty', false); + } + insertComment(data.comment); + var ao = $('#ao' + node_id); + ao.find('img').attr({'src': opts.commentBrightImage}); + if (node_id) { + // if this was a "root" comment, remove the commenting box + // (the user can get it back by reopening the comment popup) + $('#ca' + node_id).slideUp(); + } + }, + error: function(request, textStatus, error) { + form.find('textarea,input').removeAttr('disabled'); + showError('Oops, there was a problem adding the comment.'); + } + }); + } + + /** + * Recursively append comments to the main comment list and children + * lists, creating the comment tree. + */ + function appendComments(comments, ul) { + $.each(comments, function() { + var div = createCommentDiv(this); + ul.append($(document.createElement('li')).html(div)); + appendComments(this.children, div.find('ul.comment-children')); + // To avoid stagnating data, don't store the comments children in data. + this.children = null; + div.data('comment', this); + }); + } + + /** + * After adding a new comment, it must be inserted in the correct + * location in the comment tree. + */ + function insertComment(comment) { + var div = createCommentDiv(comment); + + // To avoid stagnating data, don't store the comments children in data. + comment.children = null; + div.data('comment', comment); + + var ul = $('#cl' + (comment.node || comment.parent)); + var siblings = getChildren(ul); + + var li = $(document.createElement('li')); + li.hide(); + + // Determine where in the parents children list to insert this comment. + for(i=0; i < siblings.length; i++) { + if (comp(comment, siblings[i]) <= 0) { + $('#cd' + siblings[i].id) + .parent() + .before(li.html(div)); + li.slideDown('fast'); + return; + } + } + + // If we get here, this comment rates lower than all the others, + // or it is the only comment in the list. + ul.append(li.html(div)); + li.slideDown('fast'); + } + + function acceptComment(id) { + $.ajax({ + type: 'POST', + url: opts.acceptCommentURL, + data: {id: id}, + success: function(data, textStatus, request) { + $('#cm' + id).fadeOut('fast'); + $('#cd' + id).removeClass('moderate'); + }, + error: function(request, textStatus, error) { + showError('Oops, there was a problem accepting the comment.'); + } + }); + } + + function deleteComment(id) { + $.ajax({ + type: 'POST', + url: opts.deleteCommentURL, + data: {id: id}, + success: function(data, textStatus, request) { + var div = $('#cd' + id); + if (data == 'delete') { + // Moderator mode: remove the comment and all children immediately + div.slideUp('fast', function() { + div.remove(); + }); + return; + } + // User mode: only mark the comment as deleted + div + .find('span.user-id:first') + .text('[deleted]').end() + .find('div.comment-text:first') + .text('[deleted]').end() + .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) + .remove(); + var comment = div.data('comment'); + comment.username = '[deleted]'; + comment.text = '[deleted]'; + div.data('comment', comment); + }, + error: function(request, textStatus, error) { + showError('Oops, there was a problem deleting the comment.'); + } + }); + } + + function showProposal(id) { + $('#sp' + id).hide(); + $('#hp' + id).show(); + $('#pr' + id).slideDown('fast'); + } + + function hideProposal(id) { + $('#hp' + id).hide(); + $('#sp' + id).show(); + $('#pr' + id).slideUp('fast'); + } + + function showProposeChange(id) { + $('#pc' + id).hide(); + $('#hc' + id).show(); + var textarea = $('#pt' + id); + textarea.val(textarea.data('source')); + $.fn.autogrow.resize(textarea[0]); + textarea.slideDown('fast'); + } + + function hideProposeChange(id) { + $('#hc' + id).hide(); + $('#pc' + id).show(); + var textarea = $('#pt' + id); + textarea.val('').removeAttr('disabled'); + textarea.slideUp('fast'); + } + + function toggleCommentMarkupBox(id) { + $('#mb' + id).toggle(); + } + + /** Handle when the user clicks on a sort by link. */ + function handleReSort(link) { + var classes = link.attr('class').split(/\s+/); + for (var i=0; iThank you! Your comment will show up ' + + 'once it is has been approved by a moderator.'); + } + // Prettify the comment rating. + comment.pretty_rating = comment.rating + ' point' + + (comment.rating == 1 ? '' : 's'); + // Make a class (for displaying not yet moderated comments differently) + comment.css_class = comment.displayed ? '' : ' moderate'; + // Create a div for this comment. + var context = $.extend({}, opts, comment); + var div = $(renderTemplate(commentTemplate, context)); + + // If the user has voted on this comment, highlight the correct arrow. + if (comment.vote) { + var direction = (comment.vote == 1) ? 'u' : 'd'; + div.find('#' + direction + 'v' + comment.id).hide(); + div.find('#' + direction + 'u' + comment.id).show(); + } + + if (opts.moderator || comment.text != '[deleted]') { + div.find('a.reply').show(); + if (comment.proposal_diff) + div.find('#sp' + comment.id).show(); + if (opts.moderator && !comment.displayed) + div.find('#cm' + comment.id).show(); + if (opts.moderator || (opts.username == comment.username)) + div.find('#dc' + comment.id).show(); + } + return div; + } + + /** + * A simple template renderer. Placeholders such as <%id%> are replaced + * by context['id'] with items being escaped. Placeholders such as <#id#> + * are not escaped. + */ + function renderTemplate(template, context) { + var esc = $(document.createElement('div')); + + function handle(ph, escape) { + var cur = context; + $.each(ph.split('.'), function() { + cur = cur[this]; + }); + return escape ? esc.text(cur || "").html() : cur; + } + + return template.replace(/<([%#])([\w\.]*)\1>/g, function() { + return handle(arguments[2], arguments[1] == '%' ? true : false); + }); + } + + /** Flash an error message briefly. */ + function showError(message) { + $(document.createElement('div')).attr({'class': 'popup-error'}) + .append($(document.createElement('div')) + .attr({'class': 'error-message'}).text(message)) + .appendTo('body') + .fadeIn("slow") + .delay(2000) + .fadeOut("slow"); + } + + /** Add a link the user uses to open the comments popup. */ + $.fn.comment = function() { + return this.each(function() { + var id = $(this).attr('id').substring(1); + var count = COMMENT_METADATA[id]; + var title = count + ' comment' + (count == 1 ? '' : 's'); + var image = count > 0 ? opts.commentBrightImage : opts.commentImage; + var addcls = count == 0 ? ' nocomment' : ''; + $(this) + .append( + $(document.createElement('a')).attr({ + href: '#', + 'class': 'sphinx-comment-open' + addcls, + id: 'ao' + id + }) + .append($(document.createElement('img')).attr({ + src: image, + alt: 'comment', + title: title + })) + .click(function(event) { + event.preventDefault(); + show($(this).attr('id').substring(2)); + }) + ) + .append( + $(document.createElement('a')).attr({ + href: '#', + 'class': 'sphinx-comment-close hidden', + id: 'ah' + id + }) + .append($(document.createElement('img')).attr({ + src: opts.closeCommentImage, + alt: 'close', + title: 'close' + })) + .click(function(event) { + event.preventDefault(); + hide($(this).attr('id').substring(2)); + }) + ); + }); + }; + + var opts = { + processVoteURL: '/_process_vote', + addCommentURL: '/_add_comment', + getCommentsURL: '/_get_comments', + acceptCommentURL: '/_accept_comment', + deleteCommentURL: '/_delete_comment', + commentImage: '/static/_static/comment.png', + closeCommentImage: '/static/_static/comment-close.png', + loadingImage: '/static/_static/ajax-loader.gif', + commentBrightImage: '/static/_static/comment-bright.png', + upArrow: '/static/_static/up.png', + downArrow: '/static/_static/down.png', + upArrowPressed: '/static/_static/up-pressed.png', + downArrowPressed: '/static/_static/down-pressed.png', + voting: false, + moderator: false + }; + + if (typeof COMMENT_OPTIONS != "undefined") { + opts = jQuery.extend(opts, COMMENT_OPTIONS); + } + + var popupTemplate = '\ +
    \ +

    \ + Sort by:\ + best rated\ + newest\ + oldest\ +

    \ +
    Comments
    \ +
    \ + loading comments...
    \ + \ +
    \ +

    Add a comment\ + (markup):

    \ +
    \ + reStructured text markup: *emph*, **strong**, \ + ``code``, \ + code blocks: :: and an indented block after blank line
    \ +
    \ + \ +

    \ + \ + Propose a change ▹\ + \ + \ + Propose a change ▿\ + \ +

    \ + \ + \ + \ + \ +
    \ +
    \ +
    '; + + var commentTemplate = '\ +
    \ +
    \ +
    \ + \ + \ + \ + \ + \ + \ +
    \ +
    \ + \ + \ + \ + \ + \ + \ +
    \ +
    \ +
    \ +

    \ + <%username%>\ + <%pretty_rating%>\ + <%time.delta%>\ +

    \ +
    <#text#>
    \ +

    \ + \ + reply ▿\ + proposal ▹\ + proposal ▿\ + \ + \ +

    \ +
    \
    +<#proposal_diff#>\
    +        
    \ +
      \ +
      \ +
      \ +
      \ + '; + + var replyTemplate = '\ +
    • \ +
      \ +
      \ + \ + \ + \ + \ + \ +
      \ +
      \ +
    • '; + + $(document).ready(function() { + init(); + }); +})(jQuery); + +$(document).ready(function() { + // add comment anchors for all paragraphs that are commentable + $('.sphinx-has-comment').comment(); + + // highlight search words in search results + $("div.context").each(function() { + var params = $.getQueryParameters(); + var terms = (params.q) ? params.q[0].split(/\s+/) : []; + var result = $(this); + $.each(terms, function() { + result.highlightText(this.toLowerCase(), 'highlighted'); + }); + }); + + // directly open comment window if requested + var anchor = document.location.hash; + if (anchor.substring(0, 9) == '#comment-') { + $('#ao' + anchor.substring(9)).click(); + document.location.hash = '#s' + anchor.substring(9); + } +}); diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/genindex.html --- a/flask-csrf/genindex.html Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/genindex.html Fri Oct 14 10:38:43 2011 -0400 @@ -1,14 +1,19 @@ + + + - Index — flask-csrf v0.9.1 documentation + Index — flask-csrf 0.9.1 documentation + + - + @@ -34,11 +39,11 @@
      -

      Index

      +

      Index

      -
      - -
      +
      + +
      diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/index.html --- a/flask-csrf/index.html Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/index.html Fri Oct 14 10:38:43 2011 -0400 @@ -2,13 +2,16 @@ + - Welcome to flask-csrf’s documentation! — flask-csrf v0.9.1 documentation + Welcome to flask-csrf’s documentation! — flask-csrf 0.9.1 documentation + + - + @@ -61,7 +64,7 @@

      Once you do that you’ll need to add a CSRF token to every form on your site that makes an HTTP POST request:

      -
      <input type="hidden" value="{{ csrf_token() }}">
      +
      <input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">

      If you have certain views that need to be excluded from this protection (perhaps they receive POST requests from a third-party site) you can use diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/search.html --- a/flask-csrf/search.html Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/search.html Fri Oct 14 10:38:43 2011 -0400 @@ -2,13 +2,16 @@ + - Search — flask-csrf v0.9.1 documentation + Search — flask-csrf 0.9.1 documentation + + - + diff -r 0679f03c8b49 -r 9ae2223d1010 flask-csrf/searchindex.js --- a/flask-csrf/searchindex.js Thu Jun 30 15:05:57 2011 -0400 +++ b/flask-csrf/searchindex.js Fri Oct 14 10:38:43 2011 -0400 @@ -1,1 +1,1 @@ -Search.setIndex({objects:{},terms:{just:0,victim:0,paramet:0,easi:0,flask:0,flash:[],activ:0,send:0,add:0,input:0,hidden:0,count_csrf_attack:0,applic:0,sourc:0,everi:0,string:0,thei:0,handl:0,know:0,csrf:0,fall:0,like:0,anyth:0,token:0,common:0,small:0,view:0,some:0,pass:0,happen:0,detect:0,flaskext:0,internet:0,"import":0,foo:0,usag:0,free:0,extens:0,reason:0,base:0,repositori:0,org:0,post:0,valu:0,protect:0,thing:0,perhap:0,place:0,sjl:0,com:0,disabl:0,first:0,csrf_token:0,danger:0,feel:0,onc:0,app:0,prefer:0,instal:0,open:0,your:0,forgeri:0,git:0,from:0,would:0,licens:0,two:0,mercuri:0,attack:0,call:0,type:0,"function":0,form:0,site:0,quick:0,must:0,count:0,pull:0,endpoint:0,whenev:0,csrf_exempt:0,can:0,def:0,fork:0,have:0,on_csrf:0,certain:0,argument:0,repres:0,need:0,want:0,pip:0,contribut:0,decor:0,welcom:0,receiv:0,parti:0,make:0,when:0,cross:0,snippet:0,my_receiving_view:0,take:0,you:0,document:0,simpl:0,mit:0,http:0,normal:0,user:0,bitbucket:0,github:0,third:0,ani:0,request:0,exclud:0,exampl:0,thi:0,egg:0,rout:0},objtypes:{},titles:["Welcome to flask-csrf’s documentation!"],objnames:{},filenames:["index"]}) \ No newline at end of file +Search.setIndex({objects:{},terms:{just:0,victim:0,paramet:0,easi:0,flask:0,activ:0,send:0,add:0,input:0,hidden:0,count_csrf_attack:0,applic:0,sourc:0,everi:0,string:0,thei:0,handl:0,know:0,csrf:0,fall:0,name:0,like:0,anyth:0,token:0,common:0,small:0,view:0,some:0,pass:0,happen:0,detect:0,flaskext:0,internet:0,"import":0,foo:0,usag:0,free:0,extens:0,reason:0,base:0,repositori:0,org:0,post:0,valu:0,protect:0,thing:0,perhap:0,place:0,sjl:0,com:0,disabl:0,first:0,csrf_token:0,danger:0,feel:0,onc:0,app:0,prefer:0,instal:0,open:0,your:0,forgeri:0,git:0,from:0,would:0,licens:0,two:0,mercuri:0,attack:0,call:0,type:0,"function":0,form:0,site:0,quick:0,must:0,count:0,pull:0,endpoint:0,whenev:0,csrf_exempt:0,can:0,def:0,fork:0,have:0,on_csrf:0,certain:0,argument:0,repres:0,need:0,want:0,pip:0,contribut:0,decor:0,welcom:0,receiv:0,parti:0,make:0,when:0,cross:0,snippet:0,my_receiving_view:0,"_csrf_token":0,take:0,you:0,document:0,simpl:0,mit:0,http:0,normal:0,user:0,bitbucket:0,github:0,third:0,ani:0,request:0,exclud:0,exampl:0,thi:0,egg:0,rout:0},objtypes:{},titles:["Welcome to flask-csrf’s documentation!"],objnames:{},filenames:["index"]}) \ No newline at end of file