Module tf.browser.servelib

Common Server Related Functions

About

Here are functions that are being used by various parts of the TF browser infrastructure, such as

Functions

def batchAround(nResults, position, batch)
Expand source code Browse git
def batchAround(nResults, position, batch):
    halfBatch = int((batch + 1) / 2)
    left = min(max(position - halfBatch, 1), nResults)
    right = max(min(position + halfBatch, nResults), 1)
    discrepancy = batch - (right - left + 1)
    if discrepancy != 0:
        right += discrepancy
    if right > nResults:
        right = nResults
    return (left, right)
def getAbout(colophon, header, provenance, form)
Expand source code Browse git
def getAbout(colophon, header, provenance, form):
    return f"""
{colophon}

{provenance}

Job: {form['jobName']}

# {form['title']}

## {form['author']}

{form['description']}

## Information requests:

### Sections

``` python
{form['sections']}
```

### Nodes

``` python
{form['tuples']}
```

### Search

``` python
{form['query']}
```
"""
def getFormData(interfaceDefaults)
Expand source code Browse git
def getFormData(interfaceDefaults):
    """Get form data.

    The TF browser user interacts with the web app by clicking and typing,
    as a result of which a HTML form gets filled in.
    This form as regularly submitted to the web server with a request
    for a new incarnation of the page: a response.

    The values that come with a request, must be peeled out of the form,
    and stored as logical values.

    Most of the data has a known function to the web server,
    but there is also a list of web app dependent options.
    """

    form = {}
    jobName = request.form.get("jobName", "").strip()
    resetForm = request.form.get("resetForm", "")
    form["resetForm"] = resetForm

    if jobName:
        form["jobName"] = jobName
        form["loadJob"] = ""
    else:
        form["jobName"] = DEFAULT_NAME
        form["loadJob"] = "1"
        form["resetForm"] = "1"

    form["query"] = request.form.get("query", "").replace("\r", "")
    form["messages"] = request.form.get("messages", "") or ""
    form["features"] = request.form.get("features", "") or ""
    form["tuples"] = request.form.get("tuples", "").replace("\r", "")
    form["sections"] = request.form.get("sections", "").replace("\r", "")
    form["appName"] = request.form.get("appName", "")
    form["side"] = request.form.get("side", "")
    form["dstate"] = request.form.get("dstate", "")
    form["metaopen"] = request.form.get("metaopen", "")
    form["author"] = request.form.get("author", "").strip()
    form["title"] = request.form.get("title", "").strip()
    form["description"] = request.form.get("description", "").replace("\r", "")
    form["forceEdges"] = request.form.get("forceEdges", None)
    form["hideTypes"] = request.form.get("hideTypes", None)
    form["condensed"] = request.form.get("condensed", "")
    form["baseTypes"] = tuple(request.form.getlist("baseTypes"))
    form["hiddenTypes"] = tuple(request.form.getlist("hiddenTypes"))
    form["edgeFeatures"] = tuple(request.form.getlist("edgeFeatures"))
    form["condenseType"] = request.form.get("condenseType", "")
    form["textFormat"] = request.form.get("textFormat", "")
    form["sectionsExpandAll"] = request.form.get("sectionsExpandAll", "")
    form["tuplesExpandAll"] = request.form.get("tuplesExpandAll", "")
    form["queryExpandAll"] = request.form.get("queryExpandAll", "")
    form["passageOpened"] = request.form.get("passageOpened", "")
    form["sectionsOpened"] = request.form.get("sectionsOpened", "")
    form["tuplesOpened"] = request.form.get("tuplesOpened", "")
    form["queryOpened"] = request.form.get("queryOpened", "")
    form["mode"] = request.form.get("mode", "") or "passage"
    form["position"] = getInt(request.form.get("position", ""), default=1)
    form["batch"] = getInt(request.form.get("batch", ""), default=BATCH)
    form["sec0"] = request.form.get("sec0", "")
    form["sec1"] = request.form.get("sec1", "")
    form["sec2"] = request.form.get("sec2", "")
    form["s0filter"] = request.form.get("s0filter", "")

    for k in ["colormapn", "ecolormapn"]:
        form[k] = request.form.get(k, "")
    colorMapN = getInt(form["colormapn"], default=0)
    eColorMapN = getInt(form["ecolormapn"], default=0)

    colorMap = {}

    for i in range(1, colorMapN + 1):
        colorKey = f"colormap_{i}"
        form[colorKey] = request.form.get(colorKey, "")
        color = form[colorKey]
        colorMap[i] = color

    form["colorMap"] = colorMap

    edgeHighlights = {}

    for i in range(1, eColorMapN + 1):
        for k in [f"ecolormap_{i}", f"edge_name_{i}", f"edge_from_{i}", f"edge_to_{i}"]:
            form[k] = request.form.get(k, "")
        color = form[f"ecolormap_{i}"]
        name = form[f"edge_name_{i}"]
        fRep = form[f"edge_from_{i}"]
        tRep = form[f"edge_to_{i}"]
        if name == "" or fRep == "" or tRep == "":
            continue
        f = (
            0
            if fRep == ""
            else None
            if fRep == "any"
            else int(fRep)
            if fRep.isdecimal()
            else 0
        )
        t = (
            0
            if tRep == ""
            else None
            if tRep == "any"
            else int(tRep)
            if tRep.isdecimal()
            else 0
        )
        edgeHighlights.setdefault(name, {})[(f, t)] = color

    for i in range(1, 4):
        for k in [
            f"ecolormap_new_{i}",
            f"edge_name_new_{i}",
            f"edge_from_new_{i}",
            f"edge_to_new_{i}",
        ]:
            form[k] = request.form.get(k, "")
        color = form[f"ecolormap_new_{i}"]
        name = form[f"edge_name_new_{i}"]
        fRep = form[f"edge_from_new_{i}"]
        tRep = form[f"edge_to_new_{i}"]
        if name != "" and fRep != "" and tRep != "":
            f = (
                0
                if fRep == ""
                else None
                if fRep == "any"
                else int(fRep)
                if fRep.isdecimal()
                else 0
            )
            t = (
                0
                if tRep == ""
                else None
                if tRep == "any"
                else int(tRep)
                if tRep.isdecimal()
                else 0
            )
            edgeHighlights.setdefault(name, {})[(f, t)] = color

    form["edgeHighlights"] = edgeHighlights

    for (k, v) in interfaceDefaults.items():
        if v is None:
            continue
        form[k] = request.form.get(k, None)
    return form

Get form data.

The TF browser user interacts with the web app by clicking and typing, as a result of which a HTML form gets filled in. This form as regularly submitted to the web server with a request for a new incarnation of the page: a response.

The values that come with a request, must be peeled out of the form, and stored as logical values.

Most of the data has a known function to the web server, but there is also a list of web app dependent options.

def getInt(x, default=1)
Expand source code Browse git
def getInt(x, default=1):
    if len(x) > 15:
        return default
    if not x.isdecimal():
        return default
    return int(x)
def zipTables(csvs, tupleResultsX, queryResultsX, about, form)
Expand source code Browse git
def zipTables(csvs, tupleResultsX, queryResultsX, about, form):
    appName = form["appName"]
    jobName = form["jobName"]

    zipBuffer = BytesIO()
    with ZipFile(zipBuffer, "w", **ZIP_OPTIONS) as zipFile:

        zipFile.writestr("job.json", writeJson(form).encode("utf8"))
        zipFile.writestr("job.json", writeJson.dumps(
            {k: v for (k, v) in form.items() if k not in {"edgeHighlights", "colorMap"}}
        ).encode("utf8"))
        zipFile.writestr("about.md", about)
        if csvs is not None:
            for (csv, data) in csvs:
                contents = "".join(
                    ("\t".join(str(t) for t in tup) + "\n") for tup in data
                )
                zipFile.writestr(f"{csv}.tsv", contents.encode("utf8"))
            for (name, data) in (
                ("nodesx.tsv", tupleResultsX),
                ("resultsx.tsv", queryResultsX),
            ):
                if data is not None:
                    contents = "\ufeff" + "".join(
                        ("\t".join("" if t is None else str(t) for t in tup) + "\n")
                        for tup in data
                    )
                    zipFile.writestr(name, contents.encode("utf_16_le"))
    return (f"{appName}-{jobName}.zip", zipBuffer.getvalue())