-
Notifications
You must be signed in to change notification settings - Fork 0
/
local_api_gretel_show_tree.go
72 lines (57 loc) · 1.66 KB
/
local_api_gretel_show_tree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
"errors"
"fmt"
"net/http"
"strings"
"github.com/pebbe/dbxml"
)
// Does not actually highlight, but allows retrieving the full xml tree for a given sentence.
func api_gretel_show_tree(q *Context) {
q.w.Header().Set("Access-Control-Allow-Origin", "*")
// [${corpus}, ${dactfile}, ${sentenceid}]
pathSegments := strings.Split(q.r.URL.EscapedPath(), "/")
sentID := pathSegments[len(pathSegments)-1]
dactFileID := pathSegments[len(pathSegments)-2]
corpus := pathSegments[len(pathSegments)-3]
if !mayAccess(q, corpus) {
http.Error(q.w, "", 403)
return
}
dactFile, errval := getDactFileById(corpus, dactFileID)
if gretelSendErr("Error finding component "+dactFileID+" for corpus "+corpus, q, errval) {
return
}
db, errval := dbxml.OpenRead(dactFile.path)
if gretelSendErr("Error opening component database "+dactFile.path, q, errval) {
return
}
xquery := xquery_gretel_show_tree(sentID)
var qu *dbxml.Query
qu, errval = db.PrepareRaw(xquery)
if gretelSendErr("Invalid query: "+xquery, q, errval) {
return
}
docs, errval := qu.Run()
if gretelSendErr("Cannot execute query: "+xquery, q, errval) {
return
}
// read results
docs.Next()
result := docs.Match()
if result == "" {
gretelSendErr("Could not retrieve tree "+sentID, q, errors.New("Document not found"))
return
}
q.w.Header().Set("Content-Type", "text/xml; charset=utf-8")
q.w.Header().Set("Cache-Control", "no-cache")
q.w.Header().Add("Pragma", "no-cache")
fmt.Fprint(q.w, result)
}
func xquery_gretel_show_tree(sentID string) string {
return `
for $match in collection()
where dbxml:metadata('dbxml:name', $match) = "` + sentID + `"
return $match
`
}