4 # Praat script handling configuration page
6 # SpeakGoodChinese: Config.praat loads the code needed for the
7 # settings and the Settings page of SpeakGoodChinese.
9 # Copyright (C) 2007-2010 R.J.J.H. van Son and 2010 the Netherlands Cancer Institute
10 # The SpeakGoodChinese team are:
11 # Guangqin Chen, Zhonyan Chen, Stefan de Koning, Eveline van Hagen,
12 # Rob van Son, Dennis Vierkant, David Weenink
14 # This program is free software; you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation; either version 2 of the License, or
17 # (at your option) any later version.
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with this program; if not, write to the Free Software
26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
29 ###############################################################
31 # Button Drawing Routines
33 ###############################################################
35 procedure DrawCredits .color$ .x .y .size
38 call adjustFontSizeOnHeight 'defaultFont$' 24 '.lineheight'
39 .currentFontSize = adjustFontSizeOnHeight.newFontSize
40 demo Paint circle... {0.2,0.2,0.8} '.x' '.y' '.size'
42 demo Text special... '.x' centre '.y' half Times '.currentFontSize' 0 i
45 call set_font_size 'defaultFontSize'
48 procedure DrawDeleteList .color$ .x .y .size
56 .displayWordList$ = replace_regex$(wordlistName$, "[_]", " ", 0)
59 .maxWidth = (.rightX - .leftX)
60 .currentFontSize = defaultFontSize
61 call adjustFontSizeOnWidth 'defaultFont$' '.currentFontSize' '.maxWidth' '.displayWordList$'
62 .currentFontSize = adjustFontSizeOnWidth.newFontSize
63 if adjustFontSizeOnWidth.diff > 0
64 .rightX += adjustFontSizeOnWidth.diff/2
65 .leftX -= adjustFontSizeOnWidth.diff/2
67 call set_font_size '.currentFontSize'
68 demo Paint rectangle... White '.leftX' '.rightX' '.botY' '.topY'
70 demo Text... '.x' Centre '.botY' Bottom '.displayWordList$'
73 call set_font_size 'defaultFontSize'
76 procedure DrawLogging .color$ .x .y .size
80 .color$ = "{0.5,0.5,1}"
84 demo Paint circle... '.color$' '.x' '.y' '.size'
87 ###############################################################
89 # Obligatory button Drawing Routines
91 # These MUST be defined
93 ###############################################################
95 procedure DrawReturn .color$ .x .y .size
96 call DrawConfig '.color$' '.x' '.y' '.size'
99 # Set the correct button states after redrawing the window
100 procedure setConfigMainPage
101 # Handle logging buttons with forced button draw
102 if fileReadable("'preferencesLogDir$'/logPerformance.txt")
103 call Draw_button 'config$' +!Logging 'config.logPerformance'
107 ###############################################################
109 # Button Processing Routines
111 ###############################################################
113 procedure processConfigShuffleLists .clickX .clickY .pressed$
115 .label$ = "ShuffleLists"
116 config.shuffleLists = not config.shuffleLists
117 .displayButton = 2*config.shuffleLists
118 call Draw_button '.table$' '.label$' '.displayButton'
121 procedure processConfigUseSoundExample .clickX .clickY .pressed$
123 .label$ = "UseSoundExample"
124 config.useSoundExample = not config.useSoundExample
125 .displayButton = 2*config.useSoundExample
126 call Draw_button '.table$' '.label$' '.displayButton'
129 procedure processConfigSynthesis .tts$ .clickX .clickY .pressed$
131 .label$ = "Synthesis_'.tts$'"
132 if speakCommandFile$ <> "" and fileReadable(speakCommandFile$)
133 if config.synthesis$ = ""
134 config.synthesis$ = .tts$
137 config.synthesis$ = ""
141 config.synthesis$ = "_DISABLED_"
144 call Draw_button '.table$' '.label$' '.displayButton'
147 procedure processConfigStrict .clickX .clickY .pressed$
150 config.strict = not config.strict
156 call Draw_button '.table$' '.label$' '.displayButton'
159 procedure processConfigDisplayPinyin .clickX .clickY .pressed$
161 .label$ = "DisplayPinyin"
162 config.displayPinyin = not config.displayPinyin
163 .displayButton = 2*config.displayPinyin
164 call Draw_button '.table$' '.label$' '.displayButton'
167 procedure processConfigDisplayChar .clickX .clickY .pressed$
169 .label$ = "DisplayChar"
170 config.displayChar = not config.displayChar
171 .displayButton = 2*config.displayChar
172 call Draw_button 'table$' '.label$' '.displayButton'
175 procedure processConfigDisplayTrans .clickX .clickY .pressed$
177 .label$ = "DisplayTrans"
178 config.displayTrans = not config.displayTrans
179 .displayButton = 2*config.displayTrans
180 call Draw_button 'table$' '.label$' '.displayButton'
183 procedure processConfigDisplayNumbers .clickX .clickY .pressed$
185 .label$ = "DisplayNumbers"
186 config.displayNumbers = not config.displayNumbers
187 .displayButton = 2*config.displayNumbers
188 call Draw_button 'table$' '.label$' '.displayButton'
191 procedure processConfigLanguage .language$ .clickX .clickY .pressed$
193 .label$ = "Language_'.language$'"
194 call processLanguageCodes '.table$' '.label$'
197 procedure processConfigShowBackground .clickX .clickY .pressed$
199 .label$ = "ShowBackground"
200 config.showBackground = not config.showBackground
201 .displayButton = 2*config.showBackground
202 call Draw_button 'table$' '.label$' '.displayButton'
205 procedure processConfigInput .input$ .clickX .clickY .pressed$
207 .label$ = "Input_'.input$'"
208 call Draw_button '.table$' Input_'config.input$' 0
209 config.input$ = .input$
210 call Draw_button '.table$' Input_'config.input$' 2
213 procedure processConfigRegister .register .clickX .clickY .pressed$
215 .label$ = "Register_'.register'"
216 call setRegisterFromLabel '.table$' '.label$'
219 procedure setRegisterFromLabel .table$ .label$
220 call Draw_button '.table$' Register_'config.register' 0
221 call Draw_button '.table$' '.label$' 2
222 # Someone might have to use more than 3 chars for the config.register code
223 .numChars = length(.label$) - length("Register_")
224 .registerText$ = right$(.label$, .numChars)
225 config.register = '.registerText$'
228 procedure processConfigDeleteWordlist .clickX .clickY .pressed$
230 .label$ = "DeleteWordlist"
232 # Do not process undeletable word lists, only those stored in the
233 # preferencesDirectory$ can be deleted
234 if fileReadable("'sgc2wordlists$'/'wordlistName$'")
235 call findLabel '.table$' !'.label$'
237 select Table '.table$'
238 .alertText$ = Get value... 'findLabel.row' Text
239 .confirmKey$ = Get value... 'findLabel.row' Key
240 .popupText$ = Get value... 'findLabel.row' Helptext
242 exit Cannot find delete directive: '.table$' !'.label$'
244 call write_text_popup 'defaultFont$' 14 '.popupText$'
245 call Draw_button '.table$' '.label$' 2
246 alertText$ = .alertText$
247 call Draw_button '.table$' '.label$' 3
250 # Wait for confirmation
252 if demoInput(.confirmKey$)
253 .deleteWordListDir$ = wordlistName$
254 call load_word_list "'localWordlistDir$'" 1
255 call removeWordlist '.deleteWordListDir$'
257 call Draw_button '.table$' '.label$' 0
258 call Draw_config_page
262 wordlistTag$ = "Wordlist name"
263 procedure processConfigInstallWordlist .clickX .clickY .pressed$
265 .label$ = "InstallWordlist"
266 call Draw_button '.table$' '.label$' 1
268 # Do not use the automatic sgc list option, ask for a wordlist NAME
270 call findLabel '.table$' '.label$'
272 select Table '.table$'
273 .openDialogue$ = Get value... '.row' Helptext
274 call convert_praat_to_utf8 '.openDialogue$'
275 .openDialogue$ = convert_praat_to_utf8.text$
276 .wordlistButton$ = replace$(wordlistTag$, " ", "_", 0)
277 .wordlistButton$ = replace_regex$(.wordlistButton$, "^.", "\l&", 0)
278 beginPause(.openDialogue$)
279 sentence (wordlistTag$, "")
280 clicked = endPause ("Cancel", "Open", 2)
283 .wordlist_Name$ = '.wordlistButton$'$
285 call install_wordlists_by_name '.wordlist_Name$'
287 call sgc2wordlist 'homeDirectory$'
288 call sgc2wordlist 'homeDirectory$'/Downloads
289 call sgc2wordlist 'homeDirectory$'/Documents
290 call sgc2wordlist 'homeDirectory$'/My Documents
291 call sgc2wordlist 'homeDirectory$'/My Documents/Downloads
292 call sgc2wordlist 'homeDirectory$'/Desktop
293 call sgc2wordlist 'preferencesAppDir$'
295 call load_word_list "'localWordlistDir$'" 0
296 call Draw_button '.table$' '.label$' 0
297 call Draw_config_page
300 procedure processConfigOpenWordlist .clickX .clickY .pressed$
302 .label$ = "OpenWordlist"
303 call Draw_button '.table$' '.label$' 1
306 call findLabel '.table$' '.label$'
308 select Table '.table$'
309 .openDialogue$ = Get value... '.row' Helptext
310 call convert_praat_to_utf8 '.openDialogue$'
311 .openDialogue$ = convert_praat_to_utf8.text$
313 .wordlist_Name$ = chooseReadFile$ (.openDialogue$)
314 call install_wordlists_by_name '.wordlist_Name$'
315 call load_word_list "'localWordlistDir$'" 0
316 call Draw_button '.table$' '.label$' 0
317 call Draw_config_page
320 procedure processConfigPerfSummary .clickX .clickY .pressed$
322 .label$ = "PerfSummary"
323 call Draw_button '.table$' '.label$' 1
325 call loadTable SummaryToneEvaluation
326 call write_tabbed_table SummaryToneEvaluation Evaluation_'config.language$'
328 select Table SummaryToneEvaluation
331 call Draw_button '.table$' '.label$' 0
332 call Draw_config_page
335 procedure processConfigListPerf .clickX .clickY .pressed$
338 call Draw_button '.table$' '.label$' 1
340 call write_tabbed_table 'initialiseSGC2.toneevaluation_table$' Evaluation_'config.language$'
343 call Draw_button '.table$' '.label$' 0
344 call Draw_config_page
347 procedure processConfigSavePerf .clickX .clickY .pressed$
350 call Draw_button '.table$' '.label$' 1
353 call findLabel '.table$' '.label$'
355 select Table '.table$'
356 .openDialogue$ = Get value... '.row' Helptext
357 call convert_praat_to_utf8 '.openDialogue$'
358 .openDialogue$ = convert_praat_to_utf8.text$
360 .wordlist_Name$ = chooseWriteFile$ (.openDialogue$, "Performance.Table")
361 if .wordlist_Name$ <> ""
362 select Table 'initialiseSGC2.toneevaluation_table$'
363 Write to table file... '.wordlist_Name$'
366 call Draw_button '.table$' '.label$' 0
367 call Draw_config_page
370 ###############################################################
372 # Obligatory button Processing Routines
374 # These MUST be defined
376 ###############################################################
378 procedure processConfigReturn .clickX .clickY .pressed$
381 call Draw_button '.table$' '.label$' 1
382 call write_preferences ""
385 procedure processConfigRefresh .clickX .clickY .pressed$
388 call Draw_config_page
391 procedure processConfigCredits .clickX .clickY .pressed$
394 call Draw_button '.table$' '.label$' 1
395 call write_text_table Credits_'config.language$'
397 call Draw_button '.table$' '.label$' 0
399 call Draw_config_page
402 procedure processConfigHelp .clickX .clickY .pressed$
405 call help_loop '.table$' Draw_config_page
408 ###############################################################
410 # Miscelaneous supporting code
412 ###############################################################
413 procedure install_wordlists_by_name .wordlist_Name$
414 if .wordlist_Name$ <> ""
415 printline '.wordlist_Name$'
416 if index(.wordlist_Name$, "/")
417 .sourceDir$ = left$(.wordlist_Name$, rindex(.wordlist_Name$, "/") -1)
418 .file$ = right$(.wordlist_Name$, length(.wordlist_Name$) - rindex(.wordlist_Name$, "/"))
419 call readWordlist "'.sourceDir$'" '.file$'
422 if index(.wordlist_Name$, ".")
425 .extension1$ = ".sgc"
426 .extension2$ = ".Table"
427 .extension3$ = ".txt"
429 for .e from .start to 4
430 .currentExtension$ = .extension'.e'$
431 call readWordlist "'homeDirectory$'" '.wordlist_Name$''.currentExtension$'
432 call readWordlist "'homeDirectory$'/Downloads" '.wordlist_Name$''.currentExtension$'
433 call readWordlist "'homeDirectory$'/Documents" '.wordlist_Name$''.currentExtension$'
434 call readWordlist "'homeDirectory$'/My Documents/Downloads" '.wordlist_Name$''.currentExtension$'
435 call readWordlist "'homeDirectory$'/My Documents" '.wordlist_Name$''.currentExtension$'
436 call readWordlist "'homeDirectory$'/Desktop" '.wordlist_Name$''.currentExtension$'
437 call readWordlist "'preferencesAppDir$'" '.wordlist_Name$''.currentExtension$'
443 # Word lists: It is a VERY good idea to make sure that word-lists
445 procedure load_word_list .localdir$ .relnumber
446 # Remove old word list
448 select Table 'wordlist$'
450 call wipeArea 'wipeWordlistArea$'
454 # Create Table that will recieve the wordlists and directories
455 Create Table with column names... AllWordLists 0 Name Directory
456 .currentWordlistRow = 0
458 # Start with the word lists in the distribution, unless the local directory exists!
459 if not fileReadable(.localdir$)
460 call CreateCreateWordlists
461 select Table CreateWordlists
462 .numLists = Get number of rows
464 select Table CreateWordlists
465 .currentName$ = Get value... '.i' Name
466 .currentDirectory$ = "*call Create'.currentName$'"
467 select Table AllWordLists
469 .currentWordlistRow = Get number of rows
470 Set string value... '.currentWordlistRow' Name '.currentName$'
471 .currentDirectory$ = "*call Create'.currentName$'"
472 Set string value... '.currentWordlistRow' Directory '.currentDirectory$'
474 select Table CreateWordlists
478 # First the global word lists
479 if fileReadable(globalwordlists$)
480 Create Strings as directory list... WordList 'globalwordlists$'
481 .numLists = Get number of strings
483 select Strings WordList
484 .currentName$ = Get string... '.i'
485 select Table AllWordLists
487 .currentWordlistRow = Get number of rows
488 Set string value... '.currentWordlistRow' Name '.currentName$'
489 .currentDirectory$ = globalwordlists$+"/"+.currentName$
490 Set string value... '.currentWordlistRow' Directory '.currentDirectory$'
492 select Strings WordList
496 # Now the preferences word lists
497 if fileReadable(sgc2wordlists$)
498 Create Strings as directory list... WordList 'sgc2wordlists$'
499 .numLists = Get number of strings
501 select Strings WordList
502 .currentName$ = Get string... '.i'
503 select Table AllWordLists
505 .currentWordlistRow = Get number of rows
506 Set string value... '.currentWordlistRow' Name '.currentName$'
507 .currentDirectory$ = sgc2wordlists$+"/"+.currentName$
508 Set string value... '.currentWordlistRow' Directory '.currentDirectory$'
510 select Strings WordList
514 # Finally, the local word lists
515 if fileReadable(.localdir$)
516 Create Strings as directory list... WordList '.localdir$'
517 .numLists = Get number of strings
519 select Strings WordList
520 .currentName$ = Get string... '.i'
521 select Table AllWordLists
523 .currentWordlistRow = Get number of rows
524 Set string value... '.currentWordlistRow' Name '.currentName$'
525 .currentDirectory$ = .localdir$+"/"+.currentName$
526 Set string value... '.currentWordlistRow' Directory '.currentDirectory$'
528 select Strings WordList
532 # Get the position of the current word list
533 select Table AllWordLists
535 .numLists = Get number of rows
536 if wordlistName$ <> ""
537 select Table AllWordLists
538 .currentNumber = Search column... Name 'wordlistName$'
540 wordlistNum = .currentNumber + .relnumber
541 if wordlistNum > .numLists
543 elsif wordlistNum < 1
544 wordlistNum = .numLists
546 select Table AllWordLists
547 wordlistName$ = Get value... 'wordlistNum' Name
548 .dirWordlistName$ = Get value... 'wordlistNum' Directory
549 .dirString$ = replace_regex$(.dirWordlistName$, "[ ]", "&", 0)
551 # Read in full tables
552 if fileReadable("'.dirString$'/wordlist.Table")
553 Read from file... '.dirString$'/wordlist.Table
554 Rename... 'wordlistName$'
555 # Praat wil change the name if it feels like it
556 wordlist$ = selected$("Table")
557 # Handle (legacy) simple word lists
558 elsif fileReadable("'.dirString$'/wordlist.txt")
559 Create Table with column names... "'wordlistName$'" 0 Pinyin Sound
560 wordlist$ = selected$("Table")
561 Read Strings from raw text file... '.dirString$'/wordlist.txt
562 Rename... RawWordList
563 .numWordStrings = Get number of strings
564 for .i to .numWordStrings
565 select Strings RawWordList
566 .currentLine$ = Get string... '.i'
567 .currentPinyin$ = extractWord$(.currentLine$, "")
568 if length(.currentLine$) > length(.currentPinyin$)+1
569 .currentFile$ = right$(.currentLine$, length(.currentPinyin$)+1)
570 elsif fileReadable("'.dirString$'/'.currentPinyin$'.spx")
571 .currentFile$ = .currentPinyin$+".spx"
572 elsif fileReadable("'.dirString$'/'.currentPinyin$'.flac")
573 .currentFile$ = .currentPinyin$+".flac"
574 elsif fileReadable("'.dirString$'/'.currentPinyin$'.wav")
575 .currentFile$ = .currentPinyin$+".wav"
576 elsif fileReadable("'.dirString$'/'.currentPinyin$'.mp3")
577 .currentFile$ = .currentPinyin$+".mp3"
581 select Table 'wordlist$'
583 Set string value... '.i' Pinyin '.currentPinyin$'
584 Set string value... '.i' Sound '.currentFile$'
586 select Strings RawWordList
589 select Table 'wordlist$'
590 elsif fileReadable(.dirString$)
591 Create Table with column names... "'wordlistName$'" 0 Pinyin Sound
592 wordlist$ = selected$("Table")
593 Create Strings as file list... RawWordList '.dirString$'/*
594 .numWordStrings = Get number of strings
596 for .j to .numWordStrings
597 select Strings RawWordList
598 .currentLine$ = Get string... '.j'
599 .currentFile$ = extractWord$(.currentLine$, "")
600 if index_regex(.currentFile$, "\.(spx|flac|wav|mp3)")
601 .currentPinyin$ = left$(.currentFile$, index(.currentFile$, ".")-1)
602 select Table 'wordlist$'
605 Set string value... '.i' Pinyin '.currentPinyin$'
606 Set string value... '.i' Sound '.currentFile$'
609 select Strings RawWordList
612 select Table 'wordlist$'
613 elsif startsWith(.dirString$, "*call ")
614 .callProcedure$ = right$(.dirString$, length(.dirString$)-1)
616 wordlist$ = selected$("Table")
619 # Can this wordlist be deleted?
620 if fileReadable("'sgc2wordlists$'/'wordlistName$'")
621 config.deleteWordlist = 0
623 config.deleteWordlist = -1
626 # Add a Character and Translation column if missing
627 select Table 'wordlist$'
628 numberOfWords = Get number of rows
629 .characterColumn = Get column index... Character
630 if not .characterColumn
631 Append column... Character
632 for .i to numberOfWords
633 Set string value... '.i' Character -
636 .translationColumn = Get column index... Translation
637 if not .translationColumn
638 Append column... Translation
639 for .i to numberOfWords
640 Set string value... '.i' Translation -
644 # Remove all rows without Pinyin
645 .numRows = Get number of rows
647 .rowNum = .numRows - i + 1
648 .pinyinValue$ = Get value... '.rowNum' Pinyin
649 if not index_regex(.pinyinValue$, "[a-zA-Z0-9]")
650 Remove row... '.rowNum'
653 numberOfWords = Get number of rows
655 # Shuffle words if requested
656 if config.shuffleLists
661 select Table AllWordLists
664 # There were no Word Lists
667 wordlistName$ = "No Word Lists available"
669 Create Table with column names... "'wordlistName$'" 0 Pinyin Character Translation Sound
670 wordlist$ = selected$("Table")
674 Set string value... '.i' Pinyin ni3hao3
675 Set string value... '.i' Character -
676 Set string value... '.i' Translation -
677 Set string value... '.i' Sound -
680 Set string value... '.i' Pinyin xie4xie0
681 Set string value... '.i' Character -
682 Set string value... '.i' Translation -
683 Set string value... '.i' Sound -
686 Set string value... '.i' Pinyin zai4jian4
687 Set string value... '.i' Character -
688 Set string value... '.i' Translation -
689 Set string value... '.i' Sound -
690 numberOfWords = Get number of rows
693 call set_window_title 'buttons$' 'wordlistName$'
696 procedure display_word_list_name
700 .displayWordList$ = replace_regex$(wordlistName$, "[_]", " ", 0)
701 call wipeArea 'wipeWordlistArea$'
702 call adjustFontSizeOnHeight 'defaultFont$' 'defaultFontSize' 5
703 .currentFontSize = adjustFontSizeOnHeight.newFontSize
706 demo Text special... '.xtext' Centre '.ytext' Bottom Helvetica '.currentFontSize' 0 '.displayWordList$'
709 call set_font_size 'defaultFontSize'
712 procedure write_word_list
714 call draw_tone_contour
716 # Write current Pinyin text
717 call display_text Black
719 # Write the current word list name
720 call display_word_list_name
723 procedure start_logging
724 if fileReadable("'preferencesLogDir$'/logPerformance.txt")
725 .logDirectory$ < 'preferencesLogDir$'/logPerformance.txt
726 .logDirectory$ = extractWord$(.logDirectory$, "")
727 if .logDirectory$ = "" or not fileReadable(.logDirectory$)
728 .logDirectory$ = "'preferencesLogDir$'"
730 createDirectory("'.logDirectory$'/sgc2log")
731 currentLogDirectory$ = "'.logDirectory$'/sgc2log/log'logtimeStamp$'"
732 createDirectory(currentLogDirectory$)
733 if not fileReadable("'currentLogDirectory$'/wordlist.Table")
734 .headerLine$ = "Pinyin'tab$'Character'tab$'Sound'newline$'"
735 .headerLine$ > 'currentLogDirectory$'/wordlist.Table
738 config.logPerformance = 1
742 procedure log_performance .recordedSound$ .register .proficiency .pinyin$ .choice$
744 .currentDate$ = date$()
745 .timeStamp$ = replace_regex$(.currentDate$, "[^a-zA-Z0-9\-_]", "-", 0)
746 .choiceText$ = replace_regex$(.choice$, "[^a-zA-Z0-9\-_]", "-", 0)
748 if config.logPerformance and fileReadable("'preferencesLogDir$'/logPerformance.txt")
749 .outfilename$ = .pinyin$+"_"+.choice$+"_'.register'_"+.timeStamp$+".wav"
750 .logtext$ = .pinyin$+tab$+.choice$+tab$+"'.register'Hz"+tab$+.currentDate$+tab$+.outfilename$+newline$
752 fileappend 'currentLogDirectory$'/logFile.txt '.logtext$'
754 fileappend 'currentLogDirectory$'/wordlist.Table '.pinyin$''tab$''.choice$''tab$''.outfilename$''newline$'
756 select Sound 'recordedSound$'
757 Write to WAV file... 'currentLogDirectory$'/'.outfilename$'
761 procedure paint_logging_light
763 .row = Search column... Label !Logging
765 exit Button Table Config does not have a row with label !Logging
768 .leftX = Get value... '.row' LeftX
769 .rightX = Get value... '.row' RightX
770 .lowY = Get value... '.row' LowY
771 .highY = Get value... '.row' HighY
772 .buttonColor$ = Get value... '.row' Color
773 .centerX = (.leftX + .rightX)/2
774 .centerY = (.lowY + .highY)/2
775 .radius = (.highY - .lowY )/(4*2)
776 .wipeRadius = 1.1*.radius
777 if config.logPerformance and fileReadable("'preferencesLogDir$'/logPerformance.txt")
778 demo Paint circle... White '.centerX' '.centerY' '.wipeRadius'
779 demo Paint circle... '.buttonColor$' '.centerX' '.centerY' '.radius'
782 demo Paint circle... White '.centerX' '.centerY' '.wipeRadius'
787 # Uninstall word lists
788 procedure removeWordlist .deletedWordlistName$
790 if fileReadable("'sgc2wordlists$'/'.deletedWordlistName$'")
791 .targetDir$ = "'sgc2wordlists$'/'.deletedWordlistName$'"
793 Create Strings as file list... DeleteList '.targetDir$'/*
794 .numdeleteFiles = Get number of strings
795 for .i to .numdeleteFiles
796 .file$ = Get string... '.i'
797 deleteFile("'.targetDir$'/'.file$'")
799 deleteFile("'.targetDir$'")
800 select Strings DeleteList
805 procedure sgc2wordlist .sourceDir$
806 if startsWith(.sourceDir$, "preferencesDirectory$")
807 .sourceDir$ = replace$(.sourceDir$, "preferencesDirectory$", preferencesDirectory$)
810 .targetDirectory$ = "'sgc2wordlists$'"
811 if fileReadable(.sourceDir$)
812 Create Strings as file list... PackageList '.sourceDir$'/*.sgc
813 .numFiles = Get number of strings
815 select Strings PackageList
816 .file$ = Get string... '.i'
817 call readWordlist '.sourceDir$' '.file$'
820 select Strings PackageList
825 # Debuggin remarks!!!
826 # fileReadable(<directory>) werkt niet in Windows
827 # De file paths / -> \\ must be performed on the filenames in Windows before the system_nocheck is given
828 # And yet only the 7z decompression has been implemented
829 windowsUnzipCommand$ = """C:\Program Files\7-Zip\7z"" x"
830 procedure readWordlist .sourceDir$ .file$
831 # No use doing anything if the source does not exist
832 if fileReadable("'.sourceDir$'/'.file$'")
833 # What will be the target wordlist directory?
834 .targetDirectory$ = "'sgc2wordlists$'"
835 .dirname$ = left$(.file$, rindex(.file$, ".")-1)
839 .wordlistDirectory$ = .targetDirectory$+"/"+.dirname$
840 # Wordlist directory does not exist, neither locally nor in the preferences
841 if not (fileReadable(.dirname$) or fileReadable(.wordlistDirectory$))
843 # Move source to destination
844 if index(.file$, ".sgc")
845 # Create wordlist directory
846 createDirectory(.wordlistDirectory$)
849 system bash -rc -- 'cp "'.sourceDir$'/'.file$'" "'.wordlistDirectory$'/"'
850 system cd ''.wordlistDirectory$'';bash -rc -- 'unzip "'.file$'"'
852 system copy "'.sourceDir$'/'.file$'" "'.wordlistDirectory$'/"
853 system chdir "'.wordlistDirectory$'" && 'windowsUnzipCommand$' "'.file$'"
855 deleteFile("'.wordlistDirectory$'/'.file$'")
856 elsif index_regex(.file$, "\.(Table|txt)")
857 # Create wordlist directory
858 createDirectory(.wordlistDirectory$)
860 .extension$ = replace_regex$(.file$, "^.+\.(Table|txt)$", "\1", 0)
862 system bash -rc -- 'cp "'.sourceDir$'/'.file$'" "'.wordlistDirectory$'/wordlist.'.extension$'"'
864 system copy "'.sourceDir$'/'.file$'" "'.wordlistDirectory$'/wordlist.'.extension$'"
866 elsif fileReadable("'.sourceDir$'/'.file$'/wordlist.Table") or fileReadable("'.sourceDir$'/'.file$'/wordlist.txt")
867 # Create wordlist directory
868 createDirectory(.wordlistDirectory$)
870 .sourceFiles = Create Strings as file list... SourceStrings '.sourceDir$'/'.file$'/
871 .numFiles = Get number of strings
873 select '.sourceFiles'
874 .currentFile$ = Get string... '.i'
876 system bash -rc -- 'cp "'.sourceDir$'/'.file$'/'.currentFile$'" "'.wordlistDirectory$'/"'
878 system copy "'.sourceDir$'/'.file$'/'.currentFile$'" "'.wordlistDirectory$'/"
881 select '.sourceFiles'
885 # Set current word list to read list
887 wordlistName$ = .dirname$
890 .label$ = "!NotAWordlist"
893 call findLabel '.table$' '.label$'
895 select Table '.table$'
896 .helpText$ = Get value... '.row' Helptext
897 .filetext$ = replace_regex$("'.sourceDir$'/'.file$'", "_", "\\_ ", 0)
898 call write_text_popup 'defaultFont$' 14 '.helpText$' "'.filetext$'"
899 # Wait for confirmation