initial commit

This commit is contained in:
Oleg Belyaev 2025-03-21 14:14:03 +03:00
parent cee3efab31
commit 71219733bd
31 changed files with 9242 additions and 0 deletions

16
WEB-INF/jetty.xml Normal file
View file

@ -0,0 +1,16 @@
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- Default connector. The Jetty stop port can be specified
in the .basex or pom.xml configuration file. -->
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.ServerConnector">
<Arg name="server"><Ref refid="Server"/></Arg>
<Set name="host">0.0.0.0</Set>
<Set name="port">8080</Set>
<Set name="idleTimeout">60000</Set>
<Set name="reuseAddress">true</Set>
</New>
</Arg>
</Call>
</Configure>

69
WEB-INF/web.xml Normal file
View file

@ -0,0 +1,69 @@
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0">
<display-name>BaseX: The XML Database and XQuery Processor</display-name>
<description>HTTP Services</description>
<!-- Global session and servlet listener -->
<listener>
<listener-class>org.basex.http.SessionListener</listener-class>
<listener-class>org.basex.http.ServletListener</listener-class>
</listener>
<!-- RESTXQ Service (can be disabled by removing this entry) -->
<servlet>
<servlet-name>RESTXQ</servlet-name>
<servlet-class>org.basex.http.restxq.RestXqServlet</servlet-class>
<init-param>
<param-name>org.basex.user</param-name>
<param-value>admin</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RESTXQ</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- WebSocket Service (can be disabled by removing this entry) -->
<servlet>
<servlet-name>WebSocket</servlet-name>
<servlet-class>org.basex.http.ws.WsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebSocket</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<!-- REST Service (can be disabled by removing this entry) -->
<servlet>
<servlet-name>REST</servlet-name>
<servlet-class>org.basex.http.rest.RESTServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>REST</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- WebDAV Service (can be disabled by removing this entry) -->
<servlet>
<servlet-name>WebDAV</servlet-name>
<servlet-class>org.basex.http.webdav.WebDAVServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebDAV</servlet-name>
<url-pattern>/webdav/*</url-pattern>
</servlet-mapping>
<!-- Mapping for static resources (may be restricted to a sub path) -->
<servlet>
<servlet-name>default</servlet-name>
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
</web-app>

383
csv/langnames.csv Normal file
View file

@ -0,0 +1,383 @@
code,glottolog,ru,en,en_abbr,family,genus,comment,lat,long,
ab,abkh1244,абх.,Abkhaz,Abkh.,NW Caucasian,NW Caucasian,,43.056218,41.159115,
abq,abaz1241,абаз.,Abaza,Abaza,NW Caucasian,NW Caucasian,,44.25,42.0,
abq-x-dial,abaz1241,абаз. (диал.),Abaza (dialectal),Abaza (dial.),NW Caucasian,NW Caucasian,,44.25,42.0,
ady,adyg1241,адыг.,Adyghe,Adyghe,NW Caucasian,NW Caucasian,,44.0,39.33,
ady-x-abadz,abad1240,абадз.,Abzakh Adyghe,Abzakh,NW Caucasian,NW Caucasian,coordinates of Khakurinokhabl,45.02,40.23,
ady-x-shpsg,shap1240,шапс.,Shapsug Adyghe,Shaps.,NW Caucasian,NW Caucasian,coordinates of Lazarevskoe,43.911111,39.338056,
ae,aves1237,ав.,Avestan,Av.,Indo-European,Iranian,,34.217,62.112,
ae-x-gth,aves1237,ав. (гаты),Gathic Avestan,GAv.,Indo-European,Iranian,,34.217,62.112,
aer,aran1263,аранта,Arrernte,Arrernte,Pama-Nyungan,Central Pama-Nyungan,coordinates of E. Arrernte,-23.36,135.05,
agx,aghu1253,агул.,Aghul,Agh.,NE Caucasian,Lezgic,,41.9242,47.5843,
aii,assy1241,ассир.,Assyrian,Assyr.,Afro-Asiatic,Semitic,,36.75,43.0,
ain,ainu1252,айну,Ainu,Ainu,Ainu,Ainu,I assume this is Japanese Ainu; coordinates of Hokkaido Ainu,43.63,142.46,
akk,akka1240,аккад.,Akkadian,Akk.,Afro-Asiatic,Semitic,,33.1,44.1,
akv,akhv1239,ахвах.,Akhvakh,Akhv.,NE Caucasian,Avar-Andic-Tsezic,,42.4003,46.3037,
alt,sout2694,алт.,Altai,Alt.,Altaic,Turkic,,50.1347,86.8705,
alt-x-teleut,tele1257,телеут.,Teleut Altai,Teleut,Altaic,Turkic,coordinates of Chelukhoevo,54.3672,86.2156,
ang,olde1238,англос.,Old English,OEng.,Indo-European,Germanic,,51.06,-1.31,
ani,andi1255,анд.,Andi,Andi,NE Caucasian,Avar-Andic-Tsezic,,42.8078,46.2919,
aqc,arch1244,арчин.,Archi,Archi,NE Caucasian,Lezgic,,42.3239,46.8267,
ar,stan1318,араб.,Arabic,Ar.,Afro-Asiatic,Semitic,,27.9625,43.8525,
arc,impe1235,арам.,Aramaic,Aram.,Afro-Asiatic,Semitic,,33.905,42.185,
av,avar1256,авар.,Avar,Avar,NE Caucasian,Avar-Andic-Tsezic,,41.7047,46.558,
az,mode1262,азерб.,Azerbaijani,Az.,Altaic,Turkic,coordinates of North Azerbaijani,40.98,46.47,
ba,bash1264,башк.,Bashkir,Bashk.,Altaic,Turkic,,53.59671,56.55937,
bat,east2280,балт.,Baltic,Balt.,Indo-European,Baltic,coordinates of Lithuanian,55.14,23.96,
bbl,bats1242,туш.,Bats,Bats,NE Caucasian,Nakh,,42.1806,45.344,
bdk,budu1248,будух.,Budugh,Bud.,NE Caucasian,Lezgic,,41.2272,48.3353,
be,bela1254,белорусс.,Belarusian,Bel.,Indo-European,Slavic,,53.2307,25.6038,
bg,bulg1262,болг.,Bulgarian,Bulg.,Indo-European,Slavic,,43.3646,25.047,
bgn,west2368,бел. (зап.),Western Balochi,WBal.,Indo-European,Iranian,,37.83,62.17,
bgp,east2304,бел. (вост.),Eastern Balochi,EBal.,Indo-European,Iranian,,28.0,62.0,
bn,beng1280,бенгали,Bengali,Beng.,Indo-European,Indic,,24.00,90.00,
bo,tibe1272,тибет.,Tibetan,Tib.,Sino-Tibetan,Bodic,,28.3681,90.1872,
bph,botl1242,ботл.,Botlikh,Botl.,NE Caucasian,Avar-Andic-Tsezic,,42.665,46.22,
bqi,bakh1245,перс. (бахтиар.),Persian (Bakhtiari),Pers. (Bakht.),Indo-European,Iranian,,32.02,49.77,
br,bret1244,брет.,Breton,Bret.,Indo-European,Celtic,,48.2452,-3.78934,
brh,brah1256,брахуи,Brahui,Brah.,Dravidian,Dravidian,,29.04,66.56,
bsg,bash1263,башкарди,Bashkardi,Bashkardi,Indo-European,Iranian,,32.00,53.00,
bsk,buru1296,верш.,Burushaski,Burush.,Burushaski,Burushaski,,36.2161,74.8236,
bua,buri1258,монг. бурят.,Buryat,Buryat,Altaic,Mongolic,coordinates of Russia Buriat,50.85,105.56,
cau,0,кавк.,Caucasian,Cauc.,0,0,coordinates of the Caucasus (wiki),42.261111,44.121111,
ccs,kart1248,картв.,South Caucasian,SCauc.,Kartvelian,Kartvelian,coordinates of Georgian,41.85,43.79,
ce,chec1245,чеч.,Chechen,Chech.,NE Caucasian,Nakh,,43.5,45.5,
ce-x-goyt,chec1245,чеч. (гойт.),Chechen (Ghoyta),Chech. (Ghoyta),NE Caucasian,Nakh,,43.164167,45.622222,
ce-x-achkh,chec1245,чеч. (ачхой-март.),Chechen (Achkhoy-Martan),Chech. (Achkhoy-Martan),NE Caucasian,Nakh,,43.189167,45.284722,
cel,celt1248,кельт.,Celtic,Celt.,Indo-European,Celtic,coordinates of Breton,48.25,-3.79,
chg,chag1247,чагат.,Chagatai,Chag.,Altaic,Turkic,,38.21146,57.88758,
chm,mari1278,мар.,Mari,Mari,Uralic,Mari,coordinates of Mari El,56.52,46.252,
cji,cham1309,чамал.,Chamalal,Cham.,NE Caucasian,Avar-Andic-Tsezic,,42.5024,45.995,
cjs,shor1247,шор.,Shor,Shor,Altaic,Turkic,,52.32607,88.4344,
ckb,cent1972,сорани,Sorani,Sor.,Indo-European,Iranian,,35.6539,45.8077,
ckb-x-kndln,cent1972,кандулан,Sorani (Kandulan),Kandulan,Indo-European,Iranian,I assume this is Sorani; add coordinates?,35.6539,45.8077,
cmg,halh1238,монг. письм.,Classical Mongolian,Cl. Mong.,Altaic,Mongolic,,48.32397,106.28874,
crh,crim1257,татар. (крым.),Crimean Tatar,Crim. Tat.,Altaic,Turkic,,45.0,34.08,
cs,czec1258,чеш.,Czech,Cz.,Indo-European,Slavic,,49.873398,15.10437,
cu,chur1257,ст.слав.,Old Church Slavonic,OCS,Indo-European,Slavic,,43.7171,22.8442,
cu-x-bg,chur1257,др.болг.,Old Bulgarian,OBulg.,Indo-European,Slavic,add coordinates,43.7171,22.8442,
cv,chuv1255,чув.,Chuvash,Chuv.,Altaic,Turkic,,55.48701,47.16298,
cy,wels1247,валл.,Welsh,Welsh,Indo-European,Celtic,,52.0,-4.0,
cy-x-cymr,wels1247,кимр.,Cymric,Cymr.,Indo-European,Celtic,might be Old Welsh?,52.0,-4.0,
da,dani1285,дат.,Danish,Dan.,Indo-European,Germanic,,54.8655,9.36284,
da-x-old,oldd1239,стародат.,Old Danish,ODan.,Indo-European,Germanic,,54.8655,9.36284,
dar,darg1242,дарг.,Dargwa,Darg.,NE Caucasian,Dargwic,coordinates of Aqusha,42.2665,47.3439,
dar-x-aqusha,akus1238,акуш.,Aqusha Dargwa,Aq.,NE Caucasian,Dargwic,,42.2665,47.3439,
dar-x-kaitag,kajt1238,кайт.,Kaitag Dargwa,Kait.,NE Caucasian,Dargwic,,42.052428,47.776611,
ddo,dido1241,дид.,Tsez,Tsez,NE Caucasian,Avar-Andic-Tsezic,,42.2646,45.8096,
de,stan1295,нем.,German,Ger.,Indo-European,Germanic,,48.649,12.4676,
de-x-dial,mode1258,нем. (диал.),German (dialectal),Ger. (dial.),Indo-European,Germanic,for Glottolog I assume it is High German because the dialects belong to distinct branches,48.649,12.4676,
de-x-south,mode1258,южнонем.,Southern German,SGer.,Indo-European,Germanic,coordinates of Bavarian,47.92,13.25,
dsb,lowe1385,нижне-луж.,Lower Sorbian,LSorb.,Indo-European,Slavic,,51.6621,13.9407,
ecr,eteo1236,крит.,Cretan,Cret.,Eteocretan,Eteocretan,I assume it is Eteocretan,35.21,24.91,
egy,egyp1246,древнеегипетский,Ancient Egyptian,Eg.,Afro-Asiatic,Egyptian-Coptic,,28.381735,30.834959,
el,mode1248,н.гр.,Modern Greek,Mod. Gr.,Indo-European,Greek,,38.36,23.13,
elx,elam1244,элам.,Elamite,El.,Elamite,Elamite,,31.1833,48.2333,
en,stan1293,англ.,English,Eng.,Indo-European,Germanic,,53.0,-1.0,
en-x-argt,stan1293,англ. (арго),English (slang),Eng. (sl.),Indo-European,Germanic,,53.0,-1.0,
es,stan1288,исп.,Spanish,Sp.,Indo-European,Romance,,40.4414,-1.11788,
et,esto1258,эст.,Estonian,Est.,Uralic,Finnic,,58.55,25.82,
ett,etru1241,этр.,Etruscan,Etr.,Etruscan,Etruscan,,41.90,12.48,
eu,basq1248,баск.,Basque,Bsq.,Basque,Basque,,43.2787,-1.31622,
evn,even1259,эвенк.,Evenki,Evenki,Altaic,Tungusic,,61.972,94.689,
fa,fars1255,перс.,Persian,Pers.,Indo-European,Iranian,coordinates of Western Farsi,32.90,53.30,
fa-x-dial,fars1255,перс. (диал.),Persian (dialectal),Pers. (dial.),Indo-European,Iranian,coordinates of Western Farsi,32.90,53.30,
fa-x-fars,fars1256,перс. (диалект Фарси),Persian (Fars),Pers. (Fars),Indo-European,Iranian,,29.62,52.53,
fa-x-kshn,fars1255,перс. (кашан.),Persian (Kashan),Pers. (Kashan),Indo-European,Iranian,I assume this is the local dialect of Persian rather than the NW Iranian language of Kashan,33.99,51.48,
fa-x-krmns,kerm1248,перс. (кирманшах.),Persian (Kermanshah),Pers. (Kerm.),Indo-European,Iranian,,34.314167,47.065,
fi,finn1318,фин.,Finnish,Fin.,Uralic,Finnic,,64.7628,25.5577,
fi-x-dial,finn1318,фин. (диал.),Finnish (dialectal),Fin. (dial.),Uralic,Finnic,,64.7628,25.5577,
fr,stan1290,фр.,French,Fr.,Indo-European,Romance,,48.0,2.0,
fro,oldf1239,ст.фр.,Old French,OFr.,Indo-European,Romance,,48.8,1.11,
frp,fran1260,фр. (прованс.),Franco-Provençal,Fr.-Prov.,Indo-European,Romance,,45.8051,6.48152,
frs,sate1242,фриз. (вост.),East Frisian,EFris.,Indo-European,Germanic,,53.117,7.721,
fy,fris1239,фриз.,Frisian,Fris.,Indo-European,Germanic,"chose West as the largest branch, but not certain",53.14,5.86,
ga,iris1253,ирл.,Irish,Irish,Indo-European,Celtic,,53.2186,-7.61509,
gbz,gabr1257,габри,Zoroastrian Dari,Zor. Dari,Indo-European,Iranian,,31.82,54.45,
gbz-x-yzd,zoro1242,язди,Yazdi,Yazdi,Indo-European,Iranian,,31.8161,54.4469,
gdo,ghod1238,годобер.,Godoberi,Godob.,NE Caucasian,Avar-Andic-Tsezic,,42.7428,46.2252,
gem,germ1287,герм.,Germanic,Germ.,Indo-European,Germanic,coordinates of Ostfränkisch: roughly at the middle of the are of Modern Germanic,50.01,8.62,
gem-x-old,germ1287,др.герм.,Old Germanic,OGerm.,Indo-European,Germanic,,-99,-99,
glk,gila1241,гилян.,Gilaki,GIl.,Indo-European,Iranian,,37.1344,49.8359,
gmh,midd1343,ср.в.нем.,Middle High German,MHG,Indo-European,Germanic,,48.254,10.599,
gml,midd1318,ср.н.нем.,Middle Low German,MLG,Indo-European,Germanic,,53.14,9.67,
gmq,nort3160,сканд.,Scandinavian,NGerm.,Indo-European,Germanic,rarely used,63.42,10.38, coordinates of Old Norse
goh,oldh1241,др.в.нем.,Old High German,OHG,Indo-European,Germanic,,52.0,10.0,
got,goth1244,гот.,Gothic,Goth.,Indo-European,Germanic,,46.9304,29.9786,
got-x-crm,crim1255,гот. (крым.),Crimean Gothic,Crim. Goth.,Indo-European,Germanic,,45.3,34.4,
grc,anci1242,гр.,Greek,Gr.,Indo-European,Greek,,39.8155,21.9129,
grc-x-byz,midd1362,гр. (визант.),Byzantine Greek,Byz. Gr.,Indo-European,Greek,coordinates of Istanbul,41.013611,28.955,
grc-x-doric,dori1248,гр. дор.,Doric Greek,Dor. Gr.,Indo-European,Greek,coordinates of Greek Epirus,39.6,20.8,
grc-x-hom,anci1242,гр. (Гомер),Homeric Greek,Hom. Gr.,Indo-European,Greek,coordinates of Ephesus,37.95,27.366667,
ha,haus1257,хауса,Hausa,Hausa,Afro-Asiatic,West Chadic,,11.15,8.78,
hac,gura1251,гуран.,Gorani,Gor.,Indo-European,Iranian,,36.8377,44.4956,
hbo,anci1244,др.евр.,Hebrew,Heb.,Afro-Asiatic,Semitic,,31.7761,35.1725,
hi,hind1269,хинди,Hindi,Hindi,Indo-European,Indic,,25.0,77.0,
hit,hitt1242,хетт.,Hittite,Hitt.,Indo-European,Anatolian,,40.0,35.0,
hr,croa1245,хорв.,Croatian,Croat.,Indo-European,Slavic,,45.555,15.982,
hsb,uppe1395,верхнелуж.,Upper Sorbian,USorb.,Indo-European,Slavic,,51.24,14.41,
hu,hung1274,венг.,Hungarian,Hung.,Uralic,Ugric,,46.9068585714,19.6555271429,
huz,hunz1247,гунзиб.,Hunzib,Hunz.,NE Caucasian,Avar-Andic-Tsezic,,42.0808,46.1369,
iir,indo1320,ар.,Aryan,Ar.,Indo-European,0,,-99,-99,
inc,indo1321,инд.,Indo-Aryan,IA,Indo-European,Indic,coordinates of country India,21,78,
inc-x-mid,midd1375,ср.инд.,Middle Indic,MInd.,Indo-European,Indic,coordinates of country India,21,78,
inc-x-nnew,indo1324,северные новоиндийские диалекты,North New Indic dialects,North New Indic dialects,Indo-European,Indic,coordinates of Delhi,28.61,77.23,
inc-x-old,sans1269,др.инд.,Old Indic,OInd.,Indo-European,Indic,,20.0,77.0,
ine,indo1319,и.е.,Indo-European,IE,Indo-European,0,,-99,-99,
inh,ingu1240,инг.,Ingush,Ing.,NE Caucasian,Nakh,,43.11,45.03,
ira,iran1269,иран.,Iranian,Ir.,Indo-European,Iranian,,-99,-99,
ira-x-mid,iran1269,ср.иран.,Middle Iranian,MIr.,Indo-European,Iranian,,-99,-99,
is,icel1247,исл.,Icelandic,Icel.,Indo-European,Germanic,,63.4837,-19.0212,
isk,ishk1246,пам. ишк.,Ishkashimi,Ishk.,Indo-European,Iranian,,36.67,71.55,
it,ital1282,ит.,Italian,It.,Indo-European,Romance,,43.0464,12.6489,
ja,nucl1643,япон.,Japanese,Jap.,Japanese,Japanese,,35.0,135.0,
ka,nucl1302,груз.,Georgian,Georg.,Kartvelian,Kartvelian,,41.850397,43.78613,
ka-x-clq,nucl1302,груз. (разг.),Georgian (colloquial),Georg. (col.),Kartvelian,Kartvelian,,41.850397,43.78613,
ka-x-dial,nucl1302,груз. (диал.),Georgian (dialectal),Georg. (dial.),Kartvelian,Kartvelian,,41.850397,43.78613,
ka-x-guria,guri1246,груз. (гур.),Gurian Georgian,Georg. (Gur.),Kartvelian,Kartvelian,,41.966667,42.2,
ka-x-imer,imer1248,груз. (имер.),Imeretian Georgian,Georg. (Imer.),Kartvelian,Kartvelian,,42.166667,42.983333,
ka-x-ingiloy,ingi1240,груз. (ингил.),Ingiloy Georgian,Georg. (Ing.),Kartvelian,Kartvelian,coordinates of Zaqatala,41.633611,46.643333,
ka-x-khevsur,xevs1238,груз. (хевсур.),Khevsur Georgian,Georg. (Khev.),Kartvelian,Kartvelian,,42.4883,44.87915,
ka-x-lchkhm,rach1238,груз. (лечхум.),Lechkhumi Georgian,Georg. (Lech.),Kartvelian,Kartvelian,,42.649722,42.759722,
ka-x-mokhev,moxe1238,груз. (мохев.),Mokhevian Georgian,Georg. (Mokh.),Kartvelian,Kartvelian,coordinates of Khevi,42.6975,44.519,
ka-x-mtiul,mtiu1238,груз. (мтиул.),Mtiuletian Georgian,Georg. (Mtiul.),Kartvelian,Kartvelian,coordinates of Pasanauri,42.346389,44.692778,
ka-x-pshav,psha1238,груз. (пшав.),Pshavian Georgian,Georg. (Pshav.),Kartvelian,Kartvelian,,42.283333,44.75,
ka-x-rachian,rach1238,груз. (рачин.),Rachian Georgian,Georg. (Rach.),Kartvelian,Kartvelian,,42.636111,43.436111,
kaa,kara1467,каракалп.,Kara-Kalpak,Kara-Kalp.,Altaic,Turkic,,39.98005,63.32233,
xas,kama1351,камас.,Kamas,Kamas,Uralic,Samoyedic,,55.07,94.83,
kap,bezh1248,капуч.,Bezhta,Bezhta,NE Caucasian,Avar-Andic-Tsezic,,42.1206,46.0332,
kbd,kaba1278,каб.,Kabardian,Kab.,NW Caucasian,NW Caucasian,,43.5082,43.3918,
kbd-x-crc,kaba1278,черк.,Circassian,Circ.,NW Caucasian,NW Caucasian,add coordinates to distinguish Kabardian and Circassian?,43.5082,43.3918,
kbd-x-crc-dial,kaba1278,черк. (диал.),Circassian (dialectal),Circ. (dial.),NW Caucasian,NW Caucasian,,43.5082,43.3918,
kbd-x-crc-west,kaba1278,черк. (зап.),Circassian (western),Circ. (W.),NW Caucasian,NW Caucasian,probably distinct from West Circassian (= Adyghe),43.5082,43.3918,
kbd-x-dial,kaba1278,каб. (диал.),Kabardian (dialectal),Kab. (dial.),NW Caucasian,NW Caucasian,,43.5082,43.3918,
kca,khan1279,ханты,Khanty,Khanty,Uralic,Ugric,coordinates of Kazym Khanty,62.43,66.12,
kdr,kara1464,караим.,Karaim,Kar.,Altaic,Turkic,,54.5534,25.1054,
kho,khot1251,сак.,Saka,Saka,Indo-European,Iranian,,38.33,79.04,
khv,xvar1237,хварш.,Khwarshi,Khwarshi,NE Caucasian,Avar-Andic-Tsezic,,42.27,46.00,
khw,khow1242,ховар.,Khowar,Khow.,Indo-European,Indic,,36.0,72.0,
khw-x-chtr,sout2670,читр.,Khowar (Chitral),Khow. (Chitral),Indo-European,Indic,"I assume this is Khowar, the language spoken in Chitral in Pakistan. For Glottolog I assume its southern Khowar, but this is preliminary",35.846111,71.785833,
kjh,khak1248,хакас.,Khakas,Khak.,Altaic,Turkic,coordinates of Askiz (the Glottolog coordinates may be a mistake),53.1283,90.538,
kjh-sghy,saga1260,хакас. (сагайск.),Saghay Khakas,Khak. (Saghay),Altaic,Turkic,,53.1283,90.538,
kjj,khin1240,хиналуг.,Khinalugh,Khin.,NE Caucasian,Khinalug,,41.1801,48.0571,
kk,kaza1248,каз.,Kazakh,Kaz.,Altaic,Turkic,,51.17,71.45,
kk-x-krgnd,kaza1248,караг.,Qaraghandy Kazakh,Qaragh.,Altaic,Turkic,coordinates of Karaganda,49.7931,73.1168,
ko,kore1280,кор.,Korean,Kor.,Korean,Korean,,37.54,126.98,
kpt,kara1516,карат.,Karata,Karata,NE Caucasian,Avar-Andic-Tsezic,,42.65,46.32,
krc-x-balkar,balk1253,балк.,Balkar,Balk.,Altaic,Turkic,coordinates of Tyrnyauz,43.3815,42.9188,
krc-x-karachay,kara1466,карач.,Karachay,Karach.,Altaic,Turkic,coordinates of Karachaevsk,43.762,41.9664,
krl,kare1335,карел.,Karelian,Karel.,Uralic,Finnic,,65.1691,30.8655,
kry,kryt1240,крыз.,Kryz,Kryz,NE Caucasian,Lezgic,,41.1811,48.1846,
kry-x-jek,dzhe1238,джекск.,Jek Kryz,Jek,NE Caucasian,Lezgic,,41.195,48.2417,
ku,kurd1259,курд.,Kurdish,Kurd.,Indo-European,Iranian,coordinates of Kurmanji,37.00,43.00,
kum,kumy1244,кум.,Kumyk,Kum.,Altaic,Turkic,,43.0,47.0,
kv,komi1267,коми,Komi,Komi,Uralic,Permic,coordinates of Zyrian,64.05,54.95,
kva,bagv1239,куанад.,Bagvalal,Bagv.,NE Caucasian,Avar-Andic-Tsezic,,42.40,46.10,
kw,corn1251,корн.,Cornish,Corn.,Indo-European,Celtic,,50.5233,-4.18619,
ky,kirg1245,кирг.,Kyrgyz,Kyrg.,Altaic,Turkic,,42.0,74.0,
la,lati1261,лат.,Latin,Lat.,Indo-European,Romance,,41.9026,12.4502,
lah,west2386,ланда,Lahnda,Lahnda,Indo-European,Indic,,30.09,75.35,
la-x-late,late1252,позднелат.,Late Latin,Late Lat.,Indo-European,Romance,,41.9026,12.4502,
lbe,lakk1252,лак.,Lak,Lak,NE Caucasian,Lak,,42.1328,47.0809,
ldd,luri1256,лур.,Luri,Luri,Indo-European,Iranian,,10.059,9.59745,
lez,lezg1247,лезг.,Lezgian,Lezg.,NE Caucasian,Lezgic,,41.5157,47.8951,
liv,livv1244,лив.,Livonian,Liv.,Indo-European,Baltic,,57.566,22.0262,
lrl,lari1253,лар.,Lari,Lari,Indo-European,Iranian,Glottolog Larestani,27.64,54.63,
lt,lith1251,лит.,Lithuanian,Lit.,Indo-European,Baltic,,55.1429,23.9601,
lt-x-dial,lith1251,лит. (диал.),Lithuanian (dialectal),Lit. (dial.),Indo-European,Baltic,,55.1429,23.9601,
lv,latv1249,латыш.,Latvian,Latv.,Indo-European,Baltic,,56.826108,24.309118,
lzz,lazz1240,чан.,Laz,Laz,Kartvelian,Kartvelian,,41.5004,41.9096,
man,mand1436,мандинго,Manding,Mand.,Mande,Western Mande,I assume this is Mandinka and not Manding in general,12.8165233333,-15.6539466667,
mdf,moks1248,мордовский (мокша),Moksha Mordvin,Moksha,Uralic,Mordvin,,54.1855,42.6728,
mga,midd1360,ср.ирл.,Middle Irish,MIr.,Indo-European,Celtic,,53.22,-7.62,
mis-x-khuri,khur1237,хури,Khuri,Khuri,Indo-European,Iranian,https://www.iranicaonline.org/articles/khur-oasis,33.78333333333333,55.083333333333336,
mn,mong1331,монг.,Mongolian,Mong.,Altaic,Mongolic,coordinates of Halh,48.32,106.29,
mn-x-uriankh,alta1280,урянх.,Uriankhai,Uriankh.,Altaic,Mongolic,seems to be Altai Uriankhai,48.2857,89.5001,
mnc,manc1252,манджурское,Manchu,Manchu,Altaic,Tungusic,,47.31225,126.55713,
mnj,munj1244,пам. м.,Munji,Munji,Indo-European,Iranian,,35.9321,70.9404,
mns,mans1269,манси,Mansi,Mansi,Uralic,Ugric, = вогул.,61.14,62.40,
mr,mara1378,маратхи,Marathi,Marathi,Indo-European,Indic,,17.93,76.67,
myv,erzy1239,мордовский (эрзя),Erzya Mordvin,Erzya,Uralic,Mordvin,,52.8548,45.3901,
mzn,maza1291,маз.,Mazanderani,Mazand.,Indo-European,Iranian,,36.241,52.3009,
nds,nort2627,н.н.нем.,Low German,LGer.,Indo-European,Germanic,,53.115373,12.391439,
ne,nepa1254,непал.,Nepali,Nep.,Indo-European,Indic,used macrolanguage because its not clear what exactly Abaev refers to,28.0,85.0,
nl,dutc1256,нидерл.,Dutch,Dut.,Indo-European,Germanic,,52.0,5.0,
no,norw1258,норв.,Norwegian,Nor.,Indo-European,Germanic,,59.92,10.71,
no-x-dial,norw1258,норв. (диал.),Norwegian (dialectal),Nor. (dial.),Indo-European,Germanic,,59.92,10.71,
nog,noga1249,ног.,Nogai,Nog.,Altaic,Turkic,,44.89776,43.1656,
non,oldn1244,др.сев.,Old Norse,ONor.,Indo-European,Germanic,,63.42,10.38,
non-x-is,oldw1240,др.исл.,Old Icelandic,OIcel.,Indo-European,Germanic,indicate the coordinates of Icelandic specifically,63.48,-19.02,
ntz,nata1252,натанзи,Natanzi,Natanzi,Indo-European,Iranian,,33.4593,51.9538,
nub,oldn1245,нубийское,Nubian,Nub.,Eastern Sudanic,Nubian,I assume Abaev cites Old Nubian,18.760713,31.748657,
oc,occi1239,прованс.,Occitan,Occ.,Indo-European,Romance,probably Occitan; Abaev seems to call Franco-Provençal «фр. (прованс.)»,44.1415,6.82979,
ofs,oldf1241,др.фриз.,Old Frisian,OFris.,Indo-European,Germanic,,53.35,6.8,
oge,oldg1234,др.груз.,Old Georgian,OGeorg.,Kartvelian,Kartvelian,,41.604313,43.06151,
ohu,hung1274,ст.венг.,Old Hungarian,OHung.,Uralic,Ugric,,46.9068585714,19.6555271429,
oos,oldo1234,ст.ос.,Old Ossetic,OOss.,Indo-European,Iranian,,48.48,39.46,
oru,ormu1247,орм.,Ormuri,Orm.,Indo-European,Iranian,,32.6819,69.3444,
orv,oldr1238,др.русск.,Old Russian,ORus.,Indo-European,Slavic,,54.813,31.827,
os,osse1243,ос.,Ossetic,Oss.,Indo-European,Iranian,"I assume that when Abaev cites Ossetic, he cites modern Ossetic",42.98,44.61,
os-x-digor,digo1242,д.,Digor,Dig.,Indo-European,Iranian,,43.158056,44.156944,
os-x-iron,iron1242,и.,Iron,Iron,Indo-European,Iranian,,42.98,44.61,
os-x-ksan,iron1242,ксан.,Ksan Ossetic,Ksan.,Indo-European,Iranian,add coordinates,42.98,44.61,
os-x-south,iron1242,ю.,South Ossetic,SOss.,Indo-European,Iranian,add coordinates,42.98,44.61,
osx,olds1250,др.сакс.,Old Saxon,OSax.,Indo-European,Germanic,,52.37,9.72,
oui,oldu1238,др.тюрк.,Old Turkic,OTurk.,Altaic,Turkic,,42.85,89.53,
pa,panj1256,пенджаби,Punjabi,Punj.,Indo-European,Indic,arbitrarily chose Eastern Panjabi for Glottolog,30.0368,75.6702,
pal,pahl1241,пехл.,Middle Persian,MPers.,Indo-European,Iranian,,30.06,52.7,
pal-x-pazend,pahl1241,паз.,Pazend,Paz.,Indo-European,Iranian,,30.06,52.7,
pal-x-turfan,pahl1241,пехл. турф.,Turfan Pahlavi,Pahl. Turf.,Indo-European,Iranian,add coordinates,30.06,52.7,
paq,pary1242,парья,Parya,Parya,Indo-European,Indic,,36.49,69.26,
peo,oldp1254,др.перс.,Old Persian,OPers.,Indo-European,Iranian,,32.0,54.0,
pgd,gand1259,кхарошти,Gandhari,Gandh.,Indo-European,Indic,,34.15,71.73,
pi,pali1273,пали,Pali,Pali,Indo-European,Indic,,24.5271,82.251,
pl,poli1260,пол.,Polish,Pol.,Indo-European,Slavic,,51.8439,18.6255,
pl-x-old,oldp1256,старопол.,Old Polish,OPol.,Indo-European,Slavic,,51.8439,18.6255,
pox,pola1255,полабский,Polabian,Polab.,Indo-European,Slavic,,52.00,14.00,
pra,midd1350,пракрит.,Prakrit,Prakr.,Indo-European,Indic,Glottolog arbitrary,26.61,78.97,
prc,para1299,пар.,Parachi,Par.,Indo-European,Iranian,,36.0432,70.8805,
prg,prus1238,др.прусс.,Old Prussian,OPrus.,Indo-European,Germanic,,52.394,14.757,
prn,pras1239,прасунск.,Prasun,Pras.,Indo-European,Nuristani,,35.42,70.92,
prs,dari1249,тадж. (кабули),Dari (Kabul),Dari (Kab.),Indo-European,Iranian,,31.0405,67.3593,
ps,nucl1276,афг.,Pashto,Pashto,Indo-European,Iranian,I assign this to Nuclear Pashto in Glottolog because Wanetsi is separate,31.92,69.45,
psh,sout2671,пашан,Pashai (?),Pashai,Indo-European,Iranian,Glottolog arbitrary,34.8478,69.8734,
pt,port1283,порт.,Portuguese,Port.,Indo-European,Romance,,39.91,-8.10,
qwm,cuma1241,куман.,Cuman,Cum.,Altaic,Turkic,,45.00,34.08,
ro,roma1327,рум.,Romanian,Rom.,Indo-European,Romance,,46.3913,24.2256,
rom,roma1329,цыг.,Romani,Romani,Indo-European,Indic,arbitrarily chose Central Romani,48.20,20.31,
ru,russ1263,русск.,Russian,Rus.,Indo-European,Slavic,,59.0,50.0,
ru-x-argot,russ1263,русск. (арго),Russian (argot),Rus. (argot),Indo-European,Slavic,,59.0,50.0,
ru-x-arkh,pomo1275,русск. (арх.),Russian (Arkhangelsk),Rus. (Arkh.),Indo-European,Slavic,,63.5,43.0,
ru-x-astr,sout2602,русск. (астрах.),Russian (Astrakhan),Rus. (Astr.),Indo-European,Slavic,,46.35,48.035,
ru-x-dial,russ1263,русск. (диал.),Russian (dialectal),Rus. (dial.),Indo-European,Slavic,,59.0,50.0,
ru-x-don,sout2602,русск. (донской говор),Russian (Don variety),Rus. (Don),Indo-European,Slavic,Novocherkassk,47.422222,40.093889,
ru-x-kstr,nort2597,русск. (кстр.),Russian (Kostroma),Rus. (Kostr.),Indo-European,Slavic,,57.768056,40.926944,
ru-x-novg,novg1241,русск. (новг.),Russian (Novgorod),Rus. (Novg.),Indo-European,Slavic,,58.433333,32.383333 ,
ru-x-sib,russ1263,русск. (сиб.),Russian (Siberian),Rus. (Sib.),Indo-European,Slavic,coordinates of Krasnoyarsk,56.0062,92.8712,
ru-x-smlnsk,russ1263,русск. (смол.),Russian (Smolensk),Rus. (Smol.),Indo-European,Slavic,add coordinates,59.0,50.0,
ru-x-south,sout2602,русск. (южн. диал.),Russian (southern dialects),Rus. (s.),Indo-European,Slavic,,45.05,41.983333 ,
ru-x-tvr,cent2343,русск. (твер.),Russian (Tver),Rus. (Tv.),Indo-European,Slavic,,56.8625,35.924167,
ru-x-vldmr,vlad1234,русск. (влад.),Russian (Vladimir),Rus. (Vlad.),Indo-European,Slavic,,56.083333,40.616667,
ru-x-west,russ1263,русск. (зап. диал.),Russian (Western dialects),Rus. (w.),Indo-European,Slavic,coordinates of Smolensk,54.782778,32.045278,
rut,rutu1240,рутул.,Rutul,Rut.,NE Caucasian,Lezgic,,41.6187,47.3244,
sa,clas1258,скр.,Sanskrit,Sanskr.,Indo-European,Indic,,20.0,77.0,
sa-bauddha,budd1234,др.инд. (будд.),Buddhist Sanskrit,Sanskr. (Bud.),Indo-European,Indic,coordinates of Pali,24.53,82.25,
sa-vaidika,vedi1234,вед.,Vedic,Ved.,Indo-European,Indic,,20.0,77.0,
sah,yaku1245,якут.,Yakut,Yak.,Altaic,Turkic,,61.69744,133.98031,
sbv,sabi1245,саб.,Sabine,Sab.,Indo-European,Italic,,43.54,13.46,
sel,selk1253,селькуп.,Selkup,Selk.,Uralic,Samoyedic,,59.94,82.30,
sem,semi1276,семит.,Semitic,Sem.,Afro-Asiatic,Semitic,coordinates of Imperial Aramaic,33.91,42.19,
sga,oldi1246,др.ирл.,Old Irish,OIrish,Indo-European,Celtic,,53.22,-7.62,
sgh,shug1248,пам. ш.,Shughni,Shugh.,Indo-European,Iranian,,37.5018,71.7925,
sgh-x-bartang,bart1238,пам. барт.,Bartangi,Bart.,Indo-European,Iranian,,38.21974,72.11835,
sgh-x-khufi,khuf1238,хуф.,Khufi,Khufi,Indo-European,Iranian,,37.8595,71.60373,
sgh-x-oroshori,oros1238,пам. ор.,Roshorvi,Rosh.,Indo-European,Iranian,,38.38796,72.7418,
sgr,sang1315,сангисарское,Sangsari,Sangsari,Indo-European,Iranian,,35.72,53.3,
sgy,sang1344,пам. сгл.,Sanglechi,Sangl.,Indo-European,Iranian,,36.45,71.3,
sgy-x-zebak,zeba1237,пам. зеб.,Zebaki,Zeb.,Indo-European,Iranian,may actually be a variety of Ishkashimi; coordinates of Zebak district,36.5469,71.3423,
sh,sout1528,сербо-хорв.,Serbo-Croatian,SCr.,Indo-European,Slavic,,44.15,18.81,
si,sinh1246,синг.,Sinhalese,Sinh.,Indo-European,Indic,,8.00,81.00,
sk,slov1269,словац.,Slovak,Slovak,Indo-European,Slavic,,48.55,18.78,
sl,slov1268,слов.,Slovenian,Slovene,Indo-European,Slavic,,46.2543,14.7766,
sla,slav1255,слав.,Slavic,Sl.,Indo-European,Slavic,coordinates of Rusyn (roughly at the centre of historical Slavic territory),48.72,22.96,
smi,saam1281,лопар.,Saami,Sami,Uralic,Saami,coordinates of Kemi Saami,67.09,27.54,
smi-x-sm,saam1281,саам.,Saami,Sami,Uralic,Saami,coordinates of Kemi Saami,67.09,27.54, Abaev used «лопар.» in the earlier volumes so these are viewed as distinct
smy,semn1251,семнан.,Semnani,Semn.,Indo-European,Iranian,,35.53,53.29,
sog,sogd1245,согд.,Sogdian,Sogd.,Indo-European,Iranian,,39.7,66.983,
sog-x-budd,sogd1245,согд. будд.,Buddhist Sogdian,Sogd. Bud.,Indo-European,Iranian,,39.7,66.983,
sog-x-chr,sogd1245,согд. христ.,Christian Sogdian,Sogd. Chr.,Indo-European,Iranian,,39.7,66.983,
sog-x-man,sogd1245,согд. ман.,Manichaean Sogdian,Sogd. Man.,Indo-European,Iranian,,39.7,66.983,
sog-x-mugh,sogd1245,согд. (Муг),Sogdian (Mugh),Sogd. (Mugh),Indo-European,Iranian,,39.7,66.983,
sqj,alba1267,алб.,Albanian,Alb.,Indo-European,Albanian,coordinates of Northern Tosk,41.00,20.00,
sr,serb1264,серб.,Serbian,Serb.,Indo-European,Slavic,,44.3238,21.9192,
srh,sari1246,пам. с.,Sarikoli,Sarik.,Indo-European,Iranian,,37.905,75.1449,
sty,tobo1250,тобол.,Tobol Tatar,Tobol,Altaic,Turkic,,58.1896,68.2581,
sty-x-brb,bara1273,барабин.,Baraba Tatar,Baraba,Altaic,Turkic,,55.05,82.95,coordinates of Novosibirsk
sux,sume1241,шумер.,Sumerian,Sum.,Sumerian,Sumerian,,31.3,45.6667,
sv,swed1254,швед.,Swedish,Swed.,Indo-European,Germanic,,59.800634,17.389526,
sv-x-dial,swed1254,швед. (диал.),Swedish (dialectal),Swed. (dial.),Indo-European,Germanic,,59.800634,17.389526,
sva,svan1243,сван.,Svan,Sv.,Kartvelian,Kartvelian,,42.9134,42.5915,
syd,samo1298,самодийское,Samoyedic,Sam.,Uralic,Samoyedic,coordinates of Forest Enets,68.60,86.50,
syd-x-south,samo1298,южносамодийское,South Samoyedic,SSam.,Uralic,Samoyedic,coordinates of Selkup,59.94,82.30,
syr,clas1252,сир.,Syriac,Syr.,Afro-Asiatic,Semitic,,37.1129,42.1432,
ta,tami1289,тамил.,Tamil,Tam.,Dravidian,Dravidian,,10.52,78.83,
tab,taba1259,табас.,Tabassaran,Tabas.,NE Caucasian,Lezgic,,42.0198,47.8379,
tg,taji1245,тадж.,Tajik,Taj.,Indo-European,Iranian,,38.8213,68.5549,
tg-x-dial,taji1245,тадж. (диал.),Tajik (dialectal),Taj. (dial.),Indo-European,Iranian,,38.8213,68.5549,
tg-x-qrtg,kara1511,тадж. (каратег.),Tajik (Qarategin),Taj. (Qarateg.),Indo-European,Iranian,coordinates of Rasht Valley,39.0863,70.7011,
tg-x-se,taji1245,тадж. (юго-восточные говоры),Tajik (South-Eastern varieties),Taj. (SE),Indo-European,Iranian,coordinates of Darwazi,38.32,70.76,
tg-x-vanj,taji1245,тадж. (вандж.),Tajik (Vanj),Taj. (Vanj),Indo-European,Iranian,add coordinates,38.8213,68.5549,
tin,tind1238,тинд.,Tindi,Tindi,NE Caucasian,Avar-Andic-Tsezic,,42.33,45.92,
tk,turk1304,туркм.,Turkmen,Turkm.,Altaic,Turkic,,37.08719,59.17574,
tkr,tsak1249,цахур.,Tsakhur,Tsakh.,NE Caucasian,Lezgic,,41.5916,46.8858,
tly,taly1247,тал.,Talyshi,Tal.,Indo-European,Iranian,,38.4552,48.6349,
tr,nucl1301,тур.,Turkish,Tr.,Altaic,Turkic,,39.8667,32.8667,
tr-x-anat,anat1259,анат.,Anatolian Turkish,Anat.,Altaic,Turkic,,39.87,32.87,
tr-x-dial,nucl1301,тур. (диал.),Turkish (dialectal),Tr. (dial.),Altaic,Turkic,,39.8667,32.8667,
trk,turk1311,тюрк.,Turkic,Turk.,Altaic,Turkic,,-99,-99,
trk-x-east,turk1311,восточнотюрк.,East Turkic,ETurk.,Altaic,Turkic,I assume this is SE Turkic,40.89,69.21, coord of Uzbek
trk-x-mid,turk1311,среднетюрк.,Middle Turkic,MTurk.,Altaic,Turkic,,-99,-99,
trk-x-north,turk1311,сев. тюрк.,North Turkic,NTurk.,Altaic,Turkic,"Unclear: Kipchak or Siberian? Coordinates of Bashkir, on the assumption that this refers to Kipchak",53.60,56.56,
tt,tata1255,татар.,Tatar,Tat.,Altaic,Turkic,,55.79592,49.11577,
tt-x-dial,tata1255,татар. (диал.),Tatar (dialectal),Tat. (dial.),Altaic,Turkic,,55.79592,49.11577,
tt-x-kazan,kaza1250,казан.,Kazan Tatar,Kazan,Altaic,Turkic,,55.796389,49.108889,
ttt,cauc1242,татск.,Tat,Tat,Indo-European,Iranian,coordinates of Muslim Tat,41.43,46.65,
txb,tokh1243,тохар. B,Tocharian B,Toch. B,Indo-European,Tocharian,,41.65,82.9,
txh,thra1250,фрак.,Thracian,Thrac.,Indo-European,Thracian,,42.115469,24.711977,
uby,ubyk1235,убых.,Ubykh,Ub.,NW Caucasian,NW Caucasian,,43.67,39.67,
udi,udii1243,удин.,Udi,Udi,NE Caucasian,Lezgic,,40.9,47.7236,
udm,udmu1245,удм.,Udmurt,Udm.,Uralic,Permic,,56.12921,52.63548,
ug,uigh1240,уйгур.,Uyghur,Uygh.,Altaic,Turkic,,43.88,87.38,
ug-x-kashgar,kash1278,кашг.,Kashgari Uyghur,Kashg.,Altaic,Turkic,,39.4681,75.9938,
uk,ukra1253,укр.,Ukrainian,Ukr.,Indo-European,Slavic,,49.796,29.945,
uk-x-gal,ukra1253,укр. (галиц.),Ukrainian (Galician),Ukr. (Gal.),Indo-European,Slavic,,49.796,29.945,
uk-x-west,ukra1253,укр. (зап.),Ukrainian (western),Ukr. (w.),Indo-European,Slavic,,49.796,29.945,
ur,urdu1245,урду,Urdu,Urdu,Indo-European,Indic,,25.00,67.00,
uz,uzbe1247,узб.,Uzbek,Uz.,Altaic,Turkic,coordinates of Northern Uzbek (in Uzbekistan),40.89,69.21,
vep,veps1250,вепс.,Veps,Veps,Uralic,Finnic,,60.3353,34.7865,
wbl,wakh1245,пам. в.,Wakhi,Wakhi,Indo-European,Iranian,,37.1768,73.9777,
wen,sorb1249,луж.,Sorbian,Sorb.,Indo-European,Slavic,coordinates of Upper Sorbian,51.24,14.41,
wep,west2356,нем. (вестф.),Westphalic,Westph.,Indo-European,Germanic,,51.46,7.50,
wne,wane1241,ванеци,Wanetsi,Wan.,Indo-European,Iranian,,30.0501,67.8327,
wsv,wota1240,вотапурско-катаркалайское,Wotapuri-Katarqalai,Wot.-Kat.,Indo-European,Indic,,34.958246,71.090876,
x-balochi,balo1260,бел.,Balochi,Bal.,Indo-European,Iranian,coordinates of Eastern Balochi,28.00,62.00,
x-barakai,0,варакаи,Barakai,Barakai,Indo-European,Iranian,"cited in Tomaschek, but I cannot find any trace of this dialect in the sources. Probably not Pamir but W. Iranian",-99,-99,
x-dardic,dard1244,дард.,Dardic,Dard.,Indo-European,Indic,,34.96,72.93,
x-mordvin,mord1256,морд.,Mordvinic,Mord.,Uralic,Mordvin,coordinates of Saransk,54.177,45.1833,
x-nuristan,nuri1243,кафир.,Nuristani,Nur.,Indo-European,Nuristani,coordinates of Kalasha,35.19,70.99,
x-oldirn,iran1269,др.иран.,Old Iranian,OIr.,Indo-European,Iranian,,-99,-99,
x-oldsl,slav1255,др.слав.,Old Slavic,OSl.,Indo-European,Slavic,,-99,-99,
x-pamir,0,пам.,Pamir,Pam.,Indo-European,Iranian,coordinates of Gorno-Badakhshan,38,73,
x-pamir-n,0,пам. н.??,Pamir,Pam.,Indo-European,Iranian,,38,73,
x-rushani,rush1239,пам. руш.,Rushani,Rush.,Indo-European,Iranian,,38.07829,71.58549,
x-sarm,0,сарм.,Sarmatian,Sarm.,Indo-European,Iranian,coordinates of Volgograd (arbitrary),48.707085,44.517016,
x-tchr,tokh1241,тохар.,Tocharian,Toch.,Indo-European,Tocharian,coordinates of Tocharian B,41.65,82.90,
x-vaynakh,chec1244,вейнах.,Vaynakh,Vayn.,NE Caucasian,Nakh,coordinates of Achkhoi-Martan,43.1813,45.2846,
xal,kalm1243,калм.,Kalmyk,Kalm.,Altaic,Turkic,,46.566667,45.316667,
xbc,bact1239,кушан.,Bactrian,Bact.,Indo-European,Iranian,,36.81,66.85,
xbo,bolg1250,булг.,Bulgar,Bulgar,Altaic,Turkic,,48.671481,42.729234,
xcl,clas1249,арм.,Armenian,Arm.,Indo-European,Armenian,,38.592316,41.346422,
xco,khwa1238,хорезм.,Khwarezmian,Khwar.,Indo-European,Iranian,,41.68,60.75,
xco-x-late,khwa1238,позднехорезм.,Late Khwarezmian,LKhwar.,Indo-European,Iranian,,,,
xhu,hurr1240,хурр.,Hurrian,Hurr.,Hurro-Urartian,Hurro-Urartian,,40.7339,43.3154,
xld,lydi1241,лид.,Lydian,Lyd.,Indo-European,Anatolian,,40,30,
xln,0,алан.,Alanic,Alan.,Indo-European,Iranian,coordinates of Arkhyz,43.5603,41.2798,
xlu,luvi1235,лув.,Luwian,Luw.,Indo-European,Anatolian,cuneiform,38.00,36.00,
xme,0,мид.,Median,Med.,Indo-European,Iranian,,37,47,
xmf,ming1252,мегр.,Mingerlian,Ming.,Kartvelian,Kartvelian,,42.5129,41.8719,
xmn,pahl1241,пехл. (маних.),Manichaean Middle Persian,MPers. (Man.),Indo-European,Iranian,,30.06,52.7,
xpg,phry1239,фриг.,Phrygian,Phr.,Indo-European,Phrygian,,39.613,31.28,
xpr,part1239,парф.,Parthian,Parth.,Indo-European,Iranian,,37.052,56.056,
xsc,0,скиф.,Scythian,Scyth.,Indo-European,Iranian,coordinates of Lugansk,48.5763,39.3335,
xtg,tran1282,галл.,Gaulish,Gaul.,Indo-European,Celtic,or Cisalpine? Glottolog Transalpine,43.97,3.3,
xto,tokh1242,тохар. A,Tocharian A,Toch. A,Indo-European,Tocharian,,42.98,89.18,
xtq,tums1237,сак. (Тумшук),Tumshuqese,Tumsh.,Indo-European,Iranian,,39.866667,79.066667,
xum,umbr1253,умбр.,Umbrian,Umbr.,Indo-European,Italic,,42.75,13.02,
yah,yazg1240,пам. язг.,Yazgulyami,Yazg.,Indo-European,Iranian,,38.2801,71.565,
yai,yagn1238,ягн.,Yaghnobi,Yaghn.,Indo-European,Iranian,,39.1486,69.2422,
ydg,yidg1240,пам. и.,Yidgha,Yid.,Indo-European,Iranian,,36.014,71.5077,
yrk,nene1251,нен.,Nenets,Nen.,Uralic,Samoyedic,coordinates of Tundra Nenets,66.18,71.02,
ysc,oldo1234,ясск.,Jassic,Jas.,Indo-European,Iranian,,48.48,39.46,
zh,sini1245,кит.,Chinese,Chin.,Sino-Tibetan,Chinese,,34.09,109.05,
zkz,0,хазарск.,Khazar,Khaz.,Altaic,Turkic,coordinates of Samosdelka (Itil site),46.024,47.83975,
zza,zaza1246,заза,Zazaki,Zaz.,Indo-European,Iranian,coordinates of Dimli,38.61,39.64,
1 code glottolog ru en en_abbr family genus comment lat long
2 ab abkh1244 абх. Abkhaz Abkh. NW Caucasian NW Caucasian 43.056218 41.159115
3 abq abaz1241 абаз. Abaza Abaza NW Caucasian NW Caucasian 44.25 42.0
4 abq-x-dial abaz1241 абаз. (диал.) Abaza (dialectal) Abaza (dial.) NW Caucasian NW Caucasian 44.25 42.0
5 ady adyg1241 адыг. Adyghe Adyghe NW Caucasian NW Caucasian 44.0 39.33
6 ady-x-abadz abad1240 абадз. Abzakh Adyghe Abzakh NW Caucasian NW Caucasian coordinates of Khakurinokhabl 45.02 40.23
7 ady-x-shpsg shap1240 шапс. Shapsug Adyghe Shaps. NW Caucasian NW Caucasian coordinates of Lazarevskoe 43.911111 39.338056
8 ae aves1237 ав. Avestan Av. Indo-European Iranian 34.217 62.112
9 ae-x-gth aves1237 ав. (гаты) Gathic Avestan GAv. Indo-European Iranian 34.217 62.112
10 aer aran1263 аранта Arrernte Arrernte Pama-Nyungan Central Pama-Nyungan coordinates of E. Arrernte -23.36 135.05
11 agx aghu1253 агул. Aghul Agh. NE Caucasian Lezgic 41.9242 47.5843
12 aii assy1241 ассир. Assyrian Assyr. Afro-Asiatic Semitic 36.75 43.0
13 ain ainu1252 айну Ainu Ainu Ainu Ainu I assume this is Japanese Ainu; coordinates of Hokkaido Ainu 43.63 142.46
14 akk akka1240 аккад. Akkadian Akk. Afro-Asiatic Semitic 33.1 44.1
15 akv akhv1239 ахвах. Akhvakh Akhv. NE Caucasian Avar-Andic-Tsezic 42.4003 46.3037
16 alt sout2694 алт. Altai Alt. Altaic Turkic 50.1347 86.8705
17 alt-x-teleut tele1257 телеут. Teleut Altai Teleut Altaic Turkic coordinates of Chelukhoevo 54.3672 86.2156
18 ang olde1238 англос. Old English OEng. Indo-European Germanic 51.06 -1.31
19 ani andi1255 анд. Andi Andi NE Caucasian Avar-Andic-Tsezic 42.8078 46.2919
20 aqc arch1244 арчин. Archi Archi NE Caucasian Lezgic 42.3239 46.8267
21 ar stan1318 араб. Arabic Ar. Afro-Asiatic Semitic 27.9625 43.8525
22 arc impe1235 арам. Aramaic Aram. Afro-Asiatic Semitic 33.905 42.185
23 av avar1256 авар. Avar Avar NE Caucasian Avar-Andic-Tsezic 41.7047 46.558
24 az mode1262 азерб. Azerbaijani Az. Altaic Turkic coordinates of North Azerbaijani 40.98 46.47
25 ba bash1264 башк. Bashkir Bashk. Altaic Turkic 53.59671 56.55937
26 bat east2280 балт. Baltic Balt. Indo-European Baltic coordinates of Lithuanian 55.14 23.96
27 bbl bats1242 туш. Bats Bats NE Caucasian Nakh 42.1806 45.344
28 bdk budu1248 будух. Budugh Bud. NE Caucasian Lezgic 41.2272 48.3353
29 be bela1254 белорусс. Belarusian Bel. Indo-European Slavic 53.2307 25.6038
30 bg bulg1262 болг. Bulgarian Bulg. Indo-European Slavic 43.3646 25.047
31 bgn west2368 бел. (зап.) Western Balochi WBal. Indo-European Iranian 37.83 62.17
32 bgp east2304 бел. (вост.) Eastern Balochi EBal. Indo-European Iranian 28.0 62.0
33 bn beng1280 бенгали Bengali Beng. Indo-European Indic 24.00 90.00
34 bo tibe1272 тибет. Tibetan Tib. Sino-Tibetan Bodic 28.3681 90.1872
35 bph botl1242 ботл. Botlikh Botl. NE Caucasian Avar-Andic-Tsezic 42.665 46.22
36 bqi bakh1245 перс. (бахтиар.) Persian (Bakhtiari) Pers. (Bakht.) Indo-European Iranian 32.02 49.77
37 br bret1244 брет. Breton Bret. Indo-European Celtic 48.2452 -3.78934
38 brh brah1256 брахуи Brahui Brah. Dravidian Dravidian 29.04 66.56
39 bsg bash1263 башкарди Bashkardi Bashkardi Indo-European Iranian 32.00 53.00
40 bsk buru1296 верш. Burushaski Burush. Burushaski Burushaski 36.2161 74.8236
41 bua buri1258 монг. бурят. Buryat Buryat Altaic Mongolic coordinates of Russia Buriat 50.85 105.56
42 cau 0 кавк. Caucasian Cauc. 0 0 coordinates of the Caucasus (wiki) 42.261111 44.121111
43 ccs kart1248 картв. South Caucasian SCauc. Kartvelian Kartvelian coordinates of Georgian 41.85 43.79
44 ce chec1245 чеч. Chechen Chech. NE Caucasian Nakh 43.5 45.5
45 ce-x-goyt chec1245 чеч. (гойт.) Chechen (Ghoyta) Chech. (Ghoyta) NE Caucasian Nakh 43.164167 45.622222
46 ce-x-achkh chec1245 чеч. (ачхой-март.) Chechen (Achkhoy-Martan) Chech. (Achkhoy-Martan) NE Caucasian Nakh 43.189167 45.284722
47 cel celt1248 кельт. Celtic Celt. Indo-European Celtic coordinates of Breton 48.25 -3.79
48 chg chag1247 чагат. Chagatai Chag. Altaic Turkic 38.21146 57.88758
49 chm mari1278 мар. Mari Mari Uralic Mari coordinates of Mari El 56.52 46.252
50 cji cham1309 чамал. Chamalal Cham. NE Caucasian Avar-Andic-Tsezic 42.5024 45.995
51 cjs shor1247 шор. Shor Shor Altaic Turkic 52.32607 88.4344
52 ckb cent1972 сорани Sorani Sor. Indo-European Iranian 35.6539 45.8077
53 ckb-x-kndln cent1972 кандулан Sorani (Kandulan) Kandulan Indo-European Iranian I assume this is Sorani; add coordinates? 35.6539 45.8077
54 cmg halh1238 монг. письм. Classical Mongolian Cl. Mong. Altaic Mongolic 48.32397 106.28874
55 crh crim1257 татар. (крым.) Crimean Tatar Crim. Tat. Altaic Turkic 45.0 34.08
56 cs czec1258 чеш. Czech Cz. Indo-European Slavic 49.873398 15.10437
57 cu chur1257 ст.слав. Old Church Slavonic OCS Indo-European Slavic 43.7171 22.8442
58 cu-x-bg chur1257 др.болг. Old Bulgarian OBulg. Indo-European Slavic add coordinates 43.7171 22.8442
59 cv chuv1255 чув. Chuvash Chuv. Altaic Turkic 55.48701 47.16298
60 cy wels1247 валл. Welsh Welsh Indo-European Celtic 52.0 -4.0
61 cy-x-cymr wels1247 кимр. Cymric Cymr. Indo-European Celtic might be Old Welsh? 52.0 -4.0
62 da dani1285 дат. Danish Dan. Indo-European Germanic 54.8655 9.36284
63 da-x-old oldd1239 стародат. Old Danish ODan. Indo-European Germanic 54.8655 9.36284
64 dar darg1242 дарг. Dargwa Darg. NE Caucasian Dargwic coordinates of Aqusha 42.2665 47.3439
65 dar-x-aqusha akus1238 акуш. Aqusha Dargwa Aq. NE Caucasian Dargwic 42.2665 47.3439
66 dar-x-kaitag kajt1238 кайт. Kaitag Dargwa Kait. NE Caucasian Dargwic 42.052428 47.776611
67 ddo dido1241 дид. Tsez Tsez NE Caucasian Avar-Andic-Tsezic 42.2646 45.8096
68 de stan1295 нем. German Ger. Indo-European Germanic 48.649 12.4676
69 de-x-dial mode1258 нем. (диал.) German (dialectal) Ger. (dial.) Indo-European Germanic for Glottolog I assume it is High German because the dialects belong to distinct branches 48.649 12.4676
70 de-x-south mode1258 южнонем. Southern German SGer. Indo-European Germanic coordinates of Bavarian 47.92 13.25
71 dsb lowe1385 нижне-луж. Lower Sorbian LSorb. Indo-European Slavic 51.6621 13.9407
72 ecr eteo1236 крит. Cretan Cret. Eteocretan Eteocretan I assume it is Eteocretan 35.21 24.91
73 egy egyp1246 древнеегипетский Ancient Egyptian Eg. Afro-Asiatic Egyptian-Coptic 28.381735 30.834959
74 el mode1248 н.гр. Modern Greek Mod. Gr. Indo-European Greek 38.36 23.13
75 elx elam1244 элам. Elamite El. Elamite Elamite 31.1833 48.2333
76 en stan1293 англ. English Eng. Indo-European Germanic 53.0 -1.0
77 en-x-argt stan1293 англ. (арго) English (slang) Eng. (sl.) Indo-European Germanic 53.0 -1.0
78 es stan1288 исп. Spanish Sp. Indo-European Romance 40.4414 -1.11788
79 et esto1258 эст. Estonian Est. Uralic Finnic 58.55 25.82
80 ett etru1241 этр. Etruscan Etr. Etruscan Etruscan 41.90 12.48
81 eu basq1248 баск. Basque Bsq. Basque Basque 43.2787 -1.31622
82 evn even1259 эвенк. Evenki Evenki Altaic Tungusic 61.972 94.689
83 fa fars1255 перс. Persian Pers. Indo-European Iranian coordinates of Western Farsi 32.90 53.30
84 fa-x-dial fars1255 перс. (диал.) Persian (dialectal) Pers. (dial.) Indo-European Iranian coordinates of Western Farsi 32.90 53.30
85 fa-x-fars fars1256 перс. (диалект Фарси) Persian (Fars) Pers. (Fars) Indo-European Iranian 29.62 52.53
86 fa-x-kshn fars1255 перс. (кашан.) Persian (Kashan) Pers. (Kashan) Indo-European Iranian I assume this is the local dialect of Persian rather than the NW Iranian language of Kashan 33.99 51.48
87 fa-x-krmns kerm1248 перс. (кирманшах.) Persian (Kermanshah) Pers. (Kerm.) Indo-European Iranian 34.314167 47.065
88 fi finn1318 фин. Finnish Fin. Uralic Finnic 64.7628 25.5577
89 fi-x-dial finn1318 фин. (диал.) Finnish (dialectal) Fin. (dial.) Uralic Finnic 64.7628 25.5577
90 fr stan1290 фр. French Fr. Indo-European Romance 48.0 2.0
91 fro oldf1239 ст.фр. Old French OFr. Indo-European Romance 48.8 1.11
92 frp fran1260 фр. (прованс.) Franco-Provençal Fr.-Prov. Indo-European Romance 45.8051 6.48152
93 frs sate1242 фриз. (вост.) East Frisian EFris. Indo-European Germanic 53.117 7.721
94 fy fris1239 фриз. Frisian Fris. Indo-European Germanic chose West as the largest branch, but not certain 53.14 5.86
95 ga iris1253 ирл. Irish Irish Indo-European Celtic 53.2186 -7.61509
96 gbz gabr1257 габри Zoroastrian Dari Zor. Dari Indo-European Iranian 31.82 54.45
97 gbz-x-yzd zoro1242 язди Yazdi Yazdi Indo-European Iranian 31.8161 54.4469
98 gdo ghod1238 годобер. Godoberi Godob. NE Caucasian Avar-Andic-Tsezic 42.7428 46.2252
99 gem germ1287 герм. Germanic Germ. Indo-European Germanic coordinates of Ostfränkisch: roughly at the middle of the are of Modern Germanic 50.01 8.62
100 gem-x-old germ1287 др.герм. Old Germanic OGerm. Indo-European Germanic -99 -99
101 glk gila1241 гилян. Gilaki GIl. Indo-European Iranian 37.1344 49.8359
102 gmh midd1343 ср.в.нем. Middle High German MHG Indo-European Germanic 48.254 10.599
103 gml midd1318 ср.н.нем. Middle Low German MLG Indo-European Germanic 53.14 9.67
104 gmq nort3160 сканд. Scandinavian NGerm. Indo-European Germanic rarely used 63.42 10.38 coordinates of Old Norse
105 goh oldh1241 др.в.нем. Old High German OHG Indo-European Germanic 52.0 10.0
106 got goth1244 гот. Gothic Goth. Indo-European Germanic 46.9304 29.9786
107 got-x-crm crim1255 гот. (крым.) Crimean Gothic Crim. Goth. Indo-European Germanic 45.3 34.4
108 grc anci1242 гр. Greek Gr. Indo-European Greek 39.8155 21.9129
109 grc-x-byz midd1362 гр. (визант.) Byzantine Greek Byz. Gr. Indo-European Greek coordinates of Istanbul 41.013611 28.955
110 grc-x-doric dori1248 гр. дор. Doric Greek Dor. Gr. Indo-European Greek coordinates of Greek Epirus 39.6 20.8
111 grc-x-hom anci1242 гр. (Гомер) Homeric Greek Hom. Gr. Indo-European Greek coordinates of Ephesus 37.95 27.366667
112 ha haus1257 хауса Hausa Hausa Afro-Asiatic West Chadic 11.15 8.78
113 hac gura1251 гуран. Gorani Gor. Indo-European Iranian 36.8377 44.4956
114 hbo anci1244 др.евр. Hebrew Heb. Afro-Asiatic Semitic 31.7761 35.1725
115 hi hind1269 хинди Hindi Hindi Indo-European Indic 25.0 77.0
116 hit hitt1242 хетт. Hittite Hitt. Indo-European Anatolian 40.0 35.0
117 hr croa1245 хорв. Croatian Croat. Indo-European Slavic 45.555 15.982
118 hsb uppe1395 верхнелуж. Upper Sorbian USorb. Indo-European Slavic 51.24 14.41
119 hu hung1274 венг. Hungarian Hung. Uralic Ugric 46.9068585714 19.6555271429
120 huz hunz1247 гунзиб. Hunzib Hunz. NE Caucasian Avar-Andic-Tsezic 42.0808 46.1369
121 iir indo1320 ар. Aryan Ar. Indo-European 0 -99 -99
122 inc indo1321 инд. Indo-Aryan IA Indo-European Indic coordinates of country India 21 78
123 inc-x-mid midd1375 ср.инд. Middle Indic MInd. Indo-European Indic coordinates of country India 21 78
124 inc-x-nnew indo1324 северные новоиндийские диалекты North New Indic dialects North New Indic dialects Indo-European Indic coordinates of Delhi 28.61 77.23
125 inc-x-old sans1269 др.инд. Old Indic OInd. Indo-European Indic 20.0 77.0
126 ine indo1319 и.е. Indo-European IE Indo-European 0 -99 -99
127 inh ingu1240 инг. Ingush Ing. NE Caucasian Nakh 43.11 45.03
128 ira iran1269 иран. Iranian Ir. Indo-European Iranian -99 -99
129 ira-x-mid iran1269 ср.иран. Middle Iranian MIr. Indo-European Iranian -99 -99
130 is icel1247 исл. Icelandic Icel. Indo-European Germanic 63.4837 -19.0212
131 isk ishk1246 пам. ишк. Ishkashimi Ishk. Indo-European Iranian 36.67 71.55
132 it ital1282 ит. Italian It. Indo-European Romance 43.0464 12.6489
133 ja nucl1643 япон. Japanese Jap. Japanese Japanese 35.0 135.0
134 ka nucl1302 груз. Georgian Georg. Kartvelian Kartvelian 41.850397 43.78613
135 ka-x-clq nucl1302 груз. (разг.) Georgian (colloquial) Georg. (col.) Kartvelian Kartvelian 41.850397 43.78613
136 ka-x-dial nucl1302 груз. (диал.) Georgian (dialectal) Georg. (dial.) Kartvelian Kartvelian 41.850397 43.78613
137 ka-x-guria guri1246 груз. (гур.) Gurian Georgian Georg. (Gur.) Kartvelian Kartvelian 41.966667 42.2
138 ka-x-imer imer1248 груз. (имер.) Imeretian Georgian Georg. (Imer.) Kartvelian Kartvelian 42.166667 42.983333
139 ka-x-ingiloy ingi1240 груз. (ингил.) Ingiloy Georgian Georg. (Ing.) Kartvelian Kartvelian coordinates of Zaqatala 41.633611 46.643333
140 ka-x-khevsur xevs1238 груз. (хевсур.) Khevsur Georgian Georg. (Khev.) Kartvelian Kartvelian 42.4883 44.87915
141 ka-x-lchkhm rach1238 груз. (лечхум.) Lechkhumi Georgian Georg. (Lech.) Kartvelian Kartvelian 42.649722 42.759722
142 ka-x-mokhev moxe1238 груз. (мохев.) Mokhevian Georgian Georg. (Mokh.) Kartvelian Kartvelian coordinates of Khevi 42.6975 44.519
143 ka-x-mtiul mtiu1238 груз. (мтиул.) Mtiuletian Georgian Georg. (Mtiul.) Kartvelian Kartvelian coordinates of Pasanauri 42.346389 44.692778
144 ka-x-pshav psha1238 груз. (пшав.) Pshavian Georgian Georg. (Pshav.) Kartvelian Kartvelian 42.283333 44.75
145 ka-x-rachian rach1238 груз. (рачин.) Rachian Georgian Georg. (Rach.) Kartvelian Kartvelian 42.636111 43.436111
146 kaa kara1467 каракалп. Kara-Kalpak Kara-Kalp. Altaic Turkic 39.98005 63.32233
147 xas kama1351 камас. Kamas Kamas Uralic Samoyedic 55.07 94.83
148 kap bezh1248 капуч. Bezhta Bezhta NE Caucasian Avar-Andic-Tsezic 42.1206 46.0332
149 kbd kaba1278 каб. Kabardian Kab. NW Caucasian NW Caucasian 43.5082 43.3918
150 kbd-x-crc kaba1278 черк. Circassian Circ. NW Caucasian NW Caucasian add coordinates to distinguish Kabardian and Circassian? 43.5082 43.3918
151 kbd-x-crc-dial kaba1278 черк. (диал.) Circassian (dialectal) Circ. (dial.) NW Caucasian NW Caucasian 43.5082 43.3918
152 kbd-x-crc-west kaba1278 черк. (зап.) Circassian (western) Circ. (W.) NW Caucasian NW Caucasian probably distinct from West Circassian (= Adyghe) 43.5082 43.3918
153 kbd-x-dial kaba1278 каб. (диал.) Kabardian (dialectal) Kab. (dial.) NW Caucasian NW Caucasian 43.5082 43.3918
154 kca khan1279 ханты Khanty Khanty Uralic Ugric coordinates of Kazym Khanty 62.43 66.12
155 kdr kara1464 караим. Karaim Kar. Altaic Turkic 54.5534 25.1054
156 kho khot1251 сак. Saka Saka Indo-European Iranian 38.33 79.04
157 khv xvar1237 хварш. Khwarshi Khwarshi NE Caucasian Avar-Andic-Tsezic 42.27 46.00
158 khw khow1242 ховар. Khowar Khow. Indo-European Indic 36.0 72.0
159 khw-x-chtr sout2670 читр. Khowar (Chitral) Khow. (Chitral) Indo-European Indic I assume this is Khowar, the language spoken in Chitral in Pakistan. For Glottolog I assume it’s southern Khowar, but this is preliminary 35.846111 71.785833
160 kjh khak1248 хакас. Khakas Khak. Altaic Turkic coordinates of Askiz (the Glottolog coordinates may be a mistake) 53.1283 90.538
161 kjh-sghy saga1260 хакас. (сагайск.) Saghay Khakas Khak. (Saghay) Altaic Turkic 53.1283 90.538
162 kjj khin1240 хиналуг. Khinalugh Khin. NE Caucasian Khinalug 41.1801 48.0571
163 kk kaza1248 каз. Kazakh Kaz. Altaic Turkic 51.17 71.45
164 kk-x-krgnd kaza1248 караг. Qaraghandy Kazakh Qaragh. Altaic Turkic coordinates of Karaganda 49.7931 73.1168
165 ko kore1280 кор. Korean Kor. Korean Korean 37.54 126.98
166 kpt kara1516 карат. Karata Karata NE Caucasian Avar-Andic-Tsezic 42.65 46.32
167 krc-x-balkar balk1253 балк. Balkar Balk. Altaic Turkic coordinates of Tyrnyauz 43.3815 42.9188
168 krc-x-karachay kara1466 карач. Karachay Karach. Altaic Turkic coordinates of Karachaevsk 43.762 41.9664
169 krl kare1335 карел. Karelian Karel. Uralic Finnic 65.1691 30.8655
170 kry kryt1240 крыз. Kryz Kryz NE Caucasian Lezgic 41.1811 48.1846
171 kry-x-jek dzhe1238 джекск. Jek Kryz Jek NE Caucasian Lezgic 41.195 48.2417
172 ku kurd1259 курд. Kurdish Kurd. Indo-European Iranian coordinates of Kurmanji 37.00 43.00
173 kum kumy1244 кум. Kumyk Kum. Altaic Turkic 43.0 47.0
174 kv komi1267 коми Komi Komi Uralic Permic coordinates of Zyrian 64.05 54.95
175 kva bagv1239 куанад. Bagvalal Bagv. NE Caucasian Avar-Andic-Tsezic 42.40 46.10
176 kw corn1251 корн. Cornish Corn. Indo-European Celtic 50.5233 -4.18619
177 ky kirg1245 кирг. Kyrgyz Kyrg. Altaic Turkic 42.0 74.0
178 la lati1261 лат. Latin Lat. Indo-European Romance 41.9026 12.4502
179 lah west2386 ланда Lahnda Lahnda Indo-European Indic 30.09 75.35
180 la-x-late late1252 позднелат. Late Latin Late Lat. Indo-European Romance 41.9026 12.4502
181 lbe lakk1252 лак. Lak Lak NE Caucasian Lak 42.1328 47.0809
182 ldd luri1256 лур. Luri Luri Indo-European Iranian 10.059 9.59745
183 lez lezg1247 лезг. Lezgian Lezg. NE Caucasian Lezgic 41.5157 47.8951
184 liv livv1244 лив. Livonian Liv. Indo-European Baltic 57.566 22.0262
185 lrl lari1253 лар. Lari Lari Indo-European Iranian Glottolog Larestani 27.64 54.63
186 lt lith1251 лит. Lithuanian Lit. Indo-European Baltic 55.1429 23.9601
187 lt-x-dial lith1251 лит. (диал.) Lithuanian (dialectal) Lit. (dial.) Indo-European Baltic 55.1429 23.9601
188 lv latv1249 латыш. Latvian Latv. Indo-European Baltic 56.826108 24.309118
189 lzz lazz1240 чан. Laz Laz Kartvelian Kartvelian 41.5004 41.9096
190 man mand1436 мандинго Manding Mand. Mande Western Mande I assume this is Mandinka and not Manding in general 12.8165233333 -15.6539466667
191 mdf moks1248 мордовский (мокша) Moksha Mordvin Moksha Uralic Mordvin 54.1855 42.6728
192 mga midd1360 ср.ирл. Middle Irish MIr. Indo-European Celtic 53.22 -7.62
193 mis-x-khuri khur1237 хури Khuri Khuri Indo-European Iranian https://www.iranicaonline.org/articles/khur-oasis 33.78333333333333 55.083333333333336
194 mn mong1331 монг. Mongolian Mong. Altaic Mongolic coordinates of Halh 48.32 106.29
195 mn-x-uriankh alta1280 урянх. Uriankhai Uriankh. Altaic Mongolic seems to be Altai Uriankhai 48.2857 89.5001
196 mnc manc1252 манджурское Manchu Manchu Altaic Tungusic 47.31225 126.55713
197 mnj munj1244 пам. м. Munji Munji Indo-European Iranian 35.9321 70.9404
198 mns mans1269 манси Mansi Mansi Uralic Ugric = вогул. 61.14 62.40
199 mr mara1378 маратхи Marathi Marathi Indo-European Indic 17.93 76.67
200 myv erzy1239 мордовский (эрзя) Erzya Mordvin Erzya Uralic Mordvin 52.8548 45.3901
201 mzn maza1291 маз. Mazanderani Mazand. Indo-European Iranian 36.241 52.3009
202 nds nort2627 н.н.нем. Low German LGer. Indo-European Germanic 53.115373 12.391439
203 ne nepa1254 непал. Nepali Nep. Indo-European Indic used macrolanguage because it’s not clear what exactly Abaev refers to 28.0 85.0
204 nl dutc1256 нидерл. Dutch Dut. Indo-European Germanic 52.0 5.0
205 no norw1258 норв. Norwegian Nor. Indo-European Germanic 59.92 10.71
206 no-x-dial norw1258 норв. (диал.) Norwegian (dialectal) Nor. (dial.) Indo-European Germanic 59.92 10.71
207 nog noga1249 ног. Nogai Nog. Altaic Turkic 44.89776 43.1656
208 non oldn1244 др.сев. Old Norse ONor. Indo-European Germanic 63.42 10.38
209 non-x-is oldw1240 др.исл. Old Icelandic OIcel. Indo-European Germanic indicate the coordinates of Icelandic specifically 63.48 -19.02
210 ntz nata1252 натанзи Natanzi Natanzi Indo-European Iranian 33.4593 51.9538
211 nub oldn1245 нубийское Nubian Nub. Eastern Sudanic Nubian I assume Abaev cites Old Nubian 18.760713 31.748657
212 oc occi1239 прованс. Occitan Occ. Indo-European Romance probably Occitan; Abaev seems to call Franco-Provençal «фр. (прованс.)» 44.1415 6.82979
213 ofs oldf1241 др.фриз. Old Frisian OFris. Indo-European Germanic 53.35 6.8
214 oge oldg1234 др.груз. Old Georgian OGeorg. Kartvelian Kartvelian 41.604313 43.06151
215 ohu hung1274 ст.венг. Old Hungarian OHung. Uralic Ugric 46.9068585714 19.6555271429
216 oos oldo1234 ст.ос. Old Ossetic OOss. Indo-European Iranian 48.48 39.46
217 oru ormu1247 орм. Ormuri Orm. Indo-European Iranian 32.6819 69.3444
218 orv oldr1238 др.русск. Old Russian ORus. Indo-European Slavic 54.813 31.827
219 os osse1243 ос. Ossetic Oss. Indo-European Iranian I assume that when Abaev cites Ossetic, he cites modern Ossetic 42.98 44.61
220 os-x-digor digo1242 д. Digor Dig. Indo-European Iranian 43.158056 44.156944
221 os-x-iron iron1242 и. Iron Iron Indo-European Iranian 42.98 44.61
222 os-x-ksan iron1242 ксан. Ksan Ossetic Ksan. Indo-European Iranian add coordinates 42.98 44.61
223 os-x-south iron1242 ю. South Ossetic SOss. Indo-European Iranian add coordinates 42.98 44.61
224 osx olds1250 др.сакс. Old Saxon OSax. Indo-European Germanic 52.37 9.72
225 oui oldu1238 др.тюрк. Old Turkic OTurk. Altaic Turkic 42.85 89.53
226 pa panj1256 пенджаби Punjabi Punj. Indo-European Indic arbitrarily chose Eastern Panjabi for Glottolog 30.0368 75.6702
227 pal pahl1241 пехл. Middle Persian MPers. Indo-European Iranian 30.06 52.7
228 pal-x-pazend pahl1241 паз. Pazend Paz. Indo-European Iranian 30.06 52.7
229 pal-x-turfan pahl1241 пехл. турф. Turfan Pahlavi Pahl. Turf. Indo-European Iranian add coordinates 30.06 52.7
230 paq pary1242 парья Parya Parya Indo-European Indic 36.49 69.26
231 peo oldp1254 др.перс. Old Persian OPers. Indo-European Iranian 32.0 54.0
232 pgd gand1259 кхарошти Gandhari Gandh. Indo-European Indic 34.15 71.73
233 pi pali1273 пали Pali Pali Indo-European Indic 24.5271 82.251
234 pl poli1260 пол. Polish Pol. Indo-European Slavic 51.8439 18.6255
235 pl-x-old oldp1256 старопол. Old Polish OPol. Indo-European Slavic 51.8439 18.6255
236 pox pola1255 полабский Polabian Polab. Indo-European Slavic 52.00 14.00
237 pra midd1350 пракрит. Prakrit Prakr. Indo-European Indic Glottolog arbitrary 26.61 78.97
238 prc para1299 пар. Parachi Par. Indo-European Iranian 36.0432 70.8805
239 prg prus1238 др.прусс. Old Prussian OPrus. Indo-European Germanic 52.394 14.757
240 prn pras1239 прасунск. Prasun Pras. Indo-European Nuristani 35.42 70.92
241 prs dari1249 тадж. (кабули) Dari (Kabul) Dari (Kab.) Indo-European Iranian 31.0405 67.3593
242 ps nucl1276 афг. Pashto Pashto Indo-European Iranian I assign this to Nuclear Pashto in Glottolog because Wanetsi is separate 31.92 69.45
243 psh sout2671 пашан Pashai (?) Pashai Indo-European Iranian Glottolog arbitrary 34.8478 69.8734
244 pt port1283 порт. Portuguese Port. Indo-European Romance 39.91 -8.10
245 qwm cuma1241 куман. Cuman Cum. Altaic Turkic 45.00 34.08
246 ro roma1327 рум. Romanian Rom. Indo-European Romance 46.3913 24.2256
247 rom roma1329 цыг. Romani Romani Indo-European Indic arbitrarily chose Central Romani 48.20 20.31
248 ru russ1263 русск. Russian Rus. Indo-European Slavic 59.0 50.0
249 ru-x-argot russ1263 русск. (арго) Russian (argot) Rus. (argot) Indo-European Slavic 59.0 50.0
250 ru-x-arkh pomo1275 русск. (арх.) Russian (Arkhangelsk) Rus. (Arkh.) Indo-European Slavic 63.5 43.0
251 ru-x-astr sout2602 русск. (астрах.) Russian (Astrakhan) Rus. (Astr.) Indo-European Slavic 46.35 48.035
252 ru-x-dial russ1263 русск. (диал.) Russian (dialectal) Rus. (dial.) Indo-European Slavic 59.0 50.0
253 ru-x-don sout2602 русск. (донской говор) Russian (Don variety) Rus. (Don) Indo-European Slavic Novocherkassk 47.422222 40.093889
254 ru-x-kstr nort2597 русск. (кстр.) Russian (Kostroma) Rus. (Kostr.) Indo-European Slavic 57.768056 40.926944
255 ru-x-novg novg1241 русск. (новг.) Russian (Novgorod) Rus. (Novg.) Indo-European Slavic 58.433333 32.383333
256 ru-x-sib russ1263 русск. (сиб.) Russian (Siberian) Rus. (Sib.) Indo-European Slavic coordinates of Krasnoyarsk 56.0062 92.8712
257 ru-x-smlnsk russ1263 русск. (смол.) Russian (Smolensk) Rus. (Smol.) Indo-European Slavic add coordinates 59.0 50.0
258 ru-x-south sout2602 русск. (южн. диал.) Russian (southern dialects) Rus. (s.) Indo-European Slavic 45.05 41.983333
259 ru-x-tvr cent2343 русск. (твер.) Russian (Tver) Rus. (Tv.) Indo-European Slavic 56.8625 35.924167
260 ru-x-vldmr vlad1234 русск. (влад.) Russian (Vladimir) Rus. (Vlad.) Indo-European Slavic 56.083333 40.616667
261 ru-x-west russ1263 русск. (зап. диал.) Russian (Western dialects) Rus. (w.) Indo-European Slavic coordinates of Smolensk 54.782778 32.045278
262 rut rutu1240 рутул. Rutul Rut. NE Caucasian Lezgic 41.6187 47.3244
263 sa clas1258 скр. Sanskrit Sanskr. Indo-European Indic 20.0 77.0
264 sa-bauddha budd1234 др.инд. (будд.) Buddhist Sanskrit Sanskr. (Bud.) Indo-European Indic coordinates of Pali 24.53 82.25
265 sa-vaidika vedi1234 вед. Vedic Ved. Indo-European Indic 20.0 77.0
266 sah yaku1245 якут. Yakut Yak. Altaic Turkic 61.69744 133.98031
267 sbv sabi1245 саб. Sabine Sab. Indo-European Italic 43.54 13.46
268 sel selk1253 селькуп. Selkup Selk. Uralic Samoyedic 59.94 82.30
269 sem semi1276 семит. Semitic Sem. Afro-Asiatic Semitic coordinates of Imperial Aramaic 33.91 42.19
270 sga oldi1246 др.ирл. Old Irish OIrish Indo-European Celtic 53.22 -7.62
271 sgh shug1248 пам. ш. Shughni Shugh. Indo-European Iranian 37.5018 71.7925
272 sgh-x-bartang bart1238 пам. барт. Bartangi Bart. Indo-European Iranian 38.21974 72.11835
273 sgh-x-khufi khuf1238 хуф. Khufi Khufi Indo-European Iranian 37.8595 71.60373
274 sgh-x-oroshori oros1238 пам. ор. Roshorvi Rosh. Indo-European Iranian 38.38796 72.7418
275 sgr sang1315 сангисарское Sangsari Sangsari Indo-European Iranian 35.72 53.3
276 sgy sang1344 пам. сгл. Sanglechi Sangl. Indo-European Iranian 36.45 71.3
277 sgy-x-zebak zeba1237 пам. зеб. Zebaki Zeb. Indo-European Iranian may actually be a variety of Ishkashimi; coordinates of Zebak district 36.5469 71.3423
278 sh sout1528 сербо-хорв. Serbo-Croatian SCr. Indo-European Slavic 44.15 18.81
279 si sinh1246 синг. Sinhalese Sinh. Indo-European Indic 8.00 81.00
280 sk slov1269 словац. Slovak Slovak Indo-European Slavic 48.55 18.78
281 sl slov1268 слов. Slovenian Slovene Indo-European Slavic 46.2543 14.7766
282 sla slav1255 слав. Slavic Sl. Indo-European Slavic coordinates of Rusyn (roughly at the centre of historical Slavic territory) 48.72 22.96
283 smi saam1281 лопар. Saami Sami Uralic Saami coordinates of Kemi Saami 67.09 27.54
284 smi-x-sm saam1281 саам. Saami Sami Uralic Saami coordinates of Kemi Saami 67.09 27.54 Abaev used «лопар.» in the earlier volumes so these are viewed as distinct
285 smy semn1251 семнан. Semnani Semn. Indo-European Iranian 35.53 53.29
286 sog sogd1245 согд. Sogdian Sogd. Indo-European Iranian 39.7 66.983
287 sog-x-budd sogd1245 согд. будд. Buddhist Sogdian Sogd. Bud. Indo-European Iranian 39.7 66.983
288 sog-x-chr sogd1245 согд. христ. Christian Sogdian Sogd. Chr. Indo-European Iranian 39.7 66.983
289 sog-x-man sogd1245 согд. ман. Manichaean Sogdian Sogd. Man. Indo-European Iranian 39.7 66.983
290 sog-x-mugh sogd1245 согд. (Муг) Sogdian (Mugh) Sogd. (Mugh) Indo-European Iranian 39.7 66.983
291 sqj alba1267 алб. Albanian Alb. Indo-European Albanian coordinates of Northern Tosk 41.00 20.00
292 sr serb1264 серб. Serbian Serb. Indo-European Slavic 44.3238 21.9192
293 srh sari1246 пам. с. Sarikoli Sarik. Indo-European Iranian 37.905 75.1449
294 sty tobo1250 тобол. Tobol Tatar Tobol Altaic Turkic 58.1896 68.2581
295 sty-x-brb bara1273 барабин. Baraba Tatar Baraba Altaic Turkic 55.05 82.95 coordinates of Novosibirsk
296 sux sume1241 шумер. Sumerian Sum. Sumerian Sumerian 31.3 45.6667
297 sv swed1254 швед. Swedish Swed. Indo-European Germanic 59.800634 17.389526
298 sv-x-dial swed1254 швед. (диал.) Swedish (dialectal) Swed. (dial.) Indo-European Germanic 59.800634 17.389526
299 sva svan1243 сван. Svan Sv. Kartvelian Kartvelian 42.9134 42.5915
300 syd samo1298 самодийское Samoyedic Sam. Uralic Samoyedic coordinates of Forest Enets 68.60 86.50
301 syd-x-south samo1298 южносамодийское South Samoyedic SSam. Uralic Samoyedic coordinates of Selkup 59.94 82.30
302 syr clas1252 сир. Syriac Syr. Afro-Asiatic Semitic 37.1129 42.1432
303 ta tami1289 тамил. Tamil Tam. Dravidian Dravidian 10.52 78.83
304 tab taba1259 табас. Tabassaran Tabas. NE Caucasian Lezgic 42.0198 47.8379
305 tg taji1245 тадж. Tajik Taj. Indo-European Iranian 38.8213 68.5549
306 tg-x-dial taji1245 тадж. (диал.) Tajik (dialectal) Taj. (dial.) Indo-European Iranian 38.8213 68.5549
307 tg-x-qrtg kara1511 тадж. (каратег.) Tajik (Qarategin) Taj. (Qarateg.) Indo-European Iranian coordinates of Rasht Valley 39.0863 70.7011
308 tg-x-se taji1245 тадж. (юго-восточные говоры) Tajik (South-Eastern varieties) Taj. (SE) Indo-European Iranian coordinates of Darwazi 38.32 70.76
309 tg-x-vanj taji1245 тадж. (вандж.) Tajik (Vanj) Taj. (Vanj) Indo-European Iranian add coordinates 38.8213 68.5549
310 tin tind1238 тинд. Tindi Tindi NE Caucasian Avar-Andic-Tsezic 42.33 45.92
311 tk turk1304 туркм. Turkmen Turkm. Altaic Turkic 37.08719 59.17574
312 tkr tsak1249 цахур. Tsakhur Tsakh. NE Caucasian Lezgic 41.5916 46.8858
313 tly taly1247 тал. Talyshi Tal. Indo-European Iranian 38.4552 48.6349
314 tr nucl1301 тур. Turkish Tr. Altaic Turkic 39.8667 32.8667
315 tr-x-anat anat1259 анат. Anatolian Turkish Anat. Altaic Turkic 39.87 32.87
316 tr-x-dial nucl1301 тур. (диал.) Turkish (dialectal) Tr. (dial.) Altaic Turkic 39.8667 32.8667
317 trk turk1311 тюрк. Turkic Turk. Altaic Turkic -99 -99
318 trk-x-east turk1311 восточнотюрк. East Turkic ETurk. Altaic Turkic I assume this is SE Turkic 40.89 69.21 coord of Uzbek
319 trk-x-mid turk1311 среднетюрк. Middle Turkic MTurk. Altaic Turkic -99 -99
320 trk-x-north turk1311 сев. тюрк. North Turkic NTurk. Altaic Turkic Unclear: Kipchak or Siberian? Coordinates of Bashkir, on the assumption that this refers to Kipchak 53.60 56.56
321 tt tata1255 татар. Tatar Tat. Altaic Turkic 55.79592 49.11577
322 tt-x-dial tata1255 татар. (диал.) Tatar (dialectal) Tat. (dial.) Altaic Turkic 55.79592 49.11577
323 tt-x-kazan kaza1250 казан. Kazan Tatar Kazan Altaic Turkic 55.796389 49.108889
324 ttt cauc1242 татск. Tat Tat Indo-European Iranian coordinates of Muslim Tat 41.43 46.65
325 txb tokh1243 тохар. B Tocharian B Toch. B Indo-European Tocharian 41.65 82.9
326 txh thra1250 фрак. Thracian Thrac. Indo-European Thracian 42.115469 24.711977
327 uby ubyk1235 убых. Ubykh Ub. NW Caucasian NW Caucasian 43.67 39.67
328 udi udii1243 удин. Udi Udi NE Caucasian Lezgic 40.9 47.7236
329 udm udmu1245 удм. Udmurt Udm. Uralic Permic 56.12921 52.63548
330 ug uigh1240 уйгур. Uyghur Uygh. Altaic Turkic 43.88 87.38
331 ug-x-kashgar kash1278 кашг. Kashgari Uyghur Kashg. Altaic Turkic 39.4681 75.9938
332 uk ukra1253 укр. Ukrainian Ukr. Indo-European Slavic 49.796 29.945
333 uk-x-gal ukra1253 укр. (галиц.) Ukrainian (Galician) Ukr. (Gal.) Indo-European Slavic 49.796 29.945
334 uk-x-west ukra1253 укр. (зап.) Ukrainian (western) Ukr. (w.) Indo-European Slavic 49.796 29.945
335 ur urdu1245 урду Urdu Urdu Indo-European Indic 25.00 67.00
336 uz uzbe1247 узб. Uzbek Uz. Altaic Turkic coordinates of Northern Uzbek (in Uzbekistan) 40.89 69.21
337 vep veps1250 вепс. Veps Veps Uralic Finnic 60.3353 34.7865
338 wbl wakh1245 пам. в. Wakhi Wakhi Indo-European Iranian 37.1768 73.9777
339 wen sorb1249 луж. Sorbian Sorb. Indo-European Slavic coordinates of Upper Sorbian 51.24 14.41
340 wep west2356 нем. (вестф.) Westphalic Westph. Indo-European Germanic 51.46 7.50
341 wne wane1241 ванеци Wanetsi Wan. Indo-European Iranian 30.0501 67.8327
342 wsv wota1240 вотапурско-катаркалайское Wotapuri-Katarqalai Wot.-Kat. Indo-European Indic 34.958246 71.090876
343 x-balochi balo1260 бел. Balochi Bal. Indo-European Iranian coordinates of Eastern Balochi 28.00 62.00
344 x-barakai 0 варакаи Barakai Barakai Indo-European Iranian cited in Tomaschek, but I cannot find any trace of this dialect in the sources. Probably not Pamir but W. Iranian -99 -99
345 x-dardic dard1244 дард. Dardic Dard. Indo-European Indic 34.96 72.93
346 x-mordvin mord1256 морд. Mordvinic Mord. Uralic Mordvin coordinates of Saransk 54.177 45.1833
347 x-nuristan nuri1243 кафир. Nuristani Nur. Indo-European Nuristani coordinates of Kalasha 35.19 70.99
348 x-oldirn iran1269 др.иран. Old Iranian OIr. Indo-European Iranian -99 -99
349 x-oldsl slav1255 др.слав. Old Slavic OSl. Indo-European Slavic -99 -99
350 x-pamir 0 пам. Pamir Pam. Indo-European Iranian coordinates of Gorno-Badakhshan 38 73
351 x-pamir-n 0 пам. н.?? Pamir Pam. Indo-European Iranian 38 73
352 x-rushani rush1239 пам. руш. Rushani Rush. Indo-European Iranian 38.07829 71.58549
353 x-sarm 0 сарм. Sarmatian Sarm. Indo-European Iranian coordinates of Volgograd (arbitrary) 48.707085 44.517016
354 x-tchr tokh1241 тохар. Tocharian Toch. Indo-European Tocharian coordinates of Tocharian B 41.65 82.90
355 x-vaynakh chec1244 вейнах. Vaynakh Vayn. NE Caucasian Nakh coordinates of Achkhoi-Martan 43.1813 45.2846
356 xal kalm1243 калм. Kalmyk Kalm. Altaic Turkic 46.566667 45.316667
357 xbc bact1239 кушан. Bactrian Bact. Indo-European Iranian 36.81 66.85
358 xbo bolg1250 булг. Bulgar Bulgar Altaic Turkic 48.671481 42.729234
359 xcl clas1249 арм. Armenian Arm. Indo-European Armenian 38.592316 41.346422
360 xco khwa1238 хорезм. Khwarezmian Khwar. Indo-European Iranian 41.68 60.75
361 xco-x-late khwa1238 позднехорезм. Late Khwarezmian LKhwar. Indo-European Iranian
362 xhu hurr1240 хурр. Hurrian Hurr. Hurro-Urartian Hurro-Urartian 40.7339 43.3154
363 xld lydi1241 лид. Lydian Lyd. Indo-European Anatolian 40 30
364 xln 0 алан. Alanic Alan. Indo-European Iranian coordinates of Arkhyz 43.5603 41.2798
365 xlu luvi1235 лув. Luwian Luw. Indo-European Anatolian cuneiform 38.00 36.00
366 xme 0 мид. Median Med. Indo-European Iranian 37 47
367 xmf ming1252 мегр. Mingerlian Ming. Kartvelian Kartvelian 42.5129 41.8719
368 xmn pahl1241 пехл. (маних.) Manichaean Middle Persian MPers. (Man.) Indo-European Iranian 30.06 52.7
369 xpg phry1239 фриг. Phrygian Phr. Indo-European Phrygian 39.613 31.28
370 xpr part1239 парф. Parthian Parth. Indo-European Iranian 37.052 56.056
371 xsc 0 скиф. Scythian Scyth. Indo-European Iranian coordinates of Lugansk 48.5763 39.3335
372 xtg tran1282 галл. Gaulish Gaul. Indo-European Celtic or Cisalpine? Glottolog Transalpine 43.97 3.3
373 xto tokh1242 тохар. A Tocharian A Toch. A Indo-European Tocharian 42.98 89.18
374 xtq tums1237 сак. (Тумшук) Tumshuqese Tumsh. Indo-European Iranian 39.866667 79.066667
375 xum umbr1253 умбр. Umbrian Umbr. Indo-European Italic 42.75 13.02
376 yah yazg1240 пам. язг. Yazgulyami Yazg. Indo-European Iranian 38.2801 71.565
377 yai yagn1238 ягн. Yaghnobi Yaghn. Indo-European Iranian 39.1486 69.2422
378 ydg yidg1240 пам. и. Yidgha Yid. Indo-European Iranian 36.014 71.5077
379 yrk nene1251 нен. Nenets Nen. Uralic Samoyedic coordinates of Tundra Nenets 66.18 71.02
380 ysc oldo1234 ясск. Jassic Jas. Indo-European Iranian 48.48 39.46
381 zh sini1245 кит. Chinese Chin. Sino-Tibetan Chinese 34.09 109.05
382 zkz 0 хазарск. Khazar Khaz. Altaic Turkic coordinates of Samosdelka (Itil site) 46.024 47.83975
383 zza zaza1246 заза Zazaki Zaz. Indo-European Iranian coordinates of Dimli 38.61 39.64

View file

@ -0,0 +1,30 @@
# Generate the lookup entries and the English and Russian
# standardized TEI
OPEN abaevdict
OPTIMIZE ALL
# the directory in parse-langnames
# may be incorrectly determined, check
RUN ../xq/parse-langnames.xq
RUN ../xq/make-lookup.xq
RUN ../xq/gen-lng-entries.xq
CLOSE
# Generate the HTML for faster page generation
RUN ../xq/gen-lng-html.xq
# Optimize the generated databases
OPEN abaevdict_en
OPTIMIZE ALL
CLOSE
OPEN abaevdict_ru
OPTIMIZE ALL
CLOSE
# Create mentioned indices
RUN ../xq/gen-mentioned-index.xq
# Optimize the index database
OPEN abaevdict_index
OPTIMIZE ALL
CLOSE

411
static/abaev-html.css Normal file
View file

@ -0,0 +1,411 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Universal
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Apply styling to all elements (including their `::before` and `::after`
pseudo-elements). One common use of this selector is to apply a custom
`box-sizing`. */
*, *::before, *::after {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Root
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
:root {}
html {}
body {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Content sectioning
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
h1, h2, h3, h4, h5, h6 {}
h1 {}
h2 {}
h3 {}
h4 {}
h5 {}
h6 {}
body > header {
position: sticky;
top: 0;
background: white;
border-bottom-width: thin;
border-bottom-style: solid;
padding-bottom: 0px !important;
padding-top: 0px !important;
padding-right: 1em !important;
padding-left: 1em !important;
/* color: #f1f1f1; */
}
nav {}
nav ul, nav ol {}
nav li {}
nav a {}
nav a:visited {}
nav a:hover {}
nav a:active {}
nav#entrylist {
height: 90%;
overflow-x: hidden;
overflow-y: scroll;
padding-left: 10px;
}
main {}
article.abv-entry {
display: grid;
grid-template-columns: minmax(0px,15%) 5% minmax(50%,80%);
align-items: baseline;
}
section {}
aside#leftbar {
/* The side navigation menu */
height: 100%; /* 100% Full-height */
width: 250px; /* 0 width - change this with JavaScript */
display: none;
position: fixed; /* Stay in place */
z-index: 1; /* Stay on top */
top: 0;
left: 0;
overflow-x: hidden; /* Disable horizontal scroll */
overflow-y: hidden;
padding-top: 0px; /* Place content 60px from the top */
background-color: #dcdcdc;
transition: 0.5s; /* 0.5 second transition effect to slide in the sidenav */
}
search {}
body > footer {
position: sticky;
bottom: 0;
background: white;
border-top-width: thin;
border-top-style: solid;
padding-top: 0px !important;
padding-bottom: 0px !important;
/* color: #f1f1f1; */
}
address {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Text block content
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Overall styling, e.g. vertical spacing */
p, ol, ul, pre, blockquote, figure, hr, dl {}
p {}
ol, ul {}
ol {}
ul {}
li {}
ol ol, ol ul, ul ul, ul ol {}
li li {}
pre {}
pre code {}
pre samp {}
blockquote {}
figure {}
figcaption {}
hr {}
dl {}
dt {}
dd {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Inline text semantics
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
a {}
a:visited {}
a:hover {}
a:active {}
strong {}
b {}
em {}
i {}
q {
quotes: "" "";
}
cite {}
s {}
mark {}
/* If you specify a font size, consider using the `em` unit so that it works
universally, e.g. for both `h1 small` and `p small` */
small {}
sub {}
sup {}
code {}
dfn {}
abbr {}
abbr[title] {}
var {}
kbd {}
kbd kbd {}
samp {}
u {}
data {}
time {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Demarcating edits
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
del {}
ins {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Embedded content
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
img {}
svg {}
video {}
canvas {}
audio {}
object {}
noscript {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Table content
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
table {}
caption {}
col:first-child {}
thead {}
tbody {}
tfoot {}
tr {}
th {}
td {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Forms
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
fieldset {}
fieldset:disabled {}
legend {}
form {}
label {}
::placeholder {}
:focus::placeholder {}
/* Overall styling, e.g. vertical spacing */
input, textarea, select, button {}
/* `textarea` and `input` elements that share a similar look and similar styling
capabilities */
/* - common styling */
textarea,
input[type="text"],
input[type="password"],
input[type="email"],
input[type="tel"],
input[type="number"],
input[type="search"],
input[type="url"],
input[type="date"],
input[type="datetime-local"],
input[type="month"],
input[type="week"],
input[type="time"] {}
/* - individual styling */
textarea {}
input[type="text"] {}
input[type="password"] {}
input[type="email"] {}
input[type="tel"] {}
input[type="number"] {}
input[type="search"] {}
input[type="url"] {}
input[type="date"] {}
input[type="datetime-local"] {}
input[type="month"] {}
input[type="week"] {}
input[type="time"] {}
/* Tick boxes */
input[type="checkbox"], input[type="radio"] {}
input[type="checkbox"]:checked, input[type="radio"]:checked {}
input[type="checkbox"] {}
input[type="checkbox"]:checked {}
input[type="radio"] {}
input[type="radio"]:checked {}
/* Other input fields, some with limited styling capabilities */
input[type="file"] {}
input[type="color"] {}
input[type="range"] {}
select {}
div.index {
display: grid;
grid-template-columns: 20% 20% 60%;
align-items: baseline;
}
div.index div {
height: 85vh;
}
div.index div select {
height: 90%;
overflow: scroll;
}
optgroup {}
option {}
option:checked {}
datalist {}
button,
input[type="submit"] {}
button:disabled,
input[type="submit"]:disabled {}
button.secondary {}
button.secondary:disabled {}
button#open-leftbar{
position: fixed;
top: 50vh;
left: 0;
/*height: 1ex;*/
/*line-height: 1ex;*/
/*width: 1em;*/
}
button#close-leftbar{
position: fixed;
top: 50vh;
left: 250px;
display: none;
}
/* This matches forms or form elements that are invalid *and* have been
interacted with. Note that:
1) You may need to add the `interacted` class to forms yourself
2) You may need to add the `touched` class to form fields yourself
3) `:user-invalid` is a working draft and not yet supported by most browsers
4) `:-moz-ui-invalid` is non-standard and only works in Firefox
Form validation error messages will appear (in capable browsers) regardless of
this styling. You can omit 1) and 2) and still have working forms. Perfect
example of progressive enhancement. */
/* Applies to invalid forms */
form.interacted:invalid {}
/* Applies to invalid form fields. You would need to repeat your declarations
for the following three groups of selectors individually. Browsers completely
ignore any rule that contains a selector they do not know. */
form.interacted :invalid, form .touched:invalid {}
:user-invalid {}
:-moz-ui-invalid {}
output {}
progress {}
meter {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Interactive elements
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
details {}
details[open] {}
summary {}
details[open] summary {}
dialog {}
dialog::backdrop {}
dialog#modal_map > article {
width: 75vw !important;
height: 85vh !important;
max-width: 75vw !important;
max-height: 85vh !important;
}
/* Some form fields, `details`, elements with `tabindex`, and possibly other
elements can be focussed. You should use `:focus-visible` instead of `:focus`
whenever possible. As the former is not yet widely supported, you need to do it
as follows:
1) Set styling on focus
2) If browser supports `:focus-visible`, revert/unset the styling from 1)
3) If the element matches `:focus-visible`, apply the styling again */
:focus {}
:focus:not(:focus-visible) {}
:focus-visible {}
[inert], [inert] * {}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Media queries
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
@media (prefers-reduced-motion: reduce) {
}
@media (prefers-color-scheme: dark) {
}
@media (orientation: portrait) {
}
@media (orientation: landscape) {
}
@media print {
}
/* CUSTOM: SPANS */
span.abv-text-ul {
text-decoration-line: underline;
}
span.abv-text-sc {
font-variant-caps: small-caps;
}
/*
This file evolved from Natural Selection:
https://github.com/frontaid/natural-selection
*/

61
static/abaev-index.js Normal file
View file

@ -0,0 +1,61 @@
$( document ).ready(function() {
$('#abv-select-lang').on('input', function() {
let $selected = $(this).children('option:selected');
let url = `../api/languages/${$selected.attr('value')}`;
fetch(url)
.then(res => res.json())
.then(out => {
let $select_word = $('#abv-select-word');
let $select_entry = $('#abv-select-entry');
$select_word.empty();
$select_entry.empty();
for (w of out.words) {
$select_word.append(new Option(w.text,w.id))
}
})
.catch(err => console.log(err));
});
$('#abv-select-word').on('input', function() {
let $selected = $(this).children('option:selected');
let wordid = $selected.attr('value');
let lang = $('#abv-select-lang').children('option:selected').attr('value');
let url = `../api/languages/${lang}/words/${wordid}`;
fetch(url)
.then(res => res.json())
.then(out => {
let $select_entry = $('#abv-select-entry');
$select_entry.empty();
for (e of out.entries) {
url_entry = `../api/entries/${e.id}`;
fetch(url_entry)
.then(res => res.json())
.then(out => {
let entrystring = out.form;
let glosses = [];
for (r of e.refs) {
if (r.glosses) {
for(g of r.glosses){
glosses.push(g);
}
}
}
if(glosses.length > 0) {
entrystring += ` (${glosses.join('; ')})`
}
$select_entry.append(new Option(entrystring,out.xmlid))
})
.catch(err => console.log(err));
}
})
.catch(err => console.log(err));
});
$('#abv-select-entry').on("dblclick", function() {
let $selected = $(this).children('option:selected');
let $entry = $selected.attr('value');
window.location.replace('../dict/' + $entry);
});
});

171
static/abaev.js Normal file
View file

@ -0,0 +1,171 @@
$( document ).ready(function() {
function bindMapOpen() {
// $('#modal_map').data('abv-entry',$(this).data('abv-entry'));
// $('#modal_map')[0].showModal();
let url = `../dict/map-info/${$(this).data('abv-entry')}`;
fetch(url)
.then(res => res.json())
.then(out => {
$('#modal_map').data('map',out);
$('#modal_map')[0].showModal();
})
.catch(err => console.log(err));
}
// Event to open map modal. We have to bind it
// when the button is shown, otherwise it will
// not work for newly loaded entries.
$('.abv-map').on("click", bindMapOpen);
// init Infinite Scroll
$('main').infiniteScroll({
path: '.pagination__next',
append: '.abv-entry',
//status: '.scroller-status',
//hideNav: '.pagination',
});
$('main').on( 'append.infiniteScroll', function( event, body, path, response ) {
$('.abv-map').on("click", bindMapOpen);
});
// If the hash is on the page, scroll a little bit above to account for top nav height
if ( $(decodeURI(document.location.hash)).length > 0) {
window.scrollBy(0,-$('header').height());
}
// If the hash is not on the page, go to the right page by using the ID interface
$( window ).on('hashchange', function() {
const hash = decodeURI(document.location.hash);
if ( hash.startsWith('#entry_') ) {
if ( $(hash).length == 0) {
window.location.replace(document.location.pathname + '/' + document.location.hash.substring(1));
}
else {
window.scrollBy(0,-$('header').height());
}
}
});
// Function to scroll the entry list to the selected entry OR to the first entry displayed on the current page if there is no hash in the URL
function scrollView() {
var $container = $('#entrylist')
if (document.location.hash.length > 0) {
var $scrollTo = $(`#link_${$(decodeURI(document.location.hash)).attr('id')}`);
}
else {
var $scrollTo = $(`#link_${$('article:first').attr('id')}`);
}
$container.scrollTop(
$scrollTo.offset().top - $container.offset().top + $container.scrollTop())
}
// Click to open the offcanvas entry list
$( '#open-leftbar' ).on('click', function() {
// $("#leftbar")[0].style.width = "250px";
$("#leftbar").show();
// $("#leftbar")[0].style.paddingLeft = "10px";
$("main")[0].style.marginLeft = "250px";
$("header")[0].style.marginLeft = "250px";
$("footer")[0].style.marginLeft = "250px";
$("#open-leftbar").hide();
$("#close-leftbar").show();
scrollView();
});
// Click to close the offcanvas entry list
$( '#close-leftbar' ).on('click', function() {
$("#leftbar").hide();
// $("#leftbar")[0].style.paddingLeft = null;
$("main")[0].style.marginLeft = null;
$("header")[0].style.marginLeft = null;
$("footer")[0].style.marginLeft = null;
$("#open-leftbar").show();
$("#close-leftbar").hide();
})
// Quick filter functionality
$('#filter-entries').on("keyup", function () {
var value = $(this).val().toLowerCase();
if (value.length > 1) {
$("#entrylist > ul > li").filter(function () {
return $(this).toggle($(this).children('a').text().toLowerCase().indexOf(value) > -1)
});
}
return false;
});
// Close map modal
$('.abv-close-map').on("click", function () {
$('#modal_map')[0].close();
});
// Load map data when dialog opens
$('#modal_map').on("toggle", function () {
map = document.getElementById('map_display');
var layout = {
// title: {
// text: 'Canadian cities',
// font: {
// family: 'Droid Serif, serif',
// size: 16
// }
// },
geo: {
scope: 'world',
resolution: 50,
fitbounds: 'locations',
showrivers: true,
rivercolor: '#fff',
showlakes: true,
lakecolor: '#fff',
showland: true,
landcolor: '#EAEAAE',
showcountries: false,
subunitcolor: '#d3d3d3'
}
};
Plotly.newPlot(map, [$(this).data('map')], layout);
// var data = [{
// type: 'scattergeo',
// mode: 'markers+text',
// text: [
// 'Montreal', 'Toronto', 'Vancouver', 'Calgary', 'Edmonton',
// 'Ottawa', 'Halifax', 'Victoria', 'Winnepeg', 'Regina'
// ],
// hovertext: 'HIMEM.SYS<br>EGAVGA.BGI',
// hoverinfo: 'text',
// lon: [
// -73.57, -79.24, -123.06, -114.1, -113.28,
// -75.43, -63.57, -123.21, -97.13, -104.6
// ],
// lat: [
// 45.5, 43.4, 49.13, 51.1, 53.34, 45.24,
// 44.64, 48.25, 49.89, 50.45
// ],
// marker: {
// size: 7,
// // color: [
// // '#bebada', '#fdb462', '#fb8072', '#d9d9d9', '#bc80bd',
// // '#b3de69', '#8dd3c7', '#80b1d3', '#fccde5', '#ffffb3'
// // ],
// line: {
// width: 1
// }
// },
// name: 'Canadian cities',
// textposition: [
// 'top right', 'top left', 'top center', 'bottom right', 'top right',
// 'top left', 'bottom right', 'bottom left', 'top right', 'top right'
// ],
// }];
});
});

6
static/chevron-left.svg Normal file
View file

@ -0,0 +1,6 @@
<!-- chevron-left icon by Free Icons (https://free-icons.github.io/free-icons/) -->
<svg xmlns="http://www.w3.org/2000/svg" height="1em" fill="currentColor" viewBox="0 0 512 512">
<path
d="M 126.86725663716814 249.20353982300884 Q 122.33628318584071 256 126.86725663716814 262.79646017699116 L 371.53982300884957 507.46902654867256 L 371.53982300884957 507.46902654867256 Q 378.3362831858407 512 385.13274336283183 507.46902654867256 Q 389.6637168141593 500.6725663716814 385.13274336283183 493.87610619469024 L 146.12389380530973 256 L 146.12389380530973 256 L 385.13274336283183 18.123893805309734 L 385.13274336283183 18.123893805309734 Q 389.6637168141593 11.327433628318584 385.13274336283183 4.530973451327434 Q 378.3362831858407 0 371.53982300884957 4.530973451327434 L 126.86725663716814 249.20353982300884 L 126.86725663716814 249.20353982300884 Z"
/>
</svg>

After

Width:  |  Height:  |  Size: 875 B

6
static/chevron-right.svg Normal file
View file

@ -0,0 +1,6 @@
<!-- chevron-right icon by Free Icons (https://free-icons.github.io/free-icons/) -->
<svg xmlns="http://www.w3.org/2000/svg" height="1em" fill="currentColor" viewBox="0 0 512 512">
<path
d="M 385.13274336283183 249.20353982300884 Q 389.6637168141593 256 385.13274336283183 262.79646017699116 L 140.46017699115043 507.46902654867256 L 140.46017699115043 507.46902654867256 Q 133.6637168141593 512 126.86725663716814 507.46902654867256 Q 122.33628318584071 500.6725663716814 126.86725663716814 493.87610619469024 L 365.87610619469024 256 L 365.87610619469024 256 L 126.86725663716814 18.123893805309734 L 126.86725663716814 18.123893805309734 Q 122.33628318584071 11.327433628318584 126.86725663716814 4.530973451327434 Q 133.6637168141593 0 140.46017699115043 4.530973451327434 L 385.13274336283183 249.20353982300884 L 385.13274336283183 249.20353982300884 Z"
/>
</svg>

After

Width:  |  Height:  |  Size: 877 B

14
static/infinite-scroll.pkgd.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
static/jquery-3.7.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6
static/map.svg Normal file
View file

@ -0,0 +1,6 @@
<!-- map icon by Free Icons (https://free-icons.github.io/free-icons/) -->
<svg xmlns="http://www.w3.org/2000/svg" height="1em" fill="currentColor" viewBox="0 0 512 512">
<path
d="M 160.88888888888889 57.77777777777778 Q 163.55555555555554 56.888888888888886 165.33333333333334 56.888888888888886 L 348.44444444444446 113.77777777777777 L 348.44444444444446 113.77777777777777 L 473.77777777777777 67.55555555555556 L 473.77777777777777 67.55555555555556 Q 488 63.111111111111114 499.55555555555554 71.11111111111111 Q 511.1111111111111 79.11111111111111 512 94.22222222222223 L 512 376 L 512 376 Q 511.1111111111111 395.55555555555554 493.3333333333333 402.6666666666667 L 351.1111111111111 455.1111111111111 L 351.1111111111111 455.1111111111111 Q 348.44444444444446 455.1111111111111 346.6666666666667 455.1111111111111 L 163.55555555555554 398.22222222222223 L 163.55555555555554 398.22222222222223 L 38.22222222222222 444.44444444444446 L 38.22222222222222 444.44444444444446 Q 24 448.8888888888889 12.444444444444445 440.8888888888889 Q 0.8888888888888888 432.8888888888889 0 417.77777777777777 L 0 136 L 0 136 Q 0.8888888888888888 116.44444444444444 18.666666666666668 109.33333333333333 L 160.88888888888889 57.77777777777778 L 160.88888888888889 57.77777777777778 Z M 24 122.66666666666667 Q 15.11111111111111 126.22222222222223 14.222222222222221 136 L 14.222222222222221 417.77777777777777 L 14.222222222222221 417.77777777777777 Q 14.222222222222221 424.8888888888889 20.444444444444443 429.3333333333333 Q 25.77777777777778 432.8888888888889 33.77777777777778 431.1111111111111 L 156.44444444444446 385.77777777777777 L 156.44444444444446 385.77777777777777 L 156.44444444444446 73.77777777777777 L 156.44444444444446 73.77777777777777 L 24 122.66666666666667 L 24 122.66666666666667 Z M 341.3333333333333 438.22222222222223 L 341.3333333333333 126.22222222222223 L 341.3333333333333 438.22222222222223 L 341.3333333333333 126.22222222222223 L 170.66666666666666 73.77777777777777 L 170.66666666666666 73.77777777777777 L 170.66666666666666 385.77777777777777 L 170.66666666666666 385.77777777777777 L 341.3333333333333 438.22222222222223 L 341.3333333333333 438.22222222222223 Z M 355.55555555555554 438.22222222222223 L 488.8888888888889 389.3333333333333 L 355.55555555555554 438.22222222222223 L 488.8888888888889 389.3333333333333 Q 496.8888888888889 385.77777777777777 497.77777777777777 376 L 497.77777777777777 94.22222222222223 L 497.77777777777777 94.22222222222223 Q 497.77777777777777 87.11111111111111 491.55555555555554 82.66666666666667 Q 486.22222222222223 79.11111111111111 479.1111111111111 80.88888888888889 L 355.55555555555554 126.22222222222223 L 355.55555555555554 126.22222222222223 L 355.55555555555554 438.22222222222223 L 355.55555555555554 438.22222222222223 Z"
/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

3879
static/plotly-3.0.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

264
xq/abv-mod.xqm Normal file
View file

@ -0,0 +1,264 @@
module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod';
declare namespace tei = "http://www.tei-c.org/ns/1.0";
declare namespace abv = "http://ossetic-studies.org/ns/abaevdict";
declare function abv-m:normalize-str($str as xs:string?)
as xs:string? {
$str => translate('&#xA;','') => normalize-space()
};
declare function abv-m:sortKey($word as xs:string)
as xs:string {
$word => replace('-','')
=> replace('\(','')
=> replace('\)','')
=> replace('́','') (: combining acute :)
=> replace('\*','')
=> replace('a','/')
=> replace('A', '/')
=> replace('ā', '/')
=> replace('Ā', '/')
=> replace('á', '/')
=> replace('Á', '/')
=> replace('ā́', '/')
=> replace('Ā́', '/')
=> replace('æ', '1')
=> replace('Æ', '1')
=> replace('ǽ', '1')
=> replace('Ǽ', '1')
=> replace('b', '2')
=> replace('B', '2')
=> replace('cʼ', '4')
=> replace('Cʼ', '4')
=> replace('c', '3')
=> replace('C', '3')
=> replace('d', '5')
=> replace('D', '5')
=> replace('ʒ', '6')
=> replace('Ʒ', '6')
=> replace('e', '7')
=> replace('E', '7')
=> replace('é', '7')
=> replace('É', '7')
=> replace('f', '8')
=> replace('F', '8')
=> replace('g[˳₀ₒ]', '9')
=> replace('G[˳₀ₒ]', '9')
=> replace('g', '9')
=> replace('G', '9')
=> replace('ǵ', '9')
=> replace('Ǵ', '9')
=> replace('ǧ[˳₀ₒ]', 'A')
=> replace('Ǧ[˳₀ₒ]', 'A')
=> replace('ǧ', 'A')
=> replace('Ǧ', 'A')
=> replace('i', 'B')
=> replace('I', 'B')
=> replace('í', 'B')
=> replace('Í', 'B')
=> replace('ī', 'B')
=> replace('Ī', 'B')
=> replace('ī́', 'B')
=> replace('Ī́', 'B')
=> replace('j', 'D')
=> replace('J', 'D')
=> replace('kʼ[˳₀ₒ]', 'F')
=> replace('Kʼ[˳₀ₒ]', 'F')
=> replace('kʼ', 'F')
=> replace('Kʼ', 'F')
=> replace('k[˳₀ₒ]', 'E')
=> replace('K[˳₀ₒ]', 'E')
=> replace('k', 'E')
=> replace('K', 'E')
=> replace('ḱʼ', 'F')
=> replace('Ḱʼ', 'F')
=> replace('ḱ', 'E')
=> replace('Ḱ', 'E')
=> replace('l', 'H')
=> replace('L', 'H')
=> replace('m', 'I')
=> replace('M', 'I')
=> replace('n', 'J')
=> replace('N', 'J')
=> replace('o', 'K')
=> replace('O', 'K')
=> replace('ó', 'K')
=> replace('Ó', 'K')
=> replace('pʼ', 'M')
=> replace('Pʼ', 'M')
=> replace('p', 'L')
=> replace('P', 'L')
=> replace('q[˳₀ₒ]', 'N')
=> replace('Q[˳₀ₒ]', 'N')
=> replace('q', 'N')
=> replace('Q', 'N')
=> replace('r', 'O')
=> replace('R', 'O')
=> replace('s', 'P')
=> replace('S', 'P')
=> replace('tʼ', 'R')
=> replace('Tʼ', 'R')
=> replace('t', 'Q')
=> replace('T', 'Q')
=> replace('u', 'S')
=> replace('U', 'S')
=> replace('ú', 'S')
=> replace('Ú', 'S')
=> replace('ū', 'S')
=> replace('Ū', 'S')
=> replace('ū́', 'S')
=> replace('Ū́', 'S')
=> replace('v', 'T')
=> replace('V', 'T')
=> replace('w', 'U')
=> replace('W', 'U')
=> replace('x[˳₀ₒ]', 'V')
=> replace('X[˳₀ₒ]', 'V')
=> replace('x', 'V')
=> replace('X', 'V')
=> replace('y', 'W')
=> replace('Y', 'W')
=> replace('ý', 'W')
=> replace('Ý', 'W')
=> replace('z', 'X')
=> replace('Z', 'X')
};
declare function abv-m:sort-collection($docs as document-node()+) {
sort($docs, (), function($d) {
abv-m:sortKey($d/tei:entry[1]/tei:form[1]/tei:orth[1]/text()[1]) })
};
declare function abv-m:sort-nodes($docs as node()+) {
sort($docs, (), function($d) {
abv-m:sortKey($d/text()) })
};
(: Apply XSL transformations to create a TEI-conformant <entry/> element,
or a sequence thereof :)
declare function abv-m:make-lng($src as document-node()+,
$lang as xs:string)
as node()+ {
for $doc in $src
let $del_lang := if ($lang = 'en') then 'ru' else 'en'
return ($doc => xslt:transform(doc('../xsl/strip-space.xsl'))
=> xslt:transform(doc('../xsl/delete-lang.xsl'),
{'lang': $del_lang})
=> xslt:transform(doc('../xsl/insert-refs.xsl'),
{'lookup-raw':
serialize(doc('abaevdict_index/lookup.xml')),
'biblio-raw':
serialize(doc('abaevdict_index/abaev_biblio.xml')),
'bib-lang': $lang})
=> xslt:transform(doc('../xsl/insert-langs.xsl'),
{'name-lang': $lang})
=> xslt:transform(doc('../xsl/standardize.xsl'),
{'standardize-lang': $lang})
=> xslt:transform(doc('../xsl/change-default-lang.xsl'),
{'default-lang': $lang}))/tei:TEI/tei:text/tei:body/tei:entry[1]
};
declare function abv-m:insert-full-lang($abbr as node(), $lang as xs:string) {
let $flang := tokenize($abbr/@data-lang,',')
return $abbr transform with {
insert node attribute title {
string-join(doc('abaevdict_index/langnames.xml')/csv[1]/record[code/text() = $flang]/*[name()=$lang]/text(),', ')
} as first into .
}
};
declare function abv-m:make-html($src as document-node()+,
$lang as xs:string)
as node()+ {
for $doc in $src
let $html := xslt:transform($doc,
doc('../xsl/abaev2html.xsl'), {'lang': $lang})
return $html transform with {for $abbr in //abbr
let $newabbr := abv-m:insert-full-lang($abbr,$lang)
return replace node $abbr with $newabbr}
};
(: Function to generate a map for each mentioned in a document,
to be later fed to a geo map :)
declare function abv-m:make-geomap($doc as document-node(), $lang as xs:string) {
(: let $id := $doc/tei:entry/@xml:id :)
let $list := for $mlang in distinct-values($doc//tei:mentioned[not(tei:mentioned)]/@xml:lang)
let $ment := $doc//tei:mentioned[not(tei:mentioned) and @xml:lang=$mlang][1]
let $linfo := doc(`abaevdict_index/langnames.xml`)/csv[1]/record[code/text() = $mlang]
where $mlang != 'os'
and not(starts-with($mlang,'os-'))
and $linfo/long[1] != '-99'
and $linfo/lat[1] != '-99'
and $ment[tei:w]
return {
'text': ($ment/tei:w/text())[1],
'hovertext': string($linfo/*[name()=$lang][1]/text()),
'lon': xs:float($linfo/long[1]),
'lat': xs:float($linfo/lat[1])
}
let $map := map:merge(({'type': 'scattergeo',
'mode': 'markers+text',
'hoverinfo': 'text',
'textposition': 'top center',
'marker': {'size': 7,
'line': {'width': 1}
}
},
for $k in map:keys($list[1])
let $seq := for $e in $list return $e($k)
return map:entry($k, array { $seq })))
return $map
};
declare function abv-m:langname-by-id($id as xs:string, $lang as xs:string) {
doc('abaevdict_index/langnames.xml')/csv[1]/record[code/text()=$id]/*[name()=$lang]/text()
};
declare function abv-m:entry-form-by-id($id as xs:string) {
doc(`abaevdict_index/lookup.xml`)/tei:table[1]/tei:entry[@xml:id=$id]/text()
};

12
xq/gen-lng-entries.xq Normal file
View file

@ -0,0 +1,12 @@
declare default element namespace "http://www.tei-c.org/ns/1.0";
declare namespace tei = "http://www.tei-c.org/ns/1.0";
declare namespace abv = "http://ossetic-studies.org/ns/abaevdict";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
let $langs := ('ru', 'en')
for $lang in $langs
for $doc in abv-m:make-lng(collection('abaevdict'), $lang)
let $id := $doc/@xml:id
return db:put(`abaevdict_{$lang}`, $doc, `xml/{$id}.xml`)

10
xq/gen-lng-html.xq Normal file
View file

@ -0,0 +1,10 @@
declare namespace tei = "http://www.tei-c.org/ns/1.0";
declare namespace abv = "http://ossetic-studies.org/ns/abaevdict";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
let $langs := ('ru', 'en')
for $lang in $langs
for $doc in abv-m:make-html(collection(`abaevdict_{$lang}/xml`), $lang)
return db:put(`abaevdict_{$lang}`, $doc, `html/{$doc/article[1]/@id}.html`)

115
xq/gen-mentioned-index.xq Normal file
View file

@ -0,0 +1,115 @@
declare namespace tei = "http://www.tei-c.org/ns/1.0";
declare namespace abv = "http://ossetic-studies.org/ns/abaevdict";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
declare function local:get-gloss($ment as node())
as xs:string* {
if (name($ment) = 'mentioned') then (
if (count($ment/tei:gloss) > 0)
then $ment/tei:gloss/tei:q/text()
else local:get-gloss($ment/..)
)
else ()
};
declare function local:get-ment($ment as node(), $id as xs:string)
as map(xs:string, map(xs:string, map(xs:string, item()*)))* {
for $w in $ment/tei:w/text()
return map{$w : map{$id :
map {'gloss': local:get-gloss($ment),
'node': db:node-id($ment) }
}
}
};
declare variable $metalang external := 'en';
let $docs := collection(`abaevdict_{$metalang}/xml`)
(: let $docs := doc(`abaevdict_{$metalang}/xml/entry_mad.xml`) :)
(: Create sequence of isolated indices for each entry :)
let $langs-seq := for $doc in $docs
let $ments := $doc//tei:mentioned[tei:w]
let $id := $doc/tei:entry[1]/@xml:id
for $ment in $ments
return map:build($ment, keys := fn {./@xml:lang },
value := fn { local:get-ment(., $id) } )
(: Merge these sequences into one, creating a list containing duplicates :)
let $langs-merged := map:merge($langs-seq, {'duplicates': 'combine'})
(: For each word, merge occurrence information :)
let $langs-index := map:merge(
for $lang in map:keys($langs-merged)
let $words := map:merge($langs-merged($lang),
{'duplicates': 'combine'}
)
let $words-m := map:merge(for $w in map:keys($words)
return {$w: map:merge($words($w),
{'duplicates': 'combine'}
)})
return {$lang: $words-m}
)
(: Now we have to go through these languages and merge duplicates
for each of them :)
(: let $lang-index := map:merge(
for $lang in map:keys($langs-merged)
let $linfo := map:merge($langs-merged($lang),
{'duplicates': 'combine'})
let $linfo-m := map:merge(
for $w in map:keys($linfo)
return map{$w: {'entries':
distinct-values($winfo('entries')),
'glosses':
distinct-values($winfo('glosses'))}}
)
return {$lang: $linfo-m}
) :)
(: return $langs-index :)
(: for $lang in map:keys($lang-index)
for $w in map:keys($lang-index($lang))
where count($lang-index($lang)($w)('entries')) > 1
return ($lang,$w, $lang-index($lang)($w)) :)
return
<lang-index>
{
for $lang in map:keys($langs-index)
let $words := $langs-index($lang)
order by abv-m:langname-by-id($lang, $metalang)
return
<lang id='{$lang}'>
{
for $w in map:keys($words)
let $wn := abv-m:normalize-str($w)
order by $wn
return
<word text="{$wn}">
{
for $e in map:keys($words($w))
return
<entry id="{$e}">
{
for $ref in $words($w)($e)
return
<ref node-id="{$ref('node')}">
{
for $g in $ref('gloss')
return
if ($g != '') then <gloss text="{$g}"/> else ()
}
</ref>
}
</entry>
}
</word>
}
</lang>
}
</lang-index>

24
xq/make-lookup.xq Normal file
View file

@ -0,0 +1,24 @@
declare default element namespace "http://www.tei-c.org/ns/1.0";
declare namespace tei = "http://www.tei-c.org/ns/1.0";
declare namespace abv = "http://ossetic-studies.org/ns/abaevdict";
declare function local:genLookupEntry($doc as document-node())
as element()?
{
let $node := $doc/tei:TEI/tei:text/tei:body/tei:entry
let $phon := $node/tei:form[1]/tei:orth[1]/text()[1]
return element entry {
attribute xml:id { $node/@xml:id },
attribute filename { db:path($doc) },
if ($node/@n) then attribute n {$node/@n} else (),
text { $phon }
}
};
let $tbl := <table>
{for $doc in collection('abaevdict')
return local:genLookupEntry($doc)}
</table>
return db:put('abaevdict_index', $tbl, 'lookup.xml')

4
xq/parse-langnames.xq Normal file
View file

@ -0,0 +1,4 @@
let $text := file:read-text('./basex/webapp/csv/langnames.csv')
return db:put('abaevdict_index',
csv:parse($text, { 'header': true() }),
'langnames.xml')

175
xq/restx_api.xq Normal file
View file

@ -0,0 +1,175 @@
declare namespace api = 'http://ossetic-studies.org/ns/abaevdict-api';
declare namespace tei = "http://www.tei-c.org/ns/1.0";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
(: ======================================================= :)
(: ==================== API STUFF ======================== :)
(: ======================================================= :)
declare option output:method 'json';
declare option output:json "format=xquery";
declare variable $langs-index := doc('abaevdict_index/langnames.xml');
declare variable $lookup := doc('abaevdict_index/lookup.xml');
(: Get the mentioned index for the right metalanguage :)
declare function api:ment-index($db-lang as xs:string) {
doc(`abaevdict_index/mentioned_{$db-lang}.xml`)
};
(: Short entry info (only forms for now). Hash is used because URLs don't handle
some Unicode characters very well in this system :)
declare function api:entry-info-short($n as node())
as map(xs:string, xs:string) {
map{'id': string(hash($n/@xml:id)), 'xmlid': $n/@xml:id, 'form': $n/text()}
};
(: Short language info -- for the language list :)
declare function api:lang-info-short($n as node(), $db-lang as xs:string) {
map{
'id': $n/code/text(),
'glottolog': $n/glottolog/text(),
'name': map{'full': if ($db-lang = 'ru') then $n/ru/text() else $n/en/text(),
'abbr': if ($db-lang = 'ru') then $n/ru/text() else $n/en_abbr/text()}
}
};
(: Longer info -- for individual languages :)
declare function api:lang-info-full($n as node(), $db-lang as xs:string) {
map:merge(
(api:lang-info-short($n, $db-lang),
map{'words':
array:build(api:ment-index($db-lang)/lang-index[1]/lang[@id=$n/code]/word,
api:word-info-short#1)
}
)
)
};
declare function api:word-info-short($n as node()) {
let $text := xs:string($n/@text)
return map{
(: I am using a hash function as ID, because the words are uniquely
identified within a language by their text. And the mentioned index is not
persistent enough (at least yet) to use persistent ids :)
'id': string(hash($text)),
'text': $text
}
};
declare function api:word-info-long($n as node()) {
map:merge(
(
api:word-info-short($n),
map{
'entries': array:build($n/entry,
fn {
map{'id': string(hash(./@id)),
'xmlid': string(./@id),
'refs': array:build(./ref,
fn {
map:merge((
map:entry('node-id', string(./@node-id)),
if(./gloss) then
{'glosses': array:build(distinct-values(./gloss/@text), string#1)}
else ()
)
)
})
}
}
)
(: 'nodes': array:build(string($n/ref/@node-id)),
'glosses': array:build(string($n/gloss/@text)) :)
}
)
)
};
(: RETURN JSON FOR PLOTLY MAP :)
(: English as default language :)
declare %rest:path("dict/map-info/{$entry}")
%rest:GET
function api:map-info($entry) {
(: In this case we do not redirect, but simply give the JSON via
another function :)
api:map-info('en', $entry)
};
(: This has to be remade to use the /api path. But keep it like this for now :)
declare %rest:path("{$lang}/dict/map-info/{$entry}")
%rest:GET
function api:map-info($lang, $entry) {
let $ments := abv-m:make-geomap(doc(`abaevdict_{$lang}/xml/{$entry}.xml`),
$lang)
return $ments
};
(: API FOR THE MENTIONED INDEX :)
(: Default to English :)
declare %rest:path("/api/{$path=.+}")
%rest:GET
function api:default($path as xs:string) {
web:forward(`/en/api/{$path}`)
};
(: Get languages :)
declare %rest:path("{$db-lang}/api/languages")
%rest:GET
function api:langs($db-lang as xs:string := 'en') {
array:build(
$langs-index/csv[1]/record,
api:lang-info-short(?,$db-lang)
)
};
(: Get one language :)
declare %rest:path("{$db-lang}/api/languages/{$lang}")
%rest:GET
function api:langs-lang($db-lang as xs:string, $lang as xs:string) {
api:lang-info-full(
$langs-index/csv[1]/record[code=$lang], $db-lang
)
};
(: Get words for a language :)
declare %rest:path("{$db-lang}/api/languages/{$lang}/words")
%rest:GET
function api:langs-lang-words($db-lang as xs:string, $lang as xs:string) {
array:build(api:ment-index($db-lang)/lang-index[1]/lang[@id=$lang]/word,
api:word-info-short#1)
};
(: Get info on a particular word.
Db-lang is a placeholder, it does nothing here, used only for consistency :)
declare %rest:path("{$db-lang}/api/languages/{$lang}/words/{$word-id}")
%rest:GET
function api:langs-lang-words-word($db-lang as xs:string,
$lang as xs:string,
$word-id as xs:string) {
api:word-info-long(
api:ment-index($db-lang)/lang-index[1]/lang[@id=$lang]/word[string(hash(@text))=$word-id]
)
};
(: Entry info (only form for now) :)
declare %rest:path("{$db-lang}/api/entries")
%rest:GET
function api:entries($db-lang as xs:string) {
array:build(
$lookup/tei:table[1]/tei:entry,
api:entry-info-short#1
)
};
declare %rest:path("{$db-lang}/api/entries/{$entry-id}")
%rest:GET
function api:entries($db-lang as xs:string,
$entry-id as xs:string) {
api:entry-info-short(
$lookup/tei:table[1]/tei:entry[string(hash(@xml:id))=$entry-id])
};
0

122
xq/restx_dict.xq.old Normal file
View file

@ -0,0 +1,122 @@
module namespace page = 'http://ossetic-studies.org/ns/abaevdict-site';
declare namespace tei = "http://www.tei-c.org/ns/1.0";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
declare variable $page:items as xs:integer := 20;
declare %rest:path("{$lang}/dict/page{$p}")
(: %rest:GET :)
%output:method("html")
%output:html-version('5')
function page:dict($lang, $p) {
let $pagetotal := ceiling(count(collection('abaevdict_en')) div $page:items)
let $sorted := abv-m:sort-collection(collection(`abaevdict_{$lang}`))
return
<html>
<head>
<script src="/static/jquery-3.7.1.min.js">
</script>
<script src="/static/infinite-scroll.pkgd.min.js">
</script>
<script src="/static/plotly-3.0.1.min.js" charset="utf-8"></script>
<script src="/static/abaev.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"/>
<link rel="stylesheet" href="{web:create-url('/static/abaev-html.css')}"/>
<title>Abaev</title>
</head>
<body>
<header>
<nav>
<ul>
<li><strong>Abaevdict</strong></li>
</ul>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Dictionary</a></li>
<li><a href="#">Index</a></li>
<li><a href="#">References</a></li>
</ul>
</nav>
</header>
<button id="open-leftbar">
{html:doc('../static/chevron-right.svg')}
</button>
<button id="close-leftbar">
{html:doc('../static/chevron-left.svg')}
</button>
<aside id="leftbar">
<input type="text" id="filter-entries" placeholder="Quick filter…"/>
<nav id="entrylist">
<ul>
{for $doc in $sorted
return <li id="link_{$doc/tei:entry[1]/@xml:id}">
<a href="by-id/{$doc/tei:entry[1]/@xml:id}">
{$doc/tei:entry[1]/tei:form[1]/tei:orth[1]/text()}
</a>
</li>
}
</ul>
</nav>
</aside>
<main>
{for $doc at $i in $sorted
where $i > ($p - 1) * $page:items and $i <= $p * $page:items
let $html := xslt:transform($doc,
doc('../xsl/abaev2html.xsl'), {'lang': $lang})
return $html}
</main>
<footer>
<nav class="pagination">
<ul>
<li>
{if ($p > 1) then <a href="page{$p - 1}">Previous page</a> else ()}
</li>
</ul>
<!-- <ul><li>Page {$p} of {$pagetotal}</li></ul> -->
<ul>
<li>
{if ($p < $pagetotal) then
<a class="pagination__next" href="page{$p + 1}">Next page</a> else ()}
</li>
</ul>
</nav>
</footer>
<dialog id="modal_map">
<article>
<header><button class="abv-close-map" aria-label="Close" rel="prev"></button>
<p>Map</p>
</header>
<p>
<div id="map_display" style="width:100%;height:80%;"></div>
</p>
<footer><button class="abv-close-map">Close</button></footer>
</article>
</dialog>
</body>
</html>
};
declare %rest:path("{$lang}/dict/by-id/{$id}")
(: %rest:GET :)
%output:method("html")
%output:html-version('5')
function page:by-id($lang, $id) {
let $seq := abv-m:sort-collection(collection(`abaevdict_{$lang}`))
let $doc-index := index-of($seq, $seq[tei:entry[@xml:id=`{$id}`]])
let $pagenum := ceiling($doc-index div $page:items)
return web:redirect(`../page{$pagenum}`, {}, web:decode-url($id))
};
declare %rest:path("{$lang}/dict/map-info/{$entry}")
%rest:produces("application/json")
%rest:GET function page:map-info($lang, $entry) {
let $ments := abv-m:make-geomap(doc(`abaevdict_{$lang}/{$entry}.xml`),
$lang)
return json:serialize($ments, {'format': 'xquery'})
};

219
xq/restx_dict_cached.xq Normal file
View file

@ -0,0 +1,219 @@
module namespace page = 'http://ossetic-studies.org/ns/abaevdict-site';
declare namespace tei = "http://www.tei-c.org/ns/1.0";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
(: =========================================================== :)
(: ================== GLOBAL VARIABLES ======================= :)
(: =========================================================== :)
(: Number of items per page :)
declare variable $page:items as xs:integer := 20;
(: These variables are declared in module scope because they are needed in
different places, but they are still dynamically evaluated :)
declare variable $page:lookup := doc('abaevdict_index/lookup.xml')/tei:table/tei:entry;
declare variable $page:total := ceiling(count($page:lookup) div $page:items);
declare variable $page:sorted := abv-m:sort-nodes($page:lookup);
(: =============================================================== :)
(: ======================= COMMON STUFF ========================== :)
(: =============================================================== :)
declare function page:head($title as xs:string, $script as node()* := ()) {
<head>
<script src="/static/jquery-3.7.1.min.js">
</script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"/>
<link rel="stylesheet" href="{web:create-url('/static/abaev-html.css')}"/>
{$script}
<title>{$title}</title>
</head>
};
(: Navigation header :)
declare function page:header() {
<header>
<nav>
<ul>
<li><strong>Abaevdict</strong></li>
</ul>
<ul>
<li><a href="./home">Home</a></li>
<li><a href="./dict">Dictionary</a></li>
<li><a href="./index">Index</a></li>
<li><a href="#">References</a></li>
</ul>
</nav>
</header>
};
(: =============================================================== :)
(: ======================= THE PAGES ============================= :)
(: =============================================================== :)
(: If no language defined, default to English :)
declare %rest:path("dict")
%output:method("html")
%output:html-version('5')
function page:dict() {
web:forward('/en/dict')
};
(: The main dictionary view :)
declare %rest:path("{$lang}/dict")
%rest:query-param("page","{$p}", 1)
%output:method("html")
%output:html-version('5')
function page:dict($lang, $p) {
<html>
{page:head('HEDO Dictionary',
(<script src="/static/infinite-scroll.pkgd.min.js">
</script>,
<script src="/static/plotly-3.0.1.min.js" charset="utf-8"></script>,
<script src="/static/abaev.js"></script>))}
<body>
{page:header()}
<!-- Sidebar with entry list -->
<button id="open-leftbar">
{html:doc('../static/chevron-right.svg')}
</button>
<button id="close-leftbar">
{html:doc('../static/chevron-left.svg')}
</button>
<aside id="leftbar">
<input type="text" id="filter-entries" placeholder="Quick filter…"/>
<nav id="entrylist">
<ul>
{for $doc in $page:sorted
return <li id="link_{$doc/@xml:id}">
<a href="./dict/{$doc/@xml:id}">
{$doc/text()}
</a>
</li>
}
</ul>
</nav>
</aside>
<!-- The dictionary itself. The entries are displayed as articles retrieved
from the database in HTML. On-the-fly generation is only when required -->
<main>
{for $doc at $i in $page:sorted
where $i > ($p - 1) * $page:items and $i <= $p * $page:items
let $html := doc(`abaevdict_{$lang}/html/{$doc/@xml:id}.html`)
return $html}
</main>
<!-- Footer for page navigation -->
<footer>
<nav class="pagination">
<ul>
<li>
{if ($p > 1) then <a href="?page={$p - 1}">Previous page</a> else ()}
</li>
</ul>
<!-- <ul><li>Page {$p} of {$page:total}</li></ul> -->
<ul>
<li>
{if ($p < $page:total) then
<a class="pagination__next" href="?page={$p + 1}">Next page</a> else ()}
</li>
</ul>
</nav>
</footer>
<!-- Modal for map display -->
<dialog id="modal_map">
<article>
<header><button class="abv-close-map" aria-label="Close" rel="prev"></button>
<p>Map</p>
</header>
<p>
<div id="map_display" style="width:100%;height:80%;"></div>
</p>
<footer><button class="abv-close-map">Close</button></footer>
</article>
</dialog>
</body>
</html>
};
(: == ENTRY BY ID == :)
(: English as default language :)
declare %rest:path("dict/{$id}")
%output:method("html")
%output:html-version('5')
function page:by-id($id) {
page:by-id('en',$id)
};
declare %rest:path("{$lang}/dict/{$id}")
%output:method("html")
%output:html-version('5')
function page:by-id($lang, $id) {
let $doc-index := index-of($page:sorted, $page:sorted[@xml:id=`{$id}`])
let $pagenum := ceiling($doc-index div $page:items)
return web:redirect('../dict', {'page': $pagenum}, web:decode-url($id))
};
(: Mentioned index :)
declare %rest:path("{$lang}/index")
%output:method("html")
%output:html-version('5')
function page:index($lang) {
let $mlangs := doc(`abaevdict_index/langnames.xml`)/csv[1]/record
return
<html>
{page:head('HEDO Index', <script src="/static/abaev-index.js"></script>)}
<body>
{page:header()}
<main>
<div class="index">
<div class="langs">
<label>Languages</label>
<select id="abv-select-lang" size="99999">
{
for $mlang in $mlangs
let $mlang-id := $mlang/code/text()
let $mlang-name := if ($lang = 'ru') then $mlang/ru/text() else $mlang/en/text()
where $mlang-name != ''
return
<option value="{$mlang-id}">
{
$mlang-name
}
</option>
}
</select>
</div>
<div class="forms">
<Label>Forms</Label>
<select id="abv-select-word" size="99999">
</select>
</div>
<div class="entries">
<Label>Entries</Label>
<select id="abv-select-entry" size="99999">
</select>
</div>
</div>
</main>
</body>
</html>
};
(: Default to English :)
declare %rest:path("index")
%output:method("html")
%output:html-version('5')
function page:index() {
page:index('en')
};

60
xq/test.xq Normal file
View file

@ -0,0 +1,60 @@
declare namespace tei = "http://www.tei-c.org/ns/1.0";
declare namespace abv = "http://ossetic-studies.org/ns/abaevdict";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at './abv-mod.xqm';
let $doc := db:get('abaevdict_en','/xml/entry_az.xml')
return string(abv-m:make-html($doc, 'ru')/article[1]/@id)
(: let $nid := db:node-id($doc/tei:entry[1]/tei:note[1]) :)
(: return $nid :)
(: return xquery:eval('declare namespace tei = "http://www.tei-c.org/ns/1.0";//tei:note',{'': $doc}) :)
(: abv-m:make-html(doc('abaevdict_en/xml/entry_sæpp.xml'), 'en') :)
(: db:node-id(db:get-id('abaevdict_index',1307388)) :)
(: import module namespace api = 'http://ossetic-studies.org/ns/abaevdict-api' at './restx_api.xq'; :)
(: abv-m:make-html(doc('abaevdict_en/xml/entry_az.xml')//tei:mentioned,'en') :)
(: abv-m:langname-by-id('inc-x-old-vaidika','en') :)
(: SERIALIZE AS JSONML :)
(: json:serialize(doc('abaevdict_index/mentioned.xml'), {'format': 'jsonml'}) :)
(: GENERATE MENTIONED INDEX :)
(: let $langs := ('en', 'ru')
for $lang in $langs
let $index := xquery:eval(xs:anyURI('gen-mentioned-index.xq'), {'metalang': $lang})
return db:put('abaevdict_index', $index, `mentioned_{$lang}.xml`) :)
(: GENERATE ENGLISH/RUSSIAN TEI FOR ONE ENTRY :)
(: let $langs := ('en','ru')
for $lang in $langs
for $doc in abv-m:make-lng(doc('abaevdict/abaev_-ston.xml'), $lang)
let $id := $doc/@xml:id
return db:put(`abaevdict_{$lang}`, $doc, `xml/{$id}.xml`) :)
(: GENERATE HTML FOR ONE ENTRY :)
(: let $langs := ('en','ru')
for $lang in $langs
let $doc := abv-m:make-html(doc(`abaevdict_{$lang}/xml/entry_-ston.xml`), $lang)
let $id := $doc/article[1]/@id
return db:put(`abaevdict_{$lang}`, $doc, `html/{$id}.html`) :)
(: TEST HTML GEN :)
(: abv-m:make-html(doc('abaevdict_en/xml/entry_abūxyn.xml'),'en') :)
(: GENERATE ENGLISH/RUSSIAN HTML :)
(: for $doc in abv-m:make-html(collection('abaevdict_ru/xml'), 'ru')
return db:put('abaevdict_ru', $doc, `html/{$doc/article[1]/@id}.html`) :)
(: TEST GEOMAP FOR ONE ENTRY :)
(: let $doc := doc('abaevdict_en/entry_maryn.xml')
return abv-m:make-geomap($doc,'en') :)
(: PARSE CSV OF LANGNAMES. IF I WILL EVER NEED IT :)
(: let $text := file:read-text('./basex/webapp/csv/langnames.csv')
return db:put('abaevdict_index',
csv:parse($text, { 'header': true() }),
'langnames.xml') :)

322
xsl/abaev2html.xsl Normal file
View file

@ -0,0 +1,322 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="2.0">
<xsl:output method="xml"/>
<!-- Which language we are using for the final output -->
<xsl:param name="lang"/>
<!-- Function that recursively produces a sequence of languages -->
<xsl:function name="abv:getlangs" as="xs:string+">
<xsl:param name="node" as="node()"/>
<xsl:choose>
<xsl:when test="$node/@xml:lang">
<xsl:sequence select="($node/@xml:lang, tokenize($node/@extralang,','))"/>
<!-- <xsl:value-of select="($node/@xml:lang,$node/@extralang)"/> -->
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="abv:getlangs($node/..)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:template match="tei:entry">
<xsl:variable name="entry-id" select="@xml:id"/>
<xsl:element name="article">
<xsl:attribute name="id" select="$entry-id"/>
<xsl:attribute name="lang" select="$lang"/>
<xsl:attribute name="class">abv-entry</xsl:attribute>
<xsl:variable name="position">0</xsl:variable>
<!-- Split into two groups: the headword div and the rest -->
<xsl:for-each-group select="*" group-adjacent="self::tei:form or
(self::tei:pc and following-sibling::*[1][self::tei:form])">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<h6 class="abv-headword">
<xsl:apply-templates select="current-group()"/>
<br/>
<a class="abv-map" href="#modal_map">
<xsl:attribute name="data-abv-entry" select="$entry-id"/>
<!-- map icon by Free Icons (https://free-icons.github.io/free-icons/) -->
<svg xmlns="http://www.w3.org/2000/svg" height="1em" fill="currentColor" viewBox="0 0 512 512">
<path
d="M 160.88888888888889 57.77777777777778 Q 163.55555555555554 56.888888888888886 165.33333333333334 56.888888888888886 L 348.44444444444446 113.77777777777777 L 348.44444444444446 113.77777777777777 L 473.77777777777777 67.55555555555556 L 473.77777777777777 67.55555555555556 Q 488 63.111111111111114 499.55555555555554 71.11111111111111 Q 511.1111111111111 79.11111111111111 512 94.22222222222223 L 512 376 L 512 376 Q 511.1111111111111 395.55555555555554 493.3333333333333 402.6666666666667 L 351.1111111111111 455.1111111111111 L 351.1111111111111 455.1111111111111 Q 348.44444444444446 455.1111111111111 346.6666666666667 455.1111111111111 L 163.55555555555554 398.22222222222223 L 163.55555555555554 398.22222222222223 L 38.22222222222222 444.44444444444446 L 38.22222222222222 444.44444444444446 Q 24 448.8888888888889 12.444444444444445 440.8888888888889 Q 0.8888888888888888 432.8888888888889 0 417.77777777777777 L 0 136 L 0 136 Q 0.8888888888888888 116.44444444444444 18.666666666666668 109.33333333333333 L 160.88888888888889 57.77777777777778 L 160.88888888888889 57.77777777777778 Z M 24 122.66666666666667 Q 15.11111111111111 126.22222222222223 14.222222222222221 136 L 14.222222222222221 417.77777777777777 L 14.222222222222221 417.77777777777777 Q 14.222222222222221 424.8888888888889 20.444444444444443 429.3333333333333 Q 25.77777777777778 432.8888888888889 33.77777777777778 431.1111111111111 L 156.44444444444446 385.77777777777777 L 156.44444444444446 385.77777777777777 L 156.44444444444446 73.77777777777777 L 156.44444444444446 73.77777777777777 L 24 122.66666666666667 L 24 122.66666666666667 Z M 341.3333333333333 438.22222222222223 L 341.3333333333333 126.22222222222223 L 341.3333333333333 438.22222222222223 L 341.3333333333333 126.22222222222223 L 170.66666666666666 73.77777777777777 L 170.66666666666666 73.77777777777777 L 170.66666666666666 385.77777777777777 L 170.66666666666666 385.77777777777777 L 341.3333333333333 438.22222222222223 L 341.3333333333333 438.22222222222223 Z M 355.55555555555554 438.22222222222223 L 488.8888888888889 389.3333333333333 L 355.55555555555554 438.22222222222223 L 488.8888888888889 389.3333333333333 Q 496.8888888888889 385.77777777777777 497.77777777777777 376 L 497.77777777777777 94.22222222222223 L 497.77777777777777 94.22222222222223 Q 497.77777777777777 87.11111111111111 491.55555555555554 82.66666666666667 Q 486.22222222222223 79.11111111111111 479.1111111111111 80.88888888888889 L 355.55555555555554 126.22222222222223 L 355.55555555555554 126.22222222222223 L 355.55555555555554 438.22222222222223 L 355.55555555555554 438.22222222222223 Z"
/>
</svg>
</a>
</h6>
</xsl:when>
<xsl:otherwise>
<!-- Further split into usg 9i.e. dialect marking) and rest -->
<xsl:for-each-group select="current-group()"
group-adjacent="self::tei:usg or (self::tei:pc and following-sibling::*[1][self::tei:usg])" composite="yes">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<div class="abv-usg">
<xsl:apply-templates select="current-group()"/>
</div>
</xsl:when>
<xsl:otherwise>
<!-- If there is no usg, create an empty div for correct
alignment -->
<xsl:if test="not(../tei:usg)">
<div class="abv-usg"></div>
</xsl:if>
<div class="abv-entrytxt">
<!-- Split main part into two paragraphs: examples and etym -->
<xsl:for-each-group select="current-group()"
group-adjacent="not(self::tei:etym)">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<p class="abv-mainpart">
<xsl:apply-templates select="current-group()"/>
</p>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
<!-- <div class="abv-usg">
<xsl:for-each select="tei:usg">
<xsl:apply-templates select="."/>
</xsl:for-each>
</div>
<div class="abv-entrytxt">
<p class="abv-mainpart">
<xsl:for-each select="*[not(self::tei:etym) and not(self::tei:form or self::tei:pc[following-sibling::*[1][self::tei:form]]) and not(self::tei:usg)]">
<xsl:apply-templates select="."/>
</xsl:for-each>
</p>
<xsl:apply-templates select="tei:etym"/>
</div> -->
</xsl:element>
</xsl:template>
<xsl:template match="tei:form/tei:orth">
<xsl:variable name="elem">
<xsl:choose>
<xsl:when test="ancestor::tei:cit[@type='formGrp']">i</xsl:when>
<xsl:otherwise>b</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$elem}">
<xsl:attribute name="class">abv-form</xsl:attribute>
<xsl:attribute name="lang" select="../@xml:lang"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:cit[@type='translationEquivalent']/tei:quote | tei:gloss/tei:q">
<xsl:element name="q">
<xsl:attribute name="class">abv-gloss</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:cit[@type='translation']/tei:quote">
<xsl:element name="q">
<xsl:attribute name="class">abv-tr</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:cit[@type='example']/tei:quote">
<xsl:element name="i">
<xsl:attribute name="class">abv-example</xsl:attribute>
<xsl:attribute name="lang" select="../@xml:lang"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:ref[@type='bibl']">
<xsl:element name="a">
<xsl:attribute name="class">abv-bibl</xsl:attribute>
<xsl:attribute name="href" select="@target"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:ref[@type='bibl']/tei:abbr">
<xsl:element name="abbr">
<xsl:attribute name="class">abv-bibl</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:ref[@type='xr' and not(tei:c | tei:m | tei:w | tei:phr | tei:s)]">
<xsl:element name="a">
<xsl:attribute name="href" select="@target"/>
<xsl:element name="i">
<xsl:choose>
<xsl:when test="../@xml:lang">
<xsl:attribute name="lang" select="../@xml:lang"/>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="lang">os</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="tei:ref[@type='xr']/tei:c | tei:ref[@type='xr']/tei:m | tei:ref[@type='xr']/tei:w | tei:ref[@type='xr']/tei:phr | tei:ref[@type='xr']/tei:s">
<xsl:element name="a">
<xsl:attribute name="href" select="../@target"/>
<xsl:element name="i">
<xsl:choose>
<xsl:when test="@xml:lang">
<xsl:attribute name="lang" select="@xml:lang"/>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="lang">os</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="tei:name | tei:author">
<xsl:element name="span">
<xsl:attribute name="class">abv-name</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:lang">
<xsl:element name="abbr">
<xsl:attribute name="class">abv-lang</xsl:attribute>
<xsl:attribute name="data-lang" select="string-join(abv:getlangs(.),',')"/>
<!-- <xsl:attribute name="title">#</xsl:attribute> TODO: Implement lookup table for full language names -->
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template name="make-word">
<xsl:element name="i">
<!-- If the element has its own language, or is part of a
mentioned, assign it a language. Otherwise, assign a special tag
that says that it is not really a linguistic object (e.g. an
abstract hypothetical form, phonetic sequence, etc.)-->
<xsl:choose>
<xsl:when test="../name() = 'mentioned' or @xml:lang">
<xsl:attribute name="lang" select="abv:getlangs(.)[1]"/>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="lang" select="'zxx'"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:c | tei:m | tei:w | tei:phr | tei:s">
<xsl:choose>
<xsl:when test="../name() = 'mentioned'">
<xsl:element name="a">
<xsl:attribute name="href">#</xsl:attribute>
<xsl:call-template name="make-word"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="make-word"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- If pc is empty, add one space -->
<xsl:template match="tei:pc[not(node())]">
<xsl:text> </xsl:text>
</xsl:template>
<!-- ETYMOLOGY -->
<xsl:template match="tei:etym">
<p class="abv-etym">
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="tei:oRef">
<xsl:element name="i">
<!-- If oRef has a language, select it, otherwise
use the entry language -->
<xsl:attribute name="lang">
<xsl:choose>
<xsl:when test="@xml:lang">
<xsl:value-of select="@xml:lang"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="ancestor::tei:entry/@xml:lang"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:lb">
<xsl:element name="br"/>
</xsl:template>
<xsl:template match="tei:hi">
<xsl:choose>
<xsl:when test="@rendition='#rend_italic'">
<em><xsl:apply-templates/></em>
</xsl:when>
<xsl:when test="@rendition='#rend_bold'">
<strong><xsl:apply-templates/></strong>
</xsl:when>
<xsl:when test="@rendition='#rend_underline'">
<span class="abv-text-ul"><xsl:apply-templates/></span>
</xsl:when>
<xsl:when test="@rendition='#rend_subscript'">
<sub><xsl:apply-templates/></sub>
</xsl:when>
<xsl:when test="@rendition='#rend_superscript'">
<sup><xsl:apply-templates/></sup>
</xsl:when>
<xsl:when test="@rendition='#rend_smallcaps'">
<span class="abv-text-sc"><xsl:apply-templates/></span>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- tables -->
<xsl:template match="tei:table">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="tei:row">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="tei:cell">
<td>
<xsl:apply-templates/>
</td>
</xsl:template>
<xsl:template match=
"text()">
<xsl:value-of select="replace(translate(., '&#xA;', ''), ' +', ' ')"/>
</xsl:template>
</xsl:stylesheet>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="2.0">
<xsl:param name="default-lang"/>
<!-- XSLT Template to copy anything -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tei:gloss | tei:note">
<xsl:copy>
<xsl:if test="not(@xml:lang)">
<xsl:attribute name="xml:lang">
<xsl:value-of select="$default-lang"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tei:lang[@xml:lang]">
<xsl:element name="tei:rs">
<xsl:attribute name="xml:lang"><xsl:value-of select="@xml:lang"/></xsl:attribute>
<xsl:element name="tei:lang">
<xsl:attribute name="xml:lang">
<xsl:value-of select="$default-lang"/>
</xsl:attribute>
<xsl:value-of select="node() | @*[not(name()='xml:lang')]"/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match=
"text()">
<xsl:value-of select="replace(translate(., '&#xA;', ''), ' +', ' ')"/>
</xsl:template>
</xsl:stylesheet>

30
xsl/delete-lang.xsl Normal file
View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="2.0">
<xsl:param name="lang"/>
<!-- XSLT Template to copy anything -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tei:etym|abv:tr|tei:def|tei:note|tei:bibl|tei:gram">
<xsl:choose>
<!-- <xsl:when test="lang($lang)"></xsl:when>-->
<xsl:when test="@xml:lang = $lang"></xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="tei:biblScope[@xml:lang=$lang]"></xsl:template>
</xsl:stylesheet>

33
xsl/insert-langs.xsl Normal file
View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="3.0">
<xsl:param name="name-lang"/>
<xsl:mode on-no-match="shallow-copy" />
<xsl:import href="lang-names.xsl"/>
<xsl:template match="tei:lang[not(text())]">
<xsl:variable name="lang-code" select="ancestor-or-self::*[attribute::xml:lang][1]/@xml:lang"/>
<xsl:copy>
<xsl:call-template name="lang-text">
<xsl:with-param name="lang-code" select="$lang-code"/>
<xsl:with-param name="name-lang" select="$name-lang"/>
</xsl:call-template>
<xsl:if test="parent::*/@extralang">
<xsl:for-each select="tokenize(parent::*/@extralang, ' ')">
<xsl:text>, </xsl:text>
<xsl:call-template name="lang-text">
<xsl:with-param name="lang-code" select="."/>
<xsl:with-param name="name-lang" select="$name-lang"/>
</xsl:call-template>
</xsl:for-each>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

79
xsl/insert-refs.xsl Normal file
View file

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="2.0">
<xsl:param name="lookup-raw"/>
<xsl:param name="biblio-raw"/>
<xsl:param name="bib-lang"/>
<xsl:variable name="lookup" select="parse-xml($lookup-raw)"/>
<xsl:variable name="biblio" select="parse-xml($biblio-raw)"/>
<!-- <xsl:variable name="random-doc" select="document('entries/abaev_lami.xml')"/>-->
<xsl:key name="xr" match="table/entry" use="@xml:id"/>
<!-- XSLT Template to copy anything -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tei:ref[@type = 'xr'][not(node())]">
<xsl:variable name="target" select="@target"/>
<xsl:variable name="entry" select="$lookup/tei:table/tei:entry[@xml:id = substring($target, 2)]"/>
<xsl:if test="not($entry)"><xsl:message>Cross-referenced entry <xsl:value-of select="$target"/> not found! Lemma <xsl:value-of select="ancestor::tei:entry/@xml:id"/></xsl:message></xsl:if>
<!-- <xsl:message><xsl:value-of select="$lookup"/></xsl:message>-->
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:if test="$entry/@n"><xsl:value-of xmlns:my="http://example.com/my" select="my:getN($entry/@n)"/></xsl:if><tei:w><xsl:value-of select="$entry/text()"/></tei:w>
</xsl:copy>
<!-- <xsl:message><xsl:value-of select="$random-doc/key('xr','entry_lami')"/></xsl:message>-->
</xsl:template>
<xsl:template match="tei:ref[@type = 'bibl'][not(node())]">
<xsl:variable name="target" select="@target"/>
<xsl:variable name="bibl" select="$biblio/tei:TEI/tei:text/tei:body/tei:div//tei:listBibl/tei:bibl[@xml:id = substring($target, 2)]"/>
<xsl:if test="not($bibl)"><xsl:message>Cross-referenced bibitem <xsl:value-of select="$target"/> not found! Lemma <xsl:value-of select="ancestor::tei:entry/@xml:id"/></xsl:message></xsl:if>
<!-- <xsl:message><xsl:value-of select="$lookup"/></xsl:message>-->
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:choose>
<xsl:when test="$bibl/tei:abbr[not(@xml:lang)]">
<xsl:copy-of select="$bibl/tei:abbr"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$bibl/tei:abbr[@xml:lang = $bib-lang]"/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
<!-- <xsl:message><xsl:value-of select="$random-doc/key('xr','entry_lami')"/></xsl:message>-->
</xsl:template>
<xsl:template match="tei:oRef[not(node())]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:copy-of select="ancestor::*[local-name() = 'entry' or local-name() = 're'][position() = 1]/tei:form[1]/tei:orth[1]/child::node()"/>
</xsl:copy>
</xsl:template>
<xsl:function xmlns:my="http://example.com/my" name="my:getN">
<xsl:param name="n"/>
<xsl:choose>
<xsl:when test="$n = 1">¹</xsl:when>
<xsl:when test="$n = 2">²</xsl:when>
<xsl:when test="$n = 3">³</xsl:when>
<xsl:when test="$n = 4"></xsl:when>
<xsl:when test="$n = 5"></xsl:when>
<xsl:when test="$n = 6"></xsl:when>
<xsl:when test="$n = 7"></xsl:when>
<xsl:when test="$n = 8"></xsl:when>
<xsl:when test="$n = 9"></xsl:when>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>

2304
xsl/lang-names.xsl Normal file

File diff suppressed because it is too large Load diff

354
xsl/standardize.xsl Normal file
View file

@ -0,0 +1,354 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="2.0">
<xsl:param name="standardize-lang"/>
<!-- NAMED TEMPLATES-->
<xsl:template name="defaultlang">
<xsl:if test="not(@xml:lang)">
<xsl:variable name="entrylang" select="ancestor::tei:entry/@xml:lang"/>
<xsl:choose>
<xsl:when test="$entrylang = 'os'">
<xsl:attribute name="xml:lang">os-x-iron</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="xml:lang" select="$entrylang"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
<!-- XSLT Template to copy anything -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Delete outdate elements-->
<xsl:template match="tei:encodingDesc|tei:tagsDecl">
</xsl:template>
<!-- The completeness attribute is to be used without namespace, to simplify styling.
For the purposes of conversion, delete it at present -->
<xsl:template match="@abv:completeness | @abv:status">
<!--<xsl:attribute name="completeness">
<xsl:value-of select="."/>
</xsl:attribute>-->
</xsl:template>
<!-- Replace these guys with placeholders, will fix later -->
<xsl:template match="tei:publicationStatement">
<xsl:element name="tei:publicationStatement">
<tei:p>PLACEHOLDER</tei:p>
</xsl:element>
</xsl:template>
<xsl:template match="tei:sourceDesc">
<xsl:element name="tei:sourceDesc">
<tei:p>PLACEHOLDER</tei:p>
</xsl:element>
</xsl:template>
<!-- Replace custom elements with TEI elements -->
<xsl:template match="abv:tr">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::tei:usg or self::tei:quote]">
<tei:pc><xsl:text> </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::abv:tr]">
<tei:pc><xsl:text>, </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
<xsl:element name="tei:cit">
<xsl:attribute name="type">
<xsl:choose>
<xsl:when test="parent::tei:sense">translationEquivalent</xsl:when>
<xsl:when test="parent::abv:example">translation</xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="abv:tr/tei:q">
<xsl:if test="preceding-sibling::*[1][self::tei:q]">
<tei:pc><xsl:text>, </xsl:text></tei:pc>
</xsl:if>
<xsl:element name="tei:quote">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="abv:example">
<xsl:choose>
<xsl:when test="parent::abv:formGrp and preceding-sibling::*[1][self::tei:form]">
<tei:pc><xsl:text>: </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="parent::tei:sense">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::abv:tr]">
<tei:pc><xsl:text>: </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::tei:sense]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="(parent::tei:sense or parent::abv:exampleGrp) and preceding-sibling::*[1][self::abv:example]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
<xsl:element name="tei:cit">
<xsl:attribute name="type">example</xsl:attribute>
<xsl:call-template name="defaultlang"/>
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="abv:exampleGrp">
<xsl:choose>
<xsl:when test="ancestor::tei:re[parent::tei:entry[child::tei:sense]]">
<tei:pc><xsl:text>: </xsl:text></tei:pc>
</xsl:when>
<xsl:otherwise><tei:pc>. — </tei:pc></xsl:otherwise>
</xsl:choose>
<xsl:element name="tei:dictScrap">
<xsl:apply-templates select="@*"/>
<xsl:if test="@n"><xsl:value-of select="@n"/><xsl:text>. </xsl:text></xsl:if>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:re[tei:re]">
<xsl:element name="tei:dictScrap">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<!-- FORMS AND FORM GROUPS -->
<xsl:template match="abv:formGrp">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::tei:sense or self::tei:re]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::tei:form] or (parent::tei:entry and preceding-sibling::*[1][self::abv:formGrp])">
<tei:pc><xsl:text>, </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::abv:exampleGrp]">
<tei:pc><xsl:text>. — </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
<xsl:element name="tei:cit">
<xsl:attribute name="type">formGrp</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="tei:form">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::tei:usg]">
<tei:pc><xsl:text> </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::tei:form[@xml:lang='os-x-iron']] and @xml:lang='os-x-digor'">
<tei:pc><xsl:text> | </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="(preceding-sibling::*[1][self::tei:orth] and (@type='variant' or @type='synonym')) or (preceding-sibling::*[1][self::tei:form] and parent::tei:form and @type = 'variant')">
<tei:pc><xsl:text>, </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::tei:orth or self::tei:form[@type = 'variant']] and @type='participle'">
<tei:pc><xsl:text> : </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
<xsl:if test="@subtype='parens'"><xsl:text>(</xsl:text></xsl:if>
<xsl:copy>
<xsl:if test="not(@xml:lang)">
<xsl:attribute name="xml:lang" select="ancestor::tei:entry/@xml:lang"/>
</xsl:if>
<xsl:apply-templates select="@*"/>
<xsl:if test="@type='rec'"><xsl:text>*</xsl:text></xsl:if>
<xsl:apply-templates select="node()"/>
</xsl:copy>
<xsl:if test="@subtype='parens'"><xsl:text>)</xsl:text></xsl:if>
</xsl:template>
<!-- WORDS ETC. -->
<xsl:template match="tei:w | tei:m | tei:c | tei:phr | tei:oRef">
<xsl:if test="preceding-sibling::*[1][@xml:lang='os-x-iron'] and @xml:lang='os-x-digor'"> <!-- THIS IS A HACK. MAYBE I'LL HAVE TO LIST THE TAG NAMES AFTER ALL -->
<tei:pc><xsl:text> | </xsl:text></tei:pc>
</xsl:if>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="@type='rec'"><xsl:text>*</xsl:text></xsl:if>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- Orth after lang or gram -->
<xsl:template match="tei:form/tei:orth[preceding-sibling::*[1][self::tei:lang or self::tei:gram]]">
<tei:pc><xsl:text> </xsl:text></tei:pc>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- USAGE NOTES -->
<xsl:template match="tei:usg">
<xsl:variable name="is_afterForm"><xsl:value-of select="boolean(preceding-sibling::*[1][self::tei:form or self::abv:formGrp])"/></xsl:variable>
<xsl:if test="$is_afterForm">
<tei:pc><xsl:text> </xsl:text></tei:pc>
</xsl:if>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="$is_afterForm">
<tei:pc><xsl:text>(</xsl:text></tei:pc>
</xsl:if>
<xsl:apply-templates select="node()"/>
<xsl:if test="$is_afterForm">
<tei:pc><xsl:text>)</xsl:text></tei:pc>
</xsl:if>
</xsl:copy>
</xsl:template>
<!-- SENSES -->
<xsl:template match="tei:sense">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::abv:formGrp or self::tei:re or self::tei:usg or self::tei:note]">
<tei:pc><xsl:text> </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="parent::tei:entry or parent::tei:re">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::tei:sense]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::tei:form]">
<tei:pc><xsl:text> </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="parent::tei:sense and preceding-sibling::*[1][self::tei:sense]">
<tei:pc><xsl:text>, </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="@n"><xsl:value-of select="@n"/>. </xsl:if>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- RELATED ENTRIES -->
<xsl:template match="tei:re">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::abv:formGrp]">
<tei:pc><xsl:text> </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="parent::tei:sense">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::tei:re] or preceding-sibling::*[1][self::tei:sense] or (preceding-sibling::*[1][self::abv:tr] and child::*[1][self::tei:form])">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::abv:tr] and child::*[1][self::tei:form]">
<tei:pc><xsl:text>: </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="parent::*[abv:tr] and preceding-sibling::*[1][self::tei:note]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="parent::tei:entry">
<xsl:choose>
<xsl:when test="preceding-sibling::*[self::tei:re and child::abv:exampleGrp]"><tei:pc><xsl:text>. — </xsl:text></tei:pc></xsl:when>
<xsl:when test="(preceding-sibling::*[1][self::tei:note] and child::*[1][self::tei:form]) or preceding-sibling::*[1][self::tei:sense or self::tei:re]"><tei:pc><xsl:text>; </xsl:text></tei:pc></xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="parent::tei:re">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::tei:re and child::abv:exampleGrp]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::tei:re]">
<tei:pc><xsl:text>, </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="preceding-sibling::*[1][self::abv:exampleGrp]">
<tei:pc><xsl:text>. — </xsl:text></tei:pc>
</xsl:when>
</xsl:choose>
<xsl:copy>
<xsl:call-template name="defaultlang"/>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- BIBLIO -->
<xsl:template match="abv:example/tei:bibl">
<xsl:choose>
<xsl:when test="preceding-sibling::*[self::tei:bibl]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:when>
<xsl:otherwise>
<tei:pc><xsl:text> (</xsl:text></tei:pc>
</xsl:otherwise>
</xsl:choose>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<xsl:if test="last()">
<tei:pc><xsl:text>)</xsl:text></tei:pc>
</xsl:if>
</xsl:template>
<!-- ENTRY AND ETYM PUNCTUATION -->
<xsl:template match="tei:entry[not(tei:etym)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy><tei:pc>.</tei:pc>
</xsl:template>
<xsl:template match="tei:etym">
<tei:pc>.</tei:pc><tei:lb/><xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- QUOTE -->
<xsl:template match="tei:quote[preceding-sibling::*[1][self::tei:usg]]">
<tei:pc> </tei:pc><xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- CROSSREF PUNCTUATION -->
<xsl:template match="tei:entry/tei:ref[@type='xr']">
<xsl:if test="preceding-sibling::*[1][self::tei:sense]">
<tei:pc><xsl:text>; </xsl:text></tei:pc>
</xsl:if>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:choose>
<xsl:when test="$standardize-lang = 'en'">
<xsl:text>see </xsl:text>
</xsl:when>
<xsl:when test="$standardize-lang = 'ru'">
<xsl:text>см. </xsl:text>
</xsl:when>
</xsl:choose>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

17
xsl/strip-space.xsl Normal file
View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:abv="http://ossetic-studies.org/ns/abaevdict"
exclude-result-prefixes="xs tei"
version="2.0">
<xsl:strip-space elements="tei:entry abv:exampleGrp abv:example abv:tr tei:re tei:cit tei:sense"/>
<!-- XSLT Template to copy anything -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>