Rich display

The apps of Text-Fabric know more about a corpus than vanilla TF. That knowledge is used by the apps to define pretty and plain displays of textual objects.

A plain display of an object is a simple reference to that object if it is big, or the text of that object if it is small.

A pretty display of an object is a representation of the structure of that object. It contains text and features of sub objects. Provided the object is not too big.

In [1]:
%load_ext autoreload
%autoreload 2

Incantation

The ins and outs of installing Text-Fabric, getting the corpus, and initializing a notebook are explained in the start tutorial.

In [2]:
from tf.app import use
In [3]:
A = use('bhsa', hoist=globals())
	connecting to online GitHub repo annotation/app-bhsa ... connected
Using TF-app in /Users/dirk/text-fabric-data/annotation/app-bhsa/code:
	#d3cf8f0c2ab5d690a0fda14ea31c33da5c5c8483 (latest commit)
	connecting to online GitHub repo etcbc/bhsa ... connected
Using data in /Users/dirk/text-fabric-data/etcbc/bhsa/tf/c:
	rv1.6 (latest release)
	connecting to online GitHub repo etcbc/phono ... connected
Using data in /Users/dirk/text-fabric-data/etcbc/phono/tf/c:
	r1.2 (latest release)
	connecting to online GitHub repo etcbc/parallels ... connected
Using data in /Users/dirk/text-fabric-data/etcbc/parallels/tf/c:
	r1.2 (latest release)

Arbitrary nodes

We pretty-print an arbitrary node.

In [4]:
A.nodeFromSectionStr('Genesis 1:1')
Out[4]:
1414354
In [5]:
phrase = 651574
A.pretty(phrase)

Where is this phrase on SHEBANQ? You can click on the passage reference or on the word phrase in the label of the box.

You can generate this link in code as follows:

In [6]:
A.webLink(phrase)

A link to another passage:

In [7]:
z = A.nodeFromSectionStr('Ezra 3:4')
In [8]:
A.webLink(z)

Plain

We can represent a node in plain representation and highlight specific portions.

In [9]:
firstVerse = F.otype.s('verse')[0]
phrases = F.otype.s('phrase')[3:5]
words = (2, 4, 6, 9)

First we highlight some words:

In [10]:
highlights = set(words)
A.plain(firstVerse, highlights=highlights)
Genesis 1:1בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

Now some phrases:

In [11]:
highlights = set(phrases)
A.plain(firstVerse, highlights=highlights)
Genesis 1:1בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

As you see, when we highlight bigger things than words, we put a highlighted border around the words in those things.

We can do both:

In [12]:
highlights = set(phrases) | set(words)
A.plain(firstVerse, highlights=highlights)
Genesis 1:1בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

We can also highlight the verse itself.

In [13]:
highlights = {firstVerse}
A.plain(firstVerse, highlights=highlights)
Genesis 1:1בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

As you see, only the verse label is highlighted, not the contents. The same policy is followed for chapters and books.

We can use different colors for highlighting. Lets use two colors for words and yet another color for phrases.

In [14]:
highlights = {i: 'lightsalmon' for i in [1, 5, 9]}
highlights.update({i: 'mediumaquamarine' for i in [3, 7]})
highlights.update({i: 'blue' for i in phrases})
highlights.update({firstVerse: '#eeeeee'})
A.plain(firstVerse, highlights=highlights)
Genesis 1:1בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

Verses

Now a couple of verses:

In [15]:
verse1 = A.nodeFromSectionStr('Genesis 1:7')
verse2 = A.nodeFromSectionStr('Genesis 1:17')
In [23]:
A.pretty(verse1)
clause WayX
phrase Conj CP
conj and
phrase Pred VP
verb make qal wayq
phrase Objc PP
prep <object marker>
art the
clause Way0
phrase Conj CP
conj and
phrase Pred VP
verb separate hif wayq
clause Attr NmCl
phrase Rela CP
conj <relative>
phrase PreC PP
prep from
subs under part
phrase PreC PP
prep to
art the
clause Way0|Defc
phrase Cmpl PP|CP
conj and
phrase Cmpl PP
clause Attr NmCl
phrase Rela CP
conj <relative>
phrase PreC PP
clause Way0
phrase Conj CP
conj and
phrase Pred VP
verb be qal wayq
phrase Modi AdvP

The next verse with node numbers.

In [25]:
A.pretty(verse2, withNodes=True)

Now we selectively remove a few features from the display:

Now we add features to the display: lex and g_word :

In [28]:
A.displaySetup(extraFeatures=['lex', 'g_word'])
In [29]:
A.pretty(verse2)
clause WayX
phrase Conj CP
conj and g_word=WA- lex=W
phrase Pred VP
verb give qal wayq g_word=J.IT.;71N lex=NTN[
phrase Objc PP
prep <object marker> g_word=>[email protected] lex=>T
phrase Subj NP
subs god(s) g_word=>:ELOHI73JM lex=>LHJM/
phrase Cmpl PP
prep in g_word=B.I- lex=B
subs firmament g_word=R:QI74J<A lex=RQJ</
art the g_word=HA- lex=H
subs heavens g_word=[email protected]@92JIM lex=CMJM/
clause Adju InfC
phrase Pred VP
prep to g_word=L:- lex=L
verb be light hif infc g_word=[email protected]>I73JR lex=>WR[
phrase Cmpl PP
prep upon g_word=<AL lex=<L
art the g_word=[email protected] lex=H
subs earth g_word=>@75REY lex=>RY/

and we reset the pretty features to the default values:

In [30]:
A.displayReset('extraFeatures')
In [31]:
A.pretty(verse2)
clause WayX
phrase Conj CP
conj and
phrase Pred VP
verb give qal wayq
phrase Objc PP
prep <object marker>
clause Adju InfC
phrase Pred VP
prep to
verb be light hif infc
phrase Cmpl PP

Query results

We run a TF query and show some of its results with a lot of pomp and circumstance. The query is written by Stephen Ku, and he is the one who prompted me to write rich display function for query results.

In [32]:
ellipQuery = '''
sentence
  c1:clause
    phrase function=Pred
      word pdp=verb
  c2:clause
    phrase function=Pred
  c3:clause typ=Ellp
    phrase function=Objc
      word pdp=subs|nmpr|prps|prde|prin
  c1 << c2
  c2 << c3
'''

Instead of running S.search(), we do A.search().

In [33]:
results = A.search(ellipQuery)
len(results)
  1.87s 1472 results
Out[33]:
1472
In [34]:
A.table(results, start=10, end=20)
np sentenceclausephrasewordclausephraseclausephraseword
10 Exodus 18:8וַיְסַפֵּ֤ר מֹשֶׁה֙ לְחֹ֣תְנֹ֔ו אֵת֩ כָּל־אֲשֶׁ֨ר עָשָׂ֤ה יְהוָה֙ לְפַרְעֹ֣ה וּלְמִצְרַ֔יִם עַ֖ל אֹודֹ֣ת יִשְׂרָאֵ֑ל אֵ֤ת כָּל־הַתְּלָאָה֙ אֲשֶׁ֣ר מְצָאָ֣תַם בַּדֶּ֔רֶךְ וַיַּצִּלֵ֖ם יְהוָֽה׃ וַיְסַפֵּ֤ר מֹשֶׁה֙ לְחֹ֣תְנֹ֔ו אֵת֩ כָּל־יְסַפֵּ֤ר יְסַפֵּ֤ר אֲשֶׁ֨ר עָשָׂ֤ה יְהוָה֙ לְפַרְעֹ֣ה וּלְמִצְרַ֔יִם עַ֖ל אֹודֹ֣ת יִשְׂרָאֵ֑ל עָשָׂ֤ה אֵ֤ת כָּל־הַתְּלָאָה֙ אֵ֤ת כָּל־הַתְּלָאָה֙ כָּל־
11 Exodus 18:8וַיְסַפֵּ֤ר מֹשֶׁה֙ לְחֹ֣תְנֹ֔ו אֵת֩ כָּל־אֲשֶׁ֨ר עָשָׂ֤ה יְהוָה֙ לְפַרְעֹ֣ה וּלְמִצְרַ֔יִם עַ֖ל אֹודֹ֣ת יִשְׂרָאֵ֑ל אֵ֤ת כָּל־הַתְּלָאָה֙ אֲשֶׁ֣ר מְצָאָ֣תַם בַּדֶּ֔רֶךְ וַיַּצִּלֵ֖ם יְהוָֽה׃ וַיְסַפֵּ֤ר מֹשֶׁה֙ לְחֹ֣תְנֹ֔ו אֵת֩ כָּל־יְסַפֵּ֤ר יְסַפֵּ֤ר אֲשֶׁ֨ר עָשָׂ֤ה יְהוָה֙ לְפַרְעֹ֣ה וּלְמִצְרַ֔יִם עַ֖ל אֹודֹ֣ת יִשְׂרָאֵ֑ל עָשָׂ֤ה אֵ֤ת כָּל־הַתְּלָאָה֙ אֵ֤ת כָּל־הַתְּלָאָה֙ תְּלָאָה֙
12 Exodus 23:15אֶת־חַ֣ג הַמַּצֹּות֮ תִּשְׁמֹר֒ וְחַ֤ג הַקָּצִיר֙ בִּכּוּרֵ֣י מַעֲשֶׂ֔יךָ אֲשֶׁ֥ר תִּזְרַ֖ע בַּשָּׂדֶ֑ה וְחַ֤ג הָֽאָסִף֙ בְּצֵ֣את הַשָּׁנָ֔ה בְּאָסְפְּךָ֥ אֶֽת־מַעֲשֶׂ֖יךָ מִן־הַשָּׂדֶֽה׃ אֶת־חַ֣ג הַמַּצֹּות֮ תִּשְׁמֹר֒ תִּשְׁמֹר֒ תִּשְׁמֹר֒ אֲשֶׁ֥ר תִּזְרַ֖ע בַּשָּׂדֶ֑ה תִּזְרַ֖ע וְחַ֤ג הָֽאָסִף֙ חַ֤ג הָֽאָסִף֙ חַ֤ג
13 Exodus 23:15אֶת־חַ֣ג הַמַּצֹּות֮ תִּשְׁמֹר֒ וְחַ֤ג הַקָּצִיר֙ בִּכּוּרֵ֣י מַעֲשֶׂ֔יךָ אֲשֶׁ֥ר תִּזְרַ֖ע בַּשָּׂדֶ֑ה וְחַ֤ג הָֽאָסִף֙ בְּצֵ֣את הַשָּׁנָ֔ה בְּאָסְפְּךָ֥ אֶֽת־מַעֲשֶׂ֖יךָ מִן־הַשָּׂדֶֽה׃ אֶת־חַ֣ג הַמַּצֹּות֮ תִּשְׁמֹר֒ תִּשְׁמֹר֒ תִּשְׁמֹר֒ אֲשֶׁ֥ר תִּזְרַ֖ע בַּשָּׂדֶ֑ה תִּזְרַ֖ע וְחַ֤ג הָֽאָסִף֙ חַ֤ג הָֽאָסִף֙ אָסִף֙
14 Exodus 25:12וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו וּשְׁתֵּ֣י טַבָּעֹ֗ת עַל־צַלְעֹו֙ הָֽאֶחָ֔ת וּשְׁתֵּי֙ טַבָּעֹ֔ת עַל־צַלְעֹ֖ו הַשֵּׁנִֽית׃ וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב יָצַ֣קְתָּ יָצַ֣קְתָּ וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו נָ֣תַתָּ֔ה וּשְׁתֵּ֣י טַבָּעֹ֗ת עַל־צַלְעֹו֙ הָֽאֶחָ֔ת שְׁתֵּ֣י טַבָּעֹ֗ת שְׁתֵּ֣י
15 Exodus 25:12וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו וּשְׁתֵּ֣י טַבָּעֹ֗ת עַל־צַלְעֹו֙ הָֽאֶחָ֔ת וּשְׁתֵּי֙ טַבָּעֹ֔ת עַל־צַלְעֹ֖ו הַשֵּׁנִֽית׃ וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב יָצַ֣קְתָּ יָצַ֣קְתָּ וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו נָ֣תַתָּ֔ה וּשְׁתֵּ֣י טַבָּעֹ֗ת עַל־צַלְעֹו֙ הָֽאֶחָ֔ת שְׁתֵּ֣י טַבָּעֹ֗ת טַבָּעֹ֗ת
16 Exodus 25:12וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו וּשְׁתֵּ֣י טַבָּעֹ֗ת עַל־צַלְעֹו֙ הָֽאֶחָ֔ת וּשְׁתֵּי֙ טַבָּעֹ֔ת עַל־צַלְעֹ֖ו הַשֵּׁנִֽית׃ וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב יָצַ֣קְתָּ יָצַ֣קְתָּ וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו נָ֣תַתָּ֔ה וּשְׁתֵּי֙ טַבָּעֹ֔ת עַל־צַלְעֹ֖ו הַשֵּׁנִֽית׃ שְׁתֵּי֙ טַבָּעֹ֔ת שְׁתֵּי֙
17 Exodus 25:12וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו וּשְׁתֵּ֣י טַבָּעֹ֗ת עַל־צַלְעֹו֙ הָֽאֶחָ֔ת וּשְׁתֵּי֙ טַבָּעֹ֔ת עַל־צַלְעֹ֖ו הַשֵּׁנִֽית׃ וְיָצַ֣קְתָּ לֹּ֗ו אַרְבַּע֙ טַבְּעֹ֣ת זָהָ֔ב יָצַ֣קְתָּ יָצַ֣קְתָּ וְנָ֣תַתָּ֔ה עַ֖ל אַרְבַּ֣ע פַּעֲמֹתָ֑יו נָ֣תַתָּ֔ה וּשְׁתֵּי֙ טַבָּעֹ֔ת עַל־צַלְעֹ֖ו הַשֵּׁנִֽית׃ שְׁתֵּי֙ טַבָּעֹ֔ת טַבָּעֹ֔ת
18 Exodus 31:6וְעָשׂ֕וּ אֵ֖ת כָּל־אֲשֶׁ֥ר צִוִּיתִֽךָ׃ אֵ֣ת׀ אֹ֣הֶל מֹועֵ֗ד וְאֶת־הָֽאָרֹן֙ לָֽעֵדֻ֔ת וְאֶת־הַכַּפֹּ֖רֶת אֲשֶׁ֣ר עָלָ֑יו וְאֵ֖ת כָּל־כְּלֵ֥י הָאֹֽהֶל׃ וְאֶת־הַשֻּׁלְחָן֙ וְאֶת־כֵּלָ֔יו וְאֶת־הַמְּנֹרָ֥ה הַטְּהֹרָ֖ה וְאֶת־כָּל־כֵּלֶ֑יהָ וְאֵ֖ת מִזְבַּ֥ח הַקְּטֹֽרֶת׃ וְאֶת־מִזְבַּ֥ח הָעֹלָ֖ה וְאֶת־כָּל־כֵּלָ֑יו וְאֶת־הַכִּיֹּ֖ור וְאֶת־כַּנֹּֽו׃ וְאֵ֖ת בִּגְדֵ֣י הַשְּׂרָ֑ד וְאֶת־בִּגְדֵ֤י הַקֹּ֨דֶשׁ֙ לְאַהֲרֹ֣ן הַכֹּהֵ֔ן וְאֶת־בִּגְדֵ֥י בָנָ֖יו לְכַהֵֽן׃ וְאֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים לַקֹּ֑דֶשׁ וְעָשׂ֕וּ אֵ֖ת כָּל־עָשׂ֕וּ עָשׂ֕וּ לְכַהֵֽן׃ לְכַהֵֽן׃ וְאֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים לַקֹּ֑דֶשׁ אֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים שֶׁ֧מֶן
19 Exodus 31:6וְעָשׂ֕וּ אֵ֖ת כָּל־אֲשֶׁ֥ר צִוִּיתִֽךָ׃ אֵ֣ת׀ אֹ֣הֶל מֹועֵ֗ד וְאֶת־הָֽאָרֹן֙ לָֽעֵדֻ֔ת וְאֶת־הַכַּפֹּ֖רֶת אֲשֶׁ֣ר עָלָ֑יו וְאֵ֖ת כָּל־כְּלֵ֥י הָאֹֽהֶל׃ וְאֶת־הַשֻּׁלְחָן֙ וְאֶת־כֵּלָ֔יו וְאֶת־הַמְּנֹרָ֥ה הַטְּהֹרָ֖ה וְאֶת־כָּל־כֵּלֶ֑יהָ וְאֵ֖ת מִזְבַּ֥ח הַקְּטֹֽרֶת׃ וְאֶת־מִזְבַּ֥ח הָעֹלָ֖ה וְאֶת־כָּל־כֵּלָ֑יו וְאֶת־הַכִּיֹּ֖ור וְאֶת־כַּנֹּֽו׃ וְאֵ֖ת בִּגְדֵ֣י הַשְּׂרָ֑ד וְאֶת־בִּגְדֵ֤י הַקֹּ֨דֶשׁ֙ לְאַהֲרֹ֣ן הַכֹּהֵ֔ן וְאֶת־בִּגְדֵ֥י בָנָ֖יו לְכַהֵֽן׃ וְאֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים לַקֹּ֑דֶשׁ וְעָשׂ֕וּ אֵ֖ת כָּל־עָשׂ֕וּ עָשׂ֕וּ לְכַהֵֽן׃ לְכַהֵֽן׃ וְאֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים לַקֹּ֑דֶשׁ אֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים מִּשְׁחָ֛ה
20 Exodus 31:6וְעָשׂ֕וּ אֵ֖ת כָּל־אֲשֶׁ֥ר צִוִּיתִֽךָ׃ אֵ֣ת׀ אֹ֣הֶל מֹועֵ֗ד וְאֶת־הָֽאָרֹן֙ לָֽעֵדֻ֔ת וְאֶת־הַכַּפֹּ֖רֶת אֲשֶׁ֣ר עָלָ֑יו וְאֵ֖ת כָּל־כְּלֵ֥י הָאֹֽהֶל׃ וְאֶת־הַשֻּׁלְחָן֙ וְאֶת־כֵּלָ֔יו וְאֶת־הַמְּנֹרָ֥ה הַטְּהֹרָ֖ה וְאֶת־כָּל־כֵּלֶ֑יהָ וְאֵ֖ת מִזְבַּ֥ח הַקְּטֹֽרֶת׃ וְאֶת־מִזְבַּ֥ח הָעֹלָ֖ה וְאֶת־כָּל־כֵּלָ֑יו וְאֶת־הַכִּיֹּ֖ור וְאֶת־כַּנֹּֽו׃ וְאֵ֖ת בִּגְדֵ֣י הַשְּׂרָ֑ד וְאֶת־בִּגְדֵ֤י הַקֹּ֨דֶשׁ֙ לְאַהֲרֹ֣ן הַכֹּהֵ֔ן וְאֶת־בִּגְדֵ֥י בָנָ֖יו לְכַהֵֽן׃ וְאֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים לַקֹּ֑דֶשׁ וְעָשׂ֕וּ אֵ֖ת כָּל־עָשׂ֕וּ עָשׂ֕וּ לְכַהֵֽן׃ לְכַהֵֽן׃ וְאֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים לַקֹּ֑דֶשׁ אֵ֨ת שֶׁ֧מֶן הַמִּשְׁחָ֛ה וְאֶת־קְטֹ֥רֶת הַסַּמִּ֖ים קְטֹ֥רֶת

Here it comes: the A.show() function asks you for some limits (it will not show more than 100 at a time), and then it displays them.

It lists the results as follows:

  • a heading showing which result in the sequence of all results this is
  • an overview of the nodes in the tuple of this result
  • a display of all verses that have result material, with the places highlighted that correspond to a node in the result tuple
In [35]:
A.show(results, start=10, end=14, withNodes=True)

result 10

result 11

result 12

result 13

result 14

We can also package the results tuples in other things than verses, e.g. sentences:

In [36]:
A.show(results, start=10, end=14, withNodes=True, condenseType='sentence')

result 10

result 11

result 12

result 13

result 14

And if we want to make life harder for ourselves, we can leave the passage indicators out as well.

In [37]:
A.show(results, start=10, end=14, withNodes=True, condenseType='sentence', withPassage=False)

result 10

result 11

result 12

result 13

result 14

Next steps

  • display become an expert in creating pretty displays of your text structures
  • search turbo charge your hand-coding with search templates
  • exportExcel make tailor-made spreadsheets out of your results
  • share draw in other people's data and let them use yours
  • export export your dataset as an Emdros database

Back to start