Fossil SCM
Add audio prompts to captchas so that they can be completed by visually impaired users.
Commit
dcf441077d52bae84f7a1d70c879002b71d584ff5437ceb14ec26a83bea346f2
Parent
127405403654753…
24 files changed
+6
-3
+86
+1
+16
+1
+15
+16
+16
~
src/alerts.c
~
src/captcha.c
~
src/login.c
~
src/main.mk
~
src/makemake.tcl
~
src/sounds/0.wav
~
src/sounds/1.wav
~
src/sounds/2.wav
~
src/sounds/3.wav
~
src/sounds/4.wav
~
src/sounds/5.wav
~
src/sounds/6.wav
~
src/sounds/7.wav
~
src/sounds/8.wav
~
src/sounds/9.wav
~
src/sounds/README.md
~
src/sounds/a.wav
~
src/sounds/b.wav
~
src/sounds/c.wav
~
src/sounds/d.wav
~
src/sounds/e.wav
~
src/sounds/f.wav
~
win/Makefile.mingw
~
win/Makefile.msc
+6
-3
| --- src/alerts.c | ||
| +++ src/alerts.c | ||
| @@ -1461,11 +1461,12 @@ | ||
| 1461 | 1461 | @ </table> |
| 1462 | 1462 | if( needCaptcha ){ |
| 1463 | 1463 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 1464 | 1464 | @ %h(zCaptcha) |
| 1465 | 1465 | @ </pre> |
| 1466 | - @ Enter the 8 characters above in the "Security Code" box | |
| 1466 | + @ Enter the 8 characters above in the "Security Code" box<br/> | |
| 1467 | + captcha_speakit_button(uSeed); | |
| 1467 | 1468 | @ </td></tr></table></div> |
| 1468 | 1469 | } |
| 1469 | 1470 | @ </form> |
| 1470 | 1471 | fossil_free(zErr); |
| 1471 | 1472 | style_footer(); |
| @@ -1874,11 +1875,12 @@ | ||
| 1874 | 1875 | @ </tr> |
| 1875 | 1876 | @ </table> |
| 1876 | 1877 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 1877 | 1878 | @ %h(zCaptcha) |
| 1878 | 1879 | @ </pre> |
| 1879 | - @ Enter the 8 characters above in the "Security Code" box | |
| 1880 | + @ Enter the 8 characters above in the "Security Code" box<br/> | |
| 1881 | + captcha_speakit_button(uSeed); | |
| 1880 | 1882 | @ </td></tr></table></div> |
| 1881 | 1883 | @ </form> |
| 1882 | 1884 | fossil_free(zErr); |
| 1883 | 1885 | style_footer(); |
| 1884 | 1886 | } |
| @@ -2620,11 +2622,12 @@ | ||
| 2620 | 2622 | @ </table> |
| 2621 | 2623 | if( zCaptcha ){ |
| 2622 | 2624 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 2623 | 2625 | @ %h(zCaptcha) |
| 2624 | 2626 | @ </pre> |
| 2625 | - @ Enter the 8 characters above in the "Security Code" box | |
| 2627 | + @ Enter the 8 characters above in the "Security Code" box<br/> | |
| 2628 | + captcha_speakit_button(uSeed); | |
| 2626 | 2629 | @ </td></tr></table></div> |
| 2627 | 2630 | } |
| 2628 | 2631 | @ </form> |
| 2629 | 2632 | style_footer(); |
| 2630 | 2633 | } |
| 2631 | 2634 |
| --- src/alerts.c | |
| +++ src/alerts.c | |
| @@ -1461,11 +1461,12 @@ | |
| 1461 | @ </table> |
| 1462 | if( needCaptcha ){ |
| 1463 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 1464 | @ %h(zCaptcha) |
| 1465 | @ </pre> |
| 1466 | @ Enter the 8 characters above in the "Security Code" box |
| 1467 | @ </td></tr></table></div> |
| 1468 | } |
| 1469 | @ </form> |
| 1470 | fossil_free(zErr); |
| 1471 | style_footer(); |
| @@ -1874,11 +1875,12 @@ | |
| 1874 | @ </tr> |
| 1875 | @ </table> |
| 1876 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 1877 | @ %h(zCaptcha) |
| 1878 | @ </pre> |
| 1879 | @ Enter the 8 characters above in the "Security Code" box |
| 1880 | @ </td></tr></table></div> |
| 1881 | @ </form> |
| 1882 | fossil_free(zErr); |
| 1883 | style_footer(); |
| 1884 | } |
| @@ -2620,11 +2622,12 @@ | |
| 2620 | @ </table> |
| 2621 | if( zCaptcha ){ |
| 2622 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 2623 | @ %h(zCaptcha) |
| 2624 | @ </pre> |
| 2625 | @ Enter the 8 characters above in the "Security Code" box |
| 2626 | @ </td></tr></table></div> |
| 2627 | } |
| 2628 | @ </form> |
| 2629 | style_footer(); |
| 2630 | } |
| 2631 |
| --- src/alerts.c | |
| +++ src/alerts.c | |
| @@ -1461,11 +1461,12 @@ | |
| 1461 | @ </table> |
| 1462 | if( needCaptcha ){ |
| 1463 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 1464 | @ %h(zCaptcha) |
| 1465 | @ </pre> |
| 1466 | @ Enter the 8 characters above in the "Security Code" box<br/> |
| 1467 | captcha_speakit_button(uSeed); |
| 1468 | @ </td></tr></table></div> |
| 1469 | } |
| 1470 | @ </form> |
| 1471 | fossil_free(zErr); |
| 1472 | style_footer(); |
| @@ -1874,11 +1875,12 @@ | |
| 1875 | @ </tr> |
| 1876 | @ </table> |
| 1877 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 1878 | @ %h(zCaptcha) |
| 1879 | @ </pre> |
| 1880 | @ Enter the 8 characters above in the "Security Code" box<br/> |
| 1881 | captcha_speakit_button(uSeed); |
| 1882 | @ </td></tr></table></div> |
| 1883 | @ </form> |
| 1884 | fossil_free(zErr); |
| 1885 | style_footer(); |
| 1886 | } |
| @@ -2620,11 +2622,12 @@ | |
| 2622 | @ </table> |
| 2623 | if( zCaptcha ){ |
| 2624 | @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> |
| 2625 | @ %h(zCaptcha) |
| 2626 | @ </pre> |
| 2627 | @ Enter the 8 characters above in the "Security Code" box<br/> |
| 2628 | captcha_speakit_button(uSeed); |
| 2629 | @ </td></tr></table></div> |
| 2630 | } |
| 2631 | @ </form> |
| 2632 | style_footer(); |
| 2633 | } |
| 2634 |
+86
| --- src/captcha.c | ||
| +++ src/captcha.c | ||
| @@ -548,12 +548,29 @@ | ||
| 548 | 548 | @ <input type="hidden" name="captchaseed" value="%u(uSeed)" /> |
| 549 | 549 | @ <input type="text" name="captcha" size=8 /> |
| 550 | 550 | if( showButton ){ |
| 551 | 551 | @ <input type="submit" value="Submit"> |
| 552 | 552 | } |
| 553 | + @ <br/>\ | |
| 554 | + captcha_speakit_button(uSeed); | |
| 553 | 555 | @ </td></tr></table></div> |
| 554 | 556 | } |
| 557 | + | |
| 558 | +/* | |
| 559 | +** Add a "Speak the captcha" button. | |
| 560 | +*/ | |
| 561 | +void captcha_speakit_button(unsigned int uSeed){ | |
| 562 | + @ <input type="button" value="Speak the text" id="speakthetext"> | |
| 563 | + @ <audio id="spokencaptcha" src="%R/captcha-audio/%u(uSeed)" /> | |
| 564 | + @ <script nonce="%h(style_nonce())"> | |
| 565 | + @ var x = document.getElementById("speakthetext") | |
| 566 | + @ x.onclick = function(){ | |
| 567 | + @ var audio = document.getElementById("spokencaptcha"); | |
| 568 | + @ audio.play(); | |
| 569 | + @ } | |
| 570 | + @ </script> | |
| 571 | +} | |
| 555 | 572 | |
| 556 | 573 | /* |
| 557 | 574 | ** WEBPAGE: test-captcha |
| 558 | 575 | ** Test the captcha-generator by rendering the value of the name= query |
| 559 | 576 | ** parameter using ascii-art. If name= is omitted, show a random 16-digit |
| @@ -608,5 +625,74 @@ | ||
| 608 | 625 | captcha_generate(1); |
| 609 | 626 | @ </form> |
| 610 | 627 | style_footer(); |
| 611 | 628 | return 1; |
| 612 | 629 | } |
| 630 | + | |
| 631 | +/* | |
| 632 | +** Generate a WAV file that reads aloud the hex digits given by | |
| 633 | +** zHex. | |
| 634 | +*/ | |
| 635 | +static void captcha_wav(const char *zHex, Blob *pOut){ | |
| 636 | + int i; | |
| 637 | + const int szWavHdr = 44; | |
| 638 | + blob_init(pOut, 0, 0); | |
| 639 | + blob_resize(pOut, szWavHdr); /* Space for the WAV header */ | |
| 640 | + pOut->nUsed = szWavHdr; | |
| 641 | + memset(pOut->aData, 0, szWavHdr); | |
| 642 | + if( zHex==0 || zHex[0]==0 ) zHex = "0"; | |
| 643 | + for(i=0; zHex[i]; i++){ | |
| 644 | + int v = hex_digit_value(zHex[i]); | |
| 645 | + int sz; | |
| 646 | + int nData; | |
| 647 | + const unsigned char *pData; | |
| 648 | + char zSoundName[50]; | |
| 649 | + sqlite3_snprintf(sizeof(zSoundName),zSoundName,"sounds/%c.wav", | |
| 650 | + "0123456789abcdef"[v]); | |
| 651 | + pData = builtin_file(zSoundName, &sz); | |
| 652 | + nData = sz - szWavHdr; | |
| 653 | + blob_resize(pOut, pOut->nUsed+nData); | |
| 654 | + memcpy(pOut->aData+pOut->nUsed-nData, pData+szWavHdr, nData); | |
| 655 | + if( zHex[i+1]==0 ){ | |
| 656 | + int len = pOut->nUsed + 36; | |
| 657 | + memcpy(pOut->aData, pData, szWavHdr); | |
| 658 | + pOut->aData[4] = (char)(len&0xff); | |
| 659 | + pOut->aData[5] = (char)((len>>8)&0xff); | |
| 660 | + pOut->aData[6] = (char)((len>>16)&0xff); | |
| 661 | + pOut->aData[7] = (char)((len>>24)&0xff); | |
| 662 | + len = pOut->nUsed; | |
| 663 | + pOut->aData[40] = (char)(len&0xff); | |
| 664 | + pOut->aData[41] = (char)((len>>8)&0xff); | |
| 665 | + pOut->aData[42] = (char)((len>>16)&0xff); | |
| 666 | + pOut->aData[43] = (char)((len>>24)&0xff); | |
| 667 | + } | |
| 668 | + } | |
| 669 | +} | |
| 670 | + | |
| 671 | +/* | |
| 672 | +** WEBPAGE: /captcha-audio | |
| 673 | +** | |
| 674 | +** Return a WAV file that pronounces the digits of the captcha that | |
| 675 | +** is determined by the seed given in the name= query parameter. | |
| 676 | +*/ | |
| 677 | +void captcha_wav_page(void){ | |
| 678 | + const char *zSeed = P("name"); | |
| 679 | + const char *zDecode = captcha_decode((unsigned int)atoi(zSeed)); | |
| 680 | + Blob audio; | |
| 681 | + captcha_wav(zDecode, &audio); | |
| 682 | + cgi_set_content_type("audio/wav"); | |
| 683 | + cgi_set_content(&audio); | |
| 684 | +} | |
| 685 | + | |
| 686 | +/* | |
| 687 | +** WEBPAGE: /test-captcha-audio | |
| 688 | +** | |
| 689 | +** Return a WAV file that pronounces the hex digits of the name= | |
| 690 | +** query parameter. | |
| 691 | +*/ | |
| 692 | +void captcha_test_wav_page(void){ | |
| 693 | + const char *zSeed = P("name"); | |
| 694 | + Blob audio; | |
| 695 | + captcha_wav(zSeed, &audio); | |
| 696 | + cgi_set_content_type("audio/wav"); | |
| 697 | + cgi_set_content(&audio); | |
| 698 | +} | |
| 613 | 699 |
| --- src/captcha.c | |
| +++ src/captcha.c | |
| @@ -548,12 +548,29 @@ | |
| 548 | @ <input type="hidden" name="captchaseed" value="%u(uSeed)" /> |
| 549 | @ <input type="text" name="captcha" size=8 /> |
| 550 | if( showButton ){ |
| 551 | @ <input type="submit" value="Submit"> |
| 552 | } |
| 553 | @ </td></tr></table></div> |
| 554 | } |
| 555 | |
| 556 | /* |
| 557 | ** WEBPAGE: test-captcha |
| 558 | ** Test the captcha-generator by rendering the value of the name= query |
| 559 | ** parameter using ascii-art. If name= is omitted, show a random 16-digit |
| @@ -608,5 +625,74 @@ | |
| 608 | captcha_generate(1); |
| 609 | @ </form> |
| 610 | style_footer(); |
| 611 | return 1; |
| 612 | } |
| 613 |
| --- src/captcha.c | |
| +++ src/captcha.c | |
| @@ -548,12 +548,29 @@ | |
| 548 | @ <input type="hidden" name="captchaseed" value="%u(uSeed)" /> |
| 549 | @ <input type="text" name="captcha" size=8 /> |
| 550 | if( showButton ){ |
| 551 | @ <input type="submit" value="Submit"> |
| 552 | } |
| 553 | @ <br/>\ |
| 554 | captcha_speakit_button(uSeed); |
| 555 | @ </td></tr></table></div> |
| 556 | } |
| 557 | |
| 558 | /* |
| 559 | ** Add a "Speak the captcha" button. |
| 560 | */ |
| 561 | void captcha_speakit_button(unsigned int uSeed){ |
| 562 | @ <input type="button" value="Speak the text" id="speakthetext"> |
| 563 | @ <audio id="spokencaptcha" src="%R/captcha-audio/%u(uSeed)" /> |
| 564 | @ <script nonce="%h(style_nonce())"> |
| 565 | @ var x = document.getElementById("speakthetext") |
| 566 | @ x.onclick = function(){ |
| 567 | @ var audio = document.getElementById("spokencaptcha"); |
| 568 | @ audio.play(); |
| 569 | @ } |
| 570 | @ </script> |
| 571 | } |
| 572 | |
| 573 | /* |
| 574 | ** WEBPAGE: test-captcha |
| 575 | ** Test the captcha-generator by rendering the value of the name= query |
| 576 | ** parameter using ascii-art. If name= is omitted, show a random 16-digit |
| @@ -608,5 +625,74 @@ | |
| 625 | captcha_generate(1); |
| 626 | @ </form> |
| 627 | style_footer(); |
| 628 | return 1; |
| 629 | } |
| 630 | |
| 631 | /* |
| 632 | ** Generate a WAV file that reads aloud the hex digits given by |
| 633 | ** zHex. |
| 634 | */ |
| 635 | static void captcha_wav(const char *zHex, Blob *pOut){ |
| 636 | int i; |
| 637 | const int szWavHdr = 44; |
| 638 | blob_init(pOut, 0, 0); |
| 639 | blob_resize(pOut, szWavHdr); /* Space for the WAV header */ |
| 640 | pOut->nUsed = szWavHdr; |
| 641 | memset(pOut->aData, 0, szWavHdr); |
| 642 | if( zHex==0 || zHex[0]==0 ) zHex = "0"; |
| 643 | for(i=0; zHex[i]; i++){ |
| 644 | int v = hex_digit_value(zHex[i]); |
| 645 | int sz; |
| 646 | int nData; |
| 647 | const unsigned char *pData; |
| 648 | char zSoundName[50]; |
| 649 | sqlite3_snprintf(sizeof(zSoundName),zSoundName,"sounds/%c.wav", |
| 650 | "0123456789abcdef"[v]); |
| 651 | pData = builtin_file(zSoundName, &sz); |
| 652 | nData = sz - szWavHdr; |
| 653 | blob_resize(pOut, pOut->nUsed+nData); |
| 654 | memcpy(pOut->aData+pOut->nUsed-nData, pData+szWavHdr, nData); |
| 655 | if( zHex[i+1]==0 ){ |
| 656 | int len = pOut->nUsed + 36; |
| 657 | memcpy(pOut->aData, pData, szWavHdr); |
| 658 | pOut->aData[4] = (char)(len&0xff); |
| 659 | pOut->aData[5] = (char)((len>>8)&0xff); |
| 660 | pOut->aData[6] = (char)((len>>16)&0xff); |
| 661 | pOut->aData[7] = (char)((len>>24)&0xff); |
| 662 | len = pOut->nUsed; |
| 663 | pOut->aData[40] = (char)(len&0xff); |
| 664 | pOut->aData[41] = (char)((len>>8)&0xff); |
| 665 | pOut->aData[42] = (char)((len>>16)&0xff); |
| 666 | pOut->aData[43] = (char)((len>>24)&0xff); |
| 667 | } |
| 668 | } |
| 669 | } |
| 670 | |
| 671 | /* |
| 672 | ** WEBPAGE: /captcha-audio |
| 673 | ** |
| 674 | ** Return a WAV file that pronounces the digits of the captcha that |
| 675 | ** is determined by the seed given in the name= query parameter. |
| 676 | */ |
| 677 | void captcha_wav_page(void){ |
| 678 | const char *zSeed = P("name"); |
| 679 | const char *zDecode = captcha_decode((unsigned int)atoi(zSeed)); |
| 680 | Blob audio; |
| 681 | captcha_wav(zDecode, &audio); |
| 682 | cgi_set_content_type("audio/wav"); |
| 683 | cgi_set_content(&audio); |
| 684 | } |
| 685 | |
| 686 | /* |
| 687 | ** WEBPAGE: /test-captcha-audio |
| 688 | ** |
| 689 | ** Return a WAV file that pronounces the hex digits of the name= |
| 690 | ** query parameter. |
| 691 | */ |
| 692 | void captcha_test_wav_page(void){ |
| 693 | const char *zSeed = P("name"); |
| 694 | Blob audio; |
| 695 | captcha_wav(zSeed, &audio); |
| 696 | cgi_set_content_type("audio/wav"); |
| 697 | cgi_set_content(&audio); |
| 698 | } |
| 699 |
+1
| --- src/login.c | ||
| +++ src/login.c | ||
| @@ -757,10 +757,11 @@ | ||
| 757 | 757 | @ the 8-character hexadecimal password shown below:</p> |
| 758 | 758 | @ <div class="captcha"><table class="captcha"><tr><td>\ |
| 759 | 759 | @ <pre class="captcha"> |
| 760 | 760 | @ %h(zCaptcha) |
| 761 | 761 | @ </pre></td></tr></table> |
| 762 | + captcha_speakit_button(uSeed); | |
| 762 | 763 | if( bAutoCaptcha ) { |
| 763 | 764 | @ <input type="button" value="Fill out captcha" id='autofillButton' \ |
| 764 | 765 | @ data-af='%s(zDecoded)' /> |
| 765 | 766 | style_load_one_js_file("login.js"); |
| 766 | 767 | } |
| 767 | 768 |
| --- src/login.c | |
| +++ src/login.c | |
| @@ -757,10 +757,11 @@ | |
| 757 | @ the 8-character hexadecimal password shown below:</p> |
| 758 | @ <div class="captcha"><table class="captcha"><tr><td>\ |
| 759 | @ <pre class="captcha"> |
| 760 | @ %h(zCaptcha) |
| 761 | @ </pre></td></tr></table> |
| 762 | if( bAutoCaptcha ) { |
| 763 | @ <input type="button" value="Fill out captcha" id='autofillButton' \ |
| 764 | @ data-af='%s(zDecoded)' /> |
| 765 | style_load_one_js_file("login.js"); |
| 766 | } |
| 767 |
| --- src/login.c | |
| +++ src/login.c | |
| @@ -757,10 +757,11 @@ | |
| 757 | @ the 8-character hexadecimal password shown below:</p> |
| 758 | @ <div class="captcha"><table class="captcha"><tr><td>\ |
| 759 | @ <pre class="captcha"> |
| 760 | @ %h(zCaptcha) |
| 761 | @ </pre></td></tr></table> |
| 762 | captcha_speakit_button(uSeed); |
| 763 | if( bAutoCaptcha ) { |
| 764 | @ <input type="button" value="Fill out captcha" id='autofillButton' \ |
| 765 | @ data-af='%s(zDecoded)' /> |
| 766 | style_load_one_js_file("login.js"); |
| 767 | } |
| 768 |
+16
| --- src/main.mk | ||
| +++ src/main.mk | ||
| @@ -224,10 +224,26 @@ | ||
| 224 | 224 | $(SRCDIR)/menu.js \ |
| 225 | 225 | $(SRCDIR)/sbsdiff.js \ |
| 226 | 226 | $(SRCDIR)/scroll.js \ |
| 227 | 227 | $(SRCDIR)/skin.js \ |
| 228 | 228 | $(SRCDIR)/sorttable.js \ |
| 229 | + $(SRCDIR)/sounds/0.wav \ | |
| 230 | + $(SRCDIR)/sounds/1.wav \ | |
| 231 | + $(SRCDIR)/sounds/2.wav \ | |
| 232 | + $(SRCDIR)/sounds/3.wav \ | |
| 233 | + $(SRCDIR)/sounds/4.wav \ | |
| 234 | + $(SRCDIR)/sounds/5.wav \ | |
| 235 | + $(SRCDIR)/sounds/6.wav \ | |
| 236 | + $(SRCDIR)/sounds/7.wav \ | |
| 237 | + $(SRCDIR)/sounds/8.wav \ | |
| 238 | + $(SRCDIR)/sounds/9.wav \ | |
| 239 | + $(SRCDIR)/sounds/a.wav \ | |
| 240 | + $(SRCDIR)/sounds/b.wav \ | |
| 241 | + $(SRCDIR)/sounds/c.wav \ | |
| 242 | + $(SRCDIR)/sounds/d.wav \ | |
| 243 | + $(SRCDIR)/sounds/e.wav \ | |
| 244 | + $(SRCDIR)/sounds/f.wav \ | |
| 229 | 245 | $(SRCDIR)/tree.js \ |
| 230 | 246 | $(SRCDIR)/useredit.js \ |
| 231 | 247 | $(SRCDIR)/wiki.wiki |
| 232 | 248 | |
| 233 | 249 | TRANS_SRC = \ |
| 234 | 250 |
| --- src/main.mk | |
| +++ src/main.mk | |
| @@ -224,10 +224,26 @@ | |
| 224 | $(SRCDIR)/menu.js \ |
| 225 | $(SRCDIR)/sbsdiff.js \ |
| 226 | $(SRCDIR)/scroll.js \ |
| 227 | $(SRCDIR)/skin.js \ |
| 228 | $(SRCDIR)/sorttable.js \ |
| 229 | $(SRCDIR)/tree.js \ |
| 230 | $(SRCDIR)/useredit.js \ |
| 231 | $(SRCDIR)/wiki.wiki |
| 232 | |
| 233 | TRANS_SRC = \ |
| 234 |
| --- src/main.mk | |
| +++ src/main.mk | |
| @@ -224,10 +224,26 @@ | |
| 224 | $(SRCDIR)/menu.js \ |
| 225 | $(SRCDIR)/sbsdiff.js \ |
| 226 | $(SRCDIR)/scroll.js \ |
| 227 | $(SRCDIR)/skin.js \ |
| 228 | $(SRCDIR)/sorttable.js \ |
| 229 | $(SRCDIR)/sounds/0.wav \ |
| 230 | $(SRCDIR)/sounds/1.wav \ |
| 231 | $(SRCDIR)/sounds/2.wav \ |
| 232 | $(SRCDIR)/sounds/3.wav \ |
| 233 | $(SRCDIR)/sounds/4.wav \ |
| 234 | $(SRCDIR)/sounds/5.wav \ |
| 235 | $(SRCDIR)/sounds/6.wav \ |
| 236 | $(SRCDIR)/sounds/7.wav \ |
| 237 | $(SRCDIR)/sounds/8.wav \ |
| 238 | $(SRCDIR)/sounds/9.wav \ |
| 239 | $(SRCDIR)/sounds/a.wav \ |
| 240 | $(SRCDIR)/sounds/b.wav \ |
| 241 | $(SRCDIR)/sounds/c.wav \ |
| 242 | $(SRCDIR)/sounds/d.wav \ |
| 243 | $(SRCDIR)/sounds/e.wav \ |
| 244 | $(SRCDIR)/sounds/f.wav \ |
| 245 | $(SRCDIR)/tree.js \ |
| 246 | $(SRCDIR)/useredit.js \ |
| 247 | $(SRCDIR)/wiki.wiki |
| 248 | |
| 249 | TRANS_SRC = \ |
| 250 |
+1
| --- src/makemake.tcl | ||
| +++ src/makemake.tcl | ||
| @@ -174,10 +174,11 @@ | ||
| 174 | 174 | diff.tcl |
| 175 | 175 | markdown.md |
| 176 | 176 | wiki.wiki |
| 177 | 177 | *.js |
| 178 | 178 | ../skins/*/*.txt |
| 179 | + sounds/*.wav | |
| 179 | 180 | } |
| 180 | 181 | |
| 181 | 182 | # Options used to compile the included SQLite library. |
| 182 | 183 | # |
| 183 | 184 | set SQLITE_OPTIONS { |
| 184 | 185 | |
| 185 | 186 | ADDED src/sounds/0.wav |
| 186 | 187 | ADDED src/sounds/1.wav |
| 187 | 188 | ADDED src/sounds/2.wav |
| 188 | 189 | ADDED src/sounds/3.wav |
| 189 | 190 | ADDED src/sounds/4.wav |
| 190 | 191 | ADDED src/sounds/5.wav |
| 191 | 192 | ADDED src/sounds/6.wav |
| 192 | 193 | ADDED src/sounds/7.wav |
| 193 | 194 | ADDED src/sounds/8.wav |
| 194 | 195 | ADDED src/sounds/9.wav |
| 195 | 196 | ADDED src/sounds/README.md |
| 196 | 197 | ADDED src/sounds/a.wav |
| 197 | 198 | ADDED src/sounds/b.wav |
| 198 | 199 | ADDED src/sounds/c.wav |
| 199 | 200 | ADDED src/sounds/d.wav |
| 200 | 201 | ADDED src/sounds/e.wav |
| 201 | 202 | ADDED src/sounds/f.wav |
| --- src/makemake.tcl | |
| +++ src/makemake.tcl | |
| @@ -174,10 +174,11 @@ | |
| 174 | diff.tcl |
| 175 | markdown.md |
| 176 | wiki.wiki |
| 177 | *.js |
| 178 | ../skins/*/*.txt |
| 179 | } |
| 180 | |
| 181 | # Options used to compile the included SQLite library. |
| 182 | # |
| 183 | set SQLITE_OPTIONS { |
| 184 | |
| 185 | DDED src/sounds/0.wav |
| 186 | DDED src/sounds/1.wav |
| 187 | DDED src/sounds/2.wav |
| 188 | DDED src/sounds/3.wav |
| 189 | DDED src/sounds/4.wav |
| 190 | DDED src/sounds/5.wav |
| 191 | DDED src/sounds/6.wav |
| 192 | DDED src/sounds/7.wav |
| 193 | DDED src/sounds/8.wav |
| 194 | DDED src/sounds/9.wav |
| 195 | DDED src/sounds/README.md |
| 196 | DDED src/sounds/a.wav |
| 197 | DDED src/sounds/b.wav |
| 198 | DDED src/sounds/c.wav |
| 199 | DDED src/sounds/d.wav |
| 200 | DDED src/sounds/e.wav |
| 201 | DDED src/sounds/f.wav |
| --- src/makemake.tcl | |
| +++ src/makemake.tcl | |
| @@ -174,10 +174,11 @@ | |
| 174 | diff.tcl |
| 175 | markdown.md |
| 176 | wiki.wiki |
| 177 | *.js |
| 178 | ../skins/*/*.txt |
| 179 | sounds/*.wav |
| 180 | } |
| 181 | |
| 182 | # Options used to compile the included SQLite library. |
| 183 | # |
| 184 | set SQLITE_OPTIONS { |
| 185 | |
| 186 | DDED src/sounds/0.wav |
| 187 | DDED src/sounds/1.wav |
| 188 | DDED src/sounds/2.wav |
| 189 | DDED src/sounds/3.wav |
| 190 | DDED src/sounds/4.wav |
| 191 | DDED src/sounds/5.wav |
| 192 | DDED src/sounds/6.wav |
| 193 | DDED src/sounds/7.wav |
| 194 | DDED src/sounds/8.wav |
| 195 | DDED src/sounds/9.wav |
| 196 | DDED src/sounds/README.md |
| 197 | DDED src/sounds/a.wav |
| 198 | DDED src/sounds/b.wav |
| 199 | DDED src/sounds/c.wav |
| 200 | DDED src/sounds/d.wav |
| 201 | DDED src/sounds/e.wav |
| 202 | DDED src/sounds/f.wav |
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
+15
| --- a/src/sounds/README.md | ||
| +++ b/src/sounds/README.md | ||
| @@ -0,0 +1,15 @@ | ||
| 1 | +The *.wav files in this dire speaking each | |
| 2 | +of the 16 hexadecimal d consists of just | |
| 3 | +hexadecimal digits ( generated by the | |
| 4 | +[../captcha.c module](.. files can be | |
| 5 | +hen these WAV | |
| 6 | +files can be con captcha, which | |
| 7 | +ding of the | |
| 8 | +captcha, ired users to complete the | |
| 9 | +captcha. | |
| 10 | + | |
| 11 | +Each of the WAV files uses 8000 samples per second, 8 bits per sample | |
| 12 | +and are 6000 samples in length. | |
| 13 | + | |
| 14 | +The recordings are made by Philip Bennefall and are of his own voice. | |
| 15 | +Mr. Bennefall is ytemself blind and uses this system implemented w |
| --- a/src/sounds/README.md | |
| +++ b/src/sounds/README.md | |
| @@ -0,0 +1,15 @@ | |
| --- a/src/sounds/README.md | |
| +++ b/src/sounds/README.md | |
| @@ -0,0 +1,15 @@ | |
| 1 | The *.wav files in this dire speaking each |
| 2 | of the 16 hexadecimal d consists of just |
| 3 | hexadecimal digits ( generated by the |
| 4 | [../captcha.c module](.. files can be |
| 5 | hen these WAV |
| 6 | files can be con captcha, which |
| 7 | ding of the |
| 8 | captcha, ired users to complete the |
| 9 | captcha. |
| 10 | |
| 11 | Each of the WAV files uses 8000 samples per second, 8 bits per sample |
| 12 | and are 6000 samples in length. |
| 13 | |
| 14 | The recordings are made by Philip Bennefall and are of his own voice. |
| 15 | Mr. Bennefall is ytemself blind and uses this system implemented w |
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
+16
| --- win/Makefile.mingw | ||
| +++ win/Makefile.mingw | ||
| @@ -646,10 +646,26 @@ | ||
| 646 | 646 | $(SRCDIR)/menu.js \ |
| 647 | 647 | $(SRCDIR)/sbsdiff.js \ |
| 648 | 648 | $(SRCDIR)/scroll.js \ |
| 649 | 649 | $(SRCDIR)/skin.js \ |
| 650 | 650 | $(SRCDIR)/sorttable.js \ |
| 651 | + $(SRCDIR)/sounds/0.wav \ | |
| 652 | + $(SRCDIR)/sounds/1.wav \ | |
| 653 | + $(SRCDIR)/sounds/2.wav \ | |
| 654 | + $(SRCDIR)/sounds/3.wav \ | |
| 655 | + $(SRCDIR)/sounds/4.wav \ | |
| 656 | + $(SRCDIR)/sounds/5.wav \ | |
| 657 | + $(SRCDIR)/sounds/6.wav \ | |
| 658 | + $(SRCDIR)/sounds/7.wav \ | |
| 659 | + $(SRCDIR)/sounds/8.wav \ | |
| 660 | + $(SRCDIR)/sounds/9.wav \ | |
| 661 | + $(SRCDIR)/sounds/a.wav \ | |
| 662 | + $(SRCDIR)/sounds/b.wav \ | |
| 663 | + $(SRCDIR)/sounds/c.wav \ | |
| 664 | + $(SRCDIR)/sounds/d.wav \ | |
| 665 | + $(SRCDIR)/sounds/e.wav \ | |
| 666 | + $(SRCDIR)/sounds/f.wav \ | |
| 651 | 667 | $(SRCDIR)/tree.js \ |
| 652 | 668 | $(SRCDIR)/useredit.js \ |
| 653 | 669 | $(SRCDIR)/wiki.wiki |
| 654 | 670 | |
| 655 | 671 | TRANS_SRC = \ |
| 656 | 672 |
| --- win/Makefile.mingw | |
| +++ win/Makefile.mingw | |
| @@ -646,10 +646,26 @@ | |
| 646 | $(SRCDIR)/menu.js \ |
| 647 | $(SRCDIR)/sbsdiff.js \ |
| 648 | $(SRCDIR)/scroll.js \ |
| 649 | $(SRCDIR)/skin.js \ |
| 650 | $(SRCDIR)/sorttable.js \ |
| 651 | $(SRCDIR)/tree.js \ |
| 652 | $(SRCDIR)/useredit.js \ |
| 653 | $(SRCDIR)/wiki.wiki |
| 654 | |
| 655 | TRANS_SRC = \ |
| 656 |
| --- win/Makefile.mingw | |
| +++ win/Makefile.mingw | |
| @@ -646,10 +646,26 @@ | |
| 646 | $(SRCDIR)/menu.js \ |
| 647 | $(SRCDIR)/sbsdiff.js \ |
| 648 | $(SRCDIR)/scroll.js \ |
| 649 | $(SRCDIR)/skin.js \ |
| 650 | $(SRCDIR)/sorttable.js \ |
| 651 | $(SRCDIR)/sounds/0.wav \ |
| 652 | $(SRCDIR)/sounds/1.wav \ |
| 653 | $(SRCDIR)/sounds/2.wav \ |
| 654 | $(SRCDIR)/sounds/3.wav \ |
| 655 | $(SRCDIR)/sounds/4.wav \ |
| 656 | $(SRCDIR)/sounds/5.wav \ |
| 657 | $(SRCDIR)/sounds/6.wav \ |
| 658 | $(SRCDIR)/sounds/7.wav \ |
| 659 | $(SRCDIR)/sounds/8.wav \ |
| 660 | $(SRCDIR)/sounds/9.wav \ |
| 661 | $(SRCDIR)/sounds/a.wav \ |
| 662 | $(SRCDIR)/sounds/b.wav \ |
| 663 | $(SRCDIR)/sounds/c.wav \ |
| 664 | $(SRCDIR)/sounds/d.wav \ |
| 665 | $(SRCDIR)/sounds/e.wav \ |
| 666 | $(SRCDIR)/sounds/f.wav \ |
| 667 | $(SRCDIR)/tree.js \ |
| 668 | $(SRCDIR)/useredit.js \ |
| 669 | $(SRCDIR)/wiki.wiki |
| 670 | |
| 671 | TRANS_SRC = \ |
| 672 |
+16
| --- win/Makefile.msc | ||
| +++ win/Makefile.msc | ||
| @@ -553,10 +553,26 @@ | ||
| 553 | 553 | $(SRCDIR)\menu.js \ |
| 554 | 554 | $(SRCDIR)\sbsdiff.js \ |
| 555 | 555 | $(SRCDIR)\scroll.js \ |
| 556 | 556 | $(SRCDIR)\skin.js \ |
| 557 | 557 | $(SRCDIR)\sorttable.js \ |
| 558 | + $(SRCDIR)\sounds\0.wav \ | |
| 559 | + $(SRCDIR)\sounds\1.wav \ | |
| 560 | + $(SRCDIR)\sounds\2.wav \ | |
| 561 | + $(SRCDIR)\sounds\3.wav \ | |
| 562 | + $(SRCDIR)\sounds\4.wav \ | |
| 563 | + $(SRCDIR)\sounds\5.wav \ | |
| 564 | + $(SRCDIR)\sounds\6.wav \ | |
| 565 | + $(SRCDIR)\sounds\7.wav \ | |
| 566 | + $(SRCDIR)\sounds\8.wav \ | |
| 567 | + $(SRCDIR)\sounds\9.wav \ | |
| 568 | + $(SRCDIR)\sounds\a.wav \ | |
| 569 | + $(SRCDIR)\sounds\b.wav \ | |
| 570 | + $(SRCDIR)\sounds\c.wav \ | |
| 571 | + $(SRCDIR)\sounds\d.wav \ | |
| 572 | + $(SRCDIR)\sounds\e.wav \ | |
| 573 | + $(SRCDIR)\sounds\f.wav \ | |
| 558 | 574 | $(SRCDIR)\tree.js \ |
| 559 | 575 | $(SRCDIR)\useredit.js \ |
| 560 | 576 | $(SRCDIR)\wiki.wiki |
| 561 | 577 | |
| 562 | 578 | OBJ = $(OX)\add$O \ |
| 563 | 579 |
| --- win/Makefile.msc | |
| +++ win/Makefile.msc | |
| @@ -553,10 +553,26 @@ | |
| 553 | $(SRCDIR)\menu.js \ |
| 554 | $(SRCDIR)\sbsdiff.js \ |
| 555 | $(SRCDIR)\scroll.js \ |
| 556 | $(SRCDIR)\skin.js \ |
| 557 | $(SRCDIR)\sorttable.js \ |
| 558 | $(SRCDIR)\tree.js \ |
| 559 | $(SRCDIR)\useredit.js \ |
| 560 | $(SRCDIR)\wiki.wiki |
| 561 | |
| 562 | OBJ = $(OX)\add$O \ |
| 563 |
| --- win/Makefile.msc | |
| +++ win/Makefile.msc | |
| @@ -553,10 +553,26 @@ | |
| 553 | $(SRCDIR)\menu.js \ |
| 554 | $(SRCDIR)\sbsdiff.js \ |
| 555 | $(SRCDIR)\scroll.js \ |
| 556 | $(SRCDIR)\skin.js \ |
| 557 | $(SRCDIR)\sorttable.js \ |
| 558 | $(SRCDIR)\sounds\0.wav \ |
| 559 | $(SRCDIR)\sounds\1.wav \ |
| 560 | $(SRCDIR)\sounds\2.wav \ |
| 561 | $(SRCDIR)\sounds\3.wav \ |
| 562 | $(SRCDIR)\sounds\4.wav \ |
| 563 | $(SRCDIR)\sounds\5.wav \ |
| 564 | $(SRCDIR)\sounds\6.wav \ |
| 565 | $(SRCDIR)\sounds\7.wav \ |
| 566 | $(SRCDIR)\sounds\8.wav \ |
| 567 | $(SRCDIR)\sounds\9.wav \ |
| 568 | $(SRCDIR)\sounds\a.wav \ |
| 569 | $(SRCDIR)\sounds\b.wav \ |
| 570 | $(SRCDIR)\sounds\c.wav \ |
| 571 | $(SRCDIR)\sounds\d.wav \ |
| 572 | $(SRCDIR)\sounds\e.wav \ |
| 573 | $(SRCDIR)\sounds\f.wav \ |
| 574 | $(SRCDIR)\tree.js \ |
| 575 | $(SRCDIR)\useredit.js \ |
| 576 | $(SRCDIR)\wiki.wiki |
| 577 | |
| 578 | OBJ = $(OX)\add$O \ |
| 579 |