Add tests for query syntax
This commit is contained in:
parent
934c499e93
commit
5452579f0d
4 changed files with 85 additions and 15 deletions
|
|
@ -93,6 +93,47 @@
|
||||||
padding: 0 0 36px;
|
padding: 0 0 36px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
section.posts .controls .search-form input {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 640px) {
|
||||||
|
section.posts .controls {
|
||||||
|
display: grid;
|
||||||
|
grid-template:
|
||||||
|
"a a"
|
||||||
|
"b c";
|
||||||
|
}
|
||||||
|
|
||||||
|
section.posts .controls .post-info {
|
||||||
|
grid-area: a;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.posts .controls .search-form {
|
||||||
|
grid-area: b;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.posts .controls .search-form input {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.posts .controls .buttons {
|
||||||
|
grid-area: c;
|
||||||
|
display: flex;
|
||||||
|
justify-content: end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.posts .controls .control-button {
|
||||||
|
padding: 6px;
|
||||||
|
margin: 6px 0;
|
||||||
|
background: #f5e6ab;
|
||||||
|
color: #444;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: none;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
section.posts ul.results {
|
section.posts ul.results {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
@ -132,17 +173,6 @@
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
section.posts .post .controls .control-element a {
|
|
||||||
padding: 6px;
|
|
||||||
margin: 0 0 6px 6px;
|
|
||||||
background: #f5e6ab;
|
|
||||||
color: #444;
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: none;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media screen and (min-width: 640px) {
|
@media screen and (min-width: 640px) {
|
||||||
section.posts .post .controls {
|
section.posts .post .controls {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -162,6 +192,20 @@
|
||||||
color: #eee;
|
color: #eee;
|
||||||
margin: .16rem;
|
margin: .16rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
margin-left: 0;
|
||||||
|
padding: 16px 0 16px 24px;
|
||||||
|
border-left: 3px solid #f5e6ab;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote p:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,10 @@
|
||||||
{:frontend
|
{:frontend
|
||||||
{:target :browser
|
{:target :browser
|
||||||
:modules {:main {:init-fn computersandblues.lodestone.app/init}}
|
:modules {:main {:init-fn computersandblues.lodestone.app/init}}
|
||||||
:js-options {:entry-keys ["module" "browser" "main"]}}}}
|
:js-options {:entry-keys ["module" "browser" "main"]}}
|
||||||
|
|
||||||
|
:test
|
||||||
|
{:target :node-test
|
||||||
|
:output-to "public/js/tests.js"
|
||||||
|
:ns-regexp "-test$"
|
||||||
|
:autorun true}}}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,23 @@
|
||||||
(ns computersandblues.lodestone.match
|
(ns computersandblues.lodestone.match
|
||||||
(:require [applied-science.js-interop :as j]))
|
(:require [applied-science.js-interop :as j]))
|
||||||
|
|
||||||
(defn ->regex [s]
|
(defn- ->regex
|
||||||
|
"Does its best to compila a stirng into a regular expression; will fall back
|
||||||
|
to return a RegExp that matches verbatim."
|
||||||
|
[s]
|
||||||
(try
|
(try
|
||||||
(js/RegExp. s "i")
|
(js/RegExp. s "i")
|
||||||
(catch js/Error _
|
(catch js/Error _
|
||||||
(js/RegExp. (js/RegExp.escape s) "i"))))
|
(js/RegExp. (js/RegExp.escape s) "i"))))
|
||||||
|
|
||||||
|
(defn query->tokens [query]
|
||||||
|
(->> (re-seq #"\"([^\"]+)\"|([^\s]+)" query)
|
||||||
|
(mapv (fn [[_ a b]] (or a b)))))
|
||||||
|
|
||||||
(defn query->matching-fn [query]
|
(defn query->matching-fn [query]
|
||||||
(let [match? (if query
|
(let [match? (if query
|
||||||
(partial re-find (->regex query))
|
(partial re-find (->regex query))
|
||||||
(constantly true))]
|
(constantly true))]
|
||||||
(fn [post]
|
(fn [post]
|
||||||
(or (match? (j/get post :content))
|
(or (match? (j/get post :content))
|
||||||
(match? (j/get-in post [:account :acct])) ; search for url + username of poster
|
(match? (j/get-in post [:account :acct])) ; search for url + username of poster
|
||||||
|
|
|
||||||
13
src/computersandblues/lodestone/match_test.cljs
Normal file
13
src/computersandblues/lodestone/match_test.cljs
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
(ns computersandblues.lodestone.match-test
|
||||||
|
(:require [cljs.test :refer-macros [deftest testing is]]
|
||||||
|
[computersandblues.lodestone.match :as match]))
|
||||||
|
|
||||||
|
(def fixtures
|
||||||
|
(clj->js []))
|
||||||
|
|
||||||
|
(deftest query->tokens
|
||||||
|
(testing "split words on whitespace"
|
||||||
|
(is (= ["foo" "bar"] (match/query->tokens "foo bar")))
|
||||||
|
(is (= ["xxxx" "yyyyy"] (match/query->tokens "xxxx yyyyy"))))
|
||||||
|
(testing "quotes can be used to group tokens"
|
||||||
|
(is (= ["foo" "bar baz"] (match/query->tokens "foo \"bar baz\"")))))
|
||||||
Loading…
Add table
Add a link
Reference in a new issue