Skip to content

Commit 6b3cc36

Browse files
committed
add search functionality + many small fixes
data-related changes: - use lzma instead of gzip, b/c it provides way better compression. and merge all ayat parts into one (one imlaai & one uthmani). use `-1e`, as it's the lowest level that provides the highest possible compression for both of these files. - remove the space after alef+fatha+waw+fatha in the data itself not code. see: aliftype/quran-data#17 interactivity fixes: - remove the hash params when clicking "New". hash params are most likely introduced by the app itself not the user; the user would generally use the search params (if at all). style fixes: - improve the dropdown list in darkmode on Blink-based browsers. - fix the top margin inside the options dialog. - fix the top padding of #selectors. - fix the margin-bottom of #title. - fix the almost invisible selection color in darkmode. - fix tafsirhint end-of-ayah sign having a help cursor. - fix tafsir fonts. - show texts in a local font, then swap when the remote fonts load. code fixes: - load goatcounter from javascript, b/c if it's in the html, the page waits for it to load (or fail) before executing any javascript. - rename all suar_* constants to sura_*. - various code improvements and general clean up.
1 parent 3dcd75c commit 6b3cc36

35 files changed

+495
-212
lines changed

.index.html

+18-14
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
<div id="options" class="contentcontainer">
2727

28-
<hr id="guide">
28+
<!-- <hr id="guide"> -->
2929

3030
<div id="darkmode_option" class="option maybe-inline">
3131
<label for="darkmode_input">الوضع الليلي؟&ensp;</label><input id="darkmode_input" type="checkbox" onchange="change_dark()">
@@ -130,16 +130,12 @@
130130

131131
<div>
132132
<label for="sura_bgn">من<span class="sura">&nbsp;سورة</span>:&thinsp;</label>
133-
<select id="sura_bgn">
134-
<<!!sh -c 'i=0; cat res/suar-names | while read sura; do printf "<option value=%s>%s</option>" $i "$sura"; i=$((i + 1)); done | sed "1s/>/ selected>/" | tr -d "\n"'>>
135-
</select>&thinsp;<label for="aaya_bgn"><span class="aaya">الآية:&thinsp;</span></label><select id="aaya_bgn"></select>
133+
<select id="sura_bgn"></select>&thinsp;<label for="aaya_bgn"><span class="aaya">الآية:&thinsp;</span></label><select id="aaya_bgn"></select>&thinsp;<button class="search">🔍<span class="srcttl"> ابحث</span></button>
136134
</div>
137135

138136
<div>
139137
<label for="sura_end">إلى<span class="sura">&nbsp;سورة</span>:&thinsp;</label>
140-
<select id="sura_end">
141-
<<!!sh -c 'i=0; cat res/suar-names | while read sura; do printf "<option value=%s>%s</option>" $i "$sura"; i=$((i + 1)); done | sed "1s/>/ selected>/" | tr -d "\n"'>>
142-
</select>&thinsp;<label for="aaya_end"><span class="aaya">الآية:&thinsp;</span></label><select id="aaya_end"></select>
138+
<select id="sura_end"></select>&thinsp;<label for="aaya_end"><span class="aaya">الآية:&thinsp;</span></label><select id="aaya_end"></select>&thinsp;<button class="search">🔍<span class="srcttl"> ابحث</span></button>
143139
</div>
144140

145141
<button title="حدد ما تريد مراجعته أو تسميعه، ثم اضغط على هذا الزر." id="ok">ابدأ</button>
@@ -193,23 +189,31 @@
193189
<circle cx="105" cy="350" r="35" id="T" /><text x="880" y="350" style="visibility: hidden; opacity: 0">مد حركتين</text>
194190
</svg>
195191

196-
<div id="tvc"><!-- tafsir-view container -->
197-
<div id="tv"></div><!-- tafsir-view -->
198-
<svg id="tvx" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><!-- tafsir-view close-button -->
192+
<div id="tvc" class="popup"><!-- tafsir-view container -->
193+
<div id="tv" class="pc"></div><!-- tafsir-view -->
194+
<svg class="x" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><!-- tafsir-view close-button -->
199195
<circle cx="5" cy="5" r="5" />
200196
<line x1="2" y1="2" x2="8" y2="8" stroke-width="1.25" />
201197
<line x1="8" y1="2" x2="2" y2="8" stroke-width="1.25" />
202198
</svg>
203199
</div>
204200

201+
<div id="sxc" class="popup"><!-- search container -->
202+
<div id="sx" class="pc"><!-- search -->
203+
<div id="sxi"><select id="sura_sx"></select><input id="sxq"></div>
204+
<div id="sxr"></div><!-- search results -->
205205
</div>
206+
<svg class="x" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><!-- search close-button -->
207+
<circle cx="5" cy="5" r="5" />
208+
<line x1="2" y1="2" x2="8" y2="8" stroke-width="1.25" />
209+
<line x1="8" y1="2" x2="2" y2="8" stroke-width="1.25" />
210+
</svg>
206211
</div>
207212

208-
<script>window.goatcounter={path:location.href.replace(/[?#].*/,''),allow_frame:true}</script>
209-
<!-- privacy-friendly statistics, no tracking of personal data, no need for GDPR consent; see goatcounter.com -->
210-
<script data-goatcounter="https://recite.goatcounter.com/count"
211-
async src="//gc.zgo.at/count.js"></script>
213+
</div>
214+
</div>
212215

213216
<script><<!!cat .scripts.gen.min.js>></script>
217+
214218
</body>
215219
</html>

.lzma-d-min.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.scripts.gen.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.scripts.js

+15
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,31 @@
11
'use strict'
2+
23
<<!!cat a.gen.js>>
34
<<!!cat mappings.js>>
45
<<!!cat tajlorligilumi.js>>
56
<<!!cat data.gen.js>>
67
<<!!cat versligilumi.js>>
8+
79
// from: https://github.com/mathusummut/confetti.js. Copyright (c) 2018 MathuSum Mut. MIT License
810
<<!!cat res/confetti.min.js>>
11+
912
<<!!#cat test.js>>
1013
// remove the '#' in the previous line to perform the tests
14+
1115
<<!!cat tafsir.js>>
16+
<<!!cat search.js>>
1217
<<!!cat javascript.js>>
18+
1319
// gunzipSync from fflate with a few modifications (check .g.ts)
1420
// MIT License; original source: https://github.com/101arrowz/fflate
1521
<<!!cat .g.js>>
22+
23+
// lmza-d-min.js from LZMA-JS by Nathan Rugg; v2.3.0; License: MIT.
24+
// https://github.com/LZMA-JS/LZMA-JS/blob/master/src/lzma-d-min.js
25+
<<!!cat .lzma-d-min.js>>
26+
1627
<<!!cat z.js>>
28+
29+
window.goatcounter = { path: location.href.replace(/[?#].*/,''), allow_frame: true }
30+
// privacy-friendly statistics, no tracking of personal data, no need for GDPR consent; see goatcounter.com
31+
document.body.append(make_elem('script', { data: { goatcounter: 'https://recite.goatcounter.com/count' }, async: true, src: '//gc.zgo.at/count.js' }))

Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ index.html: .index.html .scripts.gen.min.js style.min.css .minify.pl
2323

2424
%.min.css: %.css
2525
$C "$<" > "$@"
26+
# cat "$<" > "$@"
2627

2728
%.min.js: %.js
2829
$J "$<" > "$@"
2930

3031
%.gen.js: %.js
3132
$P "$<" > "$@"
3233

33-
.scripts.gen.min.js: .scripts.js .g.js a.gen.js mappings.js tafsir.js tajlorligilumi.js data.gen.js versligilumi.js res/confetti.min.js javascript.js z.js
34+
.scripts.gen.min.js: .scripts.js .g.js a.gen.js mappings.js tafsir.js search.js tajlorligilumi.js data.gen.js versligilumi.js res/confetti.min.js javascript.js z.js
3435
$P "$<" | perl -CDAS -pe 's/const +say += +console\.log//' | $J | perl -pe 's/;?\s*\Z//' > "$@"
3536
# $P "$<" > "$@"
3637

a.gen.js

+35-10
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
// with similar names, eg scroll_to_top. I also use it for variables and consts.
55
// The only exception is the Q* shorthand functions defined next.
66

7-
// const say = console.log
87
const range = (i) => [...Array(i).keys()]
98

109
// Q*, el_*
@@ -16,6 +15,27 @@ Element.prototype.Q = Element.prototype.querySelector
1615
Element.prototype.Qall = Element.prototype.querySelectorAll
1716
// Element.prototype.Qid = Element.prototype.getElementById
1817

18+
function make_elem (tag, opts={}) {
19+
const el = document.createElement(tag)
20+
for (let opt in opts)
21+
if (opt === 'data')
22+
for (let k in opts[opt])
23+
el.dataset[k] = opts[opt][k]
24+
else
25+
el[opt] = opts[opt]
26+
return el
27+
}
28+
29+
function make_svgelem (tag, attrs={}, opts={}) {
30+
const el = document.createElementNS("http://www.w3.org/2000/svg", tag)
31+
for (let attr in attrs)
32+
el.setAttribute(attr, attrs[attr])
33+
return el
34+
}
35+
36+
const spinner = make_svgelem('svg', { id: 'spinner-svg', viewBox: '0 0 100 100' })
37+
spinner.appendChild(make_svgelem('circle', { id: 'spinner', cx: 50, cy: 50, r: 35, fill: 'none', 'stroke-width': '10', 'stroke-dasharray': '40 30' }))
38+
1939
const L = location
2040
const S = localStorage
2141
// defaults are not stored:
@@ -100,7 +120,12 @@ const el_J = Qid("J")
100120
const el_T = Qid("T")
101121
const el_tvc = Qid("tvc")
102122
const el_tv = Qid("tv")
103-
const el_tvx = Qid("tvx")
123+
const el_sxc = Qid("sxc")
124+
const el_sx = Qid("sx")
125+
const el_sxi = Qid("sxi")
126+
const el_sura_sx = Qid("sura_sx")
127+
const el_sxq = Qid("sxq")
128+
const el_sxr = Qid("sxr")
104129

105130

106131
const __scroll_top = (el) => el.scrollTo({ top: 0 })
@@ -143,8 +168,8 @@ const toascii = (n) => // convert numerals to ASCII
143168
.replace(/٨/g, '8')
144169
.replace(/٩/g, '9')
145170

146-
const sura_bgn_length = () => el_sura_bgn.value === '' ? 0 : suar_length[+el_sura_bgn.value]
147-
const sura_end_length = () => el_sura_end.value === '' ? 0 : suar_length[+el_sura_end.value]
171+
const sura_bgn_length = () => el_sura_bgn.value === '' ? 0 : sura_length[+el_sura_bgn.value]
172+
const sura_end_length = () => el_sura_end.value === '' ? 0 : sura_length[+el_sura_end.value]
148173
const sura_bgn_val = () => el_sura_bgn.value === '' ? '' : +el_sura_bgn.value
149174
const sura_end_val = () => el_sura_end.value === '' ? '' : +el_sura_end.value
150175
const aaya_bgn_val = () => el_aaya_bgn.value === '' ? '' : +el_aaya_bgn.value
@@ -278,8 +303,8 @@ function valid_inputs (sura_bgn, aaya_bgn, sura_end, aaya_end) { // {{{
278303
sura_end !== '' && aaya_end !== '' &&
279304
sura_bgn <= sura_end &&
280305
(aaya_bgn <= aaya_end || sura_bgn < sura_end) &&
281-
1 <= aaya_bgn && aaya_bgn <= suar_length[sura_bgn] &&
282-
1 <= aaya_end && aaya_end <= suar_length[sura_end]
306+
1 <= aaya_bgn && aaya_bgn <= sura_length[sura_bgn] &&
307+
1 <= aaya_end && aaya_end <= sura_length[sura_end]
283308
)
284309
} // }}}
285310

@@ -435,10 +460,10 @@ function make_title (sura_bgn, aaya_bgn, sura_end, aaya_end) { // {{{
435460
aaya_bgn = +aaya_bgn
436461
sura_end = +sura_end
437462
aaya_end = +aaya_end
438-
const s_bgn_len = suar_length[sura_bgn - 1]
439-
const s_end_len = suar_length[sura_end - 1]
440-
const s_bgn_txt = suar_name[sura_bgn - 1]
441-
const s_end_txt = suar_name[sura_end - 1]
463+
const s_bgn_len = sura_length[sura_bgn - 1]
464+
const s_end_len = sura_length[sura_end - 1]
465+
const s_bgn_txt = sura_name[sura_bgn - 1]
466+
const s_end_txt = sura_name[sura_end - 1]
442467
// converts to Eastern Arabic numerals, and state the first and last in words
443468
const a_bgn_txt = aaya_bgn === 1? 'الأولى' : aaya_bgn === s_bgn_len? toarab(aaya_bgn) + nbsp+'الأخيرة' : toarab(aaya_bgn)
444469
const a_end_txt = aaya_end === 1? 'الأولى' : aaya_end === s_end_len? toarab(aaya_end) + nbsp+'الأخيرة' : toarab(aaya_end)

a.js

+29-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
// with similar names, eg scroll_to_top. I also use it for variables and consts.
55
// The only exception is the Q* shorthand functions defined next.
66

7-
// const say = console.log
87
const range = (i) => [...Array(i).keys()]
98

109
// Q*, el_*
@@ -16,6 +15,27 @@ Element.prototype.Q = Element.prototype.querySelector
1615
Element.prototype.Qall = Element.prototype.querySelectorAll
1716
// Element.prototype.Qid = Element.prototype.getElementById
1817

18+
function make_elem (tag, opts={}) {
19+
const el = document.createElement(tag)
20+
for (let opt in opts)
21+
if (opt === 'data')
22+
for (let k in opts[opt])
23+
el.dataset[k] = opts[opt][k]
24+
else
25+
el[opt] = opts[opt]
26+
return el
27+
}
28+
29+
function make_svgelem (tag, attrs={}, opts={}) {
30+
const el = document.createElementNS("http://www.w3.org/2000/svg", tag)
31+
for (let attr in attrs)
32+
el.setAttribute(attr, attrs[attr])
33+
return el
34+
}
35+
36+
const spinner = make_svgelem('svg', { id: 'spinner-svg', viewBox: '0 0 100 100' })
37+
spinner.appendChild(make_svgelem('circle', { id: 'spinner', cx: 50, cy: 50, r: 35, fill: 'none', 'stroke-width': '10', 'stroke-dasharray': '40 30' }))
38+
1939
const L = location
2040
const S = localStorage
2141
// defaults are not stored:
@@ -74,8 +94,8 @@ const toascii = (n) => // convert numerals to ASCII
7494
.replace(/٨/g, '8')
7595
.replace(/٩/g, '9')
7696

77-
const sura_bgn_length = () => el_sura_bgn.value === '' ? 0 : suar_length[+el_sura_bgn.value]
78-
const sura_end_length = () => el_sura_end.value === '' ? 0 : suar_length[+el_sura_end.value]
97+
const sura_bgn_length = () => el_sura_bgn.value === '' ? 0 : sura_length[+el_sura_bgn.value]
98+
const sura_end_length = () => el_sura_end.value === '' ? 0 : sura_length[+el_sura_end.value]
7999
const sura_bgn_val = () => el_sura_bgn.value === '' ? '' : +el_sura_bgn.value
80100
const sura_end_val = () => el_sura_end.value === '' ? '' : +el_sura_end.value
81101
const aaya_bgn_val = () => el_aaya_bgn.value === '' ? '' : +el_aaya_bgn.value
@@ -209,8 +229,8 @@ function valid_inputs (sura_bgn, aaya_bgn, sura_end, aaya_end) { // {{{
209229
sura_end !== '' && aaya_end !== '' &&
210230
sura_bgn <= sura_end &&
211231
(aaya_bgn <= aaya_end || sura_bgn < sura_end) &&
212-
1 <= aaya_bgn && aaya_bgn <= suar_length[sura_bgn] &&
213-
1 <= aaya_end && aaya_end <= suar_length[sura_end]
232+
1 <= aaya_bgn && aaya_bgn <= sura_length[sura_bgn] &&
233+
1 <= aaya_end && aaya_end <= sura_length[sura_end]
214234
)
215235
} // }}}
216236

@@ -366,10 +386,10 @@ function make_title (sura_bgn, aaya_bgn, sura_end, aaya_end) { // {{{
366386
aaya_bgn = +aaya_bgn
367387
sura_end = +sura_end
368388
aaya_end = +aaya_end
369-
const s_bgn_len = suar_length[sura_bgn - 1]
370-
const s_end_len = suar_length[sura_end - 1]
371-
const s_bgn_txt = suar_name[sura_bgn - 1]
372-
const s_end_txt = suar_name[sura_end - 1]
389+
const s_bgn_len = sura_length[sura_bgn - 1]
390+
const s_end_len = sura_length[sura_end - 1]
391+
const s_bgn_txt = sura_name[sura_bgn - 1]
392+
const s_end_txt = sura_name[sura_end - 1]
373393
// converts to Eastern Arabic numerals, and state the first and last in words
374394
const a_bgn_txt = aaya_bgn === 1? 'الأولى' : aaya_bgn === s_bgn_len? toarab(aaya_bgn) + nbsp+'الأخيرة' : toarab(aaya_bgn)
375395
const a_end_txt = aaya_end === 1? 'الأولى' : aaya_end === s_end_len? toarab(aaya_end) + nbsp+'الأخيرة' : toarab(aaya_end)

0 commit comments

Comments
 (0)