From 53a1d229ff8e6028feb52736842f0eed1b97f3d7 Mon Sep 17 00:00:00 2001 From: Benjamin Attal Date: Sun, 18 May 2014 22:49:34 -0400 Subject: [PATCH] Add extra information to search results. Add function for creating search results from codelets. --- static/js/index.js | 128 +++++++++++++++++++++++++++++++++++++++++-------- static/sass/index.sass | 56 +++++++++++++++++++--- 2 files changed, 157 insertions(+), 27 deletions(-) diff --git a/static/js/index.js b/static/js/index.js index f22ca5e..b8b0ad4 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -12,6 +12,25 @@ var typingTimer, lastValue; var codeExample = '
 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40
"""\nModule to contain all the project's Flask server plumbing.\n"""\n\nfrom flask import Flask\nfrom flask import render_template, session\n\nfrom bitshift import assets\n# from bitshift.database import Database\n# from bitshift.query import parse_query\n\napp = Flask(__name__)\napp.config.from_object("bitshift.config")\n\napp_env = app.jinja_env\napp_env.line_statement_prefix = "="\napp_env.globals.update(assets=assets)\n\n# database = Database()\n\n@app.route("/")\ndef index():\n    return render_template("index.html")\n\n@app.route("/search/<query>")\ndef search(query):\n    # tree = parse_query(query)\n    # database.search(tree)\n    pass\n\n@app.route("/about")\ndef about():\n    return render_template("about.html")\n\n@app.route("/developers")\ndef developers():\n    return render_template("developers.html")\n\nif __name__ == "__main__":\n    app.run(debug=True)\n
\n
' searchBar.onkeyup = typingTimer; +var testCodelet = { + 'code_url': 'https://github.com/earwig/bitshift/blob/develop/app.py', + 'filename': 'app.py', + 'language': 'Python', + 'date_created': 'May 10, 2014', + 'date_modified': '2 days ago', + 'symbols': { + 'vars': [ + ['app', [ [12, -1, 12, -1] ], + [ [13, -1, 13, -1], + [15, -1, 15, -1], + [16, -1, 16, -1], + [17, -1, 17, -1] ]] + ] + }, + 'authors': ['sevko', 'earwig'], + 'html_code': codeExample +}; + // Enable infinite scrolling down the results page. $(window).scroll(function() { var searchField = $("div#search-field"); @@ -95,6 +114,93 @@ function populateResults(){ } /* + * Create a result element based upon a codelet instance. + * + * @return {Element} The result element. + */ +function createResult(codelet) { + //Level 1 + var newDiv = document.createElement("div"), + table = document.createElement("table"), + row = document.createElement("tr"); + //Level 2 + var displayInfo = document.createElement("div"), + sidebar = document.createElement("td"), + codeElt = document.createElement("td"), + hiddenInfo = document.createElement("td"); + //Level 3 + var title = document.createElement("span"), + site = document.createElement("span"), + dateModified = document.createElement("span"), + language = document.createElement("span"), + dateCreated = document.createElement("span"), + matches = document.createElement("div"), + authors = document.createElement("div"); + + //Classes and ID's + newDiv.classList.add('result'); + + displayInfo.id = 'display-info'; + sidebar.id = 'sidebar'; + codeElt.id = 'code'; + hiddenInfo.id = 'hidden-info'; + + title.id = 'title'; + site.id = 'site'; + dateModified.id = 'date-modified'; + language.id = 'language'; + dateCreated.id = 'date-created'; + matches.id = 'matches'; + authors.id = 'authors'; + + //Add the bulk of the html + var hostUrl = codelet.code_url.match(/htt(p|ps):\/\/\w+\.\w+/)[0], + hostName = hostUrl.split('://')[1].split('.')[0]; + + title.innerHTML = 'File ' + + codelet.filename + ''; + site.innerHTML = 'on ' + hostName +''; + dateModified.innerHTML = 'Last modified ' + codelet.date_modified; + // Needs to be changed from int to string on the server + language.innerHTML = codelet.language; + dateCreated.innerHTML = 'Created ' + codelet.date_created; + matches.innerHTML = 'Symbol matches: '; + $.each(Object.keys(codelet.symbols), function(i, t) { + $.each(codelet.symbols[t], function(i, s) { + matches.innerHTML += '' + s[0] + ''; + }); + }); + authors.innerHTML = 'Authors: '; + $.each(codelet.authors, function(i, a) { + authors.innerHTML += '' + a + '; '; + }); + + sidebar.innerHTML = ''; + // Needs to be processed on the server + codeElt.innerHTML = '
' + codelet.html_code + '
'; + + //Finish and append elements to parent elements + row.appendChild(sidebar); + row.appendChild(codeElt); + row.appendChild(hiddenInfo); + table.appendChild(row); + + displayInfo.appendChild(title); + displayInfo.appendChild(site); + displayInfo.appendChild(dateModified); + + hiddenInfo.appendChild(dateCreated); + hiddenInfo.appendChild(language); + hiddenInfo.appendChild(matches); + hiddenInfo.appendChild(authors); + + newDiv.appendChild(displayInfo); + newDiv.appendChild(table); + + return newDiv; +} + +/* * 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 @@ -103,27 +209,7 @@ function populateResults(){ function queryServer(){ var resultDivs = [] for(var result = 0; result < 20; result++){ - var newDiv = document.createElement("div"), - table = document.createElement("table"), - row = document.createElement("tr"), - sidebar = document.createElement("td"), - codeElt = document.createElement("td"), - meta = document.createElement("td"); - - newDiv.classList.add("result"); - sidebar.id = 'sidebar'; - codeElt.id = 'code'; - meta.id = 'meta'; - - sidebar.innerHTML = ''; - codeElt.innerHTML = '
' + codeExample + '
'; - - row.appendChild(sidebar); - row.appendChild(codeElt); - row.appendChild(meta); - table.appendChild(row); - newDiv.appendChild(table); - + var newDiv = createResult(testCodelet); resultDivs.push(newDiv); } diff --git a/static/sass/index.sass b/static/sass/index.sass index 3738f0b..cb8ba7c 100644 --- a/static/sass/index.sass +++ b/static/sass/index.sass @@ -8,7 +8,7 @@ $resultWidth: 830px $sidebarWidth: 30px $codeWidth: 500px -$metaWidth: 300px +$hiddenInfoWidth: 300px div#search-field @extend .t2 @@ -103,10 +103,32 @@ div#results margin-right: auto width: 80% + /* TODO: + 1) On the side + - add way to cycle through hits in the code.*/ div.result width: $resultWidth height: 200px - margin-top: 3% + margin-top: 2% + margin-bottom: 6% + + #display-info + a + text-decoration: none + + &:hover + color: orange + + #title + margin-right: 50px + + #site + text-transform: capitalize + + #date-modified + font-family: monospace + color: #333 + display: block table border-collapse: collapse @@ -142,10 +164,32 @@ div#results border: none font-family: monospace - #meta - width: $metaWidth + #hidden-info + width: $hiddenInfoWidth + text-align: center + font-size: 1.2em + + #date-created + display: block + + #language + display: inline-block + padding: 3px + @include vendor(border-radius, 3px) + background-color: #eee + font-weight: bold + color: purple + + &:hover + background-color: #ddd + + #matches + span + color: red + + #authors + span + color: red &.cascade @extend .t3 - - margin-bottom: 0%