diff options
| -rwxr-xr-x | backend/server.py | 59 | ||||
| -rw-r--r-- | src/components/Tile.vue | 4 | ||||
| -rw-r--r-- | src/components/TileInfoModal.vue | 22 | ||||
| -rw-r--r-- | src/tol.ts | 12 |
4 files changed, 48 insertions, 49 deletions
diff --git a/backend/server.py b/backend/server.py index 0e208c3..c1e5538 100755 --- a/backend/server.py +++ b/backend/server.py @@ -43,30 +43,23 @@ def lookupNodes(names): # Check for image file match = re.fullmatch(r"\[(.+) \+ (.+)]", name) if match == None: - nodeObj["img"] = nodeNameToFile(name) + nodeObj["imgName"] = getNodeImg(name) else: - nodeObj["img"] = nodeNameToFile(match.group(1)) - if nodeObj["img"] == None: - nodeObj["img"] = nodeNameToFile(match.group(2)) + nodeObj["imgName"] = getNodeImg(match.group(1)) + if nodeObj["imgName"] == None: + nodeObj["imgName"] = getNodeImg(match.group(2)) # Add node object nodeObjs[name] = nodeObj return nodeObjs -def nodeNameToFile(name): +def getNodeImg(name): cur = dbCon.cursor() row = cur.execute("SELECT name, id FROM eol_ids WHERE name = ?", (name,)).fetchone() - if row == None: - return None - eolId = row[1] - filename = str(eolId) + ".jpg" - if not os.path.exists(imgDir + filename): - return None - row = cur.execute( - "SELECT eol_id, source_url, license, copyright_owner FROM images WHERE eol_id = ?", (eolId,)).fetchone() - if row == None: - print("ERROR: No 'images' entry for image file {}".format(imgDir + filename), file=sys.stderr) - return None - [eolId, sUrl, license, cOwner] = row - return {"filename": filename, "eolId": eolId, "sourceUrl": sUrl, "license": license, "copyrightOwner": cOwner} + if row != None: + eolId = row[1] + filename = str(eolId) + ".jpg" + if os.path.exists(imgDir + filename): + return filename + return None def lookupName(name): cur = dbCon.cursor() results = [] @@ -90,11 +83,21 @@ def lookupName(name): if len(results) > SEARCH_SUGG_LIMIT: hasMore = True del results[-1] - return json.dumps([results, hasMore]) -def lookupDesc(name): + return [results, hasMore] +def lookupNodeInfo(name): cur = dbCon.cursor() + # Get node desc row = cur.execute("SELECT desc, redirected from descs WHERE descs.name = ?", (name,)).fetchone() - return json.dumps([row[0], row[1] == 1] if row != None else None) + desc = {"text": row[0], "fromRedirect": row[1] == 1} if row != None else None + # Get img info + imgInfoQuery = "SELECT eol_id, source_url, license, copyright_owner FROM" \ + " images INNER JOIN eol_ids ON images.eol_id = eol_ids.id WHERE eol_ids.name = ?" + row = cur.execute(imgInfoQuery, (name,)).fetchone() + imgInfo = None + if row != None: + imgInfo = {"eolId": row[0], "sourceUrl": row[1], "license": row[2], "copyrightOwner": row[3]} + # + return {"desc": desc, "imgInfo": imgInfo} class DbServer(BaseHTTPRequestHandler): def do_GET(self): @@ -114,7 +117,7 @@ class DbServer(BaseHTTPRequestHandler): nodeObj = nodeObjs[name] childNodeObjs = lookupNodes(nodeObj["children"]) childNodeObjs[name] = nodeObj - self.respondJson(json.dumps(childNodeObjs)) + self.respondJson(childNodeObjs) return elif reqType == "chain": results = {} @@ -124,7 +127,7 @@ class DbServer(BaseHTTPRequestHandler): nodeObjs = lookupNodes([name]) if len(nodeObjs) == 0: if not ranOnce: - self.respondJson(json.dumps(results)) + self.respondJson(results) return print("ERROR: Parent-chain node {} not found".format(name), file=sys.stderr) break @@ -142,24 +145,24 @@ class DbServer(BaseHTTPRequestHandler): results.update(childNodeObjs) # Check if root if nodeObj["parent"] == None: - self.respondJson(json.dumps(results)) + self.respondJson(results) return else: name = nodeObj["parent"] elif reqType == "search": self.respondJson(lookupName(name)) return - elif reqType == "desc": - self.respondJson(lookupDesc(name)) + elif reqType == "info": + self.respondJson(lookupNodeInfo(name)) return self.send_response(404) self.end_headers() self.end_headers() - def respondJson(self, jsonStr): + def respondJson(self, val): self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() - self.wfile.write(jsonStr.encode("utf-8")) + self.wfile.write(json.dumps(val).encode("utf-8")) server = HTTPServer((hostname, port), DbServer) print("Server started at http://{}:{}".format(hostname, port)) diff --git a/src/components/Tile.vue b/src/components/Tile.vue index a4083bc..744adc3 100644 --- a/src/components/Tile.vue +++ b/src/components/Tile.vue @@ -88,9 +88,9 @@ export default defineComponent({ leafStyles(): Record<string,string> { return { // Image (and scrims) - backgroundImage: this.tolNode.img?.filename != null ? + backgroundImage: this.tolNode.imgName != null ? 'linear-gradient(to bottom, rgba(0,0,0,0.4), #0000 40%, #0000 60%, rgba(0,0,0,0.4) 100%),' + - 'url(\'/img/' + this.tolNode.img.filename.replaceAll('\'', '\\\'') + '\')' : + 'url(\'/img/' + this.tolNode.imgName.replaceAll('\'', '\\\'') + '\')' : 'none', backgroundColor: '#1c1917', backgroundSize: 'cover', diff --git a/src/components/TileInfoModal.vue b/src/components/TileInfoModal.vue index b59a5c9..7cd75b7 100644 --- a/src/components/TileInfoModal.vue +++ b/src/components/TileInfoModal.vue @@ -11,6 +11,7 @@ export default defineComponent({ return { desc: null as null | string, fromRedirect: false, + imgInfo: null as null | {eolId: string, sourceUrl: string, license: string, copyrightOwner: string}, }; }, props: { @@ -24,9 +25,9 @@ export default defineComponent({ }, imgStyles(): Record<string,string> { return { - backgroundImage: this.tolNode.img?.filename != null ? + backgroundImage: this.tolNode.imgName != null ? 'linear-gradient(to bottom, rgba(0,0,0,0.4), #0000 40%, #0000 60%, rgba(0,0,0,0.4) 100%),' + - 'url(\'/img/' + this.tolNode.img.filename.replaceAll('\'', '\\\'') + '\')' : + 'url(\'/img/' + this.tolNode.imgName.replaceAll('\'', '\\\'') + '\')' : 'none', backgroundColor: '#1c1917', width: this.uiOpts.infoModalImgSz + 'px', @@ -45,14 +46,17 @@ export default defineComponent({ }, created(){ let url = new URL(window.location.href); - url.pathname = '/data/desc'; + url.pathname = '/data/info'; url.search = '?name=' + encodeURIComponent(this.node.name); fetch(url.toString()) .then(response => response.json()) .then(obj => { if (obj != null){ - this.desc = obj[0]; - this.fromRedirect = obj[1]; + if (obj.desc != null){ + this.desc = obj.desc.text; + this.fromRedirect = obj.desc.fromRedirect; + } + this.imgInfo = obj.imgInfo; } }); }, @@ -72,11 +76,11 @@ export default defineComponent({ <div class="flex"> <div> <div :style="imgStyles" class="mr-4" alt="an image"></div> - <div v-if="tolNode.img != null"> + <div v-if="imgInfo != null"> <ul> - <li>License: {{tolNode.img.license}}</li> - <li><a :href="tolNode.img.sourceUrl" class="underline">Source URL</a></li> - <li>Copyright Owner: {{tolNode.img.copyrightOwner}}</li> + <li>License: {{imgInfo.license}}</li> + <li><a :href="imgInfo.sourceUrl" class="underline">Source URL</a></li> + <li>Copyright Owner: {{imgInfo.copyrightOwner}}</li> </ul> </div> </div> @@ -10,20 +10,12 @@ export class TolNode { parent: string | null; tips: number; pSupport: boolean; - img: null | { - filename: string, - eolId: string, - sourceUrl: string, - license: string, - copyrightOwner: string - }; - desc: null | [string, boolean]; + imgName: null | string; constructor(children: string[] = [], parent = null, tips = 0, pSupport = false){ this.children = children; this.parent = parent; this.tips = tips; this.pSupport = pSupport; - this.img = null; - this.desc = null; + this.imgName = null; } } |
