├── .gitattributes
├── .github
├── actions
│ ├── setup-mysql-db
│ │ └── action.yml
│ ├── setup-node
│ │ └── action.yml
│ └── setup-php
│ │ └── action.yml
└── workflows
│ └── ci.yml
├── .gitignore
├── .php-cs-fixer.dist.php
├── .prettierignore
├── README.md
├── SETUP
├── .htaccess
├── API.md
├── ARCHIVING.md
├── CHANGELOG.md
├── CODE_DOCS.md
├── CODE_STYLE.md
├── DEVELOPMENT.md
├── GRAPHS.md
├── INSTALL.md
├── MediaWiki_extensions
│ ├── README.md
│ ├── dpExtensions.php
│ └── hospitalExtensions.php
├── README.md
├── UNICODE.md
├── UPGRADE.md
├── apache2.conf.example
├── check_db_schema.template
├── ci
│ ├── Makefile
│ ├── check_includes.php
│ ├── check_require_login.php
│ ├── check_security.php
│ ├── lint_charsuites.php
│ ├── lint_json_files.sh
│ └── lint_php_files.sh
├── configuration.sh
├── configure
├── db_schema.sql
├── devex
│ ├── README.md
│ └── dpdev-docker
│ │ ├── Dockerfile
│ │ ├── configuration.sh
│ │ ├── container_startup.sh
│ │ ├── dp_db.sql
│ │ ├── index_redirect.php
│ │ ├── init_users.php
│ │ ├── install_composer.sh
│ │ └── populate_data.sh
├── diff_rq
├── document_database.php
├── dp.cron.template
├── dump_db_schema.template
├── generate_css_from_less.sh
├── generate_manifest_cache.php
├── get_git_clone
├── import_old_configuration.php
├── install_db.php
├── install_dependencies.sh
├── locale
│ ├── compile.sh
│ ├── de_DE
│ │ └── LC_MESSAGES
│ │ │ └── messages.po
│ ├── fr_FR
│ │ └── LC_MESSAGES
│ │ │ └── messages.po
│ ├── it_IT
│ │ └── LC_MESSAGES
│ │ │ └── messages.po
│ └── pt_PT
│ │ └── LC_MESSAGES
│ │ └── messages.po
├── phpbb3-functions.php.patch
├── phpbb32-pm.php.patch
├── phpstan_bootstrap.inc
├── showdeps.py
├── site_admin_notes.txt
├── site_registration_protection.php.example
├── sort_mysqldump.php
├── tests
│ ├── .htaccess
│ ├── README.md
│ ├── ci_configuration.sh
│ ├── jsTests
│ │ ├── addprooferTests.js
│ │ ├── ajaxTests.js
│ │ ├── characterValidation.js
│ │ ├── dp_proofTests.js
│ │ ├── formatPreviewTests.js
│ │ ├── jsUnit.js
│ │ ├── qunit.html
│ │ ├── splitControlTests.js
│ │ └── srchrepTests.js
│ ├── manual_web
│ │ ├── .htaccess
│ │ ├── README.md
│ │ ├── page_compare
│ │ │ ├── README.md
│ │ │ └── manual_page_compare_test.php
│ │ └── split_test
│ │ │ ├── 004.png
│ │ │ ├── index.html
│ │ │ ├── sample.txt
│ │ │ ├── split_test.css
│ │ │ ├── switchable_split.js
│ │ │ ├── switchable_split.php
│ │ │ ├── vertical_horizontal_split.js
│ │ │ ├── vertical_horizontal_split_flex.php
│ │ │ ├── vertical_split.js
│ │ │ ├── vertical_split.php
│ │ │ └── vertical_split_flex.php
│ ├── smoketests
│ │ ├── deprecated.php
│ │ ├── dot.png
│ │ ├── error.php
│ │ ├── hello.php
│ │ ├── notice.php
│ │ ├── pageload_smoketest.py
│ │ ├── posts.json
│ │ ├── smoketest_setup.sh
│ │ ├── test_tables.sql
│ │ ├── users.json
│ │ └── warning.php
│ └── unittests
│ │ ├── ActivityTest.php
│ │ ├── ApiTest.php
│ │ ├── DPDatabaseTest.php
│ │ ├── FlattenDirectoryTest.php
│ │ ├── MARCRecordTest.php
│ │ ├── MiscUtilsTest.php
│ │ ├── NonactivatedUserTest.php
│ │ ├── PageCompareTest.php
│ │ ├── ParamValidatorTest.php
│ │ ├── ProjectTest.php
│ │ ├── ProjectUtils.inc
│ │ ├── SettingsTest.php
│ │ ├── StorageTest.php
│ │ ├── TableDocumentationTest.php
│ │ ├── UnicodeTest.php
│ │ ├── UserTest.php
│ │ ├── WordCheckEngineTest.php
│ │ ├── ZipMethodsTest.php
│ │ ├── data
│ │ ├── corrupted.zip
│ │ ├── empty.zip
│ │ ├── not_zip.zip
│ │ ├── valid.zip
│ │ ├── wrong.extension
│ │ ├── yaz_array.b64
│ │ ├── yaz_array_added_names.b64
│ │ └── yaz_array_no_publisher_name.b64
│ │ ├── page_compare_data
│ │ ├── footnotes
│ │ │ ├── formatted.txt
│ │ │ └── unformatted.txt
│ │ ├── poem
│ │ │ ├── formatted.txt
│ │ │ └── unformatted.txt
│ │ └── usernotes
│ │ │ ├── formatted.txt
│ │ │ └── unformatted.txt
│ │ ├── phpunit.xml
│ │ ├── phpunit_bootstrap.php
│ │ └── phpunit_test_helpers.inc
├── update_from_github
└── upgrade
│ ├── 15
│ ├── 20200516_alter_users.php
│ ├── 20200815_create_team_membership.php
│ ├── 20200827_remove_uber_projects.php
│ ├── 20200925_alter_news_items.php
│ ├── 20201023_alter_tasks.php
│ ├── 20201215_alter_non_activated_users.php
│ ├── 20201215_alter_users.php
│ ├── 20201216_alter_projects.php
│ ├── 20201217_alter_user_profiles.php
│ ├── 20201222_alter_biographies.php
│ ├── 20201224_add_charcoal_theme.php
│ ├── 20201229_replace_project_templates.php
│ ├── 20201231_alter_special_days.php
│ └── 20210104_generate_archive_metadata.php
│ ├── 16
│ ├── 20210214_alter_project_holds.php
│ ├── 20210306_clean_usersettings.php
│ ├── 20210313_alter_non_activated_users_table.php
│ ├── 20210509_alter_user_profiles.php
│ ├── 20210802_alter_user_profiles.php
│ └── 20210807_update_sf_genre.php
│ ├── 17
│ └── 20220123_alter_users_table.php
│ ├── 18
│ └── 20220212_alter_projects.php
│ ├── 19
│ ├── 20230601_prune_user_project_info.php
│ ├── 20230627_alter_tasks.php
│ └── 20230703_clean_task_statuses.php
│ ├── 20
│ ├── 20230920_drop_i_prefs_column.php
│ ├── 20230920_move_pmdefault_to_usersettings.php
│ ├── 20230920_update_user_table.php
│ ├── 20240129_add_id_to_queue_defns.php
│ └── 20240205_alter_queue_defns.php
│ ├── 21
│ ├── 20240101_drop_marc_records.php
│ ├── 20240403_update_user_table.php
│ ├── 20240414_update_current_tallies.php
│ ├── 20240420_sparsify_past_tallies.php
│ ├── 20240611_update_job_logs.php
│ ├── 20240620_update_wordcheck_events.php
│ ├── 20240712_update_special_days.php
│ ├── 20240714_update_user_project_info.php
│ ├── 20240715_update_projects.php
│ └── 20240915_update_image_sources.php
│ ├── 22
│ └── 20241219_create_json_storage.php
│ ├── 23
│ ├── 20250305_replace_project_bios.php
│ ├── 20250306_drop_authors_tables.php
│ └── 20250401_alter_sessions.php
│ └── 24
│ ├── 20250927_delete_greek_quiz.php
│ └── 20251011_drop_pg_books.php
├── accounts
├── activate.php
├── addproofer.js
├── addproofer.php
├── login.php
├── login_failure.php
├── logout.php
└── require_login.php
├── activity_hub.php
├── api
├── ApiRouter.inc
├── README.md
├── USERS_GUIDE.md
├── api_common.inc
├── dp-openapi.yaml
├── exceptions.inc
├── index.php
├── v1.inc
├── v1_docs.inc
├── v1_projects.inc
├── v1_queues.inc
├── v1_stats.inc
├── v1_storage.inc
└── v1_validators.inc
├── composer.json
├── composer.lock
├── credits.php
├── crontab
├── ArchiveProjects.inc
├── AutoModify.inc
├── CleanDownloadTemp.inc
├── CleanUploadsTrash.inc
├── ExtendSiteTallyGoals.inc
├── NotifyOldPP.inc
├── PruneJobLogs.inc
├── PruneNonActivatedUsers.inc
├── PrunePageData.inc
├── README.md
├── RecordProjectStateCounts.inc
├── RecordUserCounts.inc
├── SendSmoothreadingNotifications.inc
├── TakeTallySnapshots.inc
├── ToggleSpecialDayQueues.inc
└── run_background_job.php
├── docker-compose.yml
├── eslint.config.js
├── faq
├── InterfaceDiagram.graphml
├── InterfaceDiagram.png
├── doc-copy.php
├── font_sample.php
├── formatting_summary.odt
├── formatting_summary.pdf
├── fr
│ ├── proofing_summary.odt
│ └── proofing_summary.pdf
├── pophelp
│ ├── prefs
│ │ └── prefs_pophelp.inc
│ └── teams
│ │ └── teams_pophelp.inc
├── privacy.php
├── prooffacehelp.php
├── proofing_summary.odt
├── proofing_summary.pdf
├── site_progress_snapshot_legend.php
├── translate.php
└── wordcheck_data.php
├── feeds
└── backend.php
├── graphics
├── Book-Plus-Small-Disabled.gif
├── Book-Plus-Small.gif
├── New-Window.gif
├── Recycle-Window.gif
├── bottom.gif
├── center.gif
├── dp-logo-dark.svg
├── dp-logo.svg
├── dp-mark-180px-white.png
├── dp-mark-32px.ico
├── exclamation.gif
├── icon_du.png
├── icon_mentor.png
├── icon_newbie.png
├── icon_pf.png
├── icon_pm.png
├── icon_pp.png
├── icon_ppv.png
├── icon_proofer.png
├── icon_sa.png
├── left.gif
├── middle.gif
├── right.gif
├── top.gif
└── xml.gif
├── index.php
├── license.txt
├── list_etexts.php
├── locale
├── debug_ui_language.php
└── translators
│ └── index.php
├── package-lock.json
├── package.json
├── pastnews.php
├── phpcs.xml
├── phpstan.neon
├── pinc
├── 3rdparty
│ ├── README.md
│ ├── iconify
│ │ ├── MIT_LICENSE
│ │ ├── README.md
│ │ ├── details.json
│ │ ├── octicon-columns-24.svg
│ │ └── octicon-rows-24.svg
│ └── mediawiki
│ │ ├── ComplexityException.php
│ │ ├── DairikiDiff.php
│ │ ├── DiffEngine.php
│ │ ├── DiffFormatter.php
│ │ ├── README.md
│ │ ├── TableDiffFormatter.php
│ │ ├── WordAccumulator.php
│ │ ├── WordLevelDiff.php
│ │ ├── details.json
│ │ ├── gpl-2.0.txt
│ │ └── mediawiki.diff.styles.css
├── Activity.inc
├── ApiStorage.inc
├── BBDiffFormatter.inc
├── BackgroundJob.inc
├── CharSuites.inc
├── CharacterSelector.inc
├── DPDatabase.inc
├── DPage.inc
├── DifferenceEngineWrapper.inc
├── DifferenceEngineWrapperBB.inc
├── DifferenceEngineWrapperTable.inc
├── ImageUtils.inc
├── JsonStorage.inc
├── LPage.inc
├── MARCRecord.inc
├── NonactivatedUser.inc
├── POFile.inc
├── PageUnformatter.inc
├── Pool.inc
├── Project.inc
├── ProjectSearchForm.inc
├── ProjectSearchResults.inc
├── ProjectSearchResultsConfig.inc
├── ProjectState.inc
├── ProjectTransition.inc
├── ProofProject.inc
├── ProofreadingToolbox.inc
├── Quiz.inc
├── RandomRule.inc
├── RandomRule.md
├── Round.inc
├── Settings.inc
├── SiteConfig.inc
├── SortUtility.inc
├── Stage.inc
├── Stopwatch.inc
├── TableDocumentation.inc
├── TallyBoard.inc
├── Team.inc
├── ThemedTable.inc
├── User.inc
├── UserProfile.inc
├── abort.inc
├── access_log.inc
├── archiving.inc
├── automodify.inc
├── autorelease.inc
├── bad_bytes.inc
├── base.inc
├── bootstrap.inc
├── button_defs.inc
├── charsuite-basic-cyrillic.inc
├── charsuite-basic-greek.inc
├── charsuite-basic-latin.inc
├── charsuite-extended-european-latin-a.inc
├── charsuite-extended-european-latin-b.inc
├── charsuite-extended-european-latin-c.inc
├── charsuite-math-symbols.inc
├── charsuite-medievalist-supplement.inc
├── charsuite-polytonic-greek.inc
├── charsuite-semitic-and-indic.inc
├── charsuite-symbols-collection.inc
├── codepoint_validator.inc
├── comment_inclusions.inc
├── daily_page_limit.inc
├── dpsession.inc
├── dpsql.inc
├── email_address.inc
├── faq.inc
├── filter_project_list.inc
├── forum_interface.inc
├── forum_interface_json.inc
├── forum_interface_phpbb3.inc
├── genres.inc
├── gettext_setup.inc
├── gradual.inc
├── graph_data.inc
├── html_page_common.inc
├── http_headers.inc
├── image_check.inc
├── iso_lang_list.inc
├── job_log.inc
├── js_newpophelp.inc
├── js_newwin.inc
├── lang_data.inc
├── languages.inc
├── links.inc
├── list_projects.inc
├── mentoring.inc
├── metarefresh.inc
├── misc.inc
├── new_user_mails.inc
├── page_controls.inc
├── page_table.inc
├── page_tally.inc
├── pg.inc
├── phpbb3.inc
├── post_files.inc
├── post_processing.inc
├── prefs_options.inc
├── privacy.inc
├── project_edit.inc
├── project_quick_check.inc
├── project_trans.inc
├── quizzes.inc
├── release_queue.inc
├── resolution.inc
├── send_mail.inc
├── showavailablebooks.inc
├── showstartexts.inc
├── site_news.inc
├── site_structure.inc
├── site_vars.php.template
├── slim_header.inc
├── smoothread.inc
├── special_colors.inc
├── stages.inc
├── theme.inc
├── unicode.inc
├── upload_file.inc
├── user_is.inc
├── user_project_info.inc
├── walkthrough.inc
└── wordcheck_engine.inc
├── pophelp.php
├── project.php
├── quiz
├── generic
│ ├── data
│ │ ├── qd_formatting1.inc
│ │ ├── qd_formatting2.inc
│ │ ├── qd_formatting3.inc
│ │ ├── qd_formatting4.inc
│ │ ├── qd_formatting5.inc
│ │ ├── qd_p_aeoe_1.inc
│ │ ├── qd_p_aeoe_2.inc
│ │ ├── qd_p_basic_1.inc
│ │ ├── qd_p_basic_2.inc
│ │ ├── qd_p_basic_3.inc
│ │ ├── qd_p_basic_4.inc
│ │ ├── qd_p_basic_5.inc
│ │ ├── qd_p_basicx_1.inc
│ │ ├── qd_p_basicx_2.inc
│ │ ├── qd_p_fraktur.inc
│ │ ├── qd_p_mod1_1.inc
│ │ ├── qd_p_mod1_2.inc
│ │ ├── qd_p_mod1_3.inc
│ │ ├── qd_p_mod1_4.inc
│ │ ├── qd_p_mod1_5.inc
│ │ ├── qd_p_mod2_1.inc
│ │ ├── qd_p_mod2_2.inc
│ │ ├── qd_p_mod2_3.inc
│ │ ├── qd_p_mod2_4.inc
│ │ ├── qd_p_mod2_5.inc
│ │ ├── qd_p_old_1.inc
│ │ ├── qd_p_old_2.inc
│ │ ├── qd_p_old_3.inc
│ │ └── qd_p_thorn.inc
│ ├── hints.php
│ ├── images
│ │ ├── Fraktur_alphabet.png
│ │ ├── abbr_France.png
│ │ ├── abbr_complete.png
│ │ ├── abbr_ground.png
│ │ ├── aelig_ital_bump.png
│ │ ├── aelig_ital_teardrop.png
│ │ ├── amp.png
│ │ ├── amp_blackletter.png
│ │ ├── amp_blackletter2.png
│ │ ├── amp_ital.png
│ │ ├── blackletter_sample.png
│ │ ├── dashes.png
│ │ ├── oelig_ital.png
│ │ ├── qi_formatting1.png
│ │ ├── qi_formatting2.png
│ │ ├── qi_formatting3.png
│ │ ├── qi_formatting4.png
│ │ ├── qi_formatting5.png
│ │ ├── qi_p_aeoe_1.png
│ │ ├── qi_p_aeoe_2.png
│ │ ├── qi_p_basic_1.png
│ │ ├── qi_p_basic_2.png
│ │ ├── qi_p_basic_3.png
│ │ ├── qi_p_basic_4.png
│ │ ├── qi_p_basic_5.png
│ │ ├── qi_p_basicx_1.png
│ │ ├── qi_p_basicx_2.png
│ │ ├── qi_p_fraktur.png
│ │ ├── qi_p_greek_1.png
│ │ ├── qi_p_greek_2.png
│ │ ├── qi_p_greek_3.png
│ │ ├── qi_p_greek_4.png
│ │ ├── qi_p_greek_5.png
│ │ ├── qi_p_mod1_1.png
│ │ ├── qi_p_mod1_2.png
│ │ ├── qi_p_mod1_3.png
│ │ ├── qi_p_mod1_4.png
│ │ ├── qi_p_mod1_5.png
│ │ ├── qi_p_mod2_1.png
│ │ ├── qi_p_mod2_2.png
│ │ ├── qi_p_mod2_3.png
│ │ ├── qi_p_mod2_4.png
│ │ ├── qi_p_mod2_5.png
│ │ ├── qi_p_old_1.png
│ │ ├── qi_p_old_2.png
│ │ ├── qi_p_old_3.png
│ │ ├── qi_p_thorn.png
│ │ ├── thorn_cap.png
│ │ ├── thorn_cap2.png
│ │ ├── thorn_lower.png
│ │ ├── thorn_lower2.png
│ │ ├── u_ital.png
│ │ └── v_ital.png
│ ├── main.php
│ ├── orig.php
│ ├── proof.php
│ ├── quiz_defaults.inc
│ ├── quiz_page.inc
│ ├── returnfeed.php
│ ├── right.php
│ └── wizard
│ │ ├── checks.php
│ │ ├── default_messages.php
│ │ ├── general.php
│ │ ├── messages.php
│ │ ├── new_quiz.php
│ │ ├── output.php
│ │ ├── output_quiz.php
│ │ ├── quiz_pages.php
│ │ └── start.php
├── index.php
├── small_theme.inc
├── start.php
└── tuts
│ ├── tut_p_aeoe_1.php
│ ├── tut_p_aeoe_2.php
│ ├── tut_p_basic_1.php
│ ├── tut_p_basic_2.php
│ ├── tut_p_basic_3.php
│ ├── tut_p_basic_4.php
│ ├── tut_p_basic_5.php
│ ├── tut_p_fraktur.php
│ ├── tut_p_mod1_1.php
│ ├── tut_p_mod1_2.php
│ ├── tut_p_mod1_3.php
│ ├── tut_p_mod1_4.php
│ ├── tut_p_mod1_5.php
│ ├── tut_p_mod2_1.php
│ ├── tut_p_mod2_2.php
│ ├── tut_p_mod2_3.php
│ ├── tut_p_mod2_4.php
│ ├── tut_p_mod2_5.php
│ ├── tut_p_old_1.php
│ ├── tut_p_old_2.php
│ ├── tut_p_old_3.php
│ └── tut_p_thorn.php
├── scripts
├── analyse_format.js
├── api.js
├── character_test.js
├── control_bar.js
├── dropdown.js
├── file_resume.js
├── filter_project.js
├── gettext.js
├── navbar_menu.js
├── page_browse.js
├── page_table.js
├── project.js
├── splitControl.js
├── svgGraphs.js
├── tasks.js
├── text_validator.js
├── text_view.js
├── userprefs.js
├── view_splitter.js
└── word_freq_table.js
├── stats
├── PP_unknown.php
├── equilibria.php
├── includes
│ ├── common.inc
│ ├── member.inc
│ └── team.inc
├── index.php
├── members
│ ├── jointeam.php
│ ├── mbr_list.php
│ ├── mbr_xml.php
│ ├── mdetail.php
│ ├── memberstats.xsd
│ └── quitteam.php
├── misc_stats1.php
├── misc_user_graphs.php
├── pages_in_states.php
├── pages_proofed_graphs.php
├── percent_users_who_proof.php
├── pm_stats.php
├── pp_stage_goal.php
├── pp_stats.php
├── ppv_stats.php
├── projects_Xed_graphs.php
├── proof_stats.php
├── release_queue.php
├── requested_books.php
├── round_backlog.php
├── round_backlog_days.php
├── teams
│ ├── new_team.php
│ ├── tdetail.php
│ ├── team_topic.php
│ ├── teams_xml.php
│ ├── teamstats.xsd
│ ├── tedit.php
│ └── tlist.php
└── user_logon_graphs.php
├── styles
├── README.md
├── design_philosophy.php
├── fonts
│ ├── DP Sans Mono License.txt
│ ├── DPSansMono.sfd
│ ├── DPSansMono.ttf
│ ├── DPSansMono.woff
│ ├── DPSansMono.woff2
│ ├── DejaVu Fonts License.txt
│ ├── DejaVuSansMono-Bold-webfont.woff
│ ├── DejaVuSansMono-BoldOblique-webfont.woff
│ ├── DejaVuSansMono-Oblique-webfont.woff
│ ├── DejaVuSansMono-webfont.woff
│ ├── EB Garamond License.txt
│ ├── EBGaramond-Bold.woff2
│ ├── README.md
│ └── details.json
├── global.less
├── layout.less
├── page_interfaces.less
├── preview.css
├── slim_header.css
├── slim_header.less
├── statsbar.css
├── statsbar.less
├── style_demo.php
└── themes
│ ├── README.md
│ ├── charcoal.css
│ ├── charcoal.less
│ ├── classic_grey.css
│ ├── classic_grey.less
│ ├── project_gutenberg.css
│ ├── project_gutenberg.less
│ ├── royal_blues.css
│ └── royal_blues.less
├── tasks.php
├── tools
├── change_sr_commitment.php
├── changestate.php
├── charsuites.php
├── download_images.php
├── extend_sr.php
├── modify_access.php
├── page_browser.js
├── page_browser.php
├── pending_access_requests.php
├── pool.php
├── post_proofers
│ ├── postcomments.php
│ ├── ppv_report.php
│ └── smooth_reading.php
├── project_manager
│ ├── add_files.php
│ ├── automodify.php
│ ├── bad_bytes_explainer.php
│ ├── clearance_check.php
│ ├── diff.php
│ ├── edit_common.inc
│ ├── edit_pages.php
│ ├── edit_project_word_lists.php
│ ├── editproject.php
│ ├── external_catalog_search.php
│ ├── generate_post_files.php
│ ├── handle_bad_page.js
│ ├── handle_bad_page.php
│ ├── manage_image_sources.php
│ ├── marc_inspector.php
│ ├── page_compare.php
│ ├── page_detail.php
│ ├── page_operations.inc
│ ├── project_quick_check.php
│ ├── projectmgr.inc
│ ├── projectmgr.js
│ ├── projectmgr.php
│ ├── remote_file_manager.php
│ ├── show_adhoc_word_details.php
│ ├── show_all_good_word_suggestions.js
│ ├── show_all_good_word_suggestions.php
│ ├── show_current_flagged_words.php
│ ├── show_good_word_suggestions.php
│ ├── show_good_word_suggestions_detail.php
│ ├── show_image_sources.php
│ ├── show_project_possible_bad_words.php
│ ├── show_project_stealth_scannos.php
│ ├── show_project_wordcheck_stats.php
│ ├── show_project_wordcheck_usage.php
│ ├── show_specials.php
│ ├── show_word_context.js
│ ├── show_word_context.php
│ ├── update_illos.php
│ ├── wfb_images
│ │ ├── wfb_delete.png
│ │ ├── wfb_directory.gif
│ │ ├── wfb_download.png
│ │ ├── wfb_file.gif
│ │ ├── wfb_move.png
│ │ ├── wfb_rename.png
│ │ └── wfb_transparent.gif
│ └── word_freq_table.inc
├── proofers
│ ├── PPage.inc
│ ├── character_selector.js
│ ├── ctrl_frame.php
│ ├── dp_proof.js
│ ├── dp_scroll.js
│ ├── for_mentors.php
│ ├── gfx
│ │ ├── bt1.png
│ │ ├── bt12.png
│ │ ├── bt13.png
│ │ ├── bt14.png
│ │ ├── bt15.png
│ │ ├── bt16.png
│ │ ├── bt2.png
│ │ ├── bt20.png
│ │ ├── bt3.png
│ │ ├── bt4.png
│ │ ├── bt5.png
│ │ ├── bt7.png
│ │ ├── bt7_n.png
│ │ ├── bt8.png
│ │ └── bt9.png
│ ├── image_block_enh.inc
│ ├── image_frame_std.php
│ ├── images_index.php
│ ├── mktable.php
│ ├── my_projects.php
│ ├── my_suggestions.php
│ ├── preview.inc
│ ├── previewControl.js
│ ├── process_diacritcal_markup.js
│ ├── processtext.php
│ ├── project_topic.php
│ ├── proof.php
│ ├── proof_frame.inc
│ ├── proof_frame.php
│ ├── proof_frame_enh.inc
│ ├── proof_frame_std.inc
│ ├── proof_image.js
│ ├── proof_validate.js
│ ├── report_bad_page.php
│ ├── review_work.php
│ ├── round.php
│ ├── spellcheck_text.inc
│ ├── srchrep.js
│ ├── srchrep.php
│ ├── text_data_processor.js
│ ├── text_frame_std.inc
│ ├── text_frame_std.php
│ ├── toolbox.js
│ └── wordcheck.js
├── remove_project_hold.php
├── request_access.php
├── search.php
├── set_project_event_subs.php
├── set_project_holds.php
├── setlangcookie.php
├── site_admin
│ ├── convert_project_table_utf8.php
│ ├── copy_pages.php
│ ├── delete_pages.php
│ ├── displayrandrules.php
│ ├── edit_mail_address_for_non_activated_user.php
│ ├── index.php
│ ├── manage_random_rules.php
│ ├── manage_site_access_privileges.php
│ ├── manage_site_charsuites.php
│ ├── manage_site_word_lists.php
│ ├── manage_special_days.php
│ ├── manage_user_sessions.php
│ ├── project_jump.php
│ ├── projects_with_odd_values.php
│ ├── rename_pages.php
│ ├── sa_common.inc
│ ├── shared_postednums.php
│ ├── show_access_log.php
│ ├── show_common_words_from_project_word_lists.php
│ ├── show_job_log.php
│ └── sitenews.php
├── site_search.php
├── upload_resumable_file.php
└── upload_text.php
├── userprefs.php
├── users
└── teams
│ ├── avatar
│ ├── avatar_default.png
│ ├── avatar_default2.png
│ └── dp_avatar.png
│ └── icon
│ ├── dp_icon.png
│ ├── icon_default.png
│ └── icon_default2.png
└── webpack.config.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # line ending settings based on
2 | # https://help.github.com/articles/dealing-with-line-endings/
3 | # Set the default behavior, in case people don't have core.autocrlf set.
4 | * text eol=lf
5 |
6 | # Explicitly declare text files you want to always be normalized and converted
7 | # to native line endings on checkout.
8 | *.php text
9 | *.inc text
10 | *.txt text
11 | *.html text
12 | *.css text
13 | *.js text
14 | *.sh text
15 |
16 | # Denote all files that are truly binary and should not be modified.
17 | *.png binary
18 | *.jpg binary
19 | *.gif binary
20 | *.odf binary
21 | *.odt binary
22 | *.pdf binary
23 | *.ttf binary
24 | *.psd binary
25 | *.mo binary
26 | *.sit binary
27 | *.woff binary
28 | *.woff2 binary
29 | *.eot binary
30 |
--------------------------------------------------------------------------------
/.github/actions/setup-mysql-db/action.yml:
--------------------------------------------------------------------------------
1 | runs:
2 | using: "composite"
3 | steps:
4 | - name: Start mysql service
5 | shell: bash
6 | run: sudo /etc/init.d/mysql start
7 | - name: Configure mysql
8 | shell: bash
9 | run: |
10 | mysql -uroot -proot -e "CREATE DATABASE dp_test_db CHARACTER SET utf8mb4;"
11 | mysql -uroot -proot -e "CREATE USER dp_test_user@localhost IDENTIFIED BY 'dp_test_password';"
12 | mysql -uroot -proot -e "GRANT ALL ON dp_test_db.* TO dp_test_user@localhost;"
13 | - name: Configure site setup
14 | shell: bash
15 | run: SETUP/configure SETUP/tests/ci_configuration.sh .
16 | - name: Install DB schema
17 | shell: bash
18 | run: cd SETUP && php install_db.php
19 |
--------------------------------------------------------------------------------
/.github/actions/setup-node/action.yml:
--------------------------------------------------------------------------------
1 | runs:
2 | using: "composite"
3 | steps:
4 | - name: Setup Node
5 | uses: actions/setup-node@v4
6 | with:
7 | node-version: '20'
8 | - name: Install NPM packages
9 | shell: bash
10 | run: npm install
11 |
--------------------------------------------------------------------------------
/.github/actions/setup-php/action.yml:
--------------------------------------------------------------------------------
1 | inputs:
2 | php-version:
3 | description: 'X.Y version string as accepted by shivammathur/setup-php'
4 | required: true
5 | runs:
6 | using: "composite"
7 | steps:
8 | - name: Setup PHP, with composer and extensions
9 | uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
10 | with:
11 | php-version: ${{ inputs.php-version }}
12 | extensions: mbstring, iconv, intl, mysql, zip
13 | tools: composer
14 | - name: Install composer dependencies
15 | shell: bash
16 | run: composer install
17 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore files generated by SETUP/configure from .template files
2 | SETUP/check_db_schema
3 | SETUP/dp.cron
4 | SETUP/dump_db_schema
5 | pinc/site_vars.php
6 | pinc/udb_user.php
7 | # Ignore compiled message files
8 | messages.mo
9 | # Ignore build artifacts
10 | build
11 | # Ignore dev tooling byproducts
12 | node_modules
13 | vendor
14 | .phpunit.cache
15 | .php_cs.cache
16 | .php-cs-fixer.cache
17 | .phpdoc
18 | .phpstan.cache
19 | # local devex artifacts
20 | SETUP/devex/dpdev-docker/container_startup_local.sh
21 | # build artifacts
22 | dist/
23 | # stupid macOS
24 | .DS_Store
25 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | pinc/3rdparty/**/*.js
--------------------------------------------------------------------------------
/SETUP/.htaccess:
--------------------------------------------------------------------------------
1 | Deny from all
2 |
--------------------------------------------------------------------------------
/SETUP/CODE_DOCS.md:
--------------------------------------------------------------------------------
1 | # Documentation
2 |
3 | Code-level docs can be generated using [phpDocumentor](https://www.phpdoc.org/).
4 | A configuration file is included in the repo.
5 |
6 | To generate the docs:
7 | ```bash
8 | # at repo base
9 | php path/to/phpDocumentor.phar run
10 | ```
11 |
12 | This will generate documentation in `build/docs`.
13 |
14 | Work is very slowly underway to update function comments to use DocBlocks
15 | and until that work is completed the value of the documentation may be dubious.
16 |
--------------------------------------------------------------------------------
/SETUP/CODE_STYLE.md:
--------------------------------------------------------------------------------
1 | # Code Style & Linting
2 |
3 | See [CODE_DOCS.md](CODE_DOCS.md) for information on code documentation.
4 |
5 | ## PHP
6 |
7 | We use [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) for PHP
8 | code formatting and include a `.php-cs-fixer.dist.php` with some small deviations from
9 | [PSR-2](https://www.php-fig.org/psr/psr-2/).
10 |
11 | PHP-CS-Fixer is included as a composer development package and can be installed
12 | with:
13 | ```bash
14 | composer install --dev
15 | ```
16 |
17 | To run it across the codebase and fix any formatting issues, run:
18 | ```bash
19 | ./vendor/bin/php-cs-fixer fix
20 | ```
21 |
22 | To run it against just a specific set of files:
23 | ```bash
24 | ./vendor/bin/php-cs-fixer fix file1 file2 ...
25 | ```
26 |
27 | See also our [Best Practices](https://www.pgdp.net/wiki/DP_Code_Best_Practices)
28 | guide in the wiki.
29 |
30 | ## Javascript
31 |
32 | We use [prettier](https://prettier.io/) for JS
33 | code formatting.
34 |
35 | prettier is included as an npm development dependency and can be installed
36 | with:
37 | ```bash
38 | npm install
39 | ```
40 |
41 | Npm can be installed with node as documented in [DEVELOPMENT](DEVELOPMENT.md).
42 |
43 | To run the linter:
44 | ```bash
45 | npm run format-check
46 | ```
47 |
48 | To have prettier auto-fix formatting issues where it can run:
49 | ```bash
50 | npm run format
51 | ```
52 |
53 |
--------------------------------------------------------------------------------
/SETUP/MediaWiki_extensions/README.md:
--------------------------------------------------------------------------------
1 | # MediaWiki Extensions
2 | These MediaWiki extensions enable the use of Magic Tags to show project
3 | information on a wiki page. These extensions support MediaWiki 1.32 and later.
4 |
5 | ## Requirements
6 | These assume that the MediaWiki tables and the DP tables are running in the
7 | same MySQL server and use the same authentication, but they do not have to
8 | be in the same database itself.
9 |
10 | ## Installation
11 | To use them:
12 |
13 | 1. Copy the files to your MediaWiki `extensions/` directory
14 | 2. Edit the files and update `$relPath` to point to your DP `c/pinc/` directory
15 | 3. Add the following lines to your MediaWiki `LocalSettings.php` file:
16 | ```php
17 | require_once('extensions/dpExtensions.php');
18 | require_once('extensions/hospitalExtensions.php');
19 | ```
20 |
21 | ## Magic Tags provided
22 | The following magic tags are provided:
23 |
24 | * `projectinfo`
25 | * `pg_formats`
26 | * `hospital_info`
27 |
28 | See Splitter Demonstrations
10 |
11 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/SETUP/tests/manual_web/split_test/sample.txt:
--------------------------------------------------------------------------------
1 | They had a beautiful place of residence,
2 | they had the most comfortable quarters, and
3 | a superabundance of stores for their subsistence.
4 | There they were living upon the fat of the land, without
5 | anything under God's heaven to do. Society
6 | was near at hand in a city populous, and furnishing
7 | all the luxuries of life. They of course did not want
8 | to surrender such quarters and such comforts for
9 | the hardships and trials of a frontier station.
10 |
11 | Finally, on June second the whole matter was laid
12 | on the table. On May 27, 1858, the troops had been
13 | withdrawn,143 and on July 19, 1858, the quartermaster
14 | turned the buildings over to Mr. Steele. But
15 | with the opening of the Civil War Fort Snelling was
16 | used by the government as a training station, and
17 | after the war it was continued as a permanent post.
18 | Mr. Steele had been unable to pay the entire $90,000,
19 | and as he claimed rent at the rate of $2000 a month
20 | for the time it had been used by the government, the
21 | matter was again taken up. It was finally adjusted
22 | in an agreement whereby Mr. Steele retained the
23 | greater part of the land, and the government kept
24 | the buildings and 1521.20 acres surrounding the
25 | fort. Later some of the land was re-purchased
26 | from Mr. Steele.1
27 | of the Department of Dakota were located within
28 |
--------------------------------------------------------------------------------
/SETUP/tests/manual_web/split_test/split_test.css:
--------------------------------------------------------------------------------
1 | .overflow-auto {
2 | overflow: auto;
3 | }
4 |
5 | .top-box {
6 | background-color: aquamarine;
7 | }
8 |
9 | .beige {
10 | background-color: beige;
11 | }
12 |
13 | .column-flex {
14 | display: flex;
15 | flex-direction: column;
16 | height: 100vh;
17 | }
18 |
19 | .flex-auto {
20 | flex: auto;
21 | }
22 |
23 | textarea {
24 | width: 100%;
25 | height: 100%;
26 | resize: none;
27 | border: none;
28 | margin: 0;
29 | }
30 |
--------------------------------------------------------------------------------
/SETUP/tests/manual_web/split_test/switchable_split.php:
--------------------------------------------------------------------------------
1 | [
12 | "switchable_split.js",
13 | ],
14 | "css_files" => ["split_test.css"],
15 | "body_attributes" => "style='margin: 0; overflow: hidden;'",
16 | ];
17 |
18 | slim_header("$title", $header_args);
19 |
20 | $text = file_get_contents("sample.txt");
21 |
22 | echo "$title
\n";
26 | echo "";
27 | echo "
$title
\n";
26 | echo "

$title
\n";
25 | echo "
" . _("Use the form above to log in.") . "
"; 14 | -------------------------------------------------------------------------------- /api/api_common.inc: -------------------------------------------------------------------------------- 1 | $query_params 11 | */ 12 | function get_flag_value(array $query_params, string $flagname) 13 | { 14 | if (!isset($query_params[$flagname])) { 15 | return null; 16 | } elseif ($query_params[$flagname] == "") { 17 | // make '?flagname' work as if '?flagname=true' 18 | return true; 19 | } else { 20 | $bool = filter_var($query_params[$flagname], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); 21 | if ($bool === null) { 22 | throw new ValueError("Invalid value for '$flagname'"); 23 | } 24 | return $bool; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /api/v1_docs.inc: -------------------------------------------------------------------------------- 1 | $query_params */ 5 | function api_v1_documents(string $method, array $data, array $query_params): array 6 | { 7 | global $external_faq_overrides; 8 | 9 | $lang_code = $query_params["language_code"] ?? null; 10 | if ($lang_code) { 11 | $docs_with_lang = []; 12 | foreach ($external_faq_overrides as $doc => $doc_array) { 13 | if (isset($doc_array[$lang_code])) { 14 | $docs_with_lang[] = $doc; 15 | } 16 | } 17 | return $docs_with_lang; 18 | } else { 19 | return array_keys($external_faq_overrides); 20 | } 21 | } 22 | 23 | /** @param array$diff\n"; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /pinc/Team.inc: -------------------------------------------------------------------------------- 1 | codepoints = [ 9 | // https://www.pgdp.net/phpBB3/viewtopic.php?p=1321508#p1321508 10 | 'U+0401', 11 | 'U+0406', 12 | 'U+0410-U+044f', 13 | 'U+0451', 14 | 'U+0456', 15 | 'U+0462-U+0463', 16 | 'U+0472-U+0473', 17 | ]; 18 | $charsuite->reference_urls = [ 19 | "https://www.pgdp.net/wiki/Basic_Cyrillic", 20 | 21 | ]; 22 | 23 | $pickerset = new PickerSet(); 24 | 25 | $pickerset->add_subset(UTF8::hex_to_chr('U+0411'), [ 26 | // upper case А - Т 27 | [ 28 | 'U+0410-U+0415', 'U+0401', 'U+0416-U+0422', 29 | ], 30 | // lowercase а - т 31 | [ 32 | 'U+0430-U+0435', 'U+0451', 'U+0436-U+0442', 33 | ], 34 | ], _("Letters А - Т")); 35 | 36 | $pickerset->add_subset(UTF8::hex_to_chr('U+042f'), [ 37 | // upper case У - Я 38 | [ 39 | 'U+0423-U+042f', 'U+0406', 'U+0462', 'U+0472', 40 | ], 41 | // lowercase у - я 42 | [ 43 | 'U+0443-U+044f', 'U+0456', 'U+0463', 'U+0473', 44 | ], 45 | ], _("Letters У - Я and old Russian orthography")); 46 | 47 | $charsuite->pickerset = $pickerset; 48 | 49 | CharSuites::add($charsuite); 50 | -------------------------------------------------------------------------------- /pinc/charsuite-basic-greek.inc: -------------------------------------------------------------------------------- 1 | codepoints = [ 8 | // https://en.wikipedia.org/wiki/Greek_and_Coptic 9 | 'U+0391-U+03a1', 10 | 'U+03a3-U+03a9', 11 | 'U+03b1-U+03c9', 12 | ]; 13 | $charsuite->reference_urls = [ 14 | "https://en.wikipedia.org/wiki/Greek_and_Coptic", 15 | ]; 16 | 17 | $pickerset = new PickerSet(); 18 | $pickerset->add_subset(UTF8::hex_to_chr('U+0391') . '-' . UTF8::hex_to_chr('U+03a9'), [ 19 | // capital alpha through omega 20 | ['U+0391-U+03a1', null, 'U+03a3-U+03a9'], 21 | // lowercase alpha through omega 22 | ['U+03b1-U+03c9'], 23 | ]); 24 | $charsuite->pickerset = $pickerset; 25 | 26 | CharSuites::add($charsuite); 27 | -------------------------------------------------------------------------------- /pinc/charsuite-extended-european-latin-a.inc: -------------------------------------------------------------------------------- 1 | description = _("Supplementary characters for Esperanto, Welsh, Sami, Romanian and Hungarian"); 8 | $charsuite->codepoints = [ 9 | // https://en.wikipedia.org/wiki/Latin_Extended-A 10 | 'U+0102-U+0103', 11 | 'U+0108-U+0109', 12 | 'U+011c-U+011d', 13 | 'U+014a-U+014b', 14 | 'U+015c-U+015d', 15 | 'U+016c-U+016d', 16 | 'U+0124-U+0125', 17 | 'U+0134-U+0135', 18 | 'U+0150-U+0151', 19 | 'U+0166-U+0167', 20 | 'U+0170-U+0171', 21 | 'U+0174-U+0177', 22 | 'U+0218-U+021b', 23 | ]; 24 | $charsuite->reference_urls = [ 25 | 'https://en.wikipedia.org/wiki/Latin_Extended-A', 26 | 'https://en.wikipedia.org/wiki/Latin_Extended-B', 27 | ]; 28 | 29 | $pickerset = new PickerSet(); 30 | // with diacriticals 31 | $pickerset->add_subset(UTF8::hex_to_chr("U+0108"), [ 32 | [ 33 | 'U+0108', 'U+011c', 'U+0124', 'U+0134', 'U+015c', 'U+0174', 'U+0176', 'U+014a', 34 | 'U+0166', 'U+0218', 'U+021a', 'U+0102', 'U+016c', 'U+0150', 'U+0170', 35 | ], 36 | [ 37 | 'U+0109', 'U+011d', 'U+0125', 'U+0135', 'U+015d', 'U+0175', 'U+0177', 'U+014b', 38 | 'U+0167', 'U+0219', 'U+021b', 'U+0103', 'U+016d', 'U+0151', 'U+0171', 39 | ], 40 | ], _("Letters with circumflex and miscellaneous")); 41 | 42 | 43 | $charsuite->pickerset = $pickerset; 44 | 45 | CharSuites::add($charsuite); 46 | -------------------------------------------------------------------------------- /pinc/charsuite-math-symbols.inc: -------------------------------------------------------------------------------- 1 | description = _("Commonly used mathematical symbols not in Basic Latin"); 9 | 10 | $charsuite->codepoints = [ 11 | 'U+2202-U+2203', 12 | 'U+2207-U+2209', 13 | 'U+221a', 14 | 'U+221e', 15 | 'U+2220', 16 | 'U+2229-U+222b', 17 | 'U+2234-U+2235', 18 | 'U+2237', 19 | 'U+2248', 20 | 'U+2260-U+2261', 21 | 'U+2264-U+2265', 22 | 'U+2282-U+2283', 23 | 'U+2295', 24 | 'U+2297', 25 | ]; 26 | 27 | $charsuite->reference_urls = [ 28 | "https://www.pgdp.net/wiki/Math_symbols", 29 | ]; 30 | 31 | $pickerset = new PickerSet(); 32 | 33 | $pickerset->add_subset(UTF8::hex_to_chr("U+222b"), [ 34 | [ 35 | 'U+2248', 'U+2260', 'U+2264-U+2265', 'U+2261', null, 'U+222b', 36 | 'U+2202', 'U+2207', 'U+221e', 'U+221a', 'U+2220', 'U+2237', 37 | ], 38 | [ 39 | 'U+2203', 'U+2208-U+2209', 'U+2282-U+2283', 'U+2229-U+222a', null, 40 | 'U+2234-U+2235', null, 'U+2295', 'U+2297', 41 | ], 42 | ], _("Math symbols")); 43 | 44 | $charsuite->pickerset = $pickerset; 45 | 46 | CharSuites::add($charsuite); 47 | -------------------------------------------------------------------------------- /pinc/codepoint_validator.inc: -------------------------------------------------------------------------------- 1 | highlighted if possible"); 6 | $quit_text = _("Quit"); 7 | $remove_text = _("Remove bad characters and quit"); 8 | echo <<
| $title |
|---|
| $content |
| " . _("Close Window") . " |
" . _("The following list shows the default error messages currently available in the quiz code. Contact a developer if you would like to add others. Any images used in the messages won't appear on this page but will appear correctly in the quiz.") . "
\n"; 18 | echo "" . _("(By the way, you should not name any of your custom messages to overlap with these built-in ones.)") . "
\n"; 19 | 20 | foreach ($messages as $key => $message) { 21 | echo "" . _("Message ID:") . " $key
\n"; 22 | echo "" . $message["message_body"] . "
\n"; 24 | if (isset($message['wiki_ref'])) { 25 | echo "" . $message['wiki_ref'] . "
\n"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /quiz/index.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Ligatures Proofreading Tutorial, page %d"), 1) . "\n"; 12 | 13 | echo "" . _("The two ligatures æ and œ can be difficult to distinguish when they are printed italics. However, the œ (oe) ligature is usually rounder at the top, while the 'a' of æ is more teardrop-shaped. For example:") . "
\n"; 14 | echo "| œ | æ |
|---|---|
"; 19 | echo sprintf( 20 | _("You can insert each of these characters using the character picker in the proofreading interface or using keyboard shortcuts. Tables for Windows and Macintosh which list these shortcuts are in the Proofreading Guidelines."), 21 | get_faq_url("proofreading_guidelines.php") . "#a_chars_win", 22 | get_faq_url("proofreading_guidelines.php") . "#a_chars_mac" 23 | ); 24 | echo "
\n"; 25 | 26 | echo "" . _("Continue to quiz page") . "
\n"; 27 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_aeoe_2.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Ligatures Proofreading Tutorial, page %d"), 2) . "\n"; 11 | 12 | echo "" . _("In other fonts, the æ may have a little bump sticking up in the middle showing the vertical line of the a:") . "
\n"; 13 | echo "| œ | æ |
|---|---|
" . _("If the word is in Latin (or derived from Latin), then there is another way to distinguish these characters: Latin words often end in -æ, but never in -œ.") . "
\n"; 18 | echo "" . _("Continue to quiz page") . "
\n"; 19 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_basic_5.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Basic Proofreading Tutorial, page %d"), 5) . "\n"; 11 | echo "" . _("Insert a blank line at the start of the poetry or epigram and another blank line at the end, so that the formatters can clearly see the beginning and end. Leave each line left justified and maintain the line breaks. Insert a blank line between stanzas, when there is one in the image.") . "
\n"; 13 | 14 | echo "" . _("Do not mark changes in font or font size. The formatters will take care of this later in the process.") . "
\n"; 16 | 17 | echo "" . _("Continue to quiz page") . "
\n"; 18 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_fraktur.php: -------------------------------------------------------------------------------- 1 | " . _("Fraktur Proofreading Tutorial") . "\n"; 11 | 12 | echo "" . _("Fraktur is a particular kind of blackletter font, used principally for German, but occasionally for Scandinavian languages. Modern readers often find it difficult to read. The alphabet is:") . "
\n"; 13 | 14 | echo "
" . _("There are two different forms of the lower case letter 's'. The 'normal' (or 'round') s is used at the end of a syllable, the 'long s' (ſ) elsewhere. The two forms both get proofread as plain 's'.") . "
\n"; 17 | 18 | echo "" . sprintf(_("If you have difficulty identifying letters in fraktur, there is a fraktur tool for the fraktur alphabet."), "http://www.kurald-galain.com/fraktur2ascii.html") . "
\n"; 19 | 20 | echo "" . _("Continue to quiz page") . "
\n"; 21 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_mod1_4.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Moderate Proofreading Tutorial: Part %1\$d, Page %2\$d"), 1, 4) . "\n"; 11 | echo "" . _("OCR commonly has trouble distinguishing between the similar characters. Some examples are:") . "
\n"; 13 | echo "" . _("Watch out for these. Normally the context of the sentence is sufficient to determine which is the correct character, but be careful—often your mind will automatically 'correct' these as you are reading.") . "
\n"; 20 | 21 | echo "" . _("Continue to quiz page") . "
\n"; 22 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_mod1_5.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Moderate Proofreading Tutorial: Part %1\$d, Page %2\$d"), 1, 5) . "\n"; 11 | echo "" . _("In the main text of the page, the character that marks a footnote 13 | location should be surrounded with square brackets ([ and ]) 14 | and placed next to the word[*] being footnoted or its punctuation mark.[*]") . "
\n"; 15 | echo "" . _("At the bottom of the page, place each footnote on a separate line in 16 | order of appearance, with a blank line before each one.") . "
\n"; 17 | echo "" . _("Do not include any horizontal lines separating the footnotes from the main text.") . "
\n"; 18 | 19 | echo "" . _("Continue to quiz page") . "
\n"; 20 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_mod2_1.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Moderate Proofreading Tutorial: Part %1\$d, Page %2\$d"), 2, 1) . "\n"; 11 | echo "" . _("Some books have short descriptions of the paragraph along the side of the text. These are called sidenotes. Proofread the sidenote text as it is printed, preserving the line breaks (while handling end-of-line hyphenation and dashes normally).") . "
\n"; 13 | echo "" . _("Leave a blank line before and after the sidenote so that it can be distinguished from the text around it. The OCR may place the sidenotes anywhere on the page, and may even intermingle the sidenote text with the rest of the text. Separate them so that the sidenote text is all together, but don't worry about the position of the sidenotes on the page.") . "
\n"; 14 | 15 | echo "" . _("Proofread ordinary text that has been printed in multiple columns as a single column. Place the text from the left-most column first, the text from the next column below that, and so on. Do not mark where the columns were split, just join them together.") . "
\n"; 17 | 18 | echo "" . _("Continue to quiz page") . "
\n"; 19 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_mod2_2.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Moderate Proofreading Tutorial: Part %1\$d, Page %2\$d"), 2, 2) . "\n"; 11 | echo "" . _("Subscripted text is often found in scientific works, but is not common in other material. Proofread subscripted text by inserting an underline character _ and surrounding the text with curly braces { and }. For example:") . "
\n"; 13 | 14 | echo "| " . _("Original Image:") . " |
|---|
| H2O. | \n"; 19 | echo "
| " . _("Correctly Proofread Text:") . " |
| H_{2}O. | \n"; 23 | echo "
" . _("Continue to quiz page") . "
\n"; 28 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_mod2_4.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Moderate Proofreading Tutorial: Part %1\$d, Page %2\$d"), 2, 4) . "\n"; 11 | echo "" . _("Proofread quotation marks at the beginning of each line of a quotation by removing all of them except for the one at the start of the quotation. If a quotation like this goes on for multiple paragraphs, leave the quote mark that appears on the first line of each paragraph.") . "
\n"; 13 | echo "" . _("Often there is no closing quotation mark until the very end of the quoted section of text, which may not be on the same page you are proofreading. Leave it that way—do not add closing quotation marks that are not in the page image.") . "
\n"; 14 | 15 | echo "" . _("Continue to quiz page") . "
\n"; 16 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_mod2_5.php: -------------------------------------------------------------------------------- 1 | " . sprintf(_("Moderate Proofreading Tutorial: Part %1\$d, Page %2\$d"), 2, 5) . "\n"; 11 | echo "" . _("In dialog, treat a change in speaker as a new paragraph, with one blank line before it.") . "
\n"; 13 | echo "" . _("Stage directions are kept as they are in the original image, so if the stage direction is on a line by itself, proofread it that way; if it is at the end of a line of dialog, leave it there. Stage directions often begin with an opening bracket and omit the closing bracket. This convention is retained; do not close the brackets.") . "
\n"; 14 | 15 | echo "" . _("Continue to quiz page") . "
\n"; 16 | -------------------------------------------------------------------------------- /quiz/tuts/tut_p_thorn.php: -------------------------------------------------------------------------------- 1 | " . _("Thorn Proofreading Tutorial") . "\n"; 11 | 12 | echo "" . sprintf(_("A thorn is a letter that was used in Old and Middle English, and is still used in Icelandic. It usually represents the \"th\" sound. In %s projects, it usually looks like:"), SiteConfig::get()->site_abbreviation) . "
\n"; 13 | echo "| Capital | \n"; 16 | echo "|
|---|---|
| Lower Case | \n"; 22 | echo "
" . _("The loop of the capital thorn is normally larger, and the stem may not drop down as far below the line as the lower case."); 29 | echo " " . _("You can insert them using the character picker at the bottom of the Proofreading Interface.") . "
\n"; 30 | 31 | echo "" . _("Continue to quiz page") . "
\n"; 32 | -------------------------------------------------------------------------------- /scripts/character_test.js: -------------------------------------------------------------------------------- 1 | /*global validCharRegex */ 2 | 3 | // this matches any character: non-mark codepoint followed by 0 or more marks 4 | export const charMatch = /\P{M}\p{M}*/gu; 5 | 6 | // return false if text contains any bad characters 7 | export function testText(text) { 8 | text = text.normalize("NFC"); 9 | let result; 10 | charMatch.lastIndex = 0; 11 | while (null != (result = charMatch.exec(text))) { 12 | if (!validCharRegex.test(result[0])) { 13 | return false; 14 | } 15 | } 16 | return true; 17 | } 18 | -------------------------------------------------------------------------------- /scripts/dropdown.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | window.addEventListener("DOMContentLoaded", () => { 3 | /* 4 | * When the user clicks on a button, 5 | * toggle between hiding and showing the dropdown content 6 | * if off close all the others before turning on 7 | */ 8 | 9 | function closeAll() { 10 | const dropdowns = document.getElementsByClassName("dropdown-content"); 11 | for (let openDropdown of dropdowns) { 12 | openDropdown.classList.remove("dropdown-show"); 13 | } 14 | } 15 | 16 | function toggleList() { 17 | const thisDropdown = this.nextElementSibling; 18 | const turnOn = !thisDropdown.classList.contains("dropdown-show"); 19 | closeAll(); 20 | if (turnOn) { 21 | thisDropdown.classList.add("dropdown-show"); 22 | } 23 | } 24 | 25 | // Close the dropdown if the user clicks outside of it 26 | window.onclick = function (event) { 27 | if (!event.target.matches(".dropdown-button")) { 28 | closeAll(); 29 | } 30 | }; 31 | 32 | window.onkeydown = function (event) { 33 | if (event.code === "Escape") { 34 | closeAll(); 35 | } 36 | }; 37 | 38 | let linkButtons = document.getElementsByClassName("dropdown-button"); 39 | for (let linkButton of linkButtons) { 40 | linkButton.addEventListener("click", toggleList); 41 | } 42 | }); 43 | -------------------------------------------------------------------------------- /scripts/filter_project.js: -------------------------------------------------------------------------------- 1 | /* global */ 2 | window.addEventListener("DOMContentLoaded", function () { 3 | "use strict"; 4 | var langSelector = document.getElementById("language"); 5 | var langMatch = document.getElementById("lang-match"); 6 | var diffAll = document.getElementById("diff-all"); 7 | var diffOpt = document.querySelectorAll(".diff-opt"); 8 | 9 | function showMatcher() { 10 | if (langMatch) { 11 | langMatch.style.display = 0 === langSelector.selectedIndex ? "none" : "block"; 12 | } 13 | } 14 | 15 | if (langSelector) { 16 | langSelector.addEventListener("change", function () { 17 | showMatcher(); 18 | }); 19 | } 20 | 21 | if (diffAll) { 22 | diffAll.addEventListener("change", function () { 23 | diffOpt.forEach((diffOption) => { 24 | diffOption.checked = false; 25 | }); 26 | }); 27 | } 28 | 29 | diffOpt.forEach((diffOption) => { 30 | diffOption.addEventListener("change", function () { 31 | diffAll.checked = false; 32 | }); 33 | }); 34 | 35 | showMatcher(); 36 | }); 37 | -------------------------------------------------------------------------------- /scripts/gettext.js: -------------------------------------------------------------------------------- 1 | /* global translations */ 2 | import gettext from "../node_modules/gettext.js/dist/gettext.esm.js"; 3 | 4 | export var translate = gettext(); 5 | 6 | var loadTranslations = function () { 7 | console.debug("Loading translations"); 8 | if (typeof translations !== "undefined") { 9 | Object.entries(translations).forEach(([key, value]) => { 10 | var headers = value[""]; 11 | delete value[""]; 12 | translate.setMessages("messages", key, value, headers["plural-forms"]); 13 | }); 14 | } else { 15 | console.debug("No translations found."); 16 | } 17 | }; 18 | 19 | window.addEventListener("DOMContentLoaded", () => { 20 | loadTranslations(); 21 | }); 22 | 23 | export default translate; 24 | -------------------------------------------------------------------------------- /scripts/page_table.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("DOMContentLoaded", () => { 2 | let optionSelector = document.getElementById("option_selector"); 3 | 4 | function changeSelection(option) { 5 | switch (option) { 6 | case "all": 7 | for (let box of document.getElementsByClassName("selectorbox")) { 8 | box.checked = true; 9 | } 10 | break; 11 | case "clear": 12 | for (let box of document.getElementsByClassName("selectorbox")) { 13 | box.checked = false; 14 | } 15 | break; 16 | case "unproofed": 17 | changeSelection("clear"); 18 | for (let box of document.getElementsByClassName("availbox")) { 19 | box.checked = true; 20 | } 21 | break; 22 | case "invert": 23 | for (let box of document.getElementsByClassName("selectorbox")) { 24 | box.checked = !box.checked; 25 | } 26 | break; 27 | } 28 | } 29 | 30 | if (optionSelector) { 31 | optionSelector.addEventListener("change", function () { 32 | changeSelection(this.value); 33 | }); 34 | } 35 | }); 36 | -------------------------------------------------------------------------------- /scripts/project.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("DOMContentLoaded", function () { 2 | function confirmSubmit(event) { 3 | if (this.dataset.confirmationQuestion && !confirm(this.dataset.confirmationQuestion)) { 4 | event.preventDefault(); 5 | } 6 | } 7 | 8 | const changeStateForms = document.getElementsByClassName("frm_chg_stt"); 9 | for (const changeStateForm of changeStateForms) { 10 | changeStateForm.addEventListener("submit", confirmSubmit); 11 | } 12 | 13 | function disableLink() { 14 | this.outerHTML = this.firstChild.nodeValue; 15 | } 16 | 17 | const newTopicLink = document.getElementById("no_topic_yet"); 18 | if (newTopicLink) { 19 | // prevent clicking again if there is a delay in creating the topic 20 | newTopicLink.addEventListener("click", disableLink); 21 | } 22 | }); 23 | -------------------------------------------------------------------------------- /scripts/tasks.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("DOMContentLoaded", function () { 2 | const meTooButton = document.getElementById("me_too_button"); 3 | const meTooMainDiv = document.getElementById("MeTooMain"); 4 | const cancelMeTooButton = document.getElementById("cancel_me_too"); 5 | 6 | if (meTooButton) { 7 | meTooButton.addEventListener("click", function () { 8 | meTooButton.style.display = "none"; 9 | meTooMainDiv.style.display = ""; 10 | }); 11 | } 12 | 13 | if (cancelMeTooButton) { 14 | cancelMeTooButton.addEventListener("click", function () { 15 | meTooMainDiv.style.display = "none"; 16 | meTooButton.style.display = ""; 17 | }); 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /scripts/userprefs.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("DOMContentLoaded", () => { 2 | let creditNameSelector = document.getElementById("credit_name"); 3 | let creditOtherInput = document.getElementById("credit_other"); 4 | 5 | function maybeShowOther() { 6 | creditOtherInput.hidden = creditNameSelector.value !== "other"; 7 | } 8 | 9 | if (creditNameSelector) { 10 | creditNameSelector.addEventListener("change", maybeShowOther); 11 | maybeShowOther(); 12 | } 13 | 14 | const checkAllButton = document.getElementById("check_all"); 15 | if (checkAllButton) { 16 | checkAllButton.addEventListener("click", function () { 17 | for (const creditBox of document.getElementsByClassName("credit_box")) { 18 | creditBox.checked = true; 19 | } 20 | }); 21 | } 22 | 23 | const unCheckAllButton = document.getElementById("un_check_all"); 24 | if (unCheckAllButton) { 25 | unCheckAllButton.addEventListener("click", function () { 26 | for (const creditBox of document.getElementsByClassName("credit_box")) { 27 | creditBox.checked = false; 28 | } 29 | }); 30 | } 31 | }); 32 | -------------------------------------------------------------------------------- /stats/members/quitteam.php: -------------------------------------------------------------------------------- 1 | remove_team($tid); 13 | metarefresh(0, "../teams/tdetail.php?tid=$tid"); 14 | -------------------------------------------------------------------------------- /stats/misc_user_graphs.php: -------------------------------------------------------------------------------- 1 | get_graph_js_files(), 19 | "js_data" => build_svg_graph_inits($graphs), 20 | ]); 21 | echo "" . implode("\n", $pool->blather) . "
"; 35 | 36 | // -------------------------------------------------------------- 37 | 38 | show_projects_for_pool($pool, 'checkedout'); 39 | 40 | // -------------------------------------------------------------- 41 | 42 | show_projects_for_pool($pool, 'available'); 43 | 44 | // special colours legend 45 | // Don't display if the user has selected the 46 | // setting "Show Special Colors: No". 47 | if (!$userSettings->get_boolean('hide_special_colors')) { 48 | echo_special_legend(" 1 = 1"); 49 | } 50 | -------------------------------------------------------------------------------- /tools/post_proofers/postcomments.php: -------------------------------------------------------------------------------- 1 | PPer_is_current_user || $project->state != PROJ_POST_FIRST_CHECKED_OUT) { 17 | echo _("The project is not checked out to you."); 18 | exit; 19 | } 20 | 21 | $sql = sprintf( 22 | " 23 | UPDATE projects 24 | SET postcomments = '%s' 25 | WHERE projectid = '%s' 26 | ", 27 | DPDatabase::escape($postcomments), 28 | DPDatabase::escape($projectid) 29 | ); 30 | $qry = DPDatabase::query($sql); 31 | 32 | $msg = _("Comments added."); 33 | metarefresh(1, "$code_url/project.php?id=$projectid", $msg, $msg); 34 | -------------------------------------------------------------------------------- /tools/project_manager/handle_bad_page.js: -------------------------------------------------------------------------------- 1 | import { validateText } from "../../scripts/text_validator.js"; 2 | 3 | window.addEventListener("DOMContentLoaded", () => { 4 | const updateTextButton = document.getElementById("update_text"); 5 | if (updateTextButton) { 6 | updateTextButton.addEventListener("click", function (event) { 7 | if (!validateText()) { 8 | event.preventDefault(); 9 | } 10 | }); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /tools/project_manager/projectmgr.js: -------------------------------------------------------------------------------- 1 | /*global serverTimezone userLanguage*/ 2 | 3 | window.addEventListener("DOMContentLoaded", () => { 4 | "use strict"; 5 | 6 | const timeSpan = document.getElementById("server-time"); 7 | const dateTimeFormat = new Intl.DateTimeFormat(userLanguage, { 8 | timeZone: serverTimezone, 9 | hourCycle: "h23", 10 | hour: "2-digit", 11 | minute: "2-digit", 12 | weekday: "short", 13 | }); 14 | 15 | function showTime() { 16 | if (timeSpan) { 17 | timeSpan.textContent = dateTimeFormat.format(Date.now()); 18 | } 19 | } 20 | 21 | setInterval(showTime, 60000); 22 | showTime(); 23 | }); 24 | -------------------------------------------------------------------------------- /tools/project_manager/show_all_good_word_suggestions.js: -------------------------------------------------------------------------------- 1 | import { splitControl } from "../../scripts/splitControl.js"; 2 | 3 | window.addEventListener("DOMContentLoaded", function () { 4 | let mainSplit = splitControl(document.getElementById("suggestions_container"), { 5 | splitVertical: true, 6 | splitPercent: 40, 7 | }); 8 | window.addEventListener("resize", mainSplit.reLayout); 9 | mainSplit.reLayout(); 10 | }); 11 | -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_delete.png -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_directory.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_directory.gif -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_download.png -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_file.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_file.gif -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_move.png -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_rename.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_rename.png -------------------------------------------------------------------------------- /tools/project_manager/wfb_images/wfb_transparent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/project_manager/wfb_images/wfb_transparent.gif -------------------------------------------------------------------------------- /tools/proofers/ctrl_frame.php: -------------------------------------------------------------------------------- 1 | [ 23 | "$code_url/tools/proofers/character_selector.js", 24 | "$code_url/tools/proofers/toolbox.js", 25 | ], 26 | "js_data" => " 27 | var projectID = '$projectid'; 28 | var mruTitle = '$mru_title'; 29 | var mruAbbrev = '$mru_abbreviation'; 30 | ", 31 | "body_attributes" => "class='control-frame'", 32 | ]; 33 | slim_header(_("Control Frame"), $header_args); 34 | 35 | $toolbox = new ProofreadingToolbox(); 36 | $toolbox->output($projectid, $round); 37 | -------------------------------------------------------------------------------- /tools/proofers/dp_scroll.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* exported focusText, initializeStuff */ 3 | frameRef = null; // used by dp_proof.js 4 | 5 | // ------------------------------------------------ 6 | // The following functions are the "exported" ones. 7 | 8 | function focusText(noScroll = false) { 9 | if (isLded && inProof) { 10 | docRef.editform.text_data.focus({ preventScroll: noScroll }); 11 | } 12 | } 13 | 14 | function initializeStuff(wFace) { 15 | frameRef = top.proofframe.document; 16 | isLded = 1; 17 | inProof = 1; 18 | inFace = wFace; 19 | if (wFace == 1) { 20 | // enhanced interface, non-spellcheck 21 | docRef = top.proofframe.document; 22 | } else if (wFace == 0) { 23 | // standard interface, non-spellcheck 24 | docRef = top.proofframe.textframe.document; 25 | } else if (wFace == 2) { 26 | // enhanced interface, spellcheck 27 | docRef = top.proofframe.document; 28 | } else if (wFace == 3) { 29 | // standard interface, spellcheck 30 | docRef = top.proofframe.textframe.document; 31 | } 32 | } 33 | inProof = 0; 34 | isLded = 0; 35 | inFace = 0; 36 | -------------------------------------------------------------------------------- /tools/proofers/gfx/bt1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt1.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt12.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt13.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt14.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt15.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt16.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt2.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt20.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt3.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt4.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt5.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt7.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt7_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt7_n.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt8.png -------------------------------------------------------------------------------- /tools/proofers/gfx/bt9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/tools/proofers/gfx/bt9.png -------------------------------------------------------------------------------- /tools/proofers/image_frame_std.php: -------------------------------------------------------------------------------- 1 | getMessage()); 15 | } 16 | $user = User::load_current(); 17 | 18 | $storage_key = "proof-std" . (($user->profile->i_layout == 1) ? "-v" : "-h"); 19 | 20 | $image_data = json_encode([ 21 | "imageUrl" => $ppage->url_for_image(), 22 | "storageKey" => $storage_key, 23 | "align" => "C", 24 | ]); 25 | 26 | $header_args = [ 27 | "js_modules" => ["$code_url/tools/proofers/proof_image.js"], 28 | "js_data" => " 29 | var imageData = $image_data; 30 | ", 31 | "body_attributes" => 'id="standard_interface_image"', 32 | ]; 33 | 34 | slim_header("Image Frame", $header_args); 35 | 36 | echo "" . sprintf(_("An error occurred when trying to create a new forum topic for this project. Please contact a site manager and let them know the following information."), "mailto:" . SiteConfig::get()->site_manager_email_addr) . "
"; 24 | 25 | echo <<" . _("Start New Search") . " | " . get_refine_search_link() . " | " . get_search_configure_link() . "
"; 49 | $search_results->render($condition); 50 | -------------------------------------------------------------------------------- /tools/setlangcookie.php: -------------------------------------------------------------------------------- 1 | $title"; 18 | 19 | echo "" . _("This tool will convert individual project tables to UTF-8 if they are not already. If the project table is already UTF-8 no changes will happen.") . "
"; 20 | 21 | $projectid = get_projectID_param($_REQUEST, 'projectid', true); 22 | 23 | if (!$projectid) { 24 | echo "\n"; 29 | exit; 30 | } 31 | 32 | $project = new Project($projectid); 33 | $title = $project->nameofwork; 34 | 35 | echo ""; 36 | echo "projectid: $projectid\n"; 37 | echo "title : $title\n"; 38 | echo "\n"; 39 | 40 | if ($project->is_utf8) { 41 | echo "
" . _("Project table is already UTF-8.") . "
"; 42 | } else { 43 | echo "" . _("Project tabie is not UTF-8.") . "
"; 44 | echo "
" . _("Converting project table...") . "
"; 45 | $project->convert_to_utf8(); 46 | echo "" . _("Done") . "
"; 47 | } 48 | -------------------------------------------------------------------------------- /tools/site_admin/displayrandrules.php: -------------------------------------------------------------------------------- 1 | " . html_safe($title) . ""; 16 | 17 | if (user_is_a_sitemanager()) { 18 | echo "" . _("Manage Random Rules") . "
"; 19 | } 20 | 21 | echo "" . sprintf(_('Rules from document %1$s for langcode %2$s.'), RandomRule::$document_values[$document], $langcode) . ""; 22 | 23 | foreach (RandomRule::get_rules($document, $langcode) as $rule) { 24 | echo "
" . _("Username") . ": "; 7 | echo "\n"; 8 | echo "
"; 9 | echo "\n"; 10 | echo "\n"; 11 | } 12 | -------------------------------------------------------------------------------- /users/teams/avatar/avatar_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/users/teams/avatar/avatar_default.png -------------------------------------------------------------------------------- /users/teams/avatar/avatar_default2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/users/teams/avatar/avatar_default2.png -------------------------------------------------------------------------------- /users/teams/avatar/dp_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/users/teams/avatar/dp_avatar.png -------------------------------------------------------------------------------- /users/teams/icon/dp_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/users/teams/icon/dp_icon.png -------------------------------------------------------------------------------- /users/teams/icon/icon_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/users/teams/icon/icon_default.png -------------------------------------------------------------------------------- /users/teams/icon/icon_default2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/users/teams/icon/icon_default2.png -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const { WebpackManifestPlugin } = require("webpack-manifest-plugin"); 3 | 4 | module.exports = { 5 | mode: "production", 6 | entry: { 7 | control_bar: "./scripts/control_bar.js", 8 | file_resume: "./scripts/file_resume.js", 9 | page_browser: "./tools/page_browser.js", 10 | show_all_good_word_suggestions: "./tools/project_manager/show_all_good_word_suggestions.js", 11 | show_word_context: "./tools/project_manager/show_word_context.js", 12 | proof_image: "./tools/proofers/proof_image.js", 13 | previewControl: "./tools/proofers/previewControl.js", 14 | }, 15 | output: { 16 | filename: "[name].bundle.[contenthash].js", 17 | path: path.resolve(__dirname, "dist"), 18 | clean: true, // Clean the output directory before emit. 19 | }, 20 | optimization: { 21 | moduleIds: "deterministic", 22 | runtimeChunk: "single", 23 | splitChunks: { 24 | // these force vendors into its own file regardless of space saved 25 | minSize: 1, 26 | minSizeReduction: 1, 27 | cacheGroups: { 28 | vendor: { 29 | test: /[\\/]node_modules[\\/]/, 30 | name: "vendors", 31 | chunks: "all", 32 | }, 33 | }, 34 | }, 35 | }, 36 | plugins: [new WebpackManifestPlugin()], 37 | target: "browserslist", 38 | watchOptions: { 39 | ignored: /node_modules/, 40 | }, 41 | }; 42 | --------------------------------------------------------------------------------