Conflicts: bitshift/languages.pytags/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> |