├── .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 for an example of how 29 | these are used at DP. 30 | -------------------------------------------------------------------------------- /SETUP/README.md: -------------------------------------------------------------------------------- 1 | # Documentation & Tools 2 | 3 | This directory provides various documentation, installation & upgrading 4 | instructions, and other tools. 5 | 6 | * [CHANGELOG.md](CHANGELOG.md) notes major changes in each version. 7 | * [UNICODE.md](UNICODE.md) covers how the site supports Unicode. 8 | 9 | Installation and upgrading: 10 | * [INSTALL.md](INSTALL.md) includes installation instructions. 11 | * [API.md](API.md) discusses enabling and configuring the API. 12 | * [ARCHIVING.md](ARCHIVING.md) describes how to set up the optional project 13 | archiving. 14 | * [site_admin_notes.txt](site_admin_notes.txt) discusses some post-installation 15 | activities for administrators. 16 | * [UPGRADE.md](UPGRADE.md) covers upgrading existing DP installs. 17 | 18 | For more information about code style, linting, and docs: 19 | * [CODE_STYLE.md](CODE_STYLE.md) 20 | * [CODE_DOCS.md](CODE_DOCS.md) 21 | 22 | For information on site styling and theming, see: 23 | * [Styling system](../styles/README.md) 24 | * [Theming](../styles/themes/README.md) 25 | 26 | For information on graphs, see: 27 | * [Graphs](GRAPHS.md) 28 | -------------------------------------------------------------------------------- /SETUP/ci/lint_json_files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | if [ -n "${1-}" ]; then 5 | BASE_DIR=$1 6 | elif [ -d SETUP ]; then 7 | BASE_DIR=. 8 | elif [ -d ../../SETUP ]; then 9 | BASE_DIR=../../ 10 | else 11 | echo "Unable to determine base code directory" 12 | exit 1 13 | fi 14 | 15 | echo "Checking all .json files under $BASE_DIR excluding node_modules/ and vendor/ for linting errors..." 16 | 17 | function lint_json() 18 | { 19 | local file=$1 20 | echo -n . 21 | if ! OUT=$(php -r "exit(json_decode(file_get_contents('$file')) === NULL);" 2>&1) || [ "$OUT" = 1 ]; then 22 | echo 23 | echo "ERROR: JSON lint failure in $file" 24 | exit 1 25 | fi 26 | } 27 | 28 | N=$(nproc) 29 | # shellcheck disable=SC2044 30 | for file in $(find "$BASE_DIR" -name "*.json" -not -path "*/node_modules/*" -not -path "*/vendor/*"); do 31 | lint_json "$file" & 32 | # Run at most N at a time. 33 | [[ $(jobs -r -p | wc -l) -ge $N ]] && wait -n 34 | done 35 | 36 | # Wait for all jobs to finish 37 | wait 38 | 39 | echo 40 | echo "No JSON linting errors found." 41 | -------------------------------------------------------------------------------- /SETUP/ci/lint_php_files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | if [ -n "${1-}" ]; then 5 | BASE_DIR=$1 6 | elif [ -d SETUP ]; then 7 | BASE_DIR=. 8 | elif [ -d ../../SETUP ]; then 9 | BASE_DIR=../../ 10 | else 11 | echo "Unable to determine base code directory" 12 | exit 1 13 | fi 14 | 15 | function lint_file() 16 | { 17 | local file=$1 18 | echo -n . 19 | OUTPUT=$(php -l "$file" 2> /dev/null || true) 20 | if ! echo "$OUTPUT" | grep -q 'No syntax errors detected'; then 21 | echo 22 | echo "ERROR: PHP lint failure in $file" 23 | echo "$OUTPUT" 24 | exit 1 25 | fi 26 | 27 | OUTPUT=$(file "$file") 28 | if ! echo "$OUTPUT" | grep -Eq 'ASCII|UTF-8'; then 29 | echo 30 | echo "ERROR: Unexpected encoding in $file" 31 | echo "$OUTPUT" 32 | exit 1 33 | fi 34 | } 35 | 36 | echo "Checking all .php and .inc files under $BASE_DIR for linting errors..." 37 | N=$(nproc) 38 | # shellcheck disable=SC2044 39 | for file in $(find "$BASE_DIR" -name "*.php" -o -name "*.inc" | grep -v /vendor/ | grep -v /.phpstan.cache/); do 40 | lint_file "$file" & 41 | # Run at most N at a time. 42 | [[ $(jobs -r -p | wc -l) -ge $N ]] && wait -n 43 | done 44 | 45 | # Wait for all jobs to finish 46 | wait 47 | 48 | echo 49 | echo "No PHP linting errors found." 50 | -------------------------------------------------------------------------------- /SETUP/devex/dpdev-docker/container_startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # initialize the dyn_dir which is mounted as a volume, but check that it 4 | # exists first just in case of a misconfiguration 5 | DYN_DIR=/var/www/html/d 6 | if [ -d $DYN_DIR ]; then 7 | mkdir -p $DYN_DIR/json_forum 8 | mkdir -p $DYN_DIR/locale 9 | mkdir -p $DYN_DIR/projects 10 | mkdir -p $DYN_DIR/uploads 11 | chown -R www-data:www-data $DYN_DIR 12 | fi 13 | 14 | # if there's a local script the user wants executed as part of 15 | # container bring-up, run that too 16 | LOCAL_STARTUP=/var/www/html/c/SETUP/devex/dpdev-docker/container_startup_local.sh 17 | if [ -f $LOCAL_STARTUP ]; then 18 | echo "Local container startup script found, executing it" 19 | cd /var/www/html/c 20 | $LOCAL_STARTUP 21 | fi 22 | 23 | # end with the normal CMD used by the php:8.1-apache container 24 | exec apache2-foreground 25 | -------------------------------------------------------------------------------- /SETUP/devex/dpdev-docker/index_redirect.php: -------------------------------------------------------------------------------- 1 | &2 echo 'ERROR: Invalid installer checksum' 12 | rm composer-setup.php 13 | exit 1 14 | fi 15 | 16 | php composer-setup.php --quiet 17 | RESULT=$? 18 | rm composer-setup.php 19 | exit $RESULT 20 | -------------------------------------------------------------------------------- /SETUP/devex/dpdev-docker/populate_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script pre-populates the database and the JSON-based "forum" with 4 | # some existing users and project data. It downloads the project files 5 | # from the pgdp.org TEST server so this requires internet access. 6 | 7 | DIR=$(dirname $0) 8 | 9 | # create the users 10 | php $DIR/init_users.php 11 | 12 | # load the database 13 | cat $DIR/dp_db.sql | mysql -h mysql -udp_user -pdp_password dp_db 14 | 15 | # pull down the zip file into the download directory 16 | mkdir -p /var/www/html/d/uploads/Users/pm/ 17 | curl -o /var/www/html/d/uploads/Users/pm/demonology_pages.zip \ 18 | https://www.pgdp.org/dp-devel-VM/demonology_pages.zip 19 | 20 | # populate the image files for the loaded project from the zip 21 | mkdir -p /var/www/html/d/projects/projectID5682a1735f76a/ 22 | unzip -q -j -d /var/www/html/d/projects/projectID5682a1735f76a/ \ 23 | /var/www/html/d/uploads/Users/pm/demonology_pages.zip 24 | rm /var/www/html/d/projects/projectID5682a1735f76a/*txt 25 | 26 | chown -R www-data:www-data /var/www/html/d 27 | -------------------------------------------------------------------------------- /SETUP/generate_css_from_less.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | CHECK=0 5 | if [ "${1-}" = "--check" ]; then 6 | CHECK=1 7 | shift 8 | fi 9 | 10 | if [ -n "${1-}" ]; then 11 | STYLE_DIR=$1 12 | elif [ -d styles ]; then 13 | STYLE_DIR=styles 14 | elif [ -d ../styles ]; then 15 | STYLE_DIR=../styles 16 | else 17 | echo "Unable to determine styles directory" 18 | exit 1 19 | fi 20 | 21 | LESSC=$STYLE_DIR/../node_modules/.bin/lessc 22 | 23 | # Array of .less files that should not turn into a .css file 24 | NON_CSS_LESS_FILES=(layout.less global.less page_interfaces.less) 25 | 26 | function run_less { 27 | less_file=$1 28 | 29 | # skip files in NON_CSS_LESS_FILES that shouldn't generate a .css 30 | less_basename=$(basename -- "$less_file") 31 | for skip_file in "${NON_CSS_LESS_FILES[@]}"; do 32 | [[ "$less_basename" = "$skip_file" ]] && return; 33 | done 34 | 35 | css_file="${less_file%.*}.css" 36 | if [ $CHECK -eq 0 ]; then 37 | echo "Generating $css_file" 38 | $LESSC "$less_file" "$css_file" 39 | else 40 | echo "Validating $css_file" 41 | if ! diff -q "$css_file" <($LESSC "$less_file") > /dev/null 2>&1; then 42 | echo "ERROR: $css_file doesn't match generated less file" 43 | exit 1 44 | fi 45 | fi 46 | } 47 | 48 | # run over every .less file in our style directory 49 | # shellcheck disable=SC2044 50 | for file in $(find $STYLE_DIR -name "*.less"); do 51 | run_less "$file" 52 | done 53 | 54 | # now the themes 55 | -------------------------------------------------------------------------------- /SETUP/generate_manifest_cache.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | assign_vars(array( 6 | 'SITENAME' => $config['sitename'], 7 | - 'SITE_DESCRIPTION' => $config['site_desc'], 8 | + // Allow HTML in SITE_DESCRIPTION 9 | + 'SITE_DESCRIPTION' => htmlspecialchars_decode($config['site_desc'], ENT_QUOTES), 10 | 'PAGE_TITLE' => $page_title, 11 | 'SCRIPT_NAME' => str_replace('.' . $phpEx, '', $user->page['page_name']), 12 | 'LAST_VISIT_DATE' => sprintf($user->lang['YOU_LAST_VISIT'], $s_last_visit), 13 | -------------------------------------------------------------------------------- /SETUP/phpbb32-pm.php.patch: -------------------------------------------------------------------------------- 1 | --- phpbb/notification/type/pm.php.orig 2017-02-21 15:28:39.777270682 +0000 2 | +++ phpbb/notification/type/pm.php 2017-02-22 02:32:30.431565971 +0000 3 | @@ -162,12 +162,25 @@ 4 | public function get_email_template_variables() 5 | { 6 | $user_data = $this->user_loader->get_user($this->get_data('from_user_id')); 7 | + 8 | + $sql = 'SELECT message_text 9 | + FROM ' . PRIVMSGS_TABLE . ' 10 | + WHERE msg_id = ' . (int) $this->item_id; 11 | + 12 | + $result = $this->db->sql_query($sql); 13 | + $row = $this->db->sql_fetchrow($result); 14 | + $this->db->sql_freeresult($result); 15 | + 16 | + $message_text = "\n_____________________________________________________________________\n" . 17 | + htmlspecialchars_decode(strip_tags(censor_text($row['message_text']))) . 18 | + "\n_____________________________________________________________________"; 19 | + 20 | 21 | return array( 22 | 'AUTHOR_NAME' => htmlspecialchars_decode($user_data['username']), 23 | - 'SUBJECT' => htmlspecialchars_decode(censor_text($this->get_data('message_subject'))), 24 | + 'SUBJECT' => htmlspecialchars_decode(censor_text($this->get_data('message_subject'))), 25 | 26 | - 'U_VIEW_MESSAGE' => generate_board_url() . '/ucp.' . $this->php_ext . "?i=pm&mode=view&p={$this->item_id}", 27 | + 'U_VIEW_MESSAGE' => generate_board_url() . '/ucp.' . $this->php_ext . "?i=pm&mode=view&p={$this->item_id}" . $message_text, 28 | ); 29 | } 30 | 31 | -------------------------------------------------------------------------------- /SETUP/tests/.htaccess: -------------------------------------------------------------------------------- 1 | Allow from all 2 | -------------------------------------------------------------------------------- /SETUP/tests/README.md: -------------------------------------------------------------------------------- 1 | # Tests 2 | 3 | This directory contains a variety of files used for testing. 4 | Including: 5 | * [phpunit](https://phpunit.de/) tests in the `unittests` directory 6 | * [QUnit](https://qunitjs.com/) tests in the `jsTests` directory 7 | * Manual web-based tests in the `manual_web` directory 8 | * Smoke tests in the `smoketests` directory 9 | * [GitHub Actions](https://github.com/features/actions) configuration 10 | 11 | ## phpunit tests 12 | 13 | `phpunit.xml` contains configuration information like bootstrap 14 | requirements, so running the full suite is as simple as: 15 | ```bash 16 | cd unittests 17 | ../../../vendor/bin/phpunit 18 | ``` 19 | 20 | To run the page compare test only: 21 | ```bash 22 | ../../../vendor/bin/phpunit PageCompareTest.php 23 | ``` 24 | 25 | ## JS tests 26 | 27 | The QUnit-based JS tests can be run from the base of the repo with: 28 | ```bash 29 | npm run test 30 | ``` 31 | 32 | You can also load the `SETUP/tests/jsTests/qunit.html` file in your web browser 33 | to run them and see any failures. 34 | -------------------------------------------------------------------------------- /SETUP/tests/jsTests/jsUnit.js: -------------------------------------------------------------------------------- 1 | /* global process require */ 2 | const { Builder, Browser, By, until } = require("selenium-webdriver"); 3 | const firefox = require("selenium-webdriver/firefox"); 4 | 5 | (async function example() { 6 | var options = new firefox.Options(); 7 | options.addArguments("-headless"); 8 | let driver = new Builder().forBrowser(Browser.FIREFOX).setFirefoxOptions(options).build(); 9 | let succeeded = false; 10 | try { 11 | await driver.get(`file:///${process.cwd()}/SETUP/tests/jsTests/qunit.html`); 12 | await driver.wait(until.elementLocated(By.className("passed")), 10000); 13 | const passed = parseInt(await (await driver.findElement(By.className("passed"))).getText(), 10); 14 | const total = parseInt(await (await driver.findElement(By.className("total"))).getText(), 10); 15 | const failed = parseInt(await (await driver.findElement(By.className("failed"))).getText(), 10); 16 | console.log(`${passed} assertions of ${total} passed, ${failed} failed.`); 17 | if (failed !== 0) { 18 | console.error("Failures:"); 19 | const failures = await driver.findElements(By.css(".fail .fail")); 20 | for (const failure of failures) { 21 | console.error("------"); 22 | console.error(await failure.getText()); 23 | } 24 | } 25 | succeeded = passed === total && failed === 0; 26 | } catch (e) { 27 | console.error(e); 28 | } finally { 29 | await driver.quit(); 30 | } 31 | if (!succeeded) { 32 | process.exit(1); 33 | } 34 | })(); 35 | -------------------------------------------------------------------------------- /SETUP/tests/jsTests/qunit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | QUnit Example 7 | 8 | 9 | 10 |
11 |
12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/.htaccess: -------------------------------------------------------------------------------- 1 | Allow from all 2 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/README.md: -------------------------------------------------------------------------------- 1 | # Manual Web Tests 2 | 3 | Files in this directory are expected to be run manually via the web. 4 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/page_compare/README.md: -------------------------------------------------------------------------------- 1 | # Page Compare Test 2 | 3 | 'manual_page_compare_test.php' is a development tool to test the functions to remove formatting (in PageUnformatter.inc) which are used in page_compare.php and diff.php. The purpose of removing formatting markup is to detect differences between P and F (or F1 and F2) rounds other than formatting; these could be either proofing corrections or inadvertent changes which are made in the F round. It is difficult to test using normal round pages because the test texts need to be in two different rounds. Two texts can be pasted into the upper two boxes in 'page_compare_test.php' and processed. The results are shown in the two lower boxes. The same processing is applied to each box. 4 | 5 | The "unwrap" check box controls the 2nd parameter of remove_formatting($text, $unwrap). 6 | 7 | The "Ignore case" checkbox is an experimental feature to explore whether ignoring case would be useful in connection with small caps markup. Since changing the text to the appropriate case is done in formatting rounds differences can show up which are just case chamges. This is not at present used in diff.php or page_compare.php. 8 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/SETUP/tests/manual_web/split_test/004.png -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Splitter tests 5 | 6 | 7 | 8 | 9 |

Splitter Demonstrations

10 | 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 "
\n"; 23 | 24 | echo "
"; 25 | echo "

$title

\n"; 26 | echo "
"; 27 | echo "
\n"; 28 | 29 | echo "
\n"; 30 | echo "
nobly sacrifice
\n"; 31 | echo "
$text
\n"; 32 | echo "
\n"; 33 | echo "
\n"; 34 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/vertical_horizontal_split.js: -------------------------------------------------------------------------------- 1 | import { splitControl } from "../../../../scripts/splitControl.js"; 2 | 3 | window.addEventListener("DOMContentLoaded", function () { 4 | let mainSplit = splitControl(document.getElementById("top-container"), { dragBarColor: "green" }); 5 | let subSplit = splitControl(document.getElementById("sub-container"), { splitVertical: false, dragBarSize: 10, dragBarColor: "blue" }); 6 | mainSplit.onResize.add(subSplit.reLayout); 7 | window.addEventListener("resize", mainSplit.reLayout); 8 | mainSplit.reLayout(); 9 | }); 10 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/vertical_horizontal_split_flex.php: -------------------------------------------------------------------------------- 1 | [ 12 | "vertical_horizontal_split.js", 13 | ], 14 | "css_files" => ["split_test.css"], 15 | "body_attributes" => "style='margin: 0; overflow: hidden'", 16 | ]; 17 | 18 | $text = file_get_contents("sample.txt"); 19 | 20 | slim_header("$title", $header_args); 21 | 22 | echo "
\n"; 23 | 24 | echo "
"; 25 | echo "

$title

\n"; 26 | echo "
\n"; 27 | 28 | echo "
\n"; 29 | 30 | echo "
nobly sacrifice
\n"; 31 | echo "
\n"; 32 | echo "
\n"; 33 | echo "
This is pane3
\n"; 34 | 35 | echo "
\n"; // sub-container 36 | 37 | echo "
\n"; // top-container 38 | 39 | echo "
\n"; // flex box 40 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/vertical_split.js: -------------------------------------------------------------------------------- 1 | import { splitControl } from "../../../../scripts/splitControl.js"; 2 | 3 | window.addEventListener("DOMContentLoaded", function () { 4 | let mainSplit = splitControl(document.getElementById("container")); 5 | window.addEventListener("resize", mainSplit.reLayout); 6 | mainSplit.reLayout(); 7 | }); 8 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/vertical_split.php: -------------------------------------------------------------------------------- 1 | [ 12 | "vertical_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 "
\n"; 23 | echo "
nobly sacrifice
\n"; 24 | echo "
$text
\n"; 25 | echo "
\n"; 26 | -------------------------------------------------------------------------------- /SETUP/tests/manual_web/split_test/vertical_split_flex.php: -------------------------------------------------------------------------------- 1 | [ 12 | "vertical_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 "
\n"; 23 | echo "
"; 24 | echo "

$title

\n"; 25 | echo "
\n"; 26 | echo "
\n"; 27 | echo "
nobly sacrifice
\n"; 28 | echo "
$text
\n"; 29 | echo "
\n"; 30 | echo "
\n"; 31 | -------------------------------------------------------------------------------- /SETUP/tests/smoketests/deprecated.php: -------------------------------------------------------------------------------- 1 | set("setting", "{}"); 12 | $value = $storage->get("setting"); 13 | $this->assertEquals("{}", $value); 14 | $value = $storage->delete("setting"); 15 | $this->assertEquals(null, $value); 16 | } 17 | 18 | public function test_invalid_json(): void 19 | { 20 | $this->expectException(ValueError::class); 21 | $storage = new JsonStorage("username"); 22 | $storage->set("setting", "blearg"); 23 | } 24 | 25 | //------------------------------------------------------------------------ 26 | // API storage test 27 | 28 | public function test_valid_storagekey(): void 29 | { 30 | SiteConfig::get()->api_storage_keys = ["valid"]; 31 | 32 | $storage = new ApiStorage("valid", "username"); 33 | $storage->set("{}"); 34 | $value = $storage->get(); 35 | $this->assertEquals("{}", $value); 36 | $value = $storage->delete(); 37 | $this->assertEquals(null, $value); 38 | } 39 | 40 | public function test_invalid_storagekey(): void 41 | { 42 | $this->expectException(ValueError::class); 43 | 44 | $storage = new ApiStorage("invalid", "username"); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /SETUP/tests/unittests/data/corrupted.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/SETUP/tests/unittests/data/corrupted.zip -------------------------------------------------------------------------------- /SETUP/tests/unittests/data/empty.zip: -------------------------------------------------------------------------------- 1 | PK -------------------------------------------------------------------------------- /SETUP/tests/unittests/data/not_zip.zip: -------------------------------------------------------------------------------- 1 | This is not a zip archive. -------------------------------------------------------------------------------- /SETUP/tests/unittests/data/valid.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/SETUP/tests/unittests/data/valid.zip -------------------------------------------------------------------------------- /SETUP/tests/unittests/data/wrong.extension: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/SETUP/tests/unittests/data/wrong.extension -------------------------------------------------------------------------------- /SETUP/tests/unittests/page_compare_data/footnotes/formatted.txt: -------------------------------------------------------------------------------- 1 | This text includes footnotes. 2 | 3 | 4 | Section 1 5 | 6 | The standardization efforts and the use of Markdown[1] generated an important reaction from the community, with hundreds[A] of comments[B]. 7 | 8 | *[Footnote: this is a continuation footnote A.H. 166 (782).] 9 | 10 | [Footnote 1: Ma'm[=u]n had conceived an aversion for T[=a]hir[** or T[^a]hir].] 11 | 12 | [Footnote A: First starred footnote.] 13 | 14 | [Footnote B: Second starred footnote.] 15 | -------------------------------------------------------------------------------- /SETUP/tests/unittests/page_compare_data/footnotes/unformatted.txt: -------------------------------------------------------------------------------- 1 | This text includes footnotes. 2 | Section 1 3 | The standardization efforts and the use of Markdown[1] generated an important reaction from the community, with hundreds[*] of comments[*]. 4 | this is a continuation footnote A.H. 166 (782). 5 | 1 Ma'm[=u]n had conceived an aversion for T[=a]hir. 6 | * First starred footnote. 7 | * Second starred footnote. -------------------------------------------------------------------------------- /SETUP/tests/unittests/page_compare_data/poem/formatted.txt: -------------------------------------------------------------------------------- 1 | to the scenery of his own country: 2 | 3 | /* 4 | Oh, to be in England 5 | Now that April's there, 6 | And whoever wakes in England 7 | Sees, some morning, unaware, 8 | That the lowest boughs and the brushwood sheaf 9 | Round the elm-tree bole are in tiny leaf, 10 | While the chaffinch sings on the orchard bough 11 | In England--now! 12 | */ -------------------------------------------------------------------------------- /SETUP/tests/unittests/page_compare_data/poem/unformatted.txt: -------------------------------------------------------------------------------- 1 | to the scenery of his own country: 2 | Oh, to be in England 3 | Now that April's there, 4 | And whoever wakes in England 5 | Sees, some morning, unaware, 6 | That the lowest boughs and the brushwood sheaf 7 | Round the elm-tree bole are in tiny leaf, 8 | While the chaffinch sings on the orchard bough 9 | In England--now! -------------------------------------------------------------------------------- /SETUP/tests/unittests/page_compare_data/usernotes/formatted.txt: -------------------------------------------------------------------------------- 1 | plain [** user note 1] [** user note [=a] 2] text -------------------------------------------------------------------------------- /SETUP/tests/unittests/page_compare_data/usernotes/unformatted.txt: -------------------------------------------------------------------------------- 1 | plain text -------------------------------------------------------------------------------- /SETUP/tests/unittests/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | . 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SETUP/tests/unittests/phpunit_bootstrap.php: -------------------------------------------------------------------------------- 1 | "New": 9 | // 3 => "Duplicate", 10 | // 4 => "Fixed", 11 | // 5 => "Invalid", 12 | // 6 => "Later", 13 | // 7 => "None", 14 | // 8 => "Out of Date", 15 | // 9 => "Postponed", 16 | // 10 => "Rejected", 17 | // 11 => "Remind", 18 | // 12 => "Won't Fix", 19 | // 13 => "Works for Me", 20 | // 17 => "Implemented", 21 | // 22 | 23 | echo "Updating rarely used task statuses to 1 = 'New' ...\n"; 24 | $sql = " 25 | UPDATE tasks 26 | SET task_status = 1 27 | WHERE (task_status >= 3 AND task_status <= 13) OR task_status = 17 28 | "; 29 | 30 | echo "$sql\n"; 31 | 32 | mysqli_query(DPDatabase::get_connection(), $sql) or die(mysqli_error(DPDatabase::get_connection())); 33 | 34 | // ------------------------------------------------------------ 35 | 36 | echo "\nDone!\n"; 37 | -------------------------------------------------------------------------------- /SETUP/upgrade/20/20230920_drop_i_prefs_column.php: -------------------------------------------------------------------------------- 1 | "user_all", 11 | 1 => "user_active", 12 | 2 => "blank", 13 | ]; 14 | 15 | $pms = Settings::get_users_with_setting("manager", "yes"); 16 | sort($pms); 17 | 18 | foreach ($pms as $pm) { 19 | echo "Setting PM view for $pm\n"; 20 | try { 21 | $user = new User($pm); 22 | } catch (NonexistentUserException $exception) { 23 | echo " Error: " . $exception->getMessage() . "\n"; 24 | continue; 25 | } 26 | $user_settings = new Settings($pm); 27 | $user_settings->set_value("pm_view", $pm_view_options[$user->i_pmdefault]); 28 | } 29 | 30 | echo "Dropping users.i_pmdefault column\n"; 31 | $sql = " 32 | ALTER TABLE users 33 | DROP COLUMN i_pmdefault 34 | "; 35 | 36 | $result = mysqli_query(DPDatabase::get_connection(), $sql) or die(mysqli_error(DPDatabase::get_connection())); 37 | 38 | // ------------------------------------------------------------ 39 | 40 | echo "\nDone!\n"; 41 | -------------------------------------------------------------------------------- /SETUP/upgrade/20/20230920_update_user_table.php: -------------------------------------------------------------------------------- 1 | "._("Return to DP Home Page.")."" 21 | ); 22 | -------------------------------------------------------------------------------- /accounts/require_login.php: -------------------------------------------------------------------------------- 1 | " . _("The page you requested requires a login. You will be redirected there once you have signed in.") . "

"; 11 | } 12 | 13 | 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 $query_params */ 24 | function api_v1_document(string $method, array $data, array $query_params): string 25 | { 26 | $lang_code = $query_params["language_code"] ?? "en"; 27 | $document = $data[":document"]; 28 | $faq_url = get_faq_url($document, $lang_code, false); 29 | if ("" === $faq_url) { 30 | throw new NotFoundError("$document is not available in language code '$lang_code'"); 31 | } 32 | return $faq_url; 33 | } 34 | 35 | /** @param array $query_params */ 36 | function api_v1_dictionaries(string $method, array $data, array $query_params): array 37 | { 38 | $dict_list = get_languages_with_dictionaries(); 39 | asort($dict_list); 40 | return $dict_list; 41 | } 42 | -------------------------------------------------------------------------------- /api/v1_storage.inc: -------------------------------------------------------------------------------- 1 | $query_params 12 | * @return mixed 13 | */ 14 | function api_v1_storage(string $method, array $data, array $query_params) 15 | { 16 | global $pguser; 17 | 18 | $storage_key = $data[":storagekey"]; 19 | 20 | $router = ApiRouter::get_router(); 21 | $storage = new ApiStorage($storage_key, $pguser); 22 | 23 | if ($method == "GET") { 24 | // return it without conversion 25 | $router->set_raw_response(); 26 | return $storage->get(); 27 | } elseif ($method == "PUT") { 28 | // we store the raw JSON input we were passed in the request 29 | $storage->set(api_get_request_body(true)); 30 | 31 | // and return it without conversion 32 | $router->set_raw_response(); 33 | return $storage->get(); 34 | } 35 | } 36 | 37 | /** @param array $query_params */ 38 | function api_v1_storage_delete(string $method, array $data, array $query_params): void 39 | { 40 | global $pguser; 41 | 42 | $storage_key = $data[":storagekey"]; 43 | 44 | $storage = new ApiStorage($storage_key, $pguser); 45 | $storage->delete(); 46 | } 47 | -------------------------------------------------------------------------------- /crontab/AutoModify.inc: -------------------------------------------------------------------------------- 1 | dyn_dir . "/stats/automodify_logs"; 17 | if (! is_dir($logs_dir)) { 18 | mkdir($logs_dir, 0777, true); 19 | } 20 | $this->logfile = sprintf("$logs_dir/%s.txt", date("Y-m-d_H:i:s")); 21 | $this->filehandle = fopen($this->logfile, "wt"); 22 | ob_start([$this, 'flush'], 1024); 23 | 24 | automodify(); 25 | autorelease(); 26 | 27 | ob_end_flush(); 28 | fclose($this->filehandle); 29 | } 30 | 31 | private function flush(string $buffer, int $phase): string 32 | { 33 | fwrite($this->filehandle, $buffer); 34 | return $buffer; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /crontab/CleanDownloadTemp.inc: -------------------------------------------------------------------------------- 1 | stop_message = "No download temp directory found, nothing to do."; 16 | return; 17 | } 18 | 19 | // remove files older than 7 days 20 | $process = new Process([ 21 | "/usr/bin/find", 22 | $download_temp_dir, 23 | "-type", "f", 24 | "-mtime", "+7", 25 | "-delete", 26 | ]); 27 | $process->run(); 28 | if (!$process->isSuccessful()) { 29 | echo "An error occurred while cleaning up files.\n"; 30 | echo "Return value: {$process->getExitCode()}\n"; 31 | echo "Command output:\n"; 32 | echo $process->getOutput(); 33 | throw new RuntimeException("An error occurred while removing files"); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /crontab/PruneJobLogs.inc: -------------------------------------------------------------------------------- 1 | days_to_retain_job_logs); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /crontab/PruneNonActivatedUsers.inc: -------------------------------------------------------------------------------- 1 | days_to_retain_pending_accounts); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /crontab/README.md: -------------------------------------------------------------------------------- 1 | # Background Jobs 2 | 3 | Files in this directory are used to run regular maintenance jobs. It is 4 | expected that they will be run regularly via cron. The `SETUP/dp.cron` 5 | file provides an example crontab indicating suggested run frequency. 6 | 7 | All jobs use a common entrypoint, `run_background_job.php`, that is expected 8 | to be run from the PHP CLI. Most jobs are executed directly from within the 9 | PHP CLI context. Some jobs are best run through the web browser as they 10 | manipulate files on the filesystem owned by the web browser user. These jobs 11 | are automatically proxied through the web browser to the same entrypoint 12 | script. 13 | 14 | `run_background_job.php` is hardened to only allow localhost access to ensure 15 | outside users do not execute jobs. 16 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mysql: 3 | image: mysql:8.0.42 4 | environment: 5 | MYSQL_ROOT_PASSWORD: password 6 | # the following will create a dp_db DB with utf8mb4 collation 7 | MYSQL_DATABASE: dp_db 8 | MYSQL_USER: dp_user 9 | MYSQL_PASSWORD: dp_password 10 | volumes: 11 | - type: volume 12 | source: mysql-data 13 | target: /var/lib/mysql 14 | expose: 15 | - "3306" 16 | 17 | dpdev: 18 | build: ./SETUP/devex/dpdev-docker 19 | volumes: 20 | - ./:/src 21 | - ./:/var/www/html/c 22 | - type: volume 23 | source: dyndir-data 24 | target: /var/www/html/d 25 | ports: 26 | - 8080:80 27 | 28 | volumes: 29 | mysql-data: 30 | dyndir-data: 31 | -------------------------------------------------------------------------------- /faq/InterfaceDiagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/InterfaceDiagram.png -------------------------------------------------------------------------------- /faq/formatting_summary.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/formatting_summary.odt -------------------------------------------------------------------------------- /faq/formatting_summary.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/formatting_summary.pdf -------------------------------------------------------------------------------- /faq/fr/proofing_summary.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/fr/proofing_summary.odt -------------------------------------------------------------------------------- /faq/fr/proofing_summary.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/fr/proofing_summary.pdf -------------------------------------------------------------------------------- /faq/proofing_summary.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/proofing_summary.odt -------------------------------------------------------------------------------- /faq/proofing_summary.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/faq/proofing_summary.pdf -------------------------------------------------------------------------------- /graphics/Book-Plus-Small-Disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/Book-Plus-Small-Disabled.gif -------------------------------------------------------------------------------- /graphics/Book-Plus-Small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/Book-Plus-Small.gif -------------------------------------------------------------------------------- /graphics/New-Window.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/New-Window.gif -------------------------------------------------------------------------------- /graphics/Recycle-Window.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/Recycle-Window.gif -------------------------------------------------------------------------------- /graphics/bottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/bottom.gif -------------------------------------------------------------------------------- /graphics/center.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/center.gif -------------------------------------------------------------------------------- /graphics/dp-mark-180px-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/dp-mark-180px-white.png -------------------------------------------------------------------------------- /graphics/dp-mark-32px.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/dp-mark-32px.ico -------------------------------------------------------------------------------- /graphics/exclamation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/exclamation.gif -------------------------------------------------------------------------------- /graphics/icon_du.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_du.png -------------------------------------------------------------------------------- /graphics/icon_mentor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_mentor.png -------------------------------------------------------------------------------- /graphics/icon_newbie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_newbie.png -------------------------------------------------------------------------------- /graphics/icon_pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_pf.png -------------------------------------------------------------------------------- /graphics/icon_pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_pm.png -------------------------------------------------------------------------------- /graphics/icon_pp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_pp.png -------------------------------------------------------------------------------- /graphics/icon_ppv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_ppv.png -------------------------------------------------------------------------------- /graphics/icon_proofer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_proofer.png -------------------------------------------------------------------------------- /graphics/icon_sa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/icon_sa.png -------------------------------------------------------------------------------- /graphics/left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/left.gif -------------------------------------------------------------------------------- /graphics/middle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/middle.gif -------------------------------------------------------------------------------- /graphics/right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/right.gif -------------------------------------------------------------------------------- /graphics/top.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/top.gif -------------------------------------------------------------------------------- /graphics/xml.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/graphics/xml.gif -------------------------------------------------------------------------------- /pinc/3rdparty/README.md: -------------------------------------------------------------------------------- 1 | # 3rd Party Code 2 | 3 | This directory contains 3rd party code -- that is other open source code that 4 | the DP code relies on for various functionality. 5 | 6 | When adding files to this directory, you must ensure that the software's 7 | license allows it to be included. Include a copy of the license in the 8 | directory as well as a `README.md` file describing what it is, where it came 9 | from, and how to update it. 10 | 11 | You must also include a `details.json` file that includes meta information 12 | about the software. This is used on the open source attributions page to 13 | ensure we are meeting our legal requirements for attribution-required 14 | licenses. 15 | -------------------------------------------------------------------------------- /pinc/3rdparty/iconify/MIT_LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 GitHub Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pinc/3rdparty/iconify/README.md: -------------------------------------------------------------------------------- 1 | # Iconify 2 | 3 | These svg icons were obtained from [Iconify design](https://iconify.design/) by copying the svg code of the individual icons. The icons `octicon-columns-24.svg` and `octicon-rows-24.svg` are licensed under the [MIT License](MIT_LICENSE). 4 | -------------------------------------------------------------------------------- /pinc/3rdparty/iconify/details.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Iconify.design", 3 | "url": "https://iconify.design/", 4 | "license": "MIT License", 5 | "license_url": "https://github.com/primer/octicons/blob/main/LICENSE", 6 | "license_file": "MIT_LICENSE" 7 | } -------------------------------------------------------------------------------- /pinc/3rdparty/iconify/octicon-columns-24.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pinc/3rdparty/iconify/octicon-rows-24.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pinc/3rdparty/mediawiki/ComplexityException.php: -------------------------------------------------------------------------------- 1 | api_storage_keys)) { 11 | throw new ValueError("$storage_key is not an accepted storage key"); 12 | } 13 | $this->setting = "api:$storage_key"; 14 | $this->storage = new JsonStorage($username); 15 | } 16 | 17 | // ------------------------------------------------------------------------- 18 | 19 | public function set(string $value): void 20 | { 21 | $this->storage->set($this->setting, $value); 22 | } 23 | 24 | public function get(): string 25 | { 26 | // if the setting isn't set, JsonStorage will return null but we want 27 | // to always return valid JSON for the API so we return an empty JSON 28 | // doc. 29 | return $this->storage->get($this->setting) ?? "{}"; 30 | } 31 | 32 | public function delete(): void 33 | { 34 | $this->storage->delete($this->setting); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pinc/DifferenceEngineWrapperBB.inc: -------------------------------------------------------------------------------- 1 | \n$ntitle"; 35 | } 36 | return "$header\n
$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 << 10 |
11 |
12 |
13 | $bad_char_message 14 |   15 |   16 |
17 | END; 18 | } 19 | -------------------------------------------------------------------------------- /pinc/comment_inclusions.inc: -------------------------------------------------------------------------------- 1 | comment_format == 'html') { 22 | $comments = sanitize_html($project->comments, 'td'); 23 | } else { 24 | $comments = render_markdown_as_html($project->comments); 25 | } 26 | 27 | return $comments; 28 | } 29 | -------------------------------------------------------------------------------- /pinc/daily_page_limit.inc: -------------------------------------------------------------------------------- 1 | id, 'U'); 39 | 40 | return $round_tallyboard->get_delta_since_latest_snapshot($user->u_id); 41 | } 42 | -------------------------------------------------------------------------------- /pinc/forum_interface.inc: -------------------------------------------------------------------------------- 1 | forum_type); 3 | require $relPath.$forum_interface_file; 4 | -------------------------------------------------------------------------------- /pinc/http_headers.inc: -------------------------------------------------------------------------------- 1 | ($page_image_size_limit * 1024)) { 12 | $result = sprintf(_("Image > %dkb: %dkb"), $page_image_size_limit, $image_size / 1024); 13 | } 14 | return $result; 15 | } 16 | 17 | function get_image_small_dimension_error($width, $height) 18 | { 19 | global $page_image_minimum_dimension; 20 | $result = null; 21 | if (min($width, $height) < $page_image_minimum_dimension) { 22 | $result = sprintf( 23 | _("Image may be too small: Resolution %dx%d, shortest dimension is less than %d pixels."), 24 | $width, 25 | $height, 26 | $page_image_minimum_dimension 27 | ); 28 | } 29 | return $result; 30 | } 31 | -------------------------------------------------------------------------------- /pinc/js_newpophelp.inc: -------------------------------------------------------------------------------- 1 | profile->i_res]); 11 | $top = ((int)$wSize[1] - 300) / 2; 12 | $left = ((int)$wSize[0] - 400) / 2; 13 | 14 | return " 15 | function newHelpWin(wFile) 16 | { 17 | var newFeatures='toolbar=0,status=0,location=0,directories=0,menubar=0,scrollbars=1,resizable=1,width=400,height=300,top=$top,left=$left'; 18 | window.open('$popHelpDir'+wFile,'popHelp',newFeatures); 19 | } 20 | "; 21 | } 22 | -------------------------------------------------------------------------------- /pinc/lang_data.inc: -------------------------------------------------------------------------------- 1 | "Pennsilfaanisch Deitsch", 9 | ]; 10 | 11 | // Language names in their English form. 12 | // This overrides/supplements the ones provided by locale_get_display_name(). 13 | $eng_name_data = [ 14 | "pd" => "Pennsylvania Dutch", 15 | ]; 16 | -------------------------------------------------------------------------------- /pinc/page_controls.inc: -------------------------------------------------------------------------------- 1 | get_font_styles(), 6 | "faceFamilies" => get_full_font_families(), 7 | "sizes" => array_values(get_available_proofreading_font_sizes()), 8 | ]; 9 | 10 | $proof_int_data = json_encode([ 11 | "font" => $font_data, 12 | ]); 13 | 14 | return "var proofIntData = $proof_int_data;"; 15 | } 16 | -------------------------------------------------------------------------------- /pinc/pg.inc: -------------------------------------------------------------------------------- 1 | element 25 | * that links to the PG catalog page for that text. 26 | */ 27 | function get_pg_catalog_link_for_etext($etext_number, $link_text = null) 28 | { 29 | $url = get_pg_catalog_url_for_etext($etext_number); 30 | 31 | if (is_null($link_text)) { 32 | $link_text = sprintf(_('PG #%d'), $etext_number); 33 | } 34 | 35 | return "$link_text"; 36 | } 37 | -------------------------------------------------------------------------------- /pinc/privacy.inc: -------------------------------------------------------------------------------- 1 | dyn_dir . "/walkthrough/$langcode")) { 16 | return SiteConfig::get()->dyn_url . "/walkthrough/$langcode"; 17 | } 18 | } 19 | 20 | return ""; 21 | } 22 | -------------------------------------------------------------------------------- /pophelp.php: -------------------------------------------------------------------------------- 1 | $prefs_pophelp, 12 | 'teams' => $teams_pophelp, 13 | ]; 14 | 15 | $category = get_enumerated_param($_GET, 'category', null, array_keys($pophelp)); 16 | $name = get_enumerated_param($_GET, 'name', null, array_keys($pophelp[$category])); 17 | 18 | $title = $pophelp[$category][$name]['title']; 19 | $content = $pophelp[$category][$name]['content']; 20 | 21 | slim_header($title); 22 | echo "\n"; 23 | echo "\n"; 24 | echo "\n"; 25 | echo "\n"; 26 | echo "
$title
$content
" . _("Close Window") . "
\n"; 27 | -------------------------------------------------------------------------------- /quiz/generic/hints.php: -------------------------------------------------------------------------------- 1 | "; 20 | 21 | qp_echo_hint_html($error, $number); 22 | 23 | echo " \n"; 24 | -------------------------------------------------------------------------------- /quiz/generic/images/Fraktur_alphabet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/Fraktur_alphabet.png -------------------------------------------------------------------------------- /quiz/generic/images/abbr_France.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/abbr_France.png -------------------------------------------------------------------------------- /quiz/generic/images/abbr_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/abbr_complete.png -------------------------------------------------------------------------------- /quiz/generic/images/abbr_ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/abbr_ground.png -------------------------------------------------------------------------------- /quiz/generic/images/aelig_ital_bump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/aelig_ital_bump.png -------------------------------------------------------------------------------- /quiz/generic/images/aelig_ital_teardrop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/aelig_ital_teardrop.png -------------------------------------------------------------------------------- /quiz/generic/images/amp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/amp.png -------------------------------------------------------------------------------- /quiz/generic/images/amp_blackletter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/amp_blackletter.png -------------------------------------------------------------------------------- /quiz/generic/images/amp_blackletter2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/amp_blackletter2.png -------------------------------------------------------------------------------- /quiz/generic/images/amp_ital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/amp_ital.png -------------------------------------------------------------------------------- /quiz/generic/images/blackletter_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/blackletter_sample.png -------------------------------------------------------------------------------- /quiz/generic/images/dashes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/dashes.png -------------------------------------------------------------------------------- /quiz/generic/images/oelig_ital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/oelig_ital.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_formatting1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_formatting1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_formatting2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_formatting2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_formatting3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_formatting3.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_formatting4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_formatting4.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_formatting5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_formatting5.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_aeoe_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_aeoe_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_aeoe_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_aeoe_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basic_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basic_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basic_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basic_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basic_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basic_3.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basic_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basic_4.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basic_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basic_5.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basicx_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basicx_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_basicx_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_basicx_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_fraktur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_fraktur.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_greek_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_greek_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_greek_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_greek_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_greek_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_greek_3.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_greek_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_greek_4.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_greek_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_greek_5.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod1_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod1_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod1_3.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod1_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod1_4.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod1_5.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod2_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod2_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod2_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod2_3.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod2_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod2_4.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_mod2_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_mod2_5.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_old_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_old_1.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_old_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_old_2.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_old_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_old_3.png -------------------------------------------------------------------------------- /quiz/generic/images/qi_p_thorn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/qi_p_thorn.png -------------------------------------------------------------------------------- /quiz/generic/images/thorn_cap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/thorn_cap.png -------------------------------------------------------------------------------- /quiz/generic/images/thorn_cap2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/thorn_cap2.png -------------------------------------------------------------------------------- /quiz/generic/images/thorn_lower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/thorn_lower.png -------------------------------------------------------------------------------- /quiz/generic/images/thorn_lower2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/thorn_lower2.png -------------------------------------------------------------------------------- /quiz/generic/images/u_ital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/u_ital.png -------------------------------------------------------------------------------- /quiz/generic/images/v_ital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/quiz/generic/images/v_ital.png -------------------------------------------------------------------------------- /quiz/generic/main.php: -------------------------------------------------------------------------------- 1 | [ 14 | "$code_url/tools/proofers/dp_proof.js", 15 | "$code_url/tools/proofers/dp_scroll.js", 16 | ], 17 | ]; 18 | 19 | // $browser_title is from qd file which is included via quiz_page.inc 20 | slim_header_frameset($browser_title, $header_args); 21 | ?> 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /quiz/generic/orig.php: -------------------------------------------------------------------------------- 1 | 'body { background-color: #ffffff; }']); 13 | echo ""; 14 | -------------------------------------------------------------------------------- /quiz/generic/right.php: -------------------------------------------------------------------------------- 1 | " . _("Default Quiz Messages") . ""; 16 | 17 | echo "

" . _("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_title'] . "

\n"; 23 | 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 "\n\n"; 15 | echo "\n"; 16 | echo "\n
Ͼ
oe ligatureae ligature
\n"; 17 | 18 | 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 "\n\n"; 14 | echo "\n"; 15 | echo "\n
Ͼ
oe ligatureae ligature
\n"; 16 | 17 | 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 "

" . _("Poetry/Epigrams") . "

\n"; 12 | 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 "

" . _("Font size changes") . "

\n"; 15 | 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 "

" . _("Fraktur alphabet") . "

\n"; 15 | 16 | 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 "

" . _("Common OCR Problems") . "

\n"; 12 | echo "

" . _("OCR commonly has trouble distinguishing between the similar characters. Some examples are:") . "

\n"; 13 | echo "
    "; 14 | echo "
  • " . _("The digit '1' (one), the lowercase letter 'l' (ell), and the uppercase letter 'I'. Note that in some fonts the number one may look like I (like a small capital letter 'i').") . "
  • \n"; 15 | echo "
  • " . _("The digit '0' (zero), and the uppercase letter 'O'.") . "
  • \n"; 16 | echo "
  • " . _("Dashes & hyphens: Proofread these carefully—OCR'd text often has only one hyphen for an em-dash that should have two.") . "
  • \n"; 17 | echo "
  • " . _("Parentheses ( ) and curly braces { }.") . "
  • \n"; 18 | echo "
"; 19 | 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 "

" . _("Footnotes/Endnotes") . "

\n"; 12 | 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 "

" . _("Paragraph Side-Descriptions (Sidenotes)") . "

\n"; 12 | 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 "

" . _("Multiple Columns") . "

\n"; 16 | 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 "

" . _("Subscripts") . "

\n"; 12 | 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 "\n"; 15 | echo " \n"; 16 | echo " \n"; 17 | echo " \n"; 18 | echo " \n"; 19 | echo " \n"; 20 | echo " \n"; 21 | echo " \n"; 22 | echo " \n"; 23 | echo " \n"; 24 | echo " \n"; 25 | echo "
" . _("Original Image:") . "
H2O.
" . _("Correctly Proofread Text:") . "
H_{2}O.
\n"; 26 | 27 | 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 "

" . _("Quote marks on each line") . "

\n"; 12 | 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 "

" . _("Plays: Actor Names/Stage Directions") . "

\n"; 12 | 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 "\n"; 14 | echo " \n"; 15 | echo " \n"; 16 | echo " \n"; 19 | echo " \n"; 20 | echo " \n"; 21 | echo " \n"; 22 | echo " \n"; 25 | echo " \n"; 26 | echo "
Capitalcapital thorn\n"; 17 | echo " capital thorn\n"; 18 | echo "
Lower Caselower case thorn\n"; 23 | echo " lower case thorn\n"; 24 | echo "
\n"; 27 | 28 | 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 "

$title

"; 22 | 23 | echo "
"; 24 | foreach ($graphs as [$type, $id]) { 25 | echo "

"; 26 | } 27 | echo "
"; 28 | -------------------------------------------------------------------------------- /stats/ppv_stats.php: -------------------------------------------------------------------------------- 1 | $title\n"; 13 | 14 | echo "

" . _("Post-Processing Verifiers") . "

\n"; 15 | echo "

" . _("Number of Projects Posted to PG") . "

\n"; 16 | 17 | $psd = get_project_status_descriptor('posted'); 18 | dpsql_dump_themed_query(" 19 | SELECT checkedoutby as '" . DPDatabase::escape(_("PPVer")) . "', 20 | count(*) as '" . DPDatabase::escape(_("Projects PPVd")) . "' 21 | FROM `projects` 22 | WHERE 1 AND checkedoutby != postproofer AND $psd->state_selector 23 | and checkedoutby != '' 24 | GROUP BY 1 25 | ORDER BY 2 DESC ", 1, DPSQL_SHOW_RANK); 26 | 27 | echo "
\n"; 28 | 29 | echo _("Note that the above figures are as accurate as possible within the bounds of the current database structure"); 30 | 31 | echo "
\n"; 32 | -------------------------------------------------------------------------------- /stats/projects_Xed_graphs.php: -------------------------------------------------------------------------------- 1 | graphs_title, NO_STATSBAR, [ 21 | "js_files" => get_graph_js_files(), 22 | "js_data" => build_svg_graph_inits($graphs), 23 | ]); 24 | 25 | echo "

$psd->graphs_title

"; 26 | 27 | echo "
"; 28 | foreach ($graphs as [$type, $id]) { 29 | echo "

"; 30 | } 31 | echo "
"; 32 | -------------------------------------------------------------------------------- /stats/teams/tdetail.php: -------------------------------------------------------------------------------- 1 | get_graph_js_files(), 28 | ]); 29 | echo "
"; 30 | 31 | showTeamInformation($curTeam, $tally_name); 32 | 33 | echo "
"; 34 | -------------------------------------------------------------------------------- /stats/user_logon_graphs.php: -------------------------------------------------------------------------------- 1 | get_graph_js_files(), 20 | "js_data" => build_svg_graph_inits($graphs), 21 | ]); 22 | echo "

$title

"; 23 | 24 | echo "
"; 25 | foreach ($graphs as [$type, $id]) { 26 | echo "

"; 27 | } 28 | echo "
"; 29 | -------------------------------------------------------------------------------- /styles/fonts/DPSansMono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DPSansMono.ttf -------------------------------------------------------------------------------- /styles/fonts/DPSansMono.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DPSansMono.woff -------------------------------------------------------------------------------- /styles/fonts/DPSansMono.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DPSansMono.woff2 -------------------------------------------------------------------------------- /styles/fonts/DejaVuSansMono-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DejaVuSansMono-Bold-webfont.woff -------------------------------------------------------------------------------- /styles/fonts/DejaVuSansMono-BoldOblique-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DejaVuSansMono-BoldOblique-webfont.woff -------------------------------------------------------------------------------- /styles/fonts/DejaVuSansMono-Oblique-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DejaVuSansMono-Oblique-webfont.woff -------------------------------------------------------------------------------- /styles/fonts/DejaVuSansMono-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/DejaVuSansMono-webfont.woff -------------------------------------------------------------------------------- /styles/fonts/EBGaramond-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DistributedProofreaders/dproofreaders/858fc5ea6979a5f8e2ebc5ef50b9b9403b97172b/styles/fonts/EBGaramond-Bold.woff2 -------------------------------------------------------------------------------- /styles/fonts/README.md: -------------------------------------------------------------------------------- 1 | # Web Fonts 2 | 3 | This directory holds web fonts we make available to all DP users. 4 | 5 | ## DP Sans Mono 6 | 7 | [DP Sans Mono](https://www.pgdp.net/wiki/DP_Sans_Mono) is a font created by 8 | DP volunteer lvl with feedback from numerous other volunteers. It is derived 9 | from DejaVu Sans Mono (see below) and is under the 10 | [DP Sans Mono License](DP%20Sans%20Mono%20License.txt). This is version "Draft 14". 11 | 12 | Various characters have been tweaked to help disambiguate them from 13 | similar-looking characters. 14 | 15 | This font is the spiritual successor to DPCustomMono2. 16 | 17 | The font is available as a 18 | [True-Type Font](https://github.com/DistributedProofreaders/dproofreaders/raw/master/styles/fonts/DPSansMono.ttf) 19 | for download and local install. 20 | 21 | # DejaVu Sans Mono 22 | 23 | DejaVu Sans Mono is a member of the [DejaVu font family](https://dejavu-fonts.github.io/) 24 | and licensed under the [DejaVu Fonts License](DejaVu%20Fonts%20License.txt). 25 | This version was obtained from [Font Squirrel](https://www.fontsquirrel.com/fonts/dejavu-sans-mono). 26 | 27 | # EB Garamond 28 | 29 | [EB Garamond](https://github.com/octaviopardo/EBGaramond12) is an open source 30 | font we use for styling. The TTF was converted to WOFF2 before being checked 31 | into git. 32 | -------------------------------------------------------------------------------- /styles/fonts/details.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "DejaVu Sans Mono", 4 | "url": "https://dejavu-fonts.github.io/", 5 | "license": "DejaVu Fonts license", 6 | "license_url": "https://dejavu-fonts.github.io/License.html", 7 | "license_file": "DejaVu Fonts License.txt" 8 | }, 9 | { 10 | "name": "DP Sans Mono", 11 | "url": "https://www.pgdp.net/wiki/DP_Sans_Mono", 12 | "license": "DP Sans Mono license", 13 | "license_url": "https://www.pgdp.net/wiki/DP_Sans_Mono#License", 14 | "license_file": "DP Sans Mono License.txt" 15 | }, 16 | { 17 | "name": "EB Garamond", 18 | "url": "https://github.com/octaviopardo/EBGaramond12", 19 | "license": "SIL Open Font License, Version 1.1", 20 | "license_url": "https://openfontlicense.org", 21 | "license_file": "EB Garamond License.txt" 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /styles/slim_header.css: -------------------------------------------------------------------------------- 1 | /* ------------------------------------------------------------------------ */ 2 | /* Global */ 3 | body { 4 | margin: 0.5em; 5 | } 6 | -------------------------------------------------------------------------------- /styles/slim_header.less: -------------------------------------------------------------------------------- 1 | @import (reference) "global.less"; 2 | 3 | /* ------------------------------------------------------------------------ */ 4 | /* Global */ 5 | body { 6 | margin: 0.5em; 7 | } 8 | -------------------------------------------------------------------------------- /styles/themes/README.md: -------------------------------------------------------------------------------- 1 | # Themes 2 | The code supports a purely-CSS-based theming system. 3 | 4 | ## Creating a new theme 5 | To create a new theme, add a new `.less` file in this directory with 6 | `@import "../layout.less";` at the end of it. See `project_gutenberg.less` for 7 | an example. 8 | 9 | To generate the corresponding `.css` file: 10 | ```bash 11 | cd ../../SETUP 12 | make less 13 | ``` 14 | 15 | ## Adding a theme to the system 16 | To add a new theme to the system, insert a row into the `themes` table. 17 | The `unixname` field must match the basename of your CSS filename. 18 | 19 | ```sql 20 | INSERT INTO themes SET 21 | name='Theme Name', 22 | unixname='css_base_filename', 23 | created_by='Your Username'; 24 | ``` 25 | 26 | ## Adding a theme to the code 27 | To add the new theme as part of the DP code, you need to commit _both_ the 28 | `.less` and the `.css` file. This ensures that other users of the code can 29 | use the code as-is without generating the CSS from the LESS themselves. 30 | 31 | In addition, update the `SETUP/db_schema.sql` file and add the INSERT 32 | statement alongside the other default themes. 33 | 34 | ## Changing site's default theme 35 | The default theme is `project_gutenberg`. If you want to change this, update 36 | the default column value of the `users.i_theme` field to the desired theme's 37 | unixname: 38 | 39 | ```sql 40 | ALTER TABLE users ALTER i_theme SET DEFAULT 'royal_blues'; 41 | ``` 42 | 43 | -------------------------------------------------------------------------------- /styles/themes/classic_grey.less: -------------------------------------------------------------------------------- 1 | /* ------------------------------------------------------------------------ */ 2 | /* Theme coloring for Classic Grey */ 3 | 4 | @import "../layout.less"; 5 | 6 | @theme-name: "classic_grey"; 7 | 8 | @page-background: #ffffff; 9 | @page-text: #000000; 10 | @header-background: #dddddd; 11 | @header-text: #000000; 12 | @navbar-background: #444444; 13 | @navbar-text: #ffffff; 14 | @sidebar-background: #dddddd; 15 | @sidebar-text: #000000; 16 | @footer-background: #cccccc; 17 | @footer-text: #000000; 18 | @heading-color: #333333; 19 | @link-color: #0000ff; 20 | @visited-color: #0000ff; 21 | @active-color: #0000ff; 22 | @sans-serif-font: Verdana, Helvetica, sans-serif; 23 | -------------------------------------------------------------------------------- /styles/themes/project_gutenberg.less: -------------------------------------------------------------------------------- 1 | /* ------------------------------------------------------------------------ */ 2 | /* Theme coloring for Project Gutenberg */ 3 | 4 | @import "../layout.less"; 5 | 6 | @theme-name: "project_gutenberg"; 7 | 8 | @page-background: #ffffff; 9 | @page-text: #000000; 10 | @header-background: #e0e8dd; 11 | @header-text: #000000; 12 | @navbar-background: #336633; 13 | @navbar-text: #ffffff; 14 | @sidebar-background: #e0e8dd; 15 | @sidebar-text: #000000; 16 | @footer-background: #336633; 17 | @footer-text: #ffffff; 18 | @heading-color: #234523; 19 | @link-color: #0000ff; 20 | @visited-color: #990099; 21 | @active-color: #ff0000; 22 | @sans-serif-font: Verdana, Helvetica, sans-serif; 23 | -------------------------------------------------------------------------------- /styles/themes/royal_blues.less: -------------------------------------------------------------------------------- 1 | /* ------------------------------------------------------------------------ */ 2 | /* Theme coloring for Royal Blues */ 3 | 4 | @import "../layout.less"; 5 | 6 | @theme-name: "royal_blues"; 7 | 8 | @page-background: #ffffff; 9 | @page-text: #000000; 10 | @header-background: #99ccff; 11 | @header-text: #000000; 12 | @navbar-background: #000099; 13 | @navbar-text: #ffffff; 14 | @sidebar-background: #99ccff; 15 | @sidebar-text: #000000; 16 | @footer-background: #000099; 17 | @footer-text: #ffffff; 18 | @heading-color: #000066; 19 | @link-color: #330099; 20 | @visited-color: #330099; 21 | @active-color: #330099; 22 | @sans-serif-font: Verdana, Helvetica, sans-serif; 23 | -------------------------------------------------------------------------------- /tools/download_images.php: -------------------------------------------------------------------------------- 1 | [ 15 | "$code_url/tools/page_browser.js", 16 | ], 17 | "js_data" => get_proofreading_interface_data_js() . " 18 | var mentorMode = $mentorMode; 19 | ", 20 | "body_attributes" => 'class="no-margin overflow-hidden fix-full"', 21 | ]; 22 | 23 | slim_header($title, $header_args); 24 | 25 | echo "
"; 26 | -------------------------------------------------------------------------------- /tools/pool.php: -------------------------------------------------------------------------------- 1 | ["$code_url/scripts/filter_project.js"]]; 16 | 17 | output_header("$pool->id: $pool->name", SHOW_STATSBAR, $header_args); 18 | 19 | global $pguser; 20 | $userSettings = & Settings::get_Settings($pguser); 21 | 22 | $uao = $pool->user_access($pguser); 23 | 24 | $pool->page_top($uao); 25 | 26 | // Show user how to access this round 27 | if (!$uao->can_access) { 28 | echo "
\n"; 29 | show_user_access_object($uao); 30 | } 31 | 32 | show_news_for_page($pool->id); 33 | 34 | 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 "
37 |
38 |
"; 39 | -------------------------------------------------------------------------------- /tools/proofers/project_topic.php: -------------------------------------------------------------------------------- 1 | ensure_topic(); 17 | 18 | if ($topic_id == null) { 19 | // an error occurred trying to create the topic, let the user know 20 | $title = _("Failure creating project topic"); 21 | slim_header($title); 22 | echo "

$title

"; 23 | 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 << 27 | ProjectID: $project_id 28 | Title: $project->nameofwork 29 | Author: $project->authorsname 30 | 31 | EOF; 32 | } else { 33 | $redirect_url = get_url_to_view_topic($topic_id); 34 | header("Location: $redirect_url"); 35 | } 36 | -------------------------------------------------------------------------------- /tools/proofers/proof_frame.inc: -------------------------------------------------------------------------------- 1 | profile->i_type; 14 | switch ($interface_type) { 15 | case 0: 16 | // standard interface 17 | echo_proof_frame_std($ppage); 18 | break; 19 | 20 | case 1: 21 | // enhanced interface 22 | echo_proof_frame_enh($ppage); 23 | break; 24 | 25 | default: 26 | throw new UnexpectedValueException("unknown i_type: '$interface_type'"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tools/proofers/proof_frame_std.inc: -------------------------------------------------------------------------------- 1 | profile->i_layout == '1') { 10 | $rows_or_cols = "COLS='*,{$user->profile->v_tframe}%'"; 11 | } else { 12 | $rows_or_cols = "ROWS='*,{$user->profile->h_tframe}%'"; 13 | } 14 | 15 | $params = $ppage->urlencoded(true); 16 | 17 | if (($user->profile->i_layout == '1' && $user->profile->v_tscroll == 0) 18 | || 19 | ($user->profile->i_layout == '0' && $user->profile->h_tscroll == 0)) { 20 | $text_scrolling = "SCROLLING='no'"; 21 | } else { 22 | $text_scrolling = ""; 23 | } 24 | 25 | $margins = "marginwidth='2' marginheight='2'"; 26 | 27 | // ------------------------------------- 28 | 29 | slim_header_frameset($ppage->projectid()); 30 | echo " 31 | 32 | 33 | 34 | 35 | "._("Your browser is not frames capable!")." 36 | "; 37 | } 38 | -------------------------------------------------------------------------------- /tools/proofers/proof_image.js: -------------------------------------------------------------------------------- 1 | /*global $ imageData */ 2 | import { makeImageWidget } from "../../scripts/control_bar.js"; 3 | 4 | window.addEventListener("DOMContentLoaded", function () { 5 | let imageDiv = $("#image-view"); 6 | 7 | let imageWidget = makeImageWidget(imageDiv, imageData.align); 8 | imageWidget.setup(imageData.storageKey); 9 | imageWidget.setImage(imageData.imageUrl); 10 | window.addEventListener("resize", imageWidget.reScroll); 11 | }); 12 | -------------------------------------------------------------------------------- /tools/proofers/srchrep.js: -------------------------------------------------------------------------------- 1 | /* exported srchrep */ 2 | 3 | var srchrep = (function () { 4 | var savedText = ""; 5 | 6 | function saveText() { 7 | savedText = opener.parent.docRef.editform.text_data.value; 8 | } 9 | 10 | function escapeRegExp(string) { 11 | return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string 12 | } 13 | 14 | function setUndoButtonDisabled(state) { 15 | document.getElementById("undo").disabled = state; 16 | } 17 | 18 | function doReplace() { 19 | var search = document.getElementById("search").value; 20 | var replacetext = document.getElementById("replace").value.replace(new RegExp("\\\\n", "g"), "\r\n"); 21 | saveText(); 22 | if (!document.getElementById("is_regex").checked) { 23 | search = escapeRegExp(search); 24 | 25 | // Replace $ in replace text with $$ to avoid special replacement patterns. 26 | // Note, $ here is in a .replace function and must be escaped so '$$' becomes '$$$$'. 27 | replacetext = replacetext.replace(/\$/g, "$$$$"); 28 | } 29 | opener.parent.docRef.editform.text_data.value = opener.parent.docRef.editform.text_data.value.replace(new RegExp(search, "gum"), replacetext); 30 | setUndoButtonDisabled(false); 31 | } 32 | 33 | function restoreSavedText() { 34 | opener.parent.docRef.editform.text_data.value = savedText; 35 | setUndoButtonDisabled(true); 36 | } 37 | 38 | return { 39 | doReplace: doReplace, 40 | restoreSavedText: restoreSavedText, 41 | }; 42 | })(); 43 | -------------------------------------------------------------------------------- /tools/proofers/srchrep.php: -------------------------------------------------------------------------------- 1 | [ 10 | "$code_url/tools/proofers/srchrep.js", 11 | ], 12 | ]); 13 | ?> 14 |
15 | 16 | 21 | 26 | 31 |
17 | : 18 | 19 | 20 |
22 | : 23 | 24 | 25 |
27 | 28 | 29 | 30 |
32 |

33 | " onClick="srchrep.doReplace()"> 34 | " onClick="srchrep.restoreSavedText()" disabled> 35 | 36 |

37 |

38 | 39 | 40 | { 12 | const textDataElement = event.target; 13 | let selectionEnd = textDataElement.selectionEnd; 14 | textDataElement.value = [...textDataElement.value] 15 | .map((character) => { 16 | const conversion = conversionMap[character] || character; 17 | selectionEnd += [...conversion].length - 1; 18 | return conversion; 19 | }) 20 | .join(""); 21 | textDataElement.selectionStart = selectionEnd; 22 | textDataElement.selectionEnd = selectionEnd; 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /tools/proofers/text_frame_std.php: -------------------------------------------------------------------------------- 1 | getMessage()); 15 | } 16 | 17 | echo_text_frame_std($ppage); 18 | -------------------------------------------------------------------------------- /tools/remove_project_hold.php: -------------------------------------------------------------------------------- 1 | can_be_managed_by_current_user) { 16 | die(_('You are not authorized to manage this project.')); 17 | } 18 | 19 | $return_uri = urldecode($_POST['return_uri']); 20 | $curr_state = get_enumerated_param($_POST, 'curr_state', null, ProjectStates::get_states()); 21 | 22 | $project->remove_holds([$curr_state]); 23 | $title = _("Removing hold"); 24 | metarefresh(0, $return_uri, $title, $title); 25 | -------------------------------------------------------------------------------- /tools/search.php: -------------------------------------------------------------------------------- 1 | ["$code_url/scripts/dropdown.js"]]; 28 | output_header(_("Project Search"), NO_STATSBAR, $header_args); 29 | $search_form = new ProjectSearchForm(); 30 | 31 | handle_config($show_view, "PS", _("Configure Search Results")); 32 | 33 | if ($show_view == 'search_form') { 34 | echo "

", _("Search for Projects"), "

"; 35 | 36 | maybe_output_new_proofer_message(); 37 | 38 | $search_form->render(); 39 | exit(); 40 | } 41 | 42 | // show must be search 43 | $condition = $search_form->get_condition(); 44 | 45 | echo "

", _("Search Results"), "

\n"; 46 | 47 | $search_results = new ProjectSearchResults("PS"); 48 | 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 "
"; 25 | echo "Project: "; 26 | echo ""; 27 | echo ""; 28 | 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 "


\n"; 25 | echo "
ID: $rule->id — $rule->subject (anchored as \"#$rule->anchor\")
\n"; 26 | echo "
$rule->rule
\n"; 27 | } 28 | -------------------------------------------------------------------------------- /tools/site_admin/sa_common.inc: -------------------------------------------------------------------------------- 1 | \n"; 6 | 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 | --------------------------------------------------------------------------------