Conflicts:
bitshift/languages.py
tags/v1.0^2
| @@ -1,3 +1,6 @@ | |||||
| static/css/* | |||||
| !static/css/lib/* | |||||
| *.swp | *.swp | ||||
| .sass-cache | .sass-cache | ||||
| .DS_Store | .DS_Store | ||||
| @@ -21,7 +24,6 @@ var | |||||
| sdist | sdist | ||||
| develop-eggs | develop-eggs | ||||
| .installed.cfg | .installed.cfg | ||||
| lib | |||||
| lib64 | lib64 | ||||
| __pycache__ | __pycache__ | ||||
| @@ -6,8 +6,9 @@ from flask import Flask | |||||
| from flask import render_template, session | from flask import render_template, session | ||||
| from bitshift import assets | from bitshift import assets | ||||
| from bitshift.database import Database | |||||
| from bitshift.query import parse_query | |||||
| from bitshift import languages | |||||
| # from bitshift.database import Database | |||||
| # from bitshift.query import parse_query | |||||
| app = Flask(__name__) | app = Flask(__name__) | ||||
| app.config.from_object("bitshift.config") | app.config.from_object("bitshift.config") | ||||
| @@ -16,17 +17,25 @@ app_env = app.jinja_env | |||||
| app_env.line_statement_prefix = "=" | app_env.line_statement_prefix = "=" | ||||
| app_env.globals.update(assets=assets) | app_env.globals.update(assets=assets) | ||||
| database = Database() | |||||
| # database = Database() | |||||
| @app.route("/") | @app.route("/") | ||||
| def index(): | def index(): | ||||
| return render_template("index.html") | |||||
| return render_template("index.html", typeahead_languages=languages.LANGS) | |||||
| @app.route("/search/<query>") | @app.route("/search/<query>") | ||||
| def search(query): | def search(query): | ||||
| tree = parse_query(query) | |||||
| database.search(tree) | |||||
| # tree = parse_query(query) | |||||
| # database.search(tree) | |||||
| pass | pass | ||||
| @app.route("/about") | |||||
| def about(): | |||||
| return render_template("about.html") | |||||
| @app.route("/developers") | |||||
| def developers(): | |||||
| return render_template("developers.html") | |||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| app.run() | |||||
| app.run(debug=True) | |||||
| @@ -1 +1,5 @@ | |||||
| LANGS = ["Python", "C", "Java", "Ruby"] | |||||
| import json | |||||
| with open("bitshift/resources/languages.json") as lang_json: | |||||
| LANGS = [lang.encode("ascii","ignore") for lang in | |||||
| json.load(lang_json)["languages"]] | |||||
| @@ -0,0 +1,4 @@ | |||||
| { | |||||
| "_comment" : "A list of programming languages supported by `bitshift`.", | |||||
| "languages" : ["Debian Sourcelist", "Delphi", "JavaScript+Mako", "Brainfuck", "Ceylon", "JavaScript+Django/Jinja", "HTML+Evoque", "NumPy", "Modula-2", "LiveScript", "Nimrod", "Bash", "HTML+Django/Jinja", "CSS+PHP", "XML+Lasso", "VimL", "CSS+Genshi Text", "Fancy", "Coldfusion HTML", "cfstatement", "Scalate Server Page", "Smarty", "XML+Evoque", "haXe", "PowerShell", "Tea", "HTML+Cheetah", "Mason", "Django/Jinja", "JAGS", "ApacheConf", "DTD", "Lighttpd configuration file", "Java", "JavaScript+Genshi Text", "Scheme", "Nemerle", "RHTML", "Ragel in Java Host", "Darcs Patch", "Puppet", "Octave", "CoffeeScript", "Ragel in D Host", "Scilab", "Monkey", "HTML+Myghty", "CSS", "JavaScript+Smarty", "Io", "COBOLFree", "Asymptote", "vhdl", "Python 3", "CSS+Ruby", "Fortran", "d-objdump", "MySQL", "REBOL", "C++", "ERB", "CBM BASIC V2", "Befunge", "Julia", "MoonScript", "Ruby", "XML+Smarty", "Dylan", "Groovy", "MoinMoin/Trac Wiki markup", "autohotkey", "C", "HTML", "Felix", "CMake", "NSIS", "SourcePawn", "Mako", "VGL", "Velocity", "Koka", "CUDA", "Gnuplot", "IRC logs", "Prolog", "Python", "CSS+Django/Jinja", "verilog", "Smalltalk", "JavaScript+Myghty", "YAML", "Julia console", "ANTLR With ActionScript Target", "XML+Mako", "XSLT", "UrbiScript", "Scaml", "S", "DylanLID", "MAQL", "sqlite3con", "Boo", "OCaml", "eC", "ActionScript", "VB.net", "SquidConf", "XQuery", "D", "Fantom", "Gettext Catalog", "Logos", "Lasso", "SCSS", "BBCode", "Haml", "FoxPro", "Python 3.0 Traceback", "MuPAD", "XML+Ruby", "Dart", "IDL", "dg", "Evoque", "Jade", "c-objdump", "Kconfig", "Java Server Page", "reg", "ABAP", "XML+Velocity", "JavaScript+Cheetah", "HTML+Mako", "Ragel in Ruby Host", "RobotFramework", "Protocol Buffer", "CFEngine3", "Ragel", "GLSL", "COBOL", "TypeScript", "Ada", "PostgreSQL SQL dialect", "Xtend", "Logtalk", "objdump", "CSS+Mako", "ca65", "Objective-C++", "Gherkin", "HTML+PHP", "Makefile", "PostScript", "Hxml", "Kotlin", "PL/pgSQL", "Vala", "Haskell", "Bro", "Lua", "POVRay", "Sass", "ANTLR With Java Target", "Tcl", "ANTLR With ObjectiveC Target", "JavaScript+Ruby", "Racket", "AspectJ", "Base Makefile", "ANTLR With Python Target", "cpp-objdump", "Genshi Text", "Ioke", "PyPy Log", "Croc", "Objective-J", "GAS", "Batchfile", "Snobol", "XML", "ANTLR", "Opa", "XML+Cheetah", "Go", "Diff", "MiniD", "Cython", "Ragel in C Host", "Erlang", "Debian Control file", "aspx-vb", "BUGS", "Ragel in CPP Host", "aspx-cs", "Properties", "Groff", "Clojure", "Modelica", "QML", "JavaScript+Lasso", "ANTLR With Perl Target", "Genshi", "BlitzMax", "Treetop", "Matlab", "Myghty", "HTML+Genshi", "Duel", "Perl", "FSharp", "reStructuredText", "NewLisp", "Scala", "CSS+Lasso", "XML+PHP", "Stan", "INI", "MOOCode", "Shell Session", "RPMSpec", "Newspeak", "Bash Session", "Coq", "Raw token data", "Tcsh", "HTML+Lasso", "C#", "Gosu Template", "RConsole", "MXML", "TeX", "CSS+Smarty", "Text only", "ANTLR With C# Target", "OpenEdge ABL", "Cheetah", "Smali", "CSS+Myghty", "Rd", "LLVM", "Standard ML", "Elixir", "Nginx configuration file", "GoodData-CL", "AppleScript", "HTML+Smarty", "Objective-C", "JavaScript", "Rust", "Common Lisp", "Embedded Ragel", "ActionScript 3", "systemverilog", "Literate Haskell", "Python Traceback", "PHP", "ANTLR With CPP Target", "Gosu", "Hybris", "JavaScript+PHP", "Factor", "HTML+Velocity", "Mscgen", "Ooc", "SQL", "HTTP", "ECL", "Redcode", "Ragel in Objective C Host", "XML+Django/Jinja", "Awk", "JSON", "NASM", "ANTLR With Ruby Target", "XML+Myghty", "AutoIt", "Mako", "CSS+Mako", "HTML+Mako", "XML+Mako", "JavaScript+Mako"] | |||||
| } | |||||
| @@ -1,4 +0,0 @@ | |||||
| /* Global project stylesheet. | |||||
| */ | |||||
| p { | |||||
| font-size: 1.5em; } | |||||
| @@ -0,0 +1,147 @@ | |||||
| /* | |||||
| * @file Manages all advanced search form logic. | |||||
| */ | |||||
| var searchGroups = $("div#search-groups"); | |||||
| /* | |||||
| * Load all advanced search form libraries. | |||||
| */ | |||||
| (function loadInputFieldWidgets(){ | |||||
| $(".search-group input#date-last-modified").datepicker(); | |||||
| $(".search-group input#date-created").datepicker(); | |||||
| $("#autocomplete").autocomplete({ | |||||
| source: function(request, response){ | |||||
| var matcher = new RegExp( | |||||
| $.ui.autocomplete.escapeRegex(request.term), "i"); | |||||
| response($.grep(AUTOCOMPLETE_LANGUAGES, function(item){ | |||||
| return matcher.test(item); | |||||
| })); | |||||
| } | |||||
| }); | |||||
| }()); | |||||
| /* | |||||
| * Set all advanced search form button callbacks. | |||||
| */ | |||||
| (function setSearchFormCallbacks(){ | |||||
| // Create a new search group, and update the `#sidebar` checklist. | |||||
| $("button#add-group").click(function(){ | |||||
| $("div#sidebar input[type=checkbox]").prop("checked", false); | |||||
| searchGroups.children("#selected").removeAttr("id"); | |||||
| var searchGroup = $("<div/>", { | |||||
| class : "search-group", | |||||
| id : "selected" | |||||
| }); | |||||
| searchGroups.append( | |||||
| searchGroup.append(createSearchGroupInput("language"))); | |||||
| $("div#sidebar input[type=checkbox]#language").prop("checked", true); | |||||
| }); | |||||
| // Remove the currently selected group if it's not the only one, and mark | |||||
| // one of its siblings as selected. | |||||
| $("button#remove-group").click(function(){ | |||||
| var currentGroup = $("div.search-group#selected"); | |||||
| if($("div.search-group").length == 1) | |||||
| return; | |||||
| else { | |||||
| var nextGroup = currentGroup.prev(); | |||||
| if(nextGroup.size() == 0) | |||||
| nextGroup = currentGroup.next(); | |||||
| } | |||||
| currentGroup.remove(); | |||||
| nextGroup.click(); | |||||
| }); | |||||
| // Select a search group, and update the `#sidebar` checklist accordingly. | |||||
| $(document).on("click", "div.search-group", function(){ | |||||
| searchGroups.children("#selected").removeAttr("id"); | |||||
| $(this).attr("id", "selected"); | |||||
| $("div#sidebar input[type=checkbox]").prop("checked", false); | |||||
| $(this).find("input[type=text]").each(function(){ | |||||
| var checkBoxSelector = "div#sidebar input[type=checkbox]"; | |||||
| $(checkBoxSelector + "#" + $(this).attr("class").split(" ")[0]). | |||||
| prop("checked", true); | |||||
| }) | |||||
| }); | |||||
| // Add an input field to the currently selected search group. | |||||
| $("div#sidebar input[type=checkbox]").click(function(){ | |||||
| var fieldId = $(this).prop("id"); | |||||
| if($(this).is(":checked")){ | |||||
| $("div.search-group#selected").append( | |||||
| $.parseHTML(createSearchGroupInput(fieldId))); | |||||
| if(fieldId.slice(0, 4) == "date") | |||||
| $(".search-group#selected ." + fieldId).datepicker(); | |||||
| } | |||||
| else | |||||
| $("div.search-group#selected #" + fieldId).remove() | |||||
| }); | |||||
| var previousAdvancedQuery = ""; | |||||
| var searchBar = $("form#search-bar input[name=query]"); | |||||
| window.setInterval(function(){ | |||||
| var currentQuery = assembleQuery(); | |||||
| if(currentQuery != previousAdvancedQuery){ | |||||
| previousAdvancedQuery = currentQuery; | |||||
| searchBar.val(assembleQuery()); | |||||
| } | |||||
| }, 1e3 / 15); | |||||
| }()); | |||||
| /* | |||||
| * Return an HTML string representing a new input field div in a search group. | |||||
| * | |||||
| * @param fieldId The id of the input field div, and its child elements. | |||||
| */ | |||||
| function createSearchGroupInput(fieldId){ | |||||
| return [ | |||||
| "<div id='" + fieldId + "'>", | |||||
| "<div class='name'>" + fieldId.replace(/-/g, " ") + "</div>", | |||||
| "<input class='" + fieldId + "' name='" + fieldId + "'type='text'>", | |||||
| "<input type='checkbox' name='regex'>", | |||||
| "<span class='regex'>Regex</span>", | |||||
| "</div>" | |||||
| ].join(""); | |||||
| } | |||||
| /* | |||||
| * Create a query from advanced-search groups. | |||||
| */ | |||||
| function assembleQuery(){ | |||||
| var groups = searchGroups.children(".search-group"); | |||||
| var groupQueries = []; | |||||
| for(var group = 0; group < groups.length; group++){ | |||||
| var inputFields = groups[group].querySelectorAll("input[type=text]"); | |||||
| var regexCheckbox = groups[group].querySelectorAll("input[name=regex]"); | |||||
| var groupQuery = []; | |||||
| for(var field = 0; field < inputFields.length; field++) | |||||
| if(inputFields[field].value.length > 0) | |||||
| groupQuery.push(genFieldQueryString( | |||||
| inputFields[field], regexCheckbox[field].checked)); | |||||
| groupQueries.push(groupQuery.join(" AND ")); | |||||
| } | |||||
| return groupQueries.join(" OR "); | |||||
| } | |||||
| /* | |||||
| * Generate a processed query string for an input field's value. | |||||
| * | |||||
| * @param field (DOM element) An `input[type=text]` element. | |||||
| * @param hasRegex (boolean) Whether or not the field's value has regex. | |||||
| */ | |||||
| function genFieldQueryString(field, hasRegex){ | |||||
| var terms = field.value.replace(/\\/g, "\\\\").replace(/\"/g, "\\\""); | |||||
| var query = field.getAttribute("name") + ":" + (hasRegex?"re:":"") + terms; | |||||
| if(field.value.indexOf('"') >= 0){ | |||||
| return '"' + query + '"'; | |||||
| } | |||||
| return query; | |||||
| } | |||||
| @@ -0,0 +1,149 @@ | |||||
| /* | |||||
| * @file Manages all library initialization, jQuery callbacks, query entry | |||||
| * callbacks, server querying, and results diplay for `index.html`. | |||||
| */ | |||||
| var advancedSearchDiv = $("div#advanced-search"); | |||||
| var advancedSearchButton = $("button#advanced-search"); | |||||
| advancedSearchButton.click(function(){ | |||||
| var searchField = $("div#search-field"); | |||||
| if(!advancedSearchDiv.hasClass("visible")){ | |||||
| searchField.addClass("partly-visible"); | |||||
| advancedSearchDiv.fadeIn(500).addClass("visible"); | |||||
| advancedSearchButton.addClass("clicked"); | |||||
| } | |||||
| else { | |||||
| advancedSearchDiv.fadeOut(300).removeClass("visible"); | |||||
| advancedSearchButton.removeClass("clicked"); | |||||
| if($("div#results .result").length == 0) | |||||
| searchField.removeClass("partly-visible"); | |||||
| } | |||||
| }); | |||||
| FINISH_TYPING_INTERVAL = 650; | |||||
| searchBar = $("form#search-bar input[type='text']")[0]; | |||||
| resultsDiv = $("div#results")[0]; | |||||
| var typingTimer, lastValue; | |||||
| searchBar.onkeyup = typingTimer; | |||||
| // Enable infinite scrolling down the results page. | |||||
| $(window).scroll(function() { | |||||
| if($(window).scrollTop() + $(window).height() == $(document).height()){ | |||||
| loadMoreResults(); | |||||
| } | |||||
| }); | |||||
| // Enable capturing the `enter` key. | |||||
| $("form#search-bar").submit(function(event){ | |||||
| event.preventDefault(); | |||||
| return false; | |||||
| }); | |||||
| /* | |||||
| * Clear the existing timer and set a new one the the user types text into the | |||||
| * search bar. | |||||
| */ | |||||
| function typingTimer(event){ | |||||
| clearTimeout(typingTimer); | |||||
| var enterKeyCode = 13; | |||||
| if(event.keyCode != enterKeyCode){ | |||||
| if(lastValue != searchBar.value) | |||||
| typingTimer = setTimeout(finishedTyping, FINISH_TYPING_INTERVAL); | |||||
| } | |||||
| else { | |||||
| event.preventDefault(); | |||||
| finishedTyping(); | |||||
| return false; | |||||
| } | |||||
| }; | |||||
| /* | |||||
| * Callback which queries the server whenver the user stops typing. | |||||
| * | |||||
| * Whenever the user doesn't type for a `FINISH_TYPING_INTERVAL` after having | |||||
| * entered new text in the search bar, send the current query request to the | |||||
| * server. | |||||
| */ | |||||
| function finishedTyping(){ | |||||
| lastValue = searchBar.value; | |||||
| var searchField = $("div#search-field"); | |||||
| clearResults(); | |||||
| if(searchBar.value){ | |||||
| searchField.addClass("partly-visible"); | |||||
| populateResults(); | |||||
| } | |||||
| else { | |||||
| searchField.removeClass("partly-visible"); | |||||
| $("div#advanced-search").fadeOut(50); | |||||
| advancedSearchButton.removeClass("clicked"); | |||||
| } | |||||
| } | |||||
| /* | |||||
| * Removes any child elements of `div#results`. | |||||
| */ | |||||
| function clearResults(){ | |||||
| while(resultsDiv.firstChild) | |||||
| resultsDiv.removeChild(resultsDiv.firstChild); | |||||
| } | |||||
| /* | |||||
| * Query the server with the current search string, and populate `div#results` | |||||
| * with its response. | |||||
| */ | |||||
| function populateResults(){ | |||||
| var results = queryServer(); | |||||
| for(var result = 0; result < results.length; result++){ | |||||
| var newDiv = results[result]; | |||||
| resultsDiv.appendChild(newDiv); | |||||
| setTimeout( | |||||
| (function(divReference){ | |||||
| return function(){ | |||||
| divReference.classList.add("cascade"); | |||||
| }; | |||||
| }(newDiv)), result * 20); | |||||
| } | |||||
| } | |||||
| /* | |||||
| * AJAX the current query string to the server, and return its response. | |||||
| * | |||||
| * @return {Array} The server's response in the form of `div.result` DOM | |||||
| * elements, to fill `div#results`. | |||||
| */ | |||||
| function queryServer(){ | |||||
| var resultDivs = [] | |||||
| for(var result = 0; result < 20; result++){ | |||||
| var newDiv = document.createElement("div"); | |||||
| newDiv.classList.add("result"); | |||||
| newDiv.innerHTML = Math.random(); | |||||
| newDiv.style.textAlign = "center"; | |||||
| newDiv.style.color = "#" + Math.floor(Math.random() * | |||||
| 16777215).toString(16); | |||||
| resultDivs.push(newDiv); | |||||
| } | |||||
| return resultDivs; | |||||
| } | |||||
| /* | |||||
| * Adds more results to `div#results`. | |||||
| */ | |||||
| function loadMoreResults(){ | |||||
| results = queryServer(); | |||||
| for(var result = 0; result < results.length; result++){ | |||||
| var newDiv = results[result]; | |||||
| resultsDiv.appendChild(newDiv); | |||||
| setTimeout( | |||||
| (function(divReference){ | |||||
| return function(){ | |||||
| divReference.classList.add("cascade"); | |||||
| }; | |||||
| }(newDiv)), | |||||
| result * 20); | |||||
| } | |||||
| } | |||||
| @@ -1,11 +1,20 @@ | |||||
| /* | /* | ||||
| Partial to contain all globally-applicable mixins | |||||
| Partial to contain all globally-applicable mixins. | |||||
| */ | */ | ||||
| // add vendor prefixes for the property $property with value $value | |||||
| // Add vendor prefixes for the property $property with value $value. | |||||
| @mixin vendor($property, $value) | @mixin vendor($property, $value) | ||||
| -webkit-#{$property}: $value | -webkit-#{$property}: $value | ||||
| -moz-#{$property}: $value | -moz-#{$property}: $value | ||||
| -ms-#{$property}: $value | -ms-#{$property}: $value | ||||
| -o-#{$property}: $value | -o-#{$property}: $value | ||||
| #{$property}: $value | #{$property}: $value | ||||
| .t1 | |||||
| @include vendor(transition, all 0.1s ease-out) | |||||
| .t2 | |||||
| @include vendor(transition, all 0.2s ease-out) | |||||
| .t3 | |||||
| @include vendor(transition, all 0.3s ease-out) | |||||
| @@ -0,0 +1,12 @@ | |||||
| /* | |||||
| Partial to contain all globally-applicable variables. | |||||
| */ | |||||
| $baseColor1: #A31F34 | |||||
| $baseColor2: #8A8B8C | |||||
| $baseColor3: #C2C0BF | |||||
| $lightGray: #F1F1F1 | |||||
| $lightBlue: #67A0FD | |||||
| $blue: #3177EB | |||||
| @@ -0,0 +1,294 @@ | |||||
| /* | |||||
| Stylesheet for `index.html`. | |||||
| */ | |||||
| @import mixins | |||||
| @import variables | |||||
| $minSearchFieldsWidth: 490px | |||||
| .ui-datepicker | |||||
| font-size: 70% | |||||
| .ui-autocomplete | |||||
| max-height: 30% | |||||
| overflow-x: hidden | |||||
| overflow-y: scroll | |||||
| padding: 0px | |||||
| >li.ui-menu-item a.ui-state-focus | |||||
| @include vendor(transition, background-color 0.3s ease-out) | |||||
| div#search-field | |||||
| @extend .t2 | |||||
| bottom: 0 | |||||
| height: 50% | |||||
| left: 0 | |||||
| margin: auto | |||||
| margin-top: 15% | |||||
| max-height: 100px | |||||
| right: 0 | |||||
| position: absolute | |||||
| top: 0 | |||||
| width: 40% | |||||
| a#title | |||||
| text-decoration: none | |||||
| div#title | |||||
| font-size: 400% | |||||
| padding-bottom: 0.2em | |||||
| text-align: center | |||||
| #title-bit | |||||
| color: $baseColor1 | |||||
| #title-angle | |||||
| color: $baseColor3 | |||||
| #title-shift | |||||
| color: $baseColor2 | |||||
| font-style: italic | |||||
| form#search-bar | |||||
| min-width: $minSearchFieldsWidth | |||||
| input[type="text"], button | |||||
| @extend .t3 | |||||
| @include vendor(box-sizing, border-box) | |||||
| border: 1px solid $baseColor2 | |||||
| font-size: 110% | |||||
| margin-bottom: 0px | |||||
| padding: 6px | |||||
| input[type="text"] | |||||
| width: 85% | |||||
| &:hover | |||||
| border-color: $baseColor1 | |||||
| button#advanced-search | |||||
| background-color: white | |||||
| border: 1px solid white | |||||
| width: 15% | |||||
| height: 10% | |||||
| padding: 0px | |||||
| float: right | |||||
| &:hover | |||||
| img | |||||
| background-color: black | |||||
| cursor: pointer | |||||
| &.clicked | |||||
| img | |||||
| background-color: $baseColor1 | |||||
| &:focus | |||||
| outline: 0 | |||||
| img | |||||
| @extend .t3 | |||||
| background-color: $baseColor2 | |||||
| margin-top: 5px | |||||
| width: 26px | |||||
| height: 26px | |||||
| &.partly-visible | |||||
| margin-top: 0% | |||||
| padding-bottom: 3% | |||||
| position: absolute | |||||
| width: 100% | |||||
| #title | |||||
| position: absolute | |||||
| top: -1% | |||||
| left: 1% | |||||
| span | |||||
| font-size: 50% | |||||
| form#search-bar | |||||
| padding-top: 3% | |||||
| margin-left: auto | |||||
| margin-right: auto | |||||
| width: 60% | |||||
| div#advanced-search | |||||
| background-color: white | |||||
| border: 1px solid $baseColor3 | |||||
| display: none | |||||
| font-size: 96% | |||||
| height: 400px | |||||
| min-width: $minSearchFieldsWidth | |||||
| padding-top: 0px | |||||
| overflow-x: auto | |||||
| overflow-y: hidden | |||||
| #heading | |||||
| color: $baseColor2 | |||||
| display: block | |||||
| font-size: 120% | |||||
| padding-left: 1% | |||||
| padding-top: 1% | |||||
| width: 100% | |||||
| div | |||||
| display: inline-block | |||||
| font-size: 110% | |||||
| &#col1 | |||||
| width: 25% | |||||
| &#col2 | |||||
| width: 75% | |||||
| >div | |||||
| @include vendor(box-sizing, border-box) | |||||
| display: inline-block | |||||
| float: left | |||||
| #sidebar | |||||
| padding-left: 1% | |||||
| width: 25% | |||||
| >ul | |||||
| list-style: none | |||||
| padding-left: 0 | |||||
| margin-bottom: 8% | |||||
| margin-top: 2% | |||||
| li | |||||
| margin-bottom: 2% | |||||
| label | |||||
| user-select: none | |||||
| div | |||||
| @extend .t3 | |||||
| background-color: $lightGray | |||||
| border: none | |||||
| padding: 3% | |||||
| width: 85% | |||||
| &:hover, &.selectedInputField | |||||
| @extend .t3 | |||||
| background-color: $baseColor2 | |||||
| color: white | |||||
| cursor: pointer | |||||
| width: 90% | |||||
| input[type="checkbox"] | |||||
| display: none | |||||
| &:checked + label > div | |||||
| @extend .selectedInputField | |||||
| background-color: $baseColor1 | |||||
| color: white | |||||
| width: 90% | |||||
| button#add-group | |||||
| background-color: $lightBlue | |||||
| border: none | |||||
| color: white | |||||
| display: block | |||||
| height: 40px | |||||
| margin-bottom: 2% | |||||
| overflow: hidden | |||||
| white-space: nowrap | |||||
| width: 40px | |||||
| span | |||||
| font-size: 150% | |||||
| font-weight: bold | |||||
| margin-left: 6px | |||||
| margin-right: 14px | |||||
| &:hover | |||||
| @extend .t3 | |||||
| background-color: $blue | |||||
| cursor: pointer | |||||
| width: 90% | |||||
| button#remove-group | |||||
| @extend button#add-group | |||||
| background-color: #D82D48 | |||||
| span | |||||
| padding-left: 3px | |||||
| &:hover | |||||
| @extend .t3 | |||||
| background-color: #F11437 | |||||
| #search-groups | |||||
| margin-top: 1% | |||||
| max-height: 93% | |||||
| overflow-y: auto | |||||
| width: 75% | |||||
| .search-group | |||||
| @include vendor(transition, all 0.6s ease-out) | |||||
| background-color: $lightGray | |||||
| padding: 1% | |||||
| margin-bottom: 2% | |||||
| width: 97% | |||||
| >div | |||||
| margin-bottom: 0.7% | |||||
| >div.name | |||||
| display: inline-block | |||||
| font-size: 90% | |||||
| width: 20% | |||||
| >input[type=text] | |||||
| display: inline-block | |||||
| padding: 2px | |||||
| width: 60% | |||||
| >input[type=checkbox] | |||||
| margin-left: 2% | |||||
| &:checked + span | |||||
| @extend .t2 | |||||
| color: green | |||||
| font-weight: bold | |||||
| &:hover | |||||
| cursor: checkbox | |||||
| span.regex | |||||
| font-size: 80% | |||||
| &#selected | |||||
| background-color: #CACACA | |||||
| div#results | |||||
| margin: 3% auto 0 auto | |||||
| margin-left: auto | |||||
| margin-right: auto | |||||
| width: 80% | |||||
| div.result | |||||
| background-color: #F8F8F8 | |||||
| margin-bottom: 10% | |||||
| margin-top: 1% | |||||
| padding: 1% | |||||
| &.cascade | |||||
| @extend .t3 | |||||
| margin-bottom: 0% | |||||
| @@ -2,6 +2,58 @@ | |||||
| Global project stylesheet. | Global project stylesheet. | ||||
| */ | */ | ||||
| // placeholder | |||||
| p | |||||
| font-size: 1.5em | |||||
| @import mixins | |||||
| @import variables | |||||
| html, body | |||||
| height: 100% | |||||
| margin: 0 | |||||
| padding: 0 | |||||
| * | |||||
| font-family: sans-serif | |||||
| div#container | |||||
| min-height: 100% | |||||
| position: relative | |||||
| div#header | |||||
| padding: 10px | |||||
| div#body | |||||
| height: 100% | |||||
| padding-bottom: 110px | |||||
| padding-top: 4% | |||||
| div#center | |||||
| margin-left: auto | |||||
| margin-right: auto | |||||
| width: 75% | |||||
| div#footer | |||||
| @extend .t3 | |||||
| background-color: $baseColor1 | |||||
| bottom: 0 | |||||
| height: 60px | |||||
| padding-top: 12px | |||||
| position: absolute | |||||
| text-align: center | |||||
| width: 100% | |||||
| * | |||||
| color: white | |||||
| a | |||||
| @extend .t3 | |||||
| font-size: 1.2em | |||||
| margin-left: 5% | |||||
| margin-right: 5% | |||||
| text-decoration: none | |||||
| &:hover | |||||
| text-decoration: underline | |||||
| p span | |||||
| font-size: 0.7em | |||||
| @@ -0,0 +1,11 @@ | |||||
| = extends "layout.html" | |||||
| = block title | |||||
| About | |||||
| = endblock | |||||
| = block body | |||||
| <div> | |||||
| About us, son. | |||||
| </div> | |||||
| = endblock | |||||
| @@ -0,0 +1,11 @@ | |||||
| = extends "layout.html" | |||||
| = block title | |||||
| About | |||||
| = endblock | |||||
| = block body | |||||
| <div> | |||||
| For developers, son. | |||||
| </div> | |||||
| = endblock | |||||
| @@ -4,6 +4,98 @@ | |||||
| Home | Home | ||||
| = endblock | = endblock | ||||
| = block head | |||||
| {{ assets.tag("lib/jqueryui.custom.min.css") }} | |||||
| {{ assets.tag("lib/jquery.min.js") }} | |||||
| {{ assets.tag("lib/jquery-ui.min.js") }} | |||||
| {{ assets.tag("lib/typeahead.bundle.min.js") }} | |||||
| {{ assets.tag("index.css") }} | |||||
| <script> | |||||
| AUTOCOMPLETE_LANGUAGES = {{ autocomplete_languages | safe }}; | |||||
| </script> | |||||
| = endblock | |||||
| = block body | = block body | ||||
| <p>Hello, world.</p> | |||||
| <div id="search-field"> | |||||
| <a id="title" href="/"> | |||||
| <div id="title"> | |||||
| <span id="title-bit">bit</span | |||||
| ><span id="title-angle">«</span | |||||
| ><span id="title-shift">shift</span> | |||||
| </div> | |||||
| </a> | |||||
| <form id="search-bar"> | |||||
| <input type="text" name="query" | |||||
| ><button id="advanced-search" title="advanced search"> | |||||
| <img src="static/img/search_bar_magnifying_glass.png"> | |||||
| </button> | |||||
| <div id="advanced-search"> | |||||
| <div id="heading"> | |||||
| <div id="col1">Fields</div | |||||
| ><div id="col2">Search groups</div> | |||||
| </div> | |||||
| <div id="sidebar"> | |||||
| <ul> | |||||
| <li> | |||||
| <input type="checkbox" id="language" checked="true"> | |||||
| <label for="language"><div>languages</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="author"> | |||||
| <label for="author"><div>authors</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="date-last-modified"> | |||||
| <label for="date-last-modified"><div>date last modified</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="date-created"> | |||||
| <label for="date-created"><div>date created</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="symbol"> | |||||
| <label for="symbol"><div>symbols</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="function"> | |||||
| <label for="function"><div>functions</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="class"> | |||||
| <label for="class"><div>classes</div></label> | |||||
| </li> | |||||
| <li> | |||||
| <input type="checkbox" id="variable"> | |||||
| <label for="variable"><div>variables</div></label> | |||||
| </li> | |||||
| </ul> | |||||
| <button id="add-group"> | |||||
| <div><span>+</span> Add</div> | |||||
| </button> | |||||
| <button id="remove-group"> | |||||
| <div><span>-</span> Remove</div> | |||||
| </button> | |||||
| </div> | |||||
| <div id="search-groups"> | |||||
| <div class="search-group" id="selected"> | |||||
| <div id="language"> | |||||
| <div class="name">language</div> | |||||
| <input id="autocomplete" class="language" name="language" type="text"> | |||||
| <input type="checkbox" name="regex"> | |||||
| <span class="regex">Regex</span> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </form> | |||||
| </div> | |||||
| <div id="results"></div> | |||||
| {{ assets.tag("index.js") }} | |||||
| {{ assets.tag("index.advanced-search-form.js") }} | |||||
| = endblock | = endblock | ||||
| @@ -9,10 +9,8 @@ | |||||
| </title> | </title> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> | ||||
| <meta name="description" content="bitshift is an online code snippet | |||||
| exchange."/> | |||||
| <meta name="keywords" content="code snippet exchange golf programming | |||||
| software community"/> | |||||
| <meta name="description" content="bitshift is a source code search engine."/> | |||||
| <meta name="keywords" content="source code language search engine"/> | |||||
| <meta name="author" content="Benjamin Attal Ben Kurtovic Severyn Kozak"/> | <meta name="author" content="Benjamin Attal Ben Kurtovic Severyn Kozak"/> | ||||
| {{ assets.tag("main.css") }} | {{ assets.tag("main.css") }} | ||||
| @@ -21,7 +19,25 @@ | |||||
| = endblock | = endblock | ||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| = block body | |||||
| = endblock | |||||
| <div id="container"> | |||||
| <div id="header"> | |||||
| </div> | |||||
| <div id="body"> | |||||
| <div id="center"> | |||||
| = block body | |||||
| = endblock | |||||
| </div> | |||||
| </div> | |||||
| <div id="footer"> | |||||
| <a href="/">home</a> | |||||
| <a href="/about">about</a> | |||||
| <a href="/developers">developers</a> | |||||
| <p> | |||||
| © 2012-2013 bitshift. <span>All Rights Reserved.</span> | |||||
| </p> | |||||
| </div> | |||||
| </div> | |||||
| </body> | </body> | ||||
| </html> | </html> | ||||