From 61ef933d4eb955239bbd0d095585c4266a9323e9 Mon Sep 17 00:00:00 2001 From: don kretz Date: Sat, 29 Aug 2015 15:30:56 -0700 Subject: [PATCH] First commit --- Diff/Diff.php | 453 + Diff/Diff/Engine/native.php | 438 + Diff/Diff/Engine/shell.php | 164 + Diff/Diff/Engine/string.php | 250 + Diff/Diff/Engine/xdiff.php | 66 + Diff/Diff/Mapped.php | 55 + Diff/Diff/Renderer.php | 237 + Diff/Diff/Renderer/context.php | 77 + Diff/Diff/Renderer/inline.php | 172 + Diff/Diff/Renderer/unified.php | 67 + Diff/Diff/ThreeWay.php | 276 + Diff/Diff3.php | 276 + Diff/docs/examples/1.txt | 3 + Diff/docs/examples/2.txt | 3 + Diff/docs/examples/diff.php | 39 + Diff/tests/1.txt | 3 + Diff/tests/2.txt | 3 + Diff/tests/3.txt | 4 + Diff/tests/4.txt | 3 + Diff/tests/5.txt | 5 + Diff/tests/6.txt | 7 + Diff/tests/context.patch | 11 + Diff/tests/context.phpt | 25 + Diff/tests/context2.phpt | 31 + Diff/tests/diff.phpt | 62 + Diff/tests/inline.phpt | 19 + Diff/tests/inline2.phpt | 37 + Diff/tests/pear_bug12740.phpt | 30 + Diff/tests/pear_bug4879.phpt | 30 + Diff/tests/pear_bug6251.phpt | 45 + Diff/tests/pear_bug6428.phpt | 18 + Diff/tests/string.phpt | 145 + Diff/tests/unified.patch | 7 + Diff/tests/unified.phpt | 21 + Diff/tests/unified2.phpt | 26 + Diff/tests/xdiff.phpt | 24 + c/.idea/.name | 1 + c/.idea/c.iml | 9 + c/.idea/encodings.xml | 5 + .../inspectionProfiles/Project_Default.xml | 219 + .../inspectionProfiles/profiles_settings.xml | 7 + c/.idea/misc.xml | 71 + c/.idea/modules.xml | 9 + c/.idea/scopes/scope_settings.xml | 5 + c/.idea/vcs.xml | 7 + c/.idea/workspace.xml | 347 + c/a.php | 32 + c/accounts/login.php | 27 + c/accounts/signin.php | 11 + c/activity_hub.php | 384 + c/ad_hoc.php | 194 + c/adhoc.html | 41 + c/admin.php | 61 + c/ah.php | 344 + c/backlog.php | 57 + c/browse.php | 33 + c/c.php | 178 + c/charfreq.php | 38 + c/chart.php | 270 + c/cmonth.php | 236 + c/common/DpDiff.class.php | 387 + c/common/hyphenation.php | 7 + c/common/p2p3diff.php | 45 + c/common/prooftester.php | 71 + c/common/scanno_regex.php | 6739 ++++++++++++ c/crontab2/TallyBoard.inc | 714 ++ c/crontab2/archive_projects.php | 98 + c/crontab2/connect.inc | 28 + c/crontab2/dpsql.inc | 257 + c/crontab2/extend_site_tally_goals.php | 57 + c/crontab2/import_pg_catalog.php | 163 + c/crontab2/inactivate_users.php | 16 + c/crontab2/log_project_states.php | 76 + c/crontab2/maybe_mail.inc | 70 + c/crontab2/misc.inc | 265 + c/crontab2/notify_old_pp.php | 88 + c/crontab2/notify_users.php | 41 + c/crontab2/onoff_special_event_queues.php | 120 + c/crontab2/pgdpcanada.cron | 29 + c/crontab2/project_events.inc | 31 + c/crontab2/project_states.inc | 456 + c/crontab2/site_vars old.php | 117 + c/crontab2/site_vars.php | 117 + c/crontab2/take_tally_snapshots.php | 65 + c/crontab2/udb_user.php | 9 + c/crontab2/update_ppers.php | 19 + c/crontab2/update_user_birthdays.php | 56 + c/crontab2/update_user_counts.php | 40 + c/css/context.css | 161 + c/css/context2.css | 133 + c/css/ctlbar.css | 121 + c/css/dp.css | 2180 ++++ c/css/filemaster.css | 33 + c/css/ppage.css | 371 + c/css/proofpage.css | 369 + c/default.php | 118 + c/descen.zip | Bin 0 -> 344124 bytes c/dkretz/ahmic/processpage.php | 84 + c/dkretz/ahmic/proofpage.js | 2873 ++++++ c/dkretz/gfx/a1_down.png | Bin 0 -> 300 bytes c/dkretz/gfx/a1_left.png | Bin 0 -> 303 bytes c/dkretz/gfx/a1_right.png | Bin 0 -> 301 bytes c/dkretz/gfx/a1_up.png | Bin 0 -> 304 bytes c/dkretz/gfx/a2_down.png | Bin 0 -> 296 bytes c/dkretz/gfx/a2_left.png | Bin 0 -> 303 bytes c/dkretz/gfx/a2_right.png | Bin 0 -> 301 bytes c/dkretz/gfx/a2_up.png | Bin 0 -> 304 bytes c/dkretz/gfx/bad.png | Bin 0 -> 1801 bytes c/dkretz/gfx/broken.png | Bin 0 -> 1762 bytes c/dkretz/gfx/bt1.png | Bin 0 -> 509 bytes c/dkretz/gfx/bt10.png | Bin 0 -> 808 bytes c/dkretz/gfx/bt11.png | Bin 0 -> 439 bytes c/dkretz/gfx/bt12.png | Bin 0 -> 719 bytes c/dkretz/gfx/bt13.png | Bin 0 -> 639 bytes c/dkretz/gfx/bt14.png | Bin 0 -> 685 bytes c/dkretz/gfx/bt15.png | Bin 0 -> 739 bytes c/dkretz/gfx/bt16.png | Bin 0 -> 823 bytes c/dkretz/gfx/bt17.png | Bin 0 -> 755 bytes c/dkretz/gfx/bt18.png | Bin 0 -> 734 bytes c/dkretz/gfx/bt1_n.png | Bin 0 -> 502 bytes c/dkretz/gfx/bt2.png | Bin 0 -> 701 bytes c/dkretz/gfx/bt3.png | Bin 0 -> 372 bytes c/dkretz/gfx/bt4.png | Bin 0 -> 321 bytes c/dkretz/gfx/bt5.png | Bin 0 -> 332 bytes c/dkretz/gfx/bt6.png | Bin 0 -> 868 bytes c/dkretz/gfx/bt7.png | Bin 0 -> 854 bytes c/dkretz/gfx/bt7_n.png | Bin 0 -> 843 bytes c/dkretz/gfx/bt8.png | Bin 0 -> 899 bytes c/dkretz/gfx/bt9.png | Bin 0 -> 742 bytes c/dkretz/gfx/down.jpg | Bin 0 -> 917 bytes c/dkretz/gfx/down.png | Bin 0 -> 509 bytes c/dkretz/gfx/greek.png | Bin 0 -> 7979 bytes c/dkretz/gfx/greekrough.png | Bin 0 -> 159 bytes c/dkretz/gfx/horiz.png | Bin 0 -> 952 bytes c/dkretz/gfx/icon-i.png | Bin 0 -> 828 bytes c/dkretz/gfx/icon-n.png | Bin 0 -> 947 bytes c/dkretz/gfx/igreek.png | Bin 0 -> 7953 bytes c/dkretz/gfx/quit.png | Bin 0 -> 1031 bytes c/dkretz/gfx/returnpage.png | Bin 0 -> 1150 bytes c/dkretz/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/dkretz/gfx/savenxt.png | Bin 0 -> 1136 bytes c/dkretz/gfx/savequit.png | Bin 0 -> 1087 bytes c/dkretz/gfx/savetmp.png | Bin 0 -> 967 bytes c/dkretz/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/dkretz/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/dkretz/gfx/tags/bold.png | Bin 0 -> 377 bytes c/dkretz/gfx/tags/caps.png | Bin 0 -> 471 bytes c/dkretz/gfx/tags/exit.png | Bin 0 -> 493 bytes c/dkretz/gfx/tags/greek.png | Bin 0 -> 522 bytes c/dkretz/gfx/tags/help.png | Bin 0 -> 436 bytes c/dkretz/gfx/tags/italic.png | Bin 0 -> 336 bytes c/dkretz/gfx/tags/sub.png | Bin 0 -> 340 bytes c/dkretz/gfx/tags/sup.png | Bin 0 -> 338 bytes c/dkretz/gfx/tags/underline.png | Bin 0 -> 356 bytes c/dkretz/gfx/up.jpg | Bin 0 -> 723 bytes c/dkretz/gfx/up.png | Bin 0 -> 508 bytes c/dkretz/gfx/vert.png | Bin 0 -> 954 bytes c/dkretz/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/dkretz/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/dkretz/processpage.php | 88 + c/dkretz/proofpage.css | 383 + c/dkretz/proofpage.js | 2350 +++++ c/dkretz/proofpage.php | 533 + c/email.php | 20 + c/error_page.php | 24 + c/faq/.idea/.name | 1 + c/faq/.idea/encodings.xml | 5 + c/faq/.idea/faq.iml | 9 + .../inspectionProfiles/Project_Default.xml | 220 + .../inspectionProfiles/profiles_settings.xml | 7 + c/faq/.idea/misc.xml | 48 + c/faq/.idea/modules.xml | 9 + c/faq/.idea/scopes/scope_settings.xml | 5 + c/faq/.idea/vcs.xml | 7 + c/faq/.idea/workspace.xml | 208 + c/faq/BBEditscript.sit | Bin 0 -> 11757 bytes c/faq/DPCustomMono2.ttf | Bin 0 -> 39968 bytes c/faq/DPflow.php | 16 + c/faq/FAQ_Formatting_Guide.txt | 757 ++ c/faq/FineReader_folders.png | Bin 0 -> 4229 bytes c/faq/OLDfaq_central.php | 217 + ...INALproofreading_guidelines_francaises.php | 2283 +++++ c/faq/ProoferFAQ.php | 346 + c/faq/Wordmacro.html | 116 + c/faq/bquote.png | Bin 0 -> 9808 bytes c/faq/chap1.png | Bin 0 -> 11477 bytes c/faq/charapp.pdf | Bin 0 -> 17264 bytes c/faq/charapp.sxw | Bin 0 -> 14079 bytes c/faq/charwin.pdf | Bin 0 -> 16086 bytes c/faq/charwin.sxw | Bin 0 -> 13618 bytes c/faq/cp.php | 749 ++ c/faq/default.php | 3 + c/faq/dev_process.php | 254 + c/faq/doc-copy.php | 235 + c/faq/doc-ency.php | 166 + c/faq/doc-poet.php | 126 + c/faq/dochist.php | 444 + c/faq/document.php | 3171 ++++++ c/faq/documentold.php | 3168 ++++++ c/faq/download.php | 31 + c/faq/dpf.php | 120 + c/faq/emdash.png | Bin 0 -> 1614 bytes c/faq/faq_central.php | 186 + c/faq/faq_centralOLD2.php | 217 + c/faq/feeds_sdk/index.php | 449 + c/faq/feeds_sdk/output_js.png | Bin 0 -> 126888 bytes c/faq/fi4340c.jpg | Bin 0 -> 12087 bytes c/faq/font_sample.php | 151 + c/faq/foot.png | Bin 0 -> 16054 bytes c/faq/formatting_guidelines_francaises.php | 2994 ++++++ c/faq/formatting_guidelines_portuguese.php | 9057 +++++++++++++++++ c/faq/formatting_summary.sxw | Bin 0 -> 28798 bytes c/faq/greek5.gif | Bin 0 -> 87436 bytes c/faq/greek6.gif | Bin 0 -> 82538 bytes c/faq/gutcheck-0.95.sit | Bin 0 -> 112056 bytes c/faq/illust.png | Bin 0 -> 11701 bytes c/faq/illust2.png | Bin 0 -> 13097 bytes c/faq/images/Arial_A.gif | Bin 0 -> 7601 bytes c/faq/images/Arial_B.gif | Bin 0 -> 8746 bytes c/faq/images/Arial_C.gif | Bin 0 -> 7647 bytes c/faq/images/Courier_A.gif | Bin 0 -> 5394 bytes c/faq/images/Courier_B.gif | Bin 0 -> 6802 bytes c/faq/images/Courier_C.gif | Bin 0 -> 5548 bytes c/faq/images/DPCustomMono2_A.gif | Bin 0 -> 11356 bytes c/faq/images/DPCustomMono2_B.gif | Bin 0 -> 12929 bytes c/faq/images/DPCustomMono2_C.gif | Bin 0 -> 11262 bytes c/faq/images/Lucida_A.gif | Bin 0 -> 3768 bytes c/faq/images/Lucida_B.gif | Bin 0 -> 3755 bytes c/faq/images/Lucida_C.gif | Bin 0 -> 3303 bytes c/faq/images/Original.gif | Bin 0 -> 19763 bytes c/faq/images/Original_A.gif | Bin 0 -> 11573 bytes c/faq/images/Original_B.gif | Bin 0 -> 11646 bytes c/faq/images/Original_C.gif | Bin 0 -> 9974 bytes c/faq/images/Times_A.gif | Bin 0 -> 6876 bytes c/faq/images/Times_B.gif | Bin 0 -> 7329 bytes c/faq/images/Times_C.gif | Bin 0 -> 6401 bytes c/faq/letter.png | Bin 0 -> 3521 bytes c/faq/longabsent.php | 207 + c/faq/olddoc14.html | 1644 +++ c/faq/play1.png | Bin 0 -> 7524 bytes c/faq/play2.png | Bin 0 -> 11566 bytes c/faq/play3.png | Bin 0 -> 21164 bytes c/faq/play4.png | Bin 0 -> 12267 bytes c/faq/pm-faq.php | 230 + c/faq/poetry.png | Bin 0 -> 9553 bytes c/faq/pophelp/prefs/set.html | 12 + c/faq/pophelp/prefs/set_align.html | 12 + c/faq/pophelp/prefs/set_auto_thread.html | 19 + c/faq/pophelp/prefs/set_creditname.html | 17 + c/faq/pophelp/prefs/set_creditswanted.html | 21 + c/faq/pophelp/prefs/set_email.html | 11 + c/faq/pophelp/prefs/set_facetype.html | 17 + c/faq/pophelp/prefs/set_h_fontface.html | 11 + c/faq/pophelp/prefs/set_h_fontsize.html | 11 + c/faq/pophelp/prefs/set_h_scroll.html | 13 + c/faq/pophelp/prefs/set_h_textlength.html | 11 + c/faq/pophelp/prefs/set_h_textlines.html | 11 + c/faq/pophelp/prefs/set_h_textsize.html | 13 + c/faq/pophelp/prefs/set_h_wrap.html | 14 + c/faq/pophelp/prefs/set_h_zoom.html | 14 + c/faq/pophelp/prefs/set_horzprefs.html | 17 + c/faq/pophelp/prefs/set_intlang.html | 11 + c/faq/pophelp/prefs/set_lang.html | 11 + c/faq/pophelp/prefs/set_layout.html | 13 + c/faq/pophelp/prefs/set_name.html | 11 + c/faq/pophelp/prefs/set_neighbors.html | 13 + c/faq/pophelp/prefs/set_newwindow.html | 12 + c/faq/pophelp/prefs/set_password.html | 13 + c/faq/pophelp/prefs/set_pmdefault.html | 11 + c/faq/pophelp/prefs/set_pmto_post.html | 21 + c/faq/pophelp/prefs/set_privacy.html | 15 + c/faq/pophelp/prefs/set_profilename.html | 15 + c/faq/pophelp/prefs/set_screenres.html | 11 + .../pophelp/prefs/set_showspecialcolors.html | 17 + c/faq/pophelp/prefs/set_statusbar.html | 13 + c/faq/pophelp/prefs/set_switch.html | 12 + c/faq/pophelp/prefs/set_theme.html | 11 + c/faq/pophelp/prefs/set_toolbar.html | 13 + c/faq/pophelp/prefs/set_topten.html | 13 + c/faq/pophelp/prefs/set_updates.html | 13 + c/faq/pophelp/prefs/set_v_fontface.html | 11 + c/faq/pophelp/prefs/set_v_fontsize.html | 11 + c/faq/pophelp/prefs/set_v_scroll.html | 13 + c/faq/pophelp/prefs/set_v_textlength.html | 11 + c/faq/pophelp/prefs/set_v_textlines.html | 11 + c/faq/pophelp/prefs/set_v_textsize.html | 13 + c/faq/pophelp/prefs/set_v_wrap.html | 14 + c/faq/pophelp/prefs/set_v_zoom.html | 14 + c/faq/pophelp/prefs/set_vertprefs.html | 17 + c/faq/pophelp/project_manager/biography.html | 25 + c/faq/pophelp/project_manager/template.html | 31 + c/faq/pophelp/teams/edit_teamavatar.html | 15 + c/faq/pophelp/teams/edit_teamdesc.html | 17 + c/faq/pophelp/teams/edit_teamicon.html | 15 + c/faq/pophelp/teams/edit_teamname.html | 11 + c/faq/pophelp/teams/edit_teamwebpage.html | 15 + c/faq/post_proof.php | 1448 +++ c/faq/ppv.php | 404 + c/faq/ppv_report.txt | 92 + c/faq/ppvold.php | 399 + c/faq/privacy.php | 408 + c/faq/project_workflow.png | Bin 0 -> 55908 bytes c/faq/prooffacehelp.php | 860 ++ c/faq/proofing_summary.sxw | Bin 0 -> 28331 bytes c/faq/proofreading_guidelines.php | 2397 +++++ c/faq/proofreading_guidelines_francaises.php | 2281 +++++ c/faq/proofreading_guidelines_portuguese.php | 6388 ++++++++++++ c/faq/proofreading_guidelines_spanish.php | 2655 +++++ c/faq/proofreading_guidelinesold.php | 2277 +++++ c/faq/proofreading_guidelinesold2.php | 2394 +++++ c/faq/scanning.php | 199 + c/faq/side.png | Bin 0 -> 21723 bytes c/faq/simple_proof_rules.php | 11 + c/faq/stealth_scannos_eng_common.txt | 65 + c/faq/stealth_scannos_eng_rare.txt | 698 ++ c/faq/stealth_scannos_eng_suspect.txt | 737 ++ c/faq/stealth_scannos_es_common.txt | 79 + c/faq/stealth_scannos_fr_common.txt | 33 + c/faq/stealth_scannos_fr_rare.txt | 761 ++ c/faq/stealth_scannos_fr_suspect.txt | 742 ++ c/faq/stealth_scannos_ger_common.txt | 4 + c/faq/stealth_scannos_ger_rare.txt | 67 + c/faq/stealth_scannos_ger_suspect.txt | 118 + c/faq/summary18NL.pdf | Bin 0 -> 59839 bytes c/faq/table1.png | Bin 0 -> 2174 bytes c/faq/table2.png | Bin 0 -> 5452 bytes c/faq/tablec.png | Bin 0 -> 7360 bytes c/faq/tbreak.png | Bin 0 -> 5239 bytes c/faq/templates_guide.php | 398 + c/faq/title.png | Bin 0 -> 3749 bytes c/faq/translate.php | 287 + c/faq/wordcheck-faq.php | 301 + c/favicon.ico | Bin 0 -> 318 bytes c/feeds/backend.php | 141 + c/feeds/projects.xsd | 42 + c/filemaster.php | 590 ++ c/fixes/frame.php | 22 + c/fixes/team_totals.php | 71 + c/goal.php | 59 + c/graphics/000000.gif | Bin 0 -> 34 bytes c/graphics/0000FF.gif | Bin 0 -> 34 bytes c/graphics/00FF00.gif | Bin 0 -> 34 bytes c/graphics/66CC66.gif | Bin 0 -> 34 bytes c/graphics/Activity_Hub.jpg | Bin 0 -> 10054 bytes c/graphics/CanadaDay_2011.jpg | Bin 0 -> 66410 bytes c/graphics/E0E0E0.gif | Bin 0 -> 34 bytes c/graphics/FF0000.gif | Bin 0 -> 34 bytes c/graphics/a1_down.png | Bin 0 -> 300 bytes c/graphics/a1_left.png | Bin 0 -> 303 bytes c/graphics/a1_right.png | Bin 0 -> 301 bytes c/graphics/a1_up.png | Bin 0 -> 304 bytes c/graphics/a2_down.png | Bin 0 -> 296 bytes c/graphics/a2_left.png | Bin 0 -> 303 bytes c/graphics/a2_right.png | Bin 0 -> 301 bytes c/graphics/a2_up.png | Bin 0 -> 304 bytes c/graphics/bad.png | Bin 0 -> 1801 bytes c/graphics/blusync.png | Bin 0 -> 949 bytes c/graphics/bookshelf500.jpg | Bin 0 -> 47695 bytes c/graphics/bottom.gif | Bin 0 -> 54 bytes c/graphics/brnsync.png | Bin 0 -> 955 bytes c/graphics/broken.png | Bin 0 -> 1762 bytes c/graphics/bronze_star.jpg | Bin 0 -> 1918 bytes c/graphics/bt1.png | Bin 0 -> 509 bytes c/graphics/bt10.png | Bin 0 -> 808 bytes c/graphics/bt11.png | Bin 0 -> 439 bytes c/graphics/bt12.png | Bin 0 -> 719 bytes c/graphics/bt13.png | Bin 0 -> 639 bytes c/graphics/bt14.png | Bin 0 -> 685 bytes c/graphics/bt15.png | Bin 0 -> 739 bytes c/graphics/bt16.png | Bin 0 -> 823 bytes c/graphics/bt17.png | Bin 0 -> 755 bytes c/graphics/bt18.png | Bin 0 -> 734 bytes c/graphics/bt1_n.png | Bin 0 -> 502 bytes c/graphics/bt2.png | Bin 0 -> 701 bytes c/graphics/bt3.png | Bin 0 -> 372 bytes c/graphics/bt4.png | Bin 0 -> 321 bytes c/graphics/bt5.png | Bin 0 -> 332 bytes c/graphics/bt6.png | Bin 0 -> 868 bytes c/graphics/bt7.png | Bin 0 -> 854 bytes c/graphics/bt7_n.png | Bin 0 -> 843 bytes c/graphics/bt8.png | Bin 0 -> 899 bytes c/graphics/bt9.png | Bin 0 -> 742 bytes c/graphics/center.gif | Bin 0 -> 53 bytes c/graphics/default_avatar.gif | Bin 0 -> 3042 bytes c/graphics/down.gif | Bin 0 -> 116 bytes c/graphics/down.jpg | Bin 0 -> 917 bytes c/graphics/down.png | Bin 0 -> 509 bytes c/graphics/dpc-logo.png | Bin 0 -> 127809 bytes c/graphics/dpclogo.png | Bin 0 -> 4667 bytes c/graphics/ebookweeklogoweb.gif | Bin 0 -> 8680 bytes c/graphics/gear-24.png | Bin 0 -> 2533 bytes c/graphics/gear.html | 502 + c/graphics/genre/art.gif | Bin 0 -> 831 bytes c/graphics/genre/biography.gif | Bin 0 -> 658 bytes c/graphics/genre/drama.gif | Bin 0 -> 538 bytes c/graphics/genre/fiction.gif | Bin 0 -> 538 bytes c/graphics/genre/geography.gif | Bin 0 -> 538 bytes c/graphics/genre/historical.gif | Bin 0 -> 658 bytes c/graphics/genre/history.gif | Bin 0 -> 538 bytes c/graphics/genre/math.gif | Bin 0 -> 658 bytes c/graphics/genre/medicine.gif | Bin 0 -> 831 bytes c/graphics/genre/music.gif | Bin 0 -> 538 bytes c/graphics/genre/nonfiction.gif | Bin 0 -> 538 bytes c/graphics/genre/romance.gif | Bin 0 -> 831 bytes c/graphics/gold_star.jpg | Bin 0 -> 7327 bytes c/graphics/greek.png | Bin 0 -> 7979 bytes c/graphics/greekrough.png | Bin 0 -> 159 bytes c/graphics/horiz.png | Bin 0 -> 952 bytes c/graphics/icon-i.png | Bin 0 -> 828 bytes c/graphics/icon-n.png | Bin 0 -> 947 bytes c/graphics/icon_newbie.png | Bin 0 -> 1234 bytes c/graphics/icon_pf.png | Bin 0 -> 1714 bytes c/graphics/icon_pm.png | Bin 0 -> 1551 bytes c/graphics/icon_pp.png | Bin 0 -> 1237 bytes c/graphics/icon_ppv.png | Bin 0 -> 1682 bytes c/graphics/icon_proofer.png | Bin 0 -> 827 bytes c/graphics/icon_sa.png | Bin 0 -> 1465 bytes c/graphics/igreek.png | Bin 0 -> 7953 bytes c/graphics/left.gif | Bin 0 -> 53 bytes c/graphics/mapleframe.jpg | Bin 0 -> 22035 bytes c/graphics/middle.gif | Bin 0 -> 56 bytes c/graphics/quit.png | Bin 0 -> 1031 bytes c/graphics/returnpage.png | Bin 0 -> 1150 bytes c/graphics/right.gif | Bin 0 -> 53 bytes c/graphics/rss.gif | Bin 0 -> 437 bytes c/graphics/rtnpg.png | Bin 0 -> 1150 bytes c/graphics/save.jpg | Bin 0 -> 6770 bytes c/graphics/save2.jpg | Bin 0 -> 812 bytes c/graphics/savenxt.png | Bin 0 -> 1136 bytes c/graphics/savequit.png | Bin 0 -> 1087 bytes c/graphics/savetmp.png | Bin 0 -> 967 bytes c/graphics/silver_star.jpg | Bin 0 -> 6279 bytes c/graphics/tags/bar1.png | Bin 0 -> 2257 bytes c/graphics/tags/bar2.png | Bin 0 -> 2469 bytes c/graphics/tags/bold.png | Bin 0 -> 377 bytes c/graphics/tags/caps.png | Bin 0 -> 471 bytes c/graphics/tags/exit.png | Bin 0 -> 493 bytes c/graphics/tags/greek.png | Bin 0 -> 522 bytes c/graphics/tags/help.png | Bin 0 -> 436 bytes c/graphics/tags/italic.png | Bin 0 -> 336 bytes c/graphics/tags/sub.png | Bin 0 -> 340 bytes c/graphics/tags/sup.png | Bin 0 -> 338 bytes c/graphics/tags/underline.png | Bin 0 -> 356 bytes c/graphics/task_percentages/large_0.png | Bin 0 -> 240 bytes c/graphics/task_percentages/large_10.png | Bin 0 -> 241 bytes c/graphics/task_percentages/large_100.png | Bin 0 -> 223 bytes c/graphics/task_percentages/large_20.png | Bin 0 -> 240 bytes c/graphics/task_percentages/large_30.png | Bin 0 -> 241 bytes c/graphics/task_percentages/large_40.png | Bin 0 -> 242 bytes c/graphics/task_percentages/large_50.png | Bin 0 -> 241 bytes c/graphics/task_percentages/large_60.png | Bin 0 -> 242 bytes c/graphics/task_percentages/large_70.png | Bin 0 -> 240 bytes c/graphics/task_percentages/large_80.png | Bin 0 -> 240 bytes c/graphics/task_percentages/large_90.png | Bin 0 -> 242 bytes c/graphics/task_percentages/small_0.png | Bin 0 -> 213 bytes c/graphics/task_percentages/small_10.png | Bin 0 -> 213 bytes c/graphics/task_percentages/small_100.png | Bin 0 -> 197 bytes c/graphics/task_percentages/small_20.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_30.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_40.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_50.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_60.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_70.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_80.png | Bin 0 -> 212 bytes c/graphics/task_percentages/small_90.png | Bin 0 -> 213 bytes c/graphics/top.gif | Bin 0 -> 56 bytes c/graphics/up.gif | Bin 0 -> 99 bytes c/graphics/up.jpg | Bin 0 -> 723 bytes c/graphics/up.png | Bin 0 -> 508 bytes c/graphics/vert.png | Bin 0 -> 954 bytes c/graphics/wchk-off.png | Bin 0 -> 1121 bytes c/graphics/wchk-on.png | Bin 0 -> 1088 bytes c/graphics/xmascard2009.png | Bin 0 -> 131909 bytes c/graphics/xml.gif | Bin 0 -> 429 bytes c/holdmaster.php | 172 + c/imgsrv.php | 18 + c/include/fw.php | 34 + c/index.html | 9 + c/jpgraph/jpg-config.inc.php | 216 + c/js/dg.js | 265 + c/js/digraph.js | 0 c/js/dp.js | 18 + c/js/dp_ajax.js | 272 + c/js/dp_edit.js | 2823 +++++ c/js/filemaster.js | 235 + c/js/itdp_edit.js | 2783 +++++ c/js/pb.js | 4 + c/js/ppage.js | 2742 +++++ c/js/proofpage.js | 2745 +++++ c/js/search.js | 59 + c/js/sort.js | 64 + c/js/sort.js.bak | 107 + c/js/sort2.js | 324 + c/js/sorttable.js | 495 + c/js/wc.js | 637 ++ c/license.txt | 340 + c/list_etexts.php | 153 + c/list_etexts.php.bak | 127 + c/loadsrv.php | 60 + c/locale/translators/index.php | 134 + c/locale/translators/new_lang.php | 53 + c/locale/translators/parse_po.inc | 51 + c/locale/translators/save_po.php | 133 + c/locale/translators/space.gif | Bin 0 -> 124 bytes c/log/slow.log.25oct | 743 ++ c/month.php | 85 + c/monthly.php | 74 + c/onemonth.php | 222 + c/pagesrv.php | 16 + c/palette.php | 74 + c/pennask.bak/.idea/.name | 1 + c/pennask.bak/.idea/encodings.xml | 5 + .../inspectionProfiles/Project_Default.xml | 219 + .../inspectionProfiles/profiles_settings.xml | 7 + c/pennask.bak/.idea/misc.xml | 71 + c/pennask.bak/.idea/modules.xml | 9 + c/pennask.bak/.idea/pennask.iml | 9 + c/pennask.bak/.idea/scopes/scope_settings.xml | 5 + c/pennask.bak/.idea/vcs.xml | 7 + c/pennask.bak/.idea/workspace.xml | 142 + c/pennask.bak/action.php | 16 + c/pennask.bak/ctrlframe.php | 112 + c/pennask.bak/gfx/a1_down.png | Bin 0 -> 300 bytes c/pennask.bak/gfx/a1_left.png | Bin 0 -> 303 bytes c/pennask.bak/gfx/a1_right.png | Bin 0 -> 301 bytes c/pennask.bak/gfx/a1_up.png | Bin 0 -> 304 bytes c/pennask.bak/gfx/a2_down.png | Bin 0 -> 296 bytes c/pennask.bak/gfx/a2_left.png | Bin 0 -> 303 bytes c/pennask.bak/gfx/a2_right.png | Bin 0 -> 301 bytes c/pennask.bak/gfx/a2_up.png | Bin 0 -> 304 bytes c/pennask.bak/gfx/bad.png | Bin 0 -> 1801 bytes c/pennask.bak/gfx/broken.png | Bin 0 -> 1762 bytes c/pennask.bak/gfx/bt1.png | Bin 0 -> 509 bytes c/pennask.bak/gfx/bt10.png | Bin 0 -> 808 bytes c/pennask.bak/gfx/bt11.png | Bin 0 -> 439 bytes c/pennask.bak/gfx/bt12.png | Bin 0 -> 719 bytes c/pennask.bak/gfx/bt13.png | Bin 0 -> 639 bytes c/pennask.bak/gfx/bt14.png | Bin 0 -> 685 bytes c/pennask.bak/gfx/bt15.png | Bin 0 -> 739 bytes c/pennask.bak/gfx/bt16.png | Bin 0 -> 823 bytes c/pennask.bak/gfx/bt17.png | Bin 0 -> 755 bytes c/pennask.bak/gfx/bt18.png | Bin 0 -> 734 bytes c/pennask.bak/gfx/bt1_n.png | Bin 0 -> 502 bytes c/pennask.bak/gfx/bt2.png | Bin 0 -> 701 bytes c/pennask.bak/gfx/bt3.png | Bin 0 -> 372 bytes c/pennask.bak/gfx/bt4.png | Bin 0 -> 321 bytes c/pennask.bak/gfx/bt5.png | Bin 0 -> 332 bytes c/pennask.bak/gfx/bt6.png | Bin 0 -> 868 bytes c/pennask.bak/gfx/bt7.png | Bin 0 -> 854 bytes c/pennask.bak/gfx/bt7_n.png | Bin 0 -> 843 bytes c/pennask.bak/gfx/bt8.png | Bin 0 -> 899 bytes c/pennask.bak/gfx/bt9.png | Bin 0 -> 742 bytes c/pennask.bak/gfx/down.jpg | Bin 0 -> 917 bytes c/pennask.bak/gfx/down.png | Bin 0 -> 509 bytes c/pennask.bak/gfx/greek.png | Bin 0 -> 7979 bytes c/pennask.bak/gfx/greekrough.png | Bin 0 -> 159 bytes c/pennask.bak/gfx/horiz.png | Bin 0 -> 952 bytes c/pennask.bak/gfx/icon-i.png | Bin 0 -> 828 bytes c/pennask.bak/gfx/icon-n.png | Bin 0 -> 947 bytes c/pennask.bak/gfx/igreek.png | Bin 0 -> 7953 bytes c/pennask.bak/gfx/quit.png | Bin 0 -> 1031 bytes c/pennask.bak/gfx/returnpage.png | Bin 0 -> 1150 bytes c/pennask.bak/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/pennask.bak/gfx/save.jpg | Bin 0 -> 6770 bytes c/pennask.bak/gfx/save2.jpg | Bin 0 -> 812 bytes c/pennask.bak/gfx/savenxt.png | Bin 0 -> 1136 bytes c/pennask.bak/gfx/savequit.png | Bin 0 -> 1087 bytes c/pennask.bak/gfx/savetmp.png | Bin 0 -> 967 bytes c/pennask.bak/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/pennask.bak/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/pennask.bak/gfx/tags/bold.png | Bin 0 -> 377 bytes c/pennask.bak/gfx/tags/caps.png | Bin 0 -> 471 bytes c/pennask.bak/gfx/tags/exit.png | Bin 0 -> 493 bytes c/pennask.bak/gfx/tags/greek.png | Bin 0 -> 522 bytes c/pennask.bak/gfx/tags/help.png | Bin 0 -> 436 bytes c/pennask.bak/gfx/tags/italic.png | Bin 0 -> 336 bytes c/pennask.bak/gfx/tags/sub.png | Bin 0 -> 340 bytes c/pennask.bak/gfx/tags/sup.png | Bin 0 -> 338 bytes c/pennask.bak/gfx/tags/underline.png | Bin 0 -> 356 bytes c/pennask.bak/gfx/up.jpg | Bin 0 -> 723 bytes c/pennask.bak/gfx/up.png | Bin 0 -> 508 bytes c/pennask.bak/gfx/vert.png | Bin 0 -> 954 bytes c/pennask.bak/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/pennask.bak/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/pennask.bak/processpage.php | 112 + c/pennask.bak/proof.php | 82 + c/pennask.bak/proof_frame.php | 647 ++ c/pennask.bak/proofpage.css | 383 + c/pennask.bak/proofpage.js | 2359 +++++ c/pennask.bak/proofpage.php | 564 + c/pennask.bak/wctest.php | 56 + c/pennask/.idea/.name | 1 + c/pennask/.idea/encodings.xml | 5 + .../inspectionProfiles/Project_Default.xml | 219 + .../inspectionProfiles/profiles_settings.xml | 7 + c/pennask/.idea/misc.xml | 71 + c/pennask/.idea/modules.xml | 9 + c/pennask/.idea/pennask.iml | 9 + c/pennask/.idea/scopes/scope_settings.xml | 5 + c/pennask/.idea/vcs.xml | 7 + c/pennask/.idea/workspace.xml | 142 + c/pennask/action.php | 16 + c/pennask/ahmic/processpage.php | 84 + c/pennask/ahmic/proofpage.js | 2873 ++++++ c/pennask/ctrlframe.php | 112 + c/pennask/ctrlframe.php.bak | 112 + c/pennask/dkretz/ahmic/processpage.php | 84 + c/pennask/dkretz/ahmic/proofpage.js | 2873 ++++++ c/pennask/dkretz/gfx/a1_down.png | Bin 0 -> 300 bytes c/pennask/dkretz/gfx/a1_left.png | Bin 0 -> 303 bytes c/pennask/dkretz/gfx/a1_right.png | Bin 0 -> 301 bytes c/pennask/dkretz/gfx/a1_up.png | Bin 0 -> 304 bytes c/pennask/dkretz/gfx/a2_down.png | Bin 0 -> 296 bytes c/pennask/dkretz/gfx/a2_left.png | Bin 0 -> 303 bytes c/pennask/dkretz/gfx/a2_right.png | Bin 0 -> 301 bytes c/pennask/dkretz/gfx/a2_up.png | Bin 0 -> 304 bytes c/pennask/dkretz/gfx/bad.png | Bin 0 -> 1801 bytes c/pennask/dkretz/gfx/broken.png | Bin 0 -> 1762 bytes c/pennask/dkretz/gfx/bt1.png | Bin 0 -> 509 bytes c/pennask/dkretz/gfx/bt10.png | Bin 0 -> 808 bytes c/pennask/dkretz/gfx/bt11.png | Bin 0 -> 439 bytes c/pennask/dkretz/gfx/bt12.png | Bin 0 -> 719 bytes c/pennask/dkretz/gfx/bt13.png | Bin 0 -> 639 bytes c/pennask/dkretz/gfx/bt14.png | Bin 0 -> 685 bytes c/pennask/dkretz/gfx/bt15.png | Bin 0 -> 739 bytes c/pennask/dkretz/gfx/bt16.png | Bin 0 -> 823 bytes c/pennask/dkretz/gfx/bt17.png | Bin 0 -> 755 bytes c/pennask/dkretz/gfx/bt18.png | Bin 0 -> 734 bytes c/pennask/dkretz/gfx/bt1_n.png | Bin 0 -> 502 bytes c/pennask/dkretz/gfx/bt2.png | Bin 0 -> 701 bytes c/pennask/dkretz/gfx/bt3.png | Bin 0 -> 372 bytes c/pennask/dkretz/gfx/bt4.png | Bin 0 -> 321 bytes c/pennask/dkretz/gfx/bt5.png | Bin 0 -> 332 bytes c/pennask/dkretz/gfx/bt6.png | Bin 0 -> 868 bytes c/pennask/dkretz/gfx/bt7.png | Bin 0 -> 854 bytes c/pennask/dkretz/gfx/bt7_n.png | Bin 0 -> 843 bytes c/pennask/dkretz/gfx/bt8.png | Bin 0 -> 899 bytes c/pennask/dkretz/gfx/bt9.png | Bin 0 -> 742 bytes c/pennask/dkretz/gfx/down.jpg | Bin 0 -> 917 bytes c/pennask/dkretz/gfx/down.png | Bin 0 -> 509 bytes c/pennask/dkretz/gfx/greek.png | Bin 0 -> 7979 bytes c/pennask/dkretz/gfx/greekrough.png | Bin 0 -> 159 bytes c/pennask/dkretz/gfx/horiz.png | Bin 0 -> 952 bytes c/pennask/dkretz/gfx/icon-i.png | Bin 0 -> 828 bytes c/pennask/dkretz/gfx/icon-n.png | Bin 0 -> 947 bytes c/pennask/dkretz/gfx/igreek.png | Bin 0 -> 7953 bytes c/pennask/dkretz/gfx/quit.png | Bin 0 -> 1031 bytes c/pennask/dkretz/gfx/returnpage.png | Bin 0 -> 1150 bytes c/pennask/dkretz/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/pennask/dkretz/gfx/savenxt.png | Bin 0 -> 1136 bytes c/pennask/dkretz/gfx/savequit.png | Bin 0 -> 1087 bytes c/pennask/dkretz/gfx/savetmp.png | Bin 0 -> 967 bytes c/pennask/dkretz/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/pennask/dkretz/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/pennask/dkretz/gfx/tags/bold.png | Bin 0 -> 377 bytes c/pennask/dkretz/gfx/tags/caps.png | Bin 0 -> 471 bytes c/pennask/dkretz/gfx/tags/exit.png | Bin 0 -> 493 bytes c/pennask/dkretz/gfx/tags/greek.png | Bin 0 -> 522 bytes c/pennask/dkretz/gfx/tags/help.png | Bin 0 -> 436 bytes c/pennask/dkretz/gfx/tags/italic.png | Bin 0 -> 336 bytes c/pennask/dkretz/gfx/tags/sub.png | Bin 0 -> 340 bytes c/pennask/dkretz/gfx/tags/sup.png | Bin 0 -> 338 bytes c/pennask/dkretz/gfx/tags/underline.png | Bin 0 -> 356 bytes c/pennask/dkretz/gfx/up.jpg | Bin 0 -> 723 bytes c/pennask/dkretz/gfx/up.png | Bin 0 -> 508 bytes c/pennask/dkretz/gfx/vert.png | Bin 0 -> 954 bytes c/pennask/dkretz/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/pennask/dkretz/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/pennask/gfx/a1_down.png | Bin 0 -> 300 bytes c/pennask/gfx/a1_left.png | Bin 0 -> 303 bytes c/pennask/gfx/a1_right.png | Bin 0 -> 301 bytes c/pennask/gfx/a1_up.png | Bin 0 -> 304 bytes c/pennask/gfx/a2_down.png | Bin 0 -> 296 bytes c/pennask/gfx/a2_left.png | Bin 0 -> 303 bytes c/pennask/gfx/a2_right.png | Bin 0 -> 301 bytes c/pennask/gfx/a2_up.png | Bin 0 -> 304 bytes c/pennask/gfx/bad.png | Bin 0 -> 1801 bytes c/pennask/gfx/broken.png | Bin 0 -> 1762 bytes c/pennask/gfx/bt1.png | Bin 0 -> 509 bytes c/pennask/gfx/bt10.png | Bin 0 -> 808 bytes c/pennask/gfx/bt11.png | Bin 0 -> 439 bytes c/pennask/gfx/bt12.png | Bin 0 -> 719 bytes c/pennask/gfx/bt13.png | Bin 0 -> 639 bytes c/pennask/gfx/bt14.png | Bin 0 -> 685 bytes c/pennask/gfx/bt15.png | Bin 0 -> 739 bytes c/pennask/gfx/bt16.png | Bin 0 -> 823 bytes c/pennask/gfx/bt17.png | Bin 0 -> 755 bytes c/pennask/gfx/bt18.png | Bin 0 -> 734 bytes c/pennask/gfx/bt1_n.png | Bin 0 -> 502 bytes c/pennask/gfx/bt2.png | Bin 0 -> 701 bytes c/pennask/gfx/bt3.png | Bin 0 -> 372 bytes c/pennask/gfx/bt4.png | Bin 0 -> 321 bytes c/pennask/gfx/bt5.png | Bin 0 -> 332 bytes c/pennask/gfx/bt6.png | Bin 0 -> 868 bytes c/pennask/gfx/bt7.png | Bin 0 -> 854 bytes c/pennask/gfx/bt7_n.png | Bin 0 -> 843 bytes c/pennask/gfx/bt8.png | Bin 0 -> 899 bytes c/pennask/gfx/bt9.png | Bin 0 -> 742 bytes c/pennask/gfx/down.jpg | Bin 0 -> 917 bytes c/pennask/gfx/down.png | Bin 0 -> 509 bytes c/pennask/gfx/gear.png | Bin 0 -> 839 bytes c/pennask/gfx/greek.png | Bin 0 -> 7979 bytes c/pennask/gfx/greekrough.png | Bin 0 -> 159 bytes c/pennask/gfx/horiz.png | Bin 0 -> 952 bytes c/pennask/gfx/icon-i.png | Bin 0 -> 828 bytes c/pennask/gfx/icon-n.png | Bin 0 -> 947 bytes c/pennask/gfx/igreek.png | Bin 0 -> 7953 bytes c/pennask/gfx/quit.png | Bin 0 -> 1031 bytes c/pennask/gfx/returnpage.png | Bin 0 -> 1150 bytes c/pennask/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/pennask/gfx/save.jpg | Bin 0 -> 6770 bytes c/pennask/gfx/save2.jpg | Bin 0 -> 812 bytes c/pennask/gfx/savenxt.png | Bin 0 -> 1136 bytes c/pennask/gfx/savequit.png | Bin 0 -> 1087 bytes c/pennask/gfx/savetmp.png | Bin 0 -> 967 bytes c/pennask/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/pennask/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/pennask/gfx/tags/bold.png | Bin 0 -> 377 bytes c/pennask/gfx/tags/caps.png | Bin 0 -> 471 bytes c/pennask/gfx/tags/exit.png | Bin 0 -> 493 bytes c/pennask/gfx/tags/greek.png | Bin 0 -> 522 bytes c/pennask/gfx/tags/help.png | Bin 0 -> 436 bytes c/pennask/gfx/tags/italic.png | Bin 0 -> 336 bytes c/pennask/gfx/tags/sub.png | Bin 0 -> 340 bytes c/pennask/gfx/tags/sup.png | Bin 0 -> 338 bytes c/pennask/gfx/tags/underline.png | Bin 0 -> 356 bytes c/pennask/gfx/up.jpg | Bin 0 -> 723 bytes c/pennask/gfx/up.png | Bin 0 -> 508 bytes c/pennask/gfx/vert.png | Bin 0 -> 954 bytes c/pennask/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/pennask/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/pennask/pennask.bak/action.php | 16 + c/pennask/pennask.bak/ahmic/processpage.php | 84 + c/pennask/pennask.bak/ahmic/proofpage.js | 2873 ++++++ c/pennask/pennask.bak/ctrlframe.php | 112 + c/pennask/pennask.bak/ctrlframe.php.bak | 112 + .../pennask.bak/dkretz/ahmic/processpage.php | 84 + .../pennask.bak/dkretz/ahmic/proofpage.js | 2873 ++++++ c/pennask/pennask.bak/dkretz/gfx/a1_down.png | Bin 0 -> 300 bytes c/pennask/pennask.bak/dkretz/gfx/a1_left.png | Bin 0 -> 303 bytes c/pennask/pennask.bak/dkretz/gfx/a1_right.png | Bin 0 -> 301 bytes c/pennask/pennask.bak/dkretz/gfx/a1_up.png | Bin 0 -> 304 bytes c/pennask/pennask.bak/dkretz/gfx/a2_down.png | Bin 0 -> 296 bytes c/pennask/pennask.bak/dkretz/gfx/a2_left.png | Bin 0 -> 303 bytes c/pennask/pennask.bak/dkretz/gfx/a2_right.png | Bin 0 -> 301 bytes c/pennask/pennask.bak/dkretz/gfx/a2_up.png | Bin 0 -> 304 bytes c/pennask/pennask.bak/dkretz/gfx/bad.png | Bin 0 -> 1801 bytes c/pennask/pennask.bak/dkretz/gfx/broken.png | Bin 0 -> 1762 bytes c/pennask/pennask.bak/dkretz/gfx/bt1.png | Bin 0 -> 509 bytes c/pennask/pennask.bak/dkretz/gfx/bt10.png | Bin 0 -> 808 bytes c/pennask/pennask.bak/dkretz/gfx/bt11.png | Bin 0 -> 439 bytes c/pennask/pennask.bak/dkretz/gfx/bt12.png | Bin 0 -> 719 bytes c/pennask/pennask.bak/dkretz/gfx/bt13.png | Bin 0 -> 639 bytes c/pennask/pennask.bak/dkretz/gfx/bt14.png | Bin 0 -> 685 bytes c/pennask/pennask.bak/dkretz/gfx/bt15.png | Bin 0 -> 739 bytes c/pennask/pennask.bak/dkretz/gfx/bt16.png | Bin 0 -> 823 bytes c/pennask/pennask.bak/dkretz/gfx/bt17.png | Bin 0 -> 755 bytes c/pennask/pennask.bak/dkretz/gfx/bt18.png | Bin 0 -> 734 bytes c/pennask/pennask.bak/dkretz/gfx/bt1_n.png | Bin 0 -> 502 bytes c/pennask/pennask.bak/dkretz/gfx/bt2.png | Bin 0 -> 701 bytes c/pennask/pennask.bak/dkretz/gfx/bt3.png | Bin 0 -> 372 bytes c/pennask/pennask.bak/dkretz/gfx/bt4.png | Bin 0 -> 321 bytes c/pennask/pennask.bak/dkretz/gfx/bt5.png | Bin 0 -> 332 bytes c/pennask/pennask.bak/dkretz/gfx/bt6.png | Bin 0 -> 868 bytes c/pennask/pennask.bak/dkretz/gfx/bt7.png | Bin 0 -> 854 bytes c/pennask/pennask.bak/dkretz/gfx/bt7_n.png | Bin 0 -> 843 bytes c/pennask/pennask.bak/dkretz/gfx/bt8.png | Bin 0 -> 899 bytes c/pennask/pennask.bak/dkretz/gfx/bt9.png | Bin 0 -> 742 bytes c/pennask/pennask.bak/dkretz/gfx/down.jpg | Bin 0 -> 917 bytes c/pennask/pennask.bak/dkretz/gfx/down.png | Bin 0 -> 509 bytes c/pennask/pennask.bak/dkretz/gfx/greek.png | Bin 0 -> 7979 bytes .../pennask.bak/dkretz/gfx/greekrough.png | Bin 0 -> 159 bytes c/pennask/pennask.bak/dkretz/gfx/horiz.png | Bin 0 -> 952 bytes c/pennask/pennask.bak/dkretz/gfx/icon-i.png | Bin 0 -> 828 bytes c/pennask/pennask.bak/dkretz/gfx/icon-n.png | Bin 0 -> 947 bytes c/pennask/pennask.bak/dkretz/gfx/igreek.png | Bin 0 -> 7953 bytes c/pennask/pennask.bak/dkretz/gfx/quit.png | Bin 0 -> 1031 bytes .../pennask.bak/dkretz/gfx/returnpage.png | Bin 0 -> 1150 bytes c/pennask/pennask.bak/dkretz/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/pennask/pennask.bak/dkretz/gfx/savenxt.png | Bin 0 -> 1136 bytes c/pennask/pennask.bak/dkretz/gfx/savequit.png | Bin 0 -> 1087 bytes c/pennask/pennask.bak/dkretz/gfx/savetmp.png | Bin 0 -> 967 bytes .../pennask.bak/dkretz/gfx/tags/bar1.png | Bin 0 -> 2257 bytes .../pennask.bak/dkretz/gfx/tags/bar2.png | Bin 0 -> 2469 bytes .../pennask.bak/dkretz/gfx/tags/bold.png | Bin 0 -> 377 bytes .../pennask.bak/dkretz/gfx/tags/caps.png | Bin 0 -> 471 bytes .../pennask.bak/dkretz/gfx/tags/exit.png | Bin 0 -> 493 bytes .../pennask.bak/dkretz/gfx/tags/greek.png | Bin 0 -> 522 bytes .../pennask.bak/dkretz/gfx/tags/help.png | Bin 0 -> 436 bytes .../pennask.bak/dkretz/gfx/tags/italic.png | Bin 0 -> 336 bytes c/pennask/pennask.bak/dkretz/gfx/tags/sub.png | Bin 0 -> 340 bytes c/pennask/pennask.bak/dkretz/gfx/tags/sup.png | Bin 0 -> 338 bytes .../pennask.bak/dkretz/gfx/tags/underline.png | Bin 0 -> 356 bytes c/pennask/pennask.bak/dkretz/gfx/up.jpg | Bin 0 -> 723 bytes c/pennask/pennask.bak/dkretz/gfx/up.png | Bin 0 -> 508 bytes c/pennask/pennask.bak/dkretz/gfx/vert.png | Bin 0 -> 954 bytes c/pennask/pennask.bak/dkretz/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/pennask/pennask.bak/dkretz/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/pennask/pennask.bak/gfx/a1_down.png | Bin 0 -> 300 bytes c/pennask/pennask.bak/gfx/a1_left.png | Bin 0 -> 303 bytes c/pennask/pennask.bak/gfx/a1_right.png | Bin 0 -> 301 bytes c/pennask/pennask.bak/gfx/a1_up.png | Bin 0 -> 304 bytes c/pennask/pennask.bak/gfx/a2_down.png | Bin 0 -> 296 bytes c/pennask/pennask.bak/gfx/a2_left.png | Bin 0 -> 303 bytes c/pennask/pennask.bak/gfx/a2_right.png | Bin 0 -> 301 bytes c/pennask/pennask.bak/gfx/a2_up.png | Bin 0 -> 304 bytes c/pennask/pennask.bak/gfx/bad.png | Bin 0 -> 1801 bytes c/pennask/pennask.bak/gfx/broken.png | Bin 0 -> 1762 bytes c/pennask/pennask.bak/gfx/bt1.png | Bin 0 -> 509 bytes c/pennask/pennask.bak/gfx/bt10.png | Bin 0 -> 808 bytes c/pennask/pennask.bak/gfx/bt11.png | Bin 0 -> 439 bytes c/pennask/pennask.bak/gfx/bt12.png | Bin 0 -> 719 bytes c/pennask/pennask.bak/gfx/bt13.png | Bin 0 -> 639 bytes c/pennask/pennask.bak/gfx/bt14.png | Bin 0 -> 685 bytes c/pennask/pennask.bak/gfx/bt15.png | Bin 0 -> 739 bytes c/pennask/pennask.bak/gfx/bt16.png | Bin 0 -> 823 bytes c/pennask/pennask.bak/gfx/bt17.png | Bin 0 -> 755 bytes c/pennask/pennask.bak/gfx/bt18.png | Bin 0 -> 734 bytes c/pennask/pennask.bak/gfx/bt1_n.png | Bin 0 -> 502 bytes c/pennask/pennask.bak/gfx/bt2.png | Bin 0 -> 701 bytes c/pennask/pennask.bak/gfx/bt3.png | Bin 0 -> 372 bytes c/pennask/pennask.bak/gfx/bt4.png | Bin 0 -> 321 bytes c/pennask/pennask.bak/gfx/bt5.png | Bin 0 -> 332 bytes c/pennask/pennask.bak/gfx/bt6.png | Bin 0 -> 868 bytes c/pennask/pennask.bak/gfx/bt7.png | Bin 0 -> 854 bytes c/pennask/pennask.bak/gfx/bt7_n.png | Bin 0 -> 843 bytes c/pennask/pennask.bak/gfx/bt8.png | Bin 0 -> 899 bytes c/pennask/pennask.bak/gfx/bt9.png | Bin 0 -> 742 bytes c/pennask/pennask.bak/gfx/down.jpg | Bin 0 -> 917 bytes c/pennask/pennask.bak/gfx/down.png | Bin 0 -> 509 bytes c/pennask/pennask.bak/gfx/greek.png | Bin 0 -> 7979 bytes c/pennask/pennask.bak/gfx/greekrough.png | Bin 0 -> 159 bytes c/pennask/pennask.bak/gfx/horiz.png | Bin 0 -> 952 bytes c/pennask/pennask.bak/gfx/icon-i.png | Bin 0 -> 828 bytes c/pennask/pennask.bak/gfx/icon-n.png | Bin 0 -> 947 bytes c/pennask/pennask.bak/gfx/igreek.png | Bin 0 -> 7953 bytes c/pennask/pennask.bak/gfx/quit.png | Bin 0 -> 1031 bytes c/pennask/pennask.bak/gfx/returnpage.png | Bin 0 -> 1150 bytes c/pennask/pennask.bak/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/pennask/pennask.bak/gfx/save.jpg | Bin 0 -> 6770 bytes c/pennask/pennask.bak/gfx/save2.jpg | Bin 0 -> 812 bytes c/pennask/pennask.bak/gfx/savenxt.png | Bin 0 -> 1136 bytes c/pennask/pennask.bak/gfx/savequit.png | Bin 0 -> 1087 bytes c/pennask/pennask.bak/gfx/savetmp.png | Bin 0 -> 967 bytes c/pennask/pennask.bak/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/pennask/pennask.bak/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/pennask/pennask.bak/gfx/tags/bold.png | Bin 0 -> 377 bytes c/pennask/pennask.bak/gfx/tags/caps.png | Bin 0 -> 471 bytes c/pennask/pennask.bak/gfx/tags/exit.png | Bin 0 -> 493 bytes c/pennask/pennask.bak/gfx/tags/greek.png | Bin 0 -> 522 bytes c/pennask/pennask.bak/gfx/tags/help.png | Bin 0 -> 436 bytes c/pennask/pennask.bak/gfx/tags/italic.png | Bin 0 -> 336 bytes c/pennask/pennask.bak/gfx/tags/sub.png | Bin 0 -> 340 bytes c/pennask/pennask.bak/gfx/tags/sup.png | Bin 0 -> 338 bytes c/pennask/pennask.bak/gfx/tags/underline.png | Bin 0 -> 356 bytes c/pennask/pennask.bak/gfx/up.jpg | Bin 0 -> 723 bytes c/pennask/pennask.bak/gfx/up.png | Bin 0 -> 508 bytes c/pennask/pennask.bak/gfx/vert.png | Bin 0 -> 954 bytes c/pennask/pennask.bak/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/pennask/pennask.bak/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/pennask/pennask.bak/processpage.php | 112 + c/pennask/pennask.bak/proof.php | 82 + c/pennask/pennask.bak/proof.php.bak | 76 + c/pennask/pennask.bak/proof_frame.php | 647 ++ c/pennask/pennask.bak/proof_frame.php.bak | 636 ++ c/pennask/pennask.bak/proofpage.css | 383 + c/pennask/pennask.bak/proofpage.js | 2359 +++++ c/pennask/pennask.bak/proofpage.php | 564 + c/pennask/pennask.bak/wc.php.bak | 391 + c/pennask/pennask.bak/wctest.php | 56 + c/pennask/processpage.php | 110 + c/pennask/proof.php | 76 + c/pennask/proof.php.bak | 76 + c/pennask/proof_frame.php | 641 ++ c/pennask/proof_frame.php.bak | 636 ++ c/pennask/proofpage.css | 445 + c/pennask/proofpage.js | 2537 +++++ c/pennask/proofpage.php | 503 + c/pennask/wc.php.bak | 391 + c/pennask/wctest.php | 56 + c/phpinfo.php | 7 + c/pinc/BrowseUtility.inc | 171 + c/pinc/Diff.class.php | 389 + c/pinc/DifferenceEngine.php | 1987 ++++ c/pinc/DifferenceEngineWrapper.php | 185 + c/pinc/DpContext.class.php | 660 ++ c/pinc/DpDb.php | 622 ++ c/pinc/DpDbi.class.php | 491 + c/pinc/DpEnchant.class.php | 199 + c/pinc/DpFile.class.php | 79 + c/pinc/DpForm.class.php | 133 + c/pinc/DpPage.class.php | 1770 ++++ c/pinc/DpPhpbb3.class.php | 358 + c/pinc/DpProject.class.php | 3481 +++++++ c/pinc/DpQualProject.class.php | 112 + c/pinc/DpTable.class.php | 643 ++ c/pinc/DpTable.class.php.bak | 561 + c/pinc/DpTable2.class.php | 636 ++ c/pinc/DpUser.class.php | 1185 +++ c/pinc/DpVersion.class.php | 370 + c/pinc/DpZip.class.php | 44 + c/pinc/Profileclass.inc | 1063 ++ c/pinc/Project.inc | 436 + c/pinc/Quiz.inc | 143 + c/pinc/RoundDescriptor.inc | 245 + c/pinc/RoundsInfo.php | 53 + c/pinc/SettingsClass.inc | 231 + c/pinc/SortUtility.inc | 342 + c/pinc/Stage.inc | 396 + c/pinc/TallyBoard.inc | 714 ++ c/pinc/ThemedTable.inc | 156 + c/pinc/abort.inc | 144 + c/pinc/access_log.inc | 23 + c/pinc/authors.inc | 21 + c/pinc/button_defs.inc | 254 + c/pinc/chart.inc | 16 + c/pinc/comment_inclusions.inc | 49 + c/pinc/daily_pages.html | 28 + c/pinc/daily_pages.js | 31 + c/pinc/daily_pages.php | 7 + c/pinc/day_chart.php | 105 + c/pinc/doctype.inc | 3 + c/pinc/dpc_edit.php | 183 + c/pinc/dpctls.php | 120 + c/pinc/dpinit.php | 59 + c/pinc/dpinit2.php | 60 + c/pinc/dpsql.inc | 269 + c/pinc/faq.inc | 73 + c/pinc/filter_project_list.inc | 436 + c/pinc/genres.inc | 88 + c/pinc/gettext_setup.inc | 42 + c/pinc/gradual.inc | 79 + c/pinc/help/README.txt | 5 + c/pinc/help/conf/authz | 32 + c/pinc/help/conf/passwd | 8 + c/pinc/help/conf/svnserve.conf | 47 + c/pinc/help/db/current | 1 + c/pinc/help/db/format | 2 + c/pinc/help/db/fs-type | 1 + c/pinc/help/db/fsfs.conf | 37 + c/pinc/help/db/min-unpacked-rev | 1 + c/pinc/help/db/rep-cache.db | Bin 0 -> 4096 bytes c/pinc/help/db/revprops/0/0 | 5 + c/pinc/help/db/revs/0/0 | 11 + c/pinc/help/db/txn-current | 1 + c/pinc/help/db/txn-current-lock | 0 c/pinc/help/db/uuid | 1 + c/pinc/help/db/write-lock | 0 c/pinc/help/format | 1 + c/pinc/help/hooks/post-commit.tmpl | 50 + c/pinc/help/hooks/post-lock.tmpl | 44 + c/pinc/help/hooks/post-revprop-change.tmpl | 56 + c/pinc/help/hooks/post-unlock.tmpl | 42 + c/pinc/help/hooks/pre-commit.tmpl | 81 + c/pinc/help/hooks/pre-lock.tmpl | 71 + c/pinc/help/hooks/pre-revprop-change.tmpl | 66 + c/pinc/help/hooks/pre-unlock.tmpl | 63 + c/pinc/help/hooks/start-commit.tmpl | 65 + c/pinc/help/locks/db-logs.lock | 3 + c/pinc/help/locks/db.lock | 3 + c/pinc/helpers.php | 1825 ++++ c/pinc/http_headers.inc | 17 + c/pinc/iso_3166_list.inc | 241 + c/pinc/iso_639_list.inc | 338 + c/pinc/iso_639_loc_list.inc | 52 + c/pinc/iso_lang_list.inc | 508 + c/pinc/js_newpophelp.inc | 14 + c/pinc/js_newwin.inc | 23 + c/pinc/lang_data.inc | 20 + c/pinc/languages.inc | 156 + c/pinc/links.php | 1070 ++ c/pinc/list_projects.inc | 68 + c/pinc/lists.php | 501 + c/pinc/maintenance_mode.inc | 23 + c/pinc/marc_format.inc | 270 + c/pinc/maybe_mail.inc | 9 + c/pinc/mentorbanner.inc | 36 + c/pinc/metarefresh.inc | 43 + c/pinc/misc.inc | 240 + c/pinc/month_chart.php | 99 + c/pinc/new_user_mails.inc | 218 + c/pinc/page_header.inc | 24 + c/pinc/page_table.inc | 193 + c/pinc/page_tally.inc | 395 + c/pinc/pg old.inc | 44 + c/pinc/pg.inc | 44 + c/pinc/phases.php | 55 + c/pinc/postcomments.inc | 20 + c/pinc/prefs_options.inc | 50 + c/pinc/privacy.inc | 30 + c/pinc/project_edit.inc | 80 + c/pinc/project_events.inc | 20 + c/pinc/project_states.inc | 407 + c/pinc/project_states_old.inc | 455 + c/pinc/projectinfo.inc | 17 + c/pinc/quizzes.inc | 31 + c/pinc/randrule.php | 27 + c/pinc/release_queue.inc | 22 + c/pinc/resolution.inc | 5 + c/pinc/root | 25 + c/pinc/rounds.php | 249 + c/pinc/select_list.inc | 17 + c/pinc/showstartexts.inc | 106 + c/pinc/showtexts.inc | 56 + c/pinc/simple_proof_text.inc | 34 + c/pinc/site_news.inc | 146 + c/pinc/site_specific.inc | 26 + c/pinc/site_vars.php | 167 + c/pinc/slim_header.inc | 19 + c/pinc/smoothread.inc | 177 + c/pinc/special_colors.inc | 123 + c/pinc/stages.inc | 360 + c/pinc/stats.php | 95 + c/pinc/tabs.inc | 125 + c/pinc/templates/base_graphics/donate.psd | Bin 0 -> 11090 bytes c/pinc/templates/base_graphics/l_curve.psd | Bin 0 -> 7759 bytes c/pinc/templates/base_graphics/logo.psd | Bin 0 -> 173015 bytes c/pinc/templates/base_graphics/r_curve.psd | Bin 0 -> 7759 bytes c/pinc/templates/base_graphics/tab.psd | Bin 0 -> 28810 bytes c/pinc/templates/base_graphics/tab_on.psd | Bin 0 -> 29078 bytes c/pinc/templates/base_graphics/tabs_howto.txt | 34 + c/pinc/templates/base_graphics/theme.tpl | 59 + .../classic_grey/graphics/donate.gif | Bin 0 -> 857 bytes .../classic_grey/graphics/l_curve.gif | Bin 0 -> 183 bytes .../templates/classic_grey/graphics/logo.gif | Bin 0 -> 2954 bytes .../classic_grey/graphics/oldlogo.gif | Bin 0 -> 18948 bytes .../classic_grey/graphics/r_curve.gif | Bin 0 -> 878 bytes .../classic_grey/graphics/tabs_bg.png | Bin 0 -> 3176 bytes .../classic_grey/graphics/tabs_left.png | Bin 0 -> 3085 bytes .../classic_grey/graphics/tabs_left_on.png | Bin 0 -> 3274 bytes .../classic_grey/graphics/tabs_right.png | Bin 0 -> 4361 bytes .../classic_grey/graphics/tabs_right_on.png | Bin 0 -> 4365 bytes c/pinc/templates/classic_grey/main.css | 4 + c/pinc/templates/classic_grey/theme.tpl | 48 + c/pinc/templates/comment_files/BG1a.txt | 6 + c/pinc/templates/comment_files/BG1b.txt | 124 + c/pinc/templates/comment_files/BGr2.txt | 5 + c/pinc/templates/comment_files/ammu.txt | 28 + c/pinc/templates/comment_files/bae1.txt | 7 + c/pinc/templates/comment_files/bell.txt | 7 + c/pinc/templates/comment_files/bem1.txt | 42 + c/pinc/templates/comment_files/diac.txt | 18 + c/pinc/templates/comment_files/eets.txt | 26 + c/pinc/templates/comment_files/grw0.txt | 10 + c/pinc/templates/comment_files/jon1.txt | 20 + c/pinc/templates/comment_files/nar2.txt | 127 + c/pinc/templates/comment_files/pgnm.txt | 3 + c/pinc/templates/comment_files/port.txt | 14 + c/pinc/templates/comment_files/samp.txt | 1 + c/pinc/templates/comment_files/ted0.txt | 19 + c/pinc/templates/comment_files/wrrn.txt | 163 + .../templates/default_graphics/tabs_left.png | Bin 0 -> 2833 bytes .../default_graphics/tabs_left_on.png | Bin 0 -> 2829 bytes .../templates/default_graphics/tabs_right.png | Bin 0 -> 3326 bytes .../default_graphics/tabs_right_on.png | Bin 0 -> 3345 bytes .../project_gutenberg/graphics/donate.gif | Bin 0 -> 857 bytes .../project_gutenberg/graphics/dpclogo5.png | Bin 0 -> 7714 bytes .../project_gutenberg/graphics/l_curve.gif | Bin 0 -> 846 bytes .../project_gutenberg/graphics/logo.gif | Bin 0 -> 4074 bytes .../project_gutenberg/graphics/r_curve.gif | Bin 0 -> 848 bytes .../project_gutenberg/graphics/tabs_bg.png | Bin 0 -> 3068 bytes .../project_gutenberg/graphics/tabs_left.png | Bin 0 -> 3146 bytes .../graphics/tabs_left_on.png | Bin 0 -> 3626 bytes .../project_gutenberg/graphics/tabs_right.png | Bin 0 -> 4294 bytes .../graphics/tabs_right_on.png | Bin 0 -> 6544 bytes c/pinc/templates/project_gutenberg/main.css | 4 + c/pinc/templates/project_gutenberg/theme.tpl | 48 + .../templates/royal_blues/graphics/donate.gif | Bin 0 -> 857 bytes .../royal_blues/graphics/l_curve.gif | Bin 0 -> 186 bytes .../templates/royal_blues/graphics/logo.gif | Bin 0 -> 2954 bytes .../royal_blues/graphics/oldlogo.gif | Bin 0 -> 19997 bytes .../royal_blues/graphics/r_curve.gif | Bin 0 -> 187 bytes .../royal_blues/graphics/tabs_bg.png | Bin 0 -> 2977 bytes .../royal_blues/graphics/tabs_left.png | Bin 0 -> 3146 bytes .../royal_blues/graphics/tabs_left_on.png | Bin 0 -> 3365 bytes .../royal_blues/graphics/tabs_right.png | Bin 0 -> 4522 bytes .../royal_blues/graphics/tabs_right_on.png | Bin 0 -> 5450 bytes c/pinc/templates/royal_blues/main.css | 4 + c/pinc/templates/royal_blues/theme.tpl | 48 + c/pinc/templates/theme.tpl | 48 + c/pinc/theme.inc | 662 ++ c/pinc/topic.inc | 164 + c/pinc/udb_user.php | 8 + c/pinc/user_is.inc | 86 + c/pinc/username.inc | 49 + c/pinc/variables_in_use.txt | 19 + c/pinc/wordcheck_engine.inc | 974 ++ c/pinc/words.php | 268 + c/pinc/xml.inc | 8 + c/pizza.html | 46 + c/post_comments.php | 18 + c/post_text_srv.php | 20 + c/project.php | 1285 +++ c/project_text.php | 39 + c/proof/ctrlframe.php | 112 + c/proof/gfx/a1_down.png | Bin 0 -> 300 bytes c/proof/gfx/a1_left.png | Bin 0 -> 303 bytes c/proof/gfx/a1_right.png | Bin 0 -> 301 bytes c/proof/gfx/a1_up.png | Bin 0 -> 304 bytes c/proof/gfx/a2_down.png | Bin 0 -> 296 bytes c/proof/gfx/a2_left.png | Bin 0 -> 303 bytes c/proof/gfx/a2_right.png | Bin 0 -> 301 bytes c/proof/gfx/a2_up.png | Bin 0 -> 304 bytes c/proof/gfx/bad.png | Bin 0 -> 1801 bytes c/proof/gfx/broken.png | Bin 0 -> 1762 bytes c/proof/gfx/bt1.png | Bin 0 -> 509 bytes c/proof/gfx/bt10.png | Bin 0 -> 808 bytes c/proof/gfx/bt11.png | Bin 0 -> 439 bytes c/proof/gfx/bt12.png | Bin 0 -> 719 bytes c/proof/gfx/bt13.png | Bin 0 -> 639 bytes c/proof/gfx/bt14.png | Bin 0 -> 685 bytes c/proof/gfx/bt15.png | Bin 0 -> 739 bytes c/proof/gfx/bt16.png | Bin 0 -> 823 bytes c/proof/gfx/bt17.png | Bin 0 -> 755 bytes c/proof/gfx/bt18.png | Bin 0 -> 734 bytes c/proof/gfx/bt1_n.png | Bin 0 -> 502 bytes c/proof/gfx/bt2.png | Bin 0 -> 701 bytes c/proof/gfx/bt3.png | Bin 0 -> 372 bytes c/proof/gfx/bt4.png | Bin 0 -> 321 bytes c/proof/gfx/bt5.png | Bin 0 -> 332 bytes c/proof/gfx/bt6.png | Bin 0 -> 868 bytes c/proof/gfx/bt7.png | Bin 0 -> 854 bytes c/proof/gfx/bt7_n.png | Bin 0 -> 843 bytes c/proof/gfx/bt8.png | Bin 0 -> 899 bytes c/proof/gfx/bt9.png | Bin 0 -> 742 bytes c/proof/gfx/down.jpg | Bin 0 -> 917 bytes c/proof/gfx/down.png | Bin 0 -> 509 bytes c/proof/gfx/greek.png | Bin 0 -> 7979 bytes c/proof/gfx/greekrough.png | Bin 0 -> 159 bytes c/proof/gfx/horiz.png | Bin 0 -> 952 bytes c/proof/gfx/icon-i.png | Bin 0 -> 828 bytes c/proof/gfx/icon-n.png | Bin 0 -> 947 bytes c/proof/gfx/igreek.png | Bin 0 -> 7953 bytes c/proof/gfx/quit.png | Bin 0 -> 1031 bytes c/proof/gfx/returnpage.png | Bin 0 -> 1150 bytes c/proof/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/proof/gfx/savenxt.png | Bin 0 -> 1136 bytes c/proof/gfx/savequit.png | Bin 0 -> 1087 bytes c/proof/gfx/savetmp.png | Bin 0 -> 967 bytes c/proof/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/proof/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/proof/gfx/tags/bold.png | Bin 0 -> 377 bytes c/proof/gfx/tags/caps.png | Bin 0 -> 471 bytes c/proof/gfx/tags/exit.png | Bin 0 -> 493 bytes c/proof/gfx/tags/greek.png | Bin 0 -> 522 bytes c/proof/gfx/tags/help.png | Bin 0 -> 436 bytes c/proof/gfx/tags/italic.png | Bin 0 -> 336 bytes c/proof/gfx/tags/sub.png | Bin 0 -> 340 bytes c/proof/gfx/tags/sup.png | Bin 0 -> 338 bytes c/proof/gfx/tags/underline.png | Bin 0 -> 356 bytes c/proof/gfx/up.png | Bin 0 -> 508 bytes c/proof/gfx/vert.png | Bin 0 -> 954 bytes c/proof/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/proof/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/proof/processpage.php | 91 + c/proof/proof.php | 76 + c/proof/proof_frame.php | 636 ++ c/proof/proofpage.css | 375 + c/proof/proofpage.js | 2909 ++++++ c/proof/proofpage.php | 509 + c/proofdev/ctrlframe.php | 112 + c/proofdev/gfx/a1_down.png | Bin 0 -> 300 bytes c/proofdev/gfx/a1_left.png | Bin 0 -> 303 bytes c/proofdev/gfx/a1_right.png | Bin 0 -> 301 bytes c/proofdev/gfx/a1_up.png | Bin 0 -> 304 bytes c/proofdev/gfx/a2_down.png | Bin 0 -> 296 bytes c/proofdev/gfx/a2_left.png | Bin 0 -> 303 bytes c/proofdev/gfx/a2_right.png | Bin 0 -> 301 bytes c/proofdev/gfx/a2_up.png | Bin 0 -> 304 bytes c/proofdev/gfx/bad.png | Bin 0 -> 1801 bytes c/proofdev/gfx/broken.png | Bin 0 -> 1762 bytes c/proofdev/gfx/bt1.png | Bin 0 -> 509 bytes c/proofdev/gfx/bt10.png | Bin 0 -> 808 bytes c/proofdev/gfx/bt11.png | Bin 0 -> 439 bytes c/proofdev/gfx/bt12.png | Bin 0 -> 719 bytes c/proofdev/gfx/bt13.png | Bin 0 -> 639 bytes c/proofdev/gfx/bt14.png | Bin 0 -> 685 bytes c/proofdev/gfx/bt15.png | Bin 0 -> 739 bytes c/proofdev/gfx/bt16.png | Bin 0 -> 823 bytes c/proofdev/gfx/bt17.png | Bin 0 -> 755 bytes c/proofdev/gfx/bt18.png | Bin 0 -> 734 bytes c/proofdev/gfx/bt1_n.png | Bin 0 -> 502 bytes c/proofdev/gfx/bt2.png | Bin 0 -> 701 bytes c/proofdev/gfx/bt3.png | Bin 0 -> 372 bytes c/proofdev/gfx/bt4.png | Bin 0 -> 321 bytes c/proofdev/gfx/bt5.png | Bin 0 -> 332 bytes c/proofdev/gfx/bt6.png | Bin 0 -> 868 bytes c/proofdev/gfx/bt7.png | Bin 0 -> 854 bytes c/proofdev/gfx/bt7_n.png | Bin 0 -> 843 bytes c/proofdev/gfx/bt8.png | Bin 0 -> 899 bytes c/proofdev/gfx/bt9.png | Bin 0 -> 742 bytes c/proofdev/gfx/down.jpg | Bin 0 -> 917 bytes c/proofdev/gfx/down.png | Bin 0 -> 509 bytes c/proofdev/gfx/greek.png | Bin 0 -> 7979 bytes c/proofdev/gfx/greekrough.png | Bin 0 -> 159 bytes c/proofdev/gfx/horiz.png | Bin 0 -> 952 bytes c/proofdev/gfx/icon-i.png | Bin 0 -> 828 bytes c/proofdev/gfx/icon-n.png | Bin 0 -> 947 bytes c/proofdev/gfx/igreek.png | Bin 0 -> 7953 bytes c/proofdev/gfx/quit.png | Bin 0 -> 1031 bytes c/proofdev/gfx/returnpage.png | Bin 0 -> 1150 bytes c/proofdev/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/proofdev/gfx/savenxt.png | Bin 0 -> 1136 bytes c/proofdev/gfx/savequit.png | Bin 0 -> 1087 bytes c/proofdev/gfx/savetmp.png | Bin 0 -> 967 bytes c/proofdev/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/proofdev/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/proofdev/gfx/tags/bold.png | Bin 0 -> 377 bytes c/proofdev/gfx/tags/caps.png | Bin 0 -> 471 bytes c/proofdev/gfx/tags/exit.png | Bin 0 -> 493 bytes c/proofdev/gfx/tags/greek.png | Bin 0 -> 522 bytes c/proofdev/gfx/tags/help.png | Bin 0 -> 436 bytes c/proofdev/gfx/tags/italic.png | Bin 0 -> 336 bytes c/proofdev/gfx/tags/sub.png | Bin 0 -> 340 bytes c/proofdev/gfx/tags/sup.png | Bin 0 -> 338 bytes c/proofdev/gfx/tags/underline.png | Bin 0 -> 356 bytes c/proofdev/gfx/up.jpg | Bin 0 -> 723 bytes c/proofdev/gfx/up.png | Bin 0 -> 508 bytes c/proofdev/gfx/vert.png | Bin 0 -> 954 bytes c/proofdev/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/proofdev/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/proofdev/processpage.php | 84 + c/proofdev/proof.php | 76 + c/proofdev/proof_frame.php | 636 ++ c/proofdev/proofpage.css | 383 + c/proofdev/proofpage.css.bak | 380 + c/proofdev/proofpage.js | 2873 ++++++ c/proofdev/proofpage.js.bak | 2862 ++++++ c/proofdev/proofpage.php | 504 + c/proofdev/wctest.php | 56 + c/proofpage.js | 2494 +++++ c/pt.inc | 439 + c/quals/candidate.php | 104 + c/quals/evaluator.php | 0 c/quals/qual_loader.php | 50 + c/quals/qualmaster.php | 31 + c/query.php | 20 + c/quick.php | 32 + c/quiz/cross.png | Bin 0 -> 940 bytes c/quiz/generic/hints.php | 28 + c/quiz/generic/main.php | 20 + c/quiz/generic/orig.php | 13 + c/quiz/generic/proof.php | 60 + c/quiz/generic/quiz_defaults.inc | 11 + c/quiz/generic/quiz_fixedtexts.inc | 9 + c/quiz/generic/returnfeed.php | 236 + c/quiz/generic/right.php | 8 + c/quiz/quiz_proof.php | 55 + c/quiz/small_theme.inc | 48 + c/quiz/start.php | 55 + c/quiz/tick.png | Bin 0 -> 684 bytes c/quiz/tuts/tut1.php | 71 + c/quiz/tuts/tut2.php | 42 + c/quiz/tuts/tut3.php | 44 + c/quiz/tuts/tut4.php | 45 + c/quiz/tuts/tut5.php | 68 + c/regex.txt | 245 + c/role_list.php | 34 + c/s.php | 480 + c/sample/Usertest.php | 1018 ++ c/sample/f_prep_ereg_headers.inc | 18 + c/sample/f_prep_text_scanos.inc | 10 + c/sample/preptxt.pl | 3737 +++++++ c/sample/readme.txt | 8 + c/sample/shift_range.php | 213 + c/sample/tif2png.php | 83 + c/sample/v_ereg_latin1.inc | 26 + c/sample/v_prep_easy_errors.inc | 145 + c/sample/v_prep_text_hyphens.inc | 45 + c/sample/v_prep_text_scanos_0_m.inc | 1998 ++++ c/sample/v_prep_text_scanos_n_z.inc | 1423 +++ c/search.php | 411 + c/search2.php | 468 + c/spaceyquotes.php | 42 + c/stats/PPV_avail.php | 109 + c/stats/PP_unknown.php | 70 + c/stats/checkedout.php | 68 + c/stats/dump_pagestats.php | 5 + c/stats/faq_data.php | 47 + c/stats/includes/common.inc | 23 + .../average_hour_users_logging_on.php | 33 + c/stats/jpgraph_files/common.inc | 408 + .../jpgraph_files/cumulative_month_proj.php | 57 + .../cumulative_total_proj_graph.php | 41 + .../cumulative_total_proj_summary_graph.php | 95 + c/stats/jpgraph_files/curr_month_proj.php | 52 + c/stats/jpgraph_files/pages_daily.php | 109 + .../jpgraph_files/percent_users_who_proof.php | 47 + c/stats/jpgraph_files/pie.inc | 38 + c/stats/jpgraph_files/tallyboard_deltas.php | 72 + .../total_pages_by_month_graph.php | 40 + c/stats/jpgraph_files/total_proj_graph.php | 40 + c/stats/jpgraph_files/users_by_country.php | 22 + c/stats/jpgraph_files/users_by_language.php | 27 + .../jpgraph_files/users_by_month_joined.php | 103 + .../users_by_pages_proofed_graph.php | 139 + c/stats/jpgraph_files/users_logging_on.php | 106 + c/stats/members/daily_counts.php | 109 + c/stats/members/jointeam.php | 137 + c/stats/members/mbr_list.php | 138 + c/stats/members/mbr_xml.php | 79 + c/stats/members/member.inc | 119 + c/stats/members/member_stats.php | 199 + c/stats/members/memberstats.xsd | 123 + c/stats/members/quitteam.php | 16 + c/stats/misc_stats1.php | 205 + c/stats/misc_user_stats.php | 19 + c/stats/pages_proofed_graphs.php | 143 + c/stats/pm_stats.php | 52 + c/stats/pp_stats.php | 86 + c/stats/ppv_stats.php | 38 + c/stats/projects_Xed_graphs.php | 27 + c/stats/proof_stats.php | 44 + c/stats/release_queue.php | 162 + c/stats/renewals_status.php | 218 + c/stats/requested_books.php | 77 + c/stats/software.php | 182 + c/stats/statestats.inc | 79 + c/stats/statestats.php | 93 + c/stats/stats.png | Bin 0 -> 3791 bytes c/stats/stats_central.php | 203 + c/stats/target.png | Bin 0 -> 4670 bytes c/stats/teams/new_team.php | 47 + c/stats/teams/tdetail.php | 231 + c/stats/teams/team.inc | 27 + c/stats/teams/team_round_counts.php | 42 + c/stats/teams/team_topic.php | 58 + c/stats/teams/teamlist.php | 99 + c/stats/teams/teams_xml.php | 102 + c/stats/teams/teamstats.xsd | 122 + c/stats/teams/tedit.php | 109 + c/stats/teams/tlist.php | 169 + c/stats/temp_PM_stats.php | 29 + c/stats/to_be_released.php | 66 + c/stats/user_logon_stats.php | 101 + c/tasks.php | 18 + c/test.json.js | 43 + c/textsrv.php | 29 + c/tools/DAvid.php | 123 + c/tools/active_projects.php | 74 + c/tools/anomalies.php | 80 + c/tools/bad.php | 70 + c/tools/bots.php | 26 + c/tools/change_sr_commitment.php | 33 + c/tools/cleanup.php | 122 + c/tools/dancer.php | 64 + c/tools/download_images.php | 57 + c/tools/edittext.php | 28 + c/tools/generic.php | 45 + c/tools/guiprep.php | 193 + c/tools/holds.php | 74 + c/tools/logout.php | 11 + c/tools/main.css | 120 + c/tools/newsletter_stats.php | 17 + c/tools/oldprojects.php | 63 + c/tools/p1counts.php | 24 + c/tools/p1release.php | 157 + c/tools/pending_access_requests.php | 153 + c/tools/pool.php | 312 + c/tools/post_proofers/pp_cruiser.php | 452 + c/tools/post_proofers/ppv_report.php | 394 + c/tools/post_proofers/smooth_reading.php | 136 + c/tools/posted.php | 44 + c/tools/pp.php | 185 + c/tools/pp_artifacts.php | 54 + c/tools/pp_or_ppv.php | 64 + c/tools/pper.php | 137 + c/tools/pper0.php | 151 + c/tools/ppv.php | 511 + c/tools/prep.php | 159 + c/tools/projdiff.php | 71 + c/tools/project_manager/DifferenceEngine.inc | 1142 +++ c/tools/project_manager/DifferenceEngine.php | 1987 ++++ .../DifferenceEngineWrapper.inc | 185 + .../DifferenceEngineWrapper.php | 185 + c/tools/project_manager/add_files.php | 863 ++ c/tools/project_manager/createproject.php | 107 + c/tools/project_manager/diff.php | 221 + c/tools/project_manager/displayimage.php | 195 + c/tools/project_manager/downloadproofed.php | 32 + c/tools/project_manager/dpdiff.css | 91 + c/tools/project_manager/dpdiff.js | 38 + c/tools/project_manager/edit_common.inc | 284 + c/tools/project_manager/edit_pages.php | 73 + c/tools/project_manager/editproject.php | 420 + c/tools/project_manager/handle_bad_page.php | 170 + c/tools/project_manager/image_source_edit.php | 192 + c/tools/project_manager/image_sources.php | 83 + .../project_manager/manage_image_sources.php | 645 ++ c/tools/project_manager/page_table.inc | 605 ++ c/tools/project_manager/pagedetail.php | 551 + c/tools/project_manager/pagelist.php | 303 + c/tools/project_manager/pagelog.php | 105 + c/tools/project_manager/post_files.inc | 369 + c/tools/project_manager/projectmgr.inc | 77 + c/tools/project_manager/projectmgr.php | 282 + .../project_manager/show_image_sources.php | 211 + c/tools/project_manager/show_specials.php | 42 + c/tools/project_manager/showimagesources.php | 222 + c/tools/project_manager/user_roles.php | 297 + c/tools/project_topic_anomalies.php | 40 + c/tools/proof.php | 109 + c/tools/proofers/button_menu.inc | 92 + c/tools/proofers/ctrl_frame.php | 145 + c/tools/proofers/ctrlframe.php | 100 + c/tools/proofers/dp_proof.js | 477 + c/tools/proofers/dp_scroll.js | 187 + c/tools/proofers/dpctls.bak.php | 102 + c/tools/proofers/dpspell.js | 14 + c/tools/proofers/for_mentors.php | 185 + c/tools/proofers/gfx/a1_down.png | Bin 0 -> 300 bytes c/tools/proofers/gfx/a1_left.png | Bin 0 -> 303 bytes c/tools/proofers/gfx/a1_right.png | Bin 0 -> 301 bytes c/tools/proofers/gfx/a1_up.png | Bin 0 -> 304 bytes c/tools/proofers/gfx/a2_down.png | Bin 0 -> 296 bytes c/tools/proofers/gfx/a2_left.png | Bin 0 -> 303 bytes c/tools/proofers/gfx/a2_right.png | Bin 0 -> 301 bytes c/tools/proofers/gfx/a2_up.png | Bin 0 -> 304 bytes c/tools/proofers/gfx/bad.png | Bin 0 -> 1801 bytes c/tools/proofers/gfx/broken.png | Bin 0 -> 1762 bytes c/tools/proofers/gfx/bt1.png | Bin 0 -> 509 bytes c/tools/proofers/gfx/bt10.png | Bin 0 -> 808 bytes c/tools/proofers/gfx/bt11.png | Bin 0 -> 439 bytes c/tools/proofers/gfx/bt12.png | Bin 0 -> 719 bytes c/tools/proofers/gfx/bt13.png | Bin 0 -> 639 bytes c/tools/proofers/gfx/bt14.png | Bin 0 -> 685 bytes c/tools/proofers/gfx/bt15.png | Bin 0 -> 739 bytes c/tools/proofers/gfx/bt16.png | Bin 0 -> 823 bytes c/tools/proofers/gfx/bt17.png | Bin 0 -> 755 bytes c/tools/proofers/gfx/bt18.png | Bin 0 -> 734 bytes c/tools/proofers/gfx/bt1_n.png | Bin 0 -> 502 bytes c/tools/proofers/gfx/bt2.png | Bin 0 -> 701 bytes c/tools/proofers/gfx/bt3.png | Bin 0 -> 372 bytes c/tools/proofers/gfx/bt4.png | Bin 0 -> 321 bytes c/tools/proofers/gfx/bt5.png | Bin 0 -> 332 bytes c/tools/proofers/gfx/bt6.png | Bin 0 -> 868 bytes c/tools/proofers/gfx/bt7.png | Bin 0 -> 854 bytes c/tools/proofers/gfx/bt7_n.png | Bin 0 -> 843 bytes c/tools/proofers/gfx/bt8.png | Bin 0 -> 899 bytes c/tools/proofers/gfx/bt9.png | Bin 0 -> 742 bytes c/tools/proofers/gfx/greek.png | Bin 0 -> 7979 bytes c/tools/proofers/gfx/greekrough.png | Bin 0 -> 159 bytes c/tools/proofers/gfx/horiz.png | Bin 0 -> 952 bytes c/tools/proofers/gfx/icon-i.png | Bin 0 -> 828 bytes c/tools/proofers/gfx/icon-n.png | Bin 0 -> 947 bytes c/tools/proofers/gfx/igreek.png | Bin 0 -> 7953 bytes c/tools/proofers/gfx/quit.png | Bin 0 -> 1031 bytes c/tools/proofers/gfx/returnpage.png | Bin 0 -> 1150 bytes c/tools/proofers/gfx/rtnpg.png | Bin 0 -> 1150 bytes c/tools/proofers/gfx/savenxt.png | Bin 0 -> 1136 bytes c/tools/proofers/gfx/savequit.png | Bin 0 -> 1087 bytes c/tools/proofers/gfx/savetmp.png | Bin 0 -> 967 bytes c/tools/proofers/gfx/tags/bar1.png | Bin 0 -> 2257 bytes c/tools/proofers/gfx/tags/bar2.png | Bin 0 -> 2469 bytes c/tools/proofers/gfx/tags/bold.png | Bin 0 -> 377 bytes c/tools/proofers/gfx/tags/caps.png | Bin 0 -> 471 bytes c/tools/proofers/gfx/tags/exit.png | Bin 0 -> 493 bytes c/tools/proofers/gfx/tags/greek.png | Bin 0 -> 522 bytes c/tools/proofers/gfx/tags/help.png | Bin 0 -> 436 bytes c/tools/proofers/gfx/tags/italic.png | Bin 0 -> 336 bytes c/tools/proofers/gfx/tags/sub.png | Bin 0 -> 340 bytes c/tools/proofers/gfx/tags/sup.png | Bin 0 -> 338 bytes c/tools/proofers/gfx/tags/underline.png | Bin 0 -> 356 bytes c/tools/proofers/gfx/vert.png | Bin 0 -> 954 bytes c/tools/proofers/gfx/wchk-off.png | Bin 0 -> 1121 bytes c/tools/proofers/gfx/wchk-on.png | Bin 0 -> 1088 bytes c/tools/proofers/greek2ascii.html | 160 + c/tools/proofers/greek2ascii.php | 177 + c/tools/proofers/image_frame_std.php | 34 + c/tools/proofers/images_index.php | 43 + c/tools/proofers/iprocesstext.php | 88 + c/tools/proofers/iproof.bak.php | 438 + c/tools/proofers/itctrlframe.php | 112 + c/tools/proofers/itproof.php | 72 + c/tools/proofers/itproof_frame.php | 631 ++ c/tools/proofers/itproofpage.php | 617 ++ c/tools/proofers/mktable.php | 215 + c/tools/proofers/morenonascii.php | 108 + c/tools/proofers/my.php | 306 + c/tools/proofers/my_projects.php | 416 + c/tools/proofers/pnonascii.inc | 35 + c/tools/proofers/posted_notice.php | 33 + c/tools/proofers/ppage.php | 427 + c/tools/proofers/processpage.php | 85 + c/tools/proofers/processtext.php | 211 + c/tools/proofers/proctext.php | 158 + c/tools/proofers/project_topic.php | 47 + c/tools/proofers/proof.php | 114 + c/tools/proofers/proof_frame.inc | 25 + c/tools/proofers/proof_frame.php | 56 + c/tools/proofers/proof_frame_enh.inc | 334 + c/tools/proofers/proof_frame_std.inc | 54 + c/tools/proofers/proof_page.php | 47 + c/tools/proofers/proof_page_enh.php | 314 + c/tools/proofers/proofpage.css | 374 + c/tools/proofers/proofpage.js | 2759 +++++ c/tools/proofers/proofpage.php | 432 + c/tools/proofers/r.php | 53 + c/tools/proofers/report_bad_page.php | 11 + c/tools/proofers/review_work.php | 164 + c/tools/proofers/round.php | 155 + c/tools/proofers/rshell.php | 93 + c/tools/proofers/spellcheck.inc | 255 + c/tools/proofers/spellcheck.php | 354 + c/tools/proofers/spellcheck.php.bak | 348 + c/tools/proofers/spellcheck_text.inc | 415 + c/tools/proofers/srchrep.php | 297 + c/tools/proofers/text_frame_std.php | 184 + c/tools/proofers/toolbox.inc | 505 + c/tools/proofers/wordcheck.inc | 355 + c/tools/qc.php | 246 + c/tools/quals/qual.php | 164 + c/tools/quals/qualpages.php | 56 + c/tools/quals/qualproof.php | 38 + c/tools/regexercise.php | 84 + c/tools/request_access.php | 111 + c/tools/round.php | 63 + c/tools/setlangcookie.php | 4 + c/tools/shell.php | 29 + c/tools/site_admin/displayrandrules.php | 26 + c/tools/site_admin/hold_roles.php | 107 + c/tools/site_admin/newsedit.php | 346 + c/tools/site_admin/personnel.php | 84 + c/tools/site_admin/proj_approvals.php | 102 + c/tools/site_admin/projectlength.php | 60 + c/tools/site_admin/shared_postednums.php | 38 + c/tools/site_admin/sitenews.php | 358 + c/tools/site_admin/stats_repair.php | 60 + c/tools/site_admin/user_roles.php | 198 + c/tools/t.php | 622 ++ c/tools/trace.php | 561 + c/tools/udb_user.php | 9 + c/tools/upload.css | 120 + c/tools/upload.html | 55 + c/tools/upload.js | 196 + c/tools/upload.php | 17 + c/tools/upload_text.php | 251 + c/tools/zip_images.php | 24 + c/update_user_counts.php | 63 + c/uploads/sandbag-tutorial.html | 349 + c/uploads/sandbag-tutorial.pdf | Bin 0 -> 236463 bytes c/upwidget.php | 99 + c/user_pages.php | 220 + c/usernames.php | 20 + c/userprefs.php | 878 ++ c/vtest.php | 74 + c/wc.php | 281 + c/wc/project_words.php | 347 + c/wc/scannos.php | 3514 +++++++ c/wc/scannos.txt | 203 + c/wc/wcontext.php | 200 + c/wc/wdiff.php | 43 + c/wc/word_freq_table.php | 139 + c/wc/wordcheck/en.bad.txt | 3427 +++++++ c/wc/wordcheck/en.good.txt | 116 + c/wc/wordcontext.php | 244 + c/wc/wordcontext.php~ | 203 + c/word/proofpage.css | 377 + c/word/proofpage.css.bak | 377 + c/word/proofpage.js | 2912 ++++++ c/word/proofpage.php | 511 + c/wp.php | 50 + c/wpajax.php | 90 + c/wpinsert.php | 64 + index.php | 17 + 1565 files changed, 240765 insertions(+) create mode 100644 Diff/Diff.php create mode 100644 Diff/Diff/Engine/native.php create mode 100644 Diff/Diff/Engine/shell.php create mode 100644 Diff/Diff/Engine/string.php create mode 100644 Diff/Diff/Engine/xdiff.php create mode 100644 Diff/Diff/Mapped.php create mode 100644 Diff/Diff/Renderer.php create mode 100644 Diff/Diff/Renderer/context.php create mode 100644 Diff/Diff/Renderer/inline.php create mode 100644 Diff/Diff/Renderer/unified.php create mode 100644 Diff/Diff/ThreeWay.php create mode 100644 Diff/Diff3.php create mode 100644 Diff/docs/examples/1.txt create mode 100644 Diff/docs/examples/2.txt create mode 100644 Diff/docs/examples/diff.php create mode 100644 Diff/tests/1.txt create mode 100644 Diff/tests/2.txt create mode 100644 Diff/tests/3.txt create mode 100644 Diff/tests/4.txt create mode 100644 Diff/tests/5.txt create mode 100644 Diff/tests/6.txt create mode 100644 Diff/tests/context.patch create mode 100644 Diff/tests/context.phpt create mode 100644 Diff/tests/context2.phpt create mode 100644 Diff/tests/diff.phpt create mode 100644 Diff/tests/inline.phpt create mode 100644 Diff/tests/inline2.phpt create mode 100644 Diff/tests/pear_bug12740.phpt create mode 100644 Diff/tests/pear_bug4879.phpt create mode 100644 Diff/tests/pear_bug6251.phpt create mode 100644 Diff/tests/pear_bug6428.phpt create mode 100644 Diff/tests/string.phpt create mode 100644 Diff/tests/unified.patch create mode 100644 Diff/tests/unified.phpt create mode 100644 Diff/tests/unified2.phpt create mode 100644 Diff/tests/xdiff.phpt create mode 100644 c/.idea/.name create mode 100644 c/.idea/c.iml create mode 100644 c/.idea/encodings.xml create mode 100644 c/.idea/inspectionProfiles/Project_Default.xml create mode 100644 c/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 c/.idea/misc.xml create mode 100644 c/.idea/modules.xml create mode 100644 c/.idea/scopes/scope_settings.xml create mode 100644 c/.idea/vcs.xml create mode 100644 c/.idea/workspace.xml create mode 100644 c/a.php create mode 100644 c/accounts/login.php create mode 100644 c/accounts/signin.php create mode 100644 c/activity_hub.php create mode 100644 c/ad_hoc.php create mode 100644 c/adhoc.html create mode 100644 c/admin.php create mode 100644 c/ah.php create mode 100644 c/backlog.php create mode 100644 c/browse.php create mode 100644 c/c.php create mode 100644 c/charfreq.php create mode 100644 c/chart.php create mode 100644 c/cmonth.php create mode 100644 c/common/DpDiff.class.php create mode 100644 c/common/hyphenation.php create mode 100644 c/common/p2p3diff.php create mode 100644 c/common/prooftester.php create mode 100644 c/common/scanno_regex.php create mode 100644 c/crontab2/TallyBoard.inc create mode 100644 c/crontab2/archive_projects.php create mode 100644 c/crontab2/connect.inc create mode 100644 c/crontab2/dpsql.inc create mode 100644 c/crontab2/extend_site_tally_goals.php create mode 100644 c/crontab2/import_pg_catalog.php create mode 100644 c/crontab2/inactivate_users.php create mode 100644 c/crontab2/log_project_states.php create mode 100644 c/crontab2/maybe_mail.inc create mode 100644 c/crontab2/misc.inc create mode 100644 c/crontab2/notify_old_pp.php create mode 100644 c/crontab2/notify_users.php create mode 100644 c/crontab2/onoff_special_event_queues.php create mode 100644 c/crontab2/pgdpcanada.cron create mode 100644 c/crontab2/project_events.inc create mode 100644 c/crontab2/project_states.inc create mode 100644 c/crontab2/site_vars old.php create mode 100644 c/crontab2/site_vars.php create mode 100644 c/crontab2/take_tally_snapshots.php create mode 100644 c/crontab2/udb_user.php create mode 100644 c/crontab2/update_ppers.php create mode 100644 c/crontab2/update_user_birthdays.php create mode 100644 c/crontab2/update_user_counts.php create mode 100644 c/css/context.css create mode 100644 c/css/context2.css create mode 100644 c/css/ctlbar.css create mode 100644 c/css/dp.css create mode 100644 c/css/filemaster.css create mode 100644 c/css/ppage.css create mode 100644 c/css/proofpage.css create mode 100644 c/default.php create mode 100644 c/descen.zip create mode 100644 c/dkretz/ahmic/processpage.php create mode 100644 c/dkretz/ahmic/proofpage.js create mode 100644 c/dkretz/gfx/a1_down.png create mode 100644 c/dkretz/gfx/a1_left.png create mode 100644 c/dkretz/gfx/a1_right.png create mode 100644 c/dkretz/gfx/a1_up.png create mode 100644 c/dkretz/gfx/a2_down.png create mode 100644 c/dkretz/gfx/a2_left.png create mode 100644 c/dkretz/gfx/a2_right.png create mode 100644 c/dkretz/gfx/a2_up.png create mode 100644 c/dkretz/gfx/bad.png create mode 100644 c/dkretz/gfx/broken.png create mode 100644 c/dkretz/gfx/bt1.png create mode 100644 c/dkretz/gfx/bt10.png create mode 100644 c/dkretz/gfx/bt11.png create mode 100644 c/dkretz/gfx/bt12.png create mode 100644 c/dkretz/gfx/bt13.png create mode 100644 c/dkretz/gfx/bt14.png create mode 100644 c/dkretz/gfx/bt15.png create mode 100644 c/dkretz/gfx/bt16.png create mode 100644 c/dkretz/gfx/bt17.png create mode 100644 c/dkretz/gfx/bt18.png create mode 100644 c/dkretz/gfx/bt1_n.png create mode 100644 c/dkretz/gfx/bt2.png create mode 100644 c/dkretz/gfx/bt3.png create mode 100644 c/dkretz/gfx/bt4.png create mode 100644 c/dkretz/gfx/bt5.png create mode 100644 c/dkretz/gfx/bt6.png create mode 100644 c/dkretz/gfx/bt7.png create mode 100644 c/dkretz/gfx/bt7_n.png create mode 100644 c/dkretz/gfx/bt8.png create mode 100644 c/dkretz/gfx/bt9.png create mode 100644 c/dkretz/gfx/down.jpg create mode 100644 c/dkretz/gfx/down.png create mode 100644 c/dkretz/gfx/greek.png create mode 100644 c/dkretz/gfx/greekrough.png create mode 100644 c/dkretz/gfx/horiz.png create mode 100644 c/dkretz/gfx/icon-i.png create mode 100644 c/dkretz/gfx/icon-n.png create mode 100644 c/dkretz/gfx/igreek.png create mode 100644 c/dkretz/gfx/quit.png create mode 100644 c/dkretz/gfx/returnpage.png create mode 100644 c/dkretz/gfx/rtnpg.png create mode 100644 c/dkretz/gfx/savenxt.png create mode 100644 c/dkretz/gfx/savequit.png create mode 100644 c/dkretz/gfx/savetmp.png create mode 100644 c/dkretz/gfx/tags/bar1.png create mode 100644 c/dkretz/gfx/tags/bar2.png create mode 100644 c/dkretz/gfx/tags/bold.png create mode 100644 c/dkretz/gfx/tags/caps.png create mode 100644 c/dkretz/gfx/tags/exit.png create mode 100644 c/dkretz/gfx/tags/greek.png create mode 100644 c/dkretz/gfx/tags/help.png create mode 100644 c/dkretz/gfx/tags/italic.png create mode 100644 c/dkretz/gfx/tags/sub.png create mode 100644 c/dkretz/gfx/tags/sup.png create mode 100644 c/dkretz/gfx/tags/underline.png create mode 100644 c/dkretz/gfx/up.jpg create mode 100644 c/dkretz/gfx/up.png create mode 100644 c/dkretz/gfx/vert.png create mode 100644 c/dkretz/gfx/wchk-off.png create mode 100644 c/dkretz/gfx/wchk-on.png create mode 100644 c/dkretz/processpage.php create mode 100644 c/dkretz/proofpage.css create mode 100644 c/dkretz/proofpage.js create mode 100644 c/dkretz/proofpage.php create mode 100644 c/email.php create mode 100644 c/error_page.php create mode 100644 c/faq/.idea/.name create mode 100644 c/faq/.idea/encodings.xml create mode 100644 c/faq/.idea/faq.iml create mode 100644 c/faq/.idea/inspectionProfiles/Project_Default.xml create mode 100644 c/faq/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 c/faq/.idea/misc.xml create mode 100644 c/faq/.idea/modules.xml create mode 100644 c/faq/.idea/scopes/scope_settings.xml create mode 100644 c/faq/.idea/vcs.xml create mode 100644 c/faq/.idea/workspace.xml create mode 100644 c/faq/BBEditscript.sit create mode 100644 c/faq/DPCustomMono2.ttf create mode 100644 c/faq/DPflow.php create mode 100644 c/faq/FAQ_Formatting_Guide.txt create mode 100644 c/faq/FineReader_folders.png create mode 100644 c/faq/OLDfaq_central.php create mode 100644 c/faq/ORIGINALproofreading_guidelines_francaises.php create mode 100644 c/faq/ProoferFAQ.php create mode 100644 c/faq/Wordmacro.html create mode 100644 c/faq/bquote.png create mode 100644 c/faq/chap1.png create mode 100644 c/faq/charapp.pdf create mode 100644 c/faq/charapp.sxw create mode 100644 c/faq/charwin.pdf create mode 100644 c/faq/charwin.sxw create mode 100644 c/faq/cp.php create mode 100644 c/faq/default.php create mode 100644 c/faq/dev_process.php create mode 100644 c/faq/doc-copy.php create mode 100644 c/faq/doc-ency.php create mode 100644 c/faq/doc-poet.php create mode 100644 c/faq/dochist.php create mode 100644 c/faq/document.php create mode 100644 c/faq/documentold.php create mode 100644 c/faq/download.php create mode 100644 c/faq/dpf.php create mode 100644 c/faq/emdash.png create mode 100644 c/faq/faq_central.php create mode 100644 c/faq/faq_centralOLD2.php create mode 100644 c/faq/feeds_sdk/index.php create mode 100644 c/faq/feeds_sdk/output_js.png create mode 100644 c/faq/fi4340c.jpg create mode 100644 c/faq/font_sample.php create mode 100644 c/faq/foot.png create mode 100644 c/faq/formatting_guidelines_francaises.php create mode 100644 c/faq/formatting_guidelines_portuguese.php create mode 100644 c/faq/formatting_summary.sxw create mode 100644 c/faq/greek5.gif create mode 100644 c/faq/greek6.gif create mode 100644 c/faq/gutcheck-0.95.sit create mode 100644 c/faq/illust.png create mode 100644 c/faq/illust2.png create mode 100644 c/faq/images/Arial_A.gif create mode 100644 c/faq/images/Arial_B.gif create mode 100644 c/faq/images/Arial_C.gif create mode 100644 c/faq/images/Courier_A.gif create mode 100644 c/faq/images/Courier_B.gif create mode 100644 c/faq/images/Courier_C.gif create mode 100644 c/faq/images/DPCustomMono2_A.gif create mode 100644 c/faq/images/DPCustomMono2_B.gif create mode 100644 c/faq/images/DPCustomMono2_C.gif create mode 100644 c/faq/images/Lucida_A.gif create mode 100644 c/faq/images/Lucida_B.gif create mode 100644 c/faq/images/Lucida_C.gif create mode 100644 c/faq/images/Original.gif create mode 100644 c/faq/images/Original_A.gif create mode 100644 c/faq/images/Original_B.gif create mode 100644 c/faq/images/Original_C.gif create mode 100644 c/faq/images/Times_A.gif create mode 100644 c/faq/images/Times_B.gif create mode 100644 c/faq/images/Times_C.gif create mode 100644 c/faq/letter.png create mode 100644 c/faq/longabsent.php create mode 100644 c/faq/olddoc14.html create mode 100644 c/faq/play1.png create mode 100644 c/faq/play2.png create mode 100644 c/faq/play3.png create mode 100644 c/faq/play4.png create mode 100644 c/faq/pm-faq.php create mode 100644 c/faq/poetry.png create mode 100644 c/faq/pophelp/prefs/set.html create mode 100644 c/faq/pophelp/prefs/set_align.html create mode 100644 c/faq/pophelp/prefs/set_auto_thread.html create mode 100644 c/faq/pophelp/prefs/set_creditname.html create mode 100644 c/faq/pophelp/prefs/set_creditswanted.html create mode 100644 c/faq/pophelp/prefs/set_email.html create mode 100644 c/faq/pophelp/prefs/set_facetype.html create mode 100644 c/faq/pophelp/prefs/set_h_fontface.html create mode 100644 c/faq/pophelp/prefs/set_h_fontsize.html create mode 100644 c/faq/pophelp/prefs/set_h_scroll.html create mode 100644 c/faq/pophelp/prefs/set_h_textlength.html create mode 100644 c/faq/pophelp/prefs/set_h_textlines.html create mode 100644 c/faq/pophelp/prefs/set_h_textsize.html create mode 100644 c/faq/pophelp/prefs/set_h_wrap.html create mode 100644 c/faq/pophelp/prefs/set_h_zoom.html create mode 100644 c/faq/pophelp/prefs/set_horzprefs.html create mode 100644 c/faq/pophelp/prefs/set_intlang.html create mode 100644 c/faq/pophelp/prefs/set_lang.html create mode 100644 c/faq/pophelp/prefs/set_layout.html create mode 100644 c/faq/pophelp/prefs/set_name.html create mode 100644 c/faq/pophelp/prefs/set_neighbors.html create mode 100644 c/faq/pophelp/prefs/set_newwindow.html create mode 100644 c/faq/pophelp/prefs/set_password.html create mode 100644 c/faq/pophelp/prefs/set_pmdefault.html create mode 100644 c/faq/pophelp/prefs/set_pmto_post.html create mode 100644 c/faq/pophelp/prefs/set_privacy.html create mode 100644 c/faq/pophelp/prefs/set_profilename.html create mode 100644 c/faq/pophelp/prefs/set_screenres.html create mode 100644 c/faq/pophelp/prefs/set_showspecialcolors.html create mode 100644 c/faq/pophelp/prefs/set_statusbar.html create mode 100644 c/faq/pophelp/prefs/set_switch.html create mode 100644 c/faq/pophelp/prefs/set_theme.html create mode 100644 c/faq/pophelp/prefs/set_toolbar.html create mode 100644 c/faq/pophelp/prefs/set_topten.html create mode 100644 c/faq/pophelp/prefs/set_updates.html create mode 100644 c/faq/pophelp/prefs/set_v_fontface.html create mode 100644 c/faq/pophelp/prefs/set_v_fontsize.html create mode 100644 c/faq/pophelp/prefs/set_v_scroll.html create mode 100644 c/faq/pophelp/prefs/set_v_textlength.html create mode 100644 c/faq/pophelp/prefs/set_v_textlines.html create mode 100644 c/faq/pophelp/prefs/set_v_textsize.html create mode 100644 c/faq/pophelp/prefs/set_v_wrap.html create mode 100644 c/faq/pophelp/prefs/set_v_zoom.html create mode 100644 c/faq/pophelp/prefs/set_vertprefs.html create mode 100644 c/faq/pophelp/project_manager/biography.html create mode 100644 c/faq/pophelp/project_manager/template.html create mode 100644 c/faq/pophelp/teams/edit_teamavatar.html create mode 100644 c/faq/pophelp/teams/edit_teamdesc.html create mode 100644 c/faq/pophelp/teams/edit_teamicon.html create mode 100644 c/faq/pophelp/teams/edit_teamname.html create mode 100644 c/faq/pophelp/teams/edit_teamwebpage.html create mode 100644 c/faq/post_proof.php create mode 100644 c/faq/ppv.php create mode 100644 c/faq/ppv_report.txt create mode 100644 c/faq/ppvold.php create mode 100644 c/faq/privacy.php create mode 100644 c/faq/project_workflow.png create mode 100644 c/faq/prooffacehelp.php create mode 100644 c/faq/proofing_summary.sxw create mode 100644 c/faq/proofreading_guidelines.php create mode 100644 c/faq/proofreading_guidelines_francaises.php create mode 100644 c/faq/proofreading_guidelines_portuguese.php create mode 100644 c/faq/proofreading_guidelines_spanish.php create mode 100644 c/faq/proofreading_guidelinesold.php create mode 100644 c/faq/proofreading_guidelinesold2.php create mode 100644 c/faq/scanning.php create mode 100644 c/faq/side.png create mode 100644 c/faq/simple_proof_rules.php create mode 100644 c/faq/stealth_scannos_eng_common.txt create mode 100644 c/faq/stealth_scannos_eng_rare.txt create mode 100644 c/faq/stealth_scannos_eng_suspect.txt create mode 100644 c/faq/stealth_scannos_es_common.txt create mode 100644 c/faq/stealth_scannos_fr_common.txt create mode 100644 c/faq/stealth_scannos_fr_rare.txt create mode 100644 c/faq/stealth_scannos_fr_suspect.txt create mode 100644 c/faq/stealth_scannos_ger_common.txt create mode 100644 c/faq/stealth_scannos_ger_rare.txt create mode 100644 c/faq/stealth_scannos_ger_suspect.txt create mode 100644 c/faq/summary18NL.pdf create mode 100644 c/faq/table1.png create mode 100644 c/faq/table2.png create mode 100644 c/faq/tablec.png create mode 100644 c/faq/tbreak.png create mode 100644 c/faq/templates_guide.php create mode 100644 c/faq/title.png create mode 100644 c/faq/translate.php create mode 100644 c/faq/wordcheck-faq.php create mode 100644 c/favicon.ico create mode 100644 c/feeds/backend.php create mode 100644 c/feeds/projects.xsd create mode 100644 c/filemaster.php create mode 100644 c/fixes/frame.php create mode 100644 c/fixes/team_totals.php create mode 100644 c/goal.php create mode 100644 c/graphics/000000.gif create mode 100644 c/graphics/0000FF.gif create mode 100644 c/graphics/00FF00.gif create mode 100644 c/graphics/66CC66.gif create mode 100644 c/graphics/Activity_Hub.jpg create mode 100644 c/graphics/CanadaDay_2011.jpg create mode 100644 c/graphics/E0E0E0.gif create mode 100644 c/graphics/FF0000.gif create mode 100644 c/graphics/a1_down.png create mode 100644 c/graphics/a1_left.png create mode 100644 c/graphics/a1_right.png create mode 100644 c/graphics/a1_up.png create mode 100644 c/graphics/a2_down.png create mode 100644 c/graphics/a2_left.png create mode 100644 c/graphics/a2_right.png create mode 100644 c/graphics/a2_up.png create mode 100644 c/graphics/bad.png create mode 100644 c/graphics/blusync.png create mode 100644 c/graphics/bookshelf500.jpg create mode 100644 c/graphics/bottom.gif create mode 100644 c/graphics/brnsync.png create mode 100644 c/graphics/broken.png create mode 100644 c/graphics/bronze_star.jpg create mode 100644 c/graphics/bt1.png create mode 100644 c/graphics/bt10.png create mode 100644 c/graphics/bt11.png create mode 100644 c/graphics/bt12.png create mode 100644 c/graphics/bt13.png create mode 100644 c/graphics/bt14.png create mode 100644 c/graphics/bt15.png create mode 100644 c/graphics/bt16.png create mode 100644 c/graphics/bt17.png create mode 100644 c/graphics/bt18.png create mode 100644 c/graphics/bt1_n.png create mode 100644 c/graphics/bt2.png create mode 100644 c/graphics/bt3.png create mode 100644 c/graphics/bt4.png create mode 100644 c/graphics/bt5.png create mode 100644 c/graphics/bt6.png create mode 100644 c/graphics/bt7.png create mode 100644 c/graphics/bt7_n.png create mode 100644 c/graphics/bt8.png create mode 100644 c/graphics/bt9.png create mode 100644 c/graphics/center.gif create mode 100644 c/graphics/default_avatar.gif create mode 100644 c/graphics/down.gif create mode 100644 c/graphics/down.jpg create mode 100644 c/graphics/down.png create mode 100644 c/graphics/dpc-logo.png create mode 100644 c/graphics/dpclogo.png create mode 100644 c/graphics/ebookweeklogoweb.gif create mode 100644 c/graphics/gear-24.png create mode 100644 c/graphics/gear.html create mode 100644 c/graphics/genre/art.gif create mode 100644 c/graphics/genre/biography.gif create mode 100644 c/graphics/genre/drama.gif create mode 100644 c/graphics/genre/fiction.gif create mode 100644 c/graphics/genre/geography.gif create mode 100644 c/graphics/genre/historical.gif create mode 100644 c/graphics/genre/history.gif create mode 100644 c/graphics/genre/math.gif create mode 100644 c/graphics/genre/medicine.gif create mode 100644 c/graphics/genre/music.gif create mode 100644 c/graphics/genre/nonfiction.gif create mode 100644 c/graphics/genre/romance.gif create mode 100644 c/graphics/gold_star.jpg create mode 100644 c/graphics/greek.png create mode 100644 c/graphics/greekrough.png create mode 100644 c/graphics/horiz.png create mode 100644 c/graphics/icon-i.png create mode 100644 c/graphics/icon-n.png create mode 100644 c/graphics/icon_newbie.png create mode 100644 c/graphics/icon_pf.png create mode 100644 c/graphics/icon_pm.png create mode 100644 c/graphics/icon_pp.png create mode 100644 c/graphics/icon_ppv.png create mode 100644 c/graphics/icon_proofer.png create mode 100644 c/graphics/icon_sa.png create mode 100644 c/graphics/igreek.png create mode 100644 c/graphics/left.gif create mode 100644 c/graphics/mapleframe.jpg create mode 100644 c/graphics/middle.gif create mode 100644 c/graphics/quit.png create mode 100644 c/graphics/returnpage.png create mode 100644 c/graphics/right.gif create mode 100644 c/graphics/rss.gif create mode 100644 c/graphics/rtnpg.png create mode 100644 c/graphics/save.jpg create mode 100644 c/graphics/save2.jpg create mode 100644 c/graphics/savenxt.png create mode 100644 c/graphics/savequit.png create mode 100644 c/graphics/savetmp.png create mode 100644 c/graphics/silver_star.jpg create mode 100644 c/graphics/tags/bar1.png create mode 100644 c/graphics/tags/bar2.png create mode 100644 c/graphics/tags/bold.png create mode 100644 c/graphics/tags/caps.png create mode 100644 c/graphics/tags/exit.png create mode 100644 c/graphics/tags/greek.png create mode 100644 c/graphics/tags/help.png create mode 100644 c/graphics/tags/italic.png create mode 100644 c/graphics/tags/sub.png create mode 100644 c/graphics/tags/sup.png create mode 100644 c/graphics/tags/underline.png create mode 100644 c/graphics/task_percentages/large_0.png create mode 100644 c/graphics/task_percentages/large_10.png create mode 100644 c/graphics/task_percentages/large_100.png create mode 100644 c/graphics/task_percentages/large_20.png create mode 100644 c/graphics/task_percentages/large_30.png create mode 100644 c/graphics/task_percentages/large_40.png create mode 100644 c/graphics/task_percentages/large_50.png create mode 100644 c/graphics/task_percentages/large_60.png create mode 100644 c/graphics/task_percentages/large_70.png create mode 100644 c/graphics/task_percentages/large_80.png create mode 100644 c/graphics/task_percentages/large_90.png create mode 100644 c/graphics/task_percentages/small_0.png create mode 100644 c/graphics/task_percentages/small_10.png create mode 100644 c/graphics/task_percentages/small_100.png create mode 100644 c/graphics/task_percentages/small_20.png create mode 100644 c/graphics/task_percentages/small_30.png create mode 100644 c/graphics/task_percentages/small_40.png create mode 100644 c/graphics/task_percentages/small_50.png create mode 100644 c/graphics/task_percentages/small_60.png create mode 100644 c/graphics/task_percentages/small_70.png create mode 100644 c/graphics/task_percentages/small_80.png create mode 100644 c/graphics/task_percentages/small_90.png create mode 100644 c/graphics/top.gif create mode 100644 c/graphics/up.gif create mode 100644 c/graphics/up.jpg create mode 100644 c/graphics/up.png create mode 100644 c/graphics/vert.png create mode 100644 c/graphics/wchk-off.png create mode 100644 c/graphics/wchk-on.png create mode 100644 c/graphics/xmascard2009.png create mode 100644 c/graphics/xml.gif create mode 100644 c/holdmaster.php create mode 100644 c/imgsrv.php create mode 100644 c/include/fw.php create mode 100644 c/index.html create mode 100644 c/jpgraph/jpg-config.inc.php create mode 100644 c/js/dg.js create mode 100644 c/js/digraph.js create mode 100644 c/js/dp.js create mode 100644 c/js/dp_ajax.js create mode 100644 c/js/dp_edit.js create mode 100644 c/js/filemaster.js create mode 100644 c/js/itdp_edit.js create mode 100644 c/js/pb.js create mode 100644 c/js/ppage.js create mode 100644 c/js/proofpage.js create mode 100644 c/js/search.js create mode 100644 c/js/sort.js create mode 100644 c/js/sort.js.bak create mode 100644 c/js/sort2.js create mode 100644 c/js/sorttable.js create mode 100644 c/js/wc.js create mode 100644 c/license.txt create mode 100644 c/list_etexts.php create mode 100644 c/list_etexts.php.bak create mode 100644 c/loadsrv.php create mode 100644 c/locale/translators/index.php create mode 100644 c/locale/translators/new_lang.php create mode 100644 c/locale/translators/parse_po.inc create mode 100644 c/locale/translators/save_po.php create mode 100644 c/locale/translators/space.gif create mode 100644 c/log/slow.log.25oct create mode 100644 c/month.php create mode 100644 c/monthly.php create mode 100644 c/onemonth.php create mode 100644 c/pagesrv.php create mode 100644 c/palette.php create mode 100644 c/pennask.bak/.idea/.name create mode 100644 c/pennask.bak/.idea/encodings.xml create mode 100644 c/pennask.bak/.idea/inspectionProfiles/Project_Default.xml create mode 100644 c/pennask.bak/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 c/pennask.bak/.idea/misc.xml create mode 100644 c/pennask.bak/.idea/modules.xml create mode 100644 c/pennask.bak/.idea/pennask.iml create mode 100644 c/pennask.bak/.idea/scopes/scope_settings.xml create mode 100644 c/pennask.bak/.idea/vcs.xml create mode 100644 c/pennask.bak/.idea/workspace.xml create mode 100644 c/pennask.bak/action.php create mode 100644 c/pennask.bak/ctrlframe.php create mode 100644 c/pennask.bak/gfx/a1_down.png create mode 100644 c/pennask.bak/gfx/a1_left.png create mode 100644 c/pennask.bak/gfx/a1_right.png create mode 100644 c/pennask.bak/gfx/a1_up.png create mode 100644 c/pennask.bak/gfx/a2_down.png create mode 100644 c/pennask.bak/gfx/a2_left.png create mode 100644 c/pennask.bak/gfx/a2_right.png create mode 100644 c/pennask.bak/gfx/a2_up.png create mode 100644 c/pennask.bak/gfx/bad.png create mode 100644 c/pennask.bak/gfx/broken.png create mode 100644 c/pennask.bak/gfx/bt1.png create mode 100644 c/pennask.bak/gfx/bt10.png create mode 100644 c/pennask.bak/gfx/bt11.png create mode 100644 c/pennask.bak/gfx/bt12.png create mode 100644 c/pennask.bak/gfx/bt13.png create mode 100644 c/pennask.bak/gfx/bt14.png create mode 100644 c/pennask.bak/gfx/bt15.png create mode 100644 c/pennask.bak/gfx/bt16.png create mode 100644 c/pennask.bak/gfx/bt17.png create mode 100644 c/pennask.bak/gfx/bt18.png create mode 100644 c/pennask.bak/gfx/bt1_n.png create mode 100644 c/pennask.bak/gfx/bt2.png create mode 100644 c/pennask.bak/gfx/bt3.png create mode 100644 c/pennask.bak/gfx/bt4.png create mode 100644 c/pennask.bak/gfx/bt5.png create mode 100644 c/pennask.bak/gfx/bt6.png create mode 100644 c/pennask.bak/gfx/bt7.png create mode 100644 c/pennask.bak/gfx/bt7_n.png create mode 100644 c/pennask.bak/gfx/bt8.png create mode 100644 c/pennask.bak/gfx/bt9.png create mode 100644 c/pennask.bak/gfx/down.jpg create mode 100644 c/pennask.bak/gfx/down.png create mode 100644 c/pennask.bak/gfx/greek.png create mode 100644 c/pennask.bak/gfx/greekrough.png create mode 100644 c/pennask.bak/gfx/horiz.png create mode 100644 c/pennask.bak/gfx/icon-i.png create mode 100644 c/pennask.bak/gfx/icon-n.png create mode 100644 c/pennask.bak/gfx/igreek.png create mode 100644 c/pennask.bak/gfx/quit.png create mode 100644 c/pennask.bak/gfx/returnpage.png create mode 100644 c/pennask.bak/gfx/rtnpg.png create mode 100644 c/pennask.bak/gfx/save.jpg create mode 100644 c/pennask.bak/gfx/save2.jpg create mode 100644 c/pennask.bak/gfx/savenxt.png create mode 100644 c/pennask.bak/gfx/savequit.png create mode 100644 c/pennask.bak/gfx/savetmp.png create mode 100644 c/pennask.bak/gfx/tags/bar1.png create mode 100644 c/pennask.bak/gfx/tags/bar2.png create mode 100644 c/pennask.bak/gfx/tags/bold.png create mode 100644 c/pennask.bak/gfx/tags/caps.png create mode 100644 c/pennask.bak/gfx/tags/exit.png create mode 100644 c/pennask.bak/gfx/tags/greek.png create mode 100644 c/pennask.bak/gfx/tags/help.png create mode 100644 c/pennask.bak/gfx/tags/italic.png create mode 100644 c/pennask.bak/gfx/tags/sub.png create mode 100644 c/pennask.bak/gfx/tags/sup.png create mode 100644 c/pennask.bak/gfx/tags/underline.png create mode 100644 c/pennask.bak/gfx/up.jpg create mode 100644 c/pennask.bak/gfx/up.png create mode 100644 c/pennask.bak/gfx/vert.png create mode 100644 c/pennask.bak/gfx/wchk-off.png create mode 100644 c/pennask.bak/gfx/wchk-on.png create mode 100644 c/pennask.bak/processpage.php create mode 100644 c/pennask.bak/proof.php create mode 100644 c/pennask.bak/proof_frame.php create mode 100644 c/pennask.bak/proofpage.css create mode 100644 c/pennask.bak/proofpage.js create mode 100644 c/pennask.bak/proofpage.php create mode 100644 c/pennask.bak/wctest.php create mode 100644 c/pennask/.idea/.name create mode 100644 c/pennask/.idea/encodings.xml create mode 100644 c/pennask/.idea/inspectionProfiles/Project_Default.xml create mode 100644 c/pennask/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 c/pennask/.idea/misc.xml create mode 100644 c/pennask/.idea/modules.xml create mode 100644 c/pennask/.idea/pennask.iml create mode 100644 c/pennask/.idea/scopes/scope_settings.xml create mode 100644 c/pennask/.idea/vcs.xml create mode 100644 c/pennask/.idea/workspace.xml create mode 100644 c/pennask/action.php create mode 100644 c/pennask/ahmic/processpage.php create mode 100644 c/pennask/ahmic/proofpage.js create mode 100644 c/pennask/ctrlframe.php create mode 100644 c/pennask/ctrlframe.php.bak create mode 100644 c/pennask/dkretz/ahmic/processpage.php create mode 100644 c/pennask/dkretz/ahmic/proofpage.js create mode 100644 c/pennask/dkretz/gfx/a1_down.png create mode 100644 c/pennask/dkretz/gfx/a1_left.png create mode 100644 c/pennask/dkretz/gfx/a1_right.png create mode 100644 c/pennask/dkretz/gfx/a1_up.png create mode 100644 c/pennask/dkretz/gfx/a2_down.png create mode 100644 c/pennask/dkretz/gfx/a2_left.png create mode 100644 c/pennask/dkretz/gfx/a2_right.png create mode 100644 c/pennask/dkretz/gfx/a2_up.png create mode 100644 c/pennask/dkretz/gfx/bad.png create mode 100644 c/pennask/dkretz/gfx/broken.png create mode 100644 c/pennask/dkretz/gfx/bt1.png create mode 100644 c/pennask/dkretz/gfx/bt10.png create mode 100644 c/pennask/dkretz/gfx/bt11.png create mode 100644 c/pennask/dkretz/gfx/bt12.png create mode 100644 c/pennask/dkretz/gfx/bt13.png create mode 100644 c/pennask/dkretz/gfx/bt14.png create mode 100644 c/pennask/dkretz/gfx/bt15.png create mode 100644 c/pennask/dkretz/gfx/bt16.png create mode 100644 c/pennask/dkretz/gfx/bt17.png create mode 100644 c/pennask/dkretz/gfx/bt18.png create mode 100644 c/pennask/dkretz/gfx/bt1_n.png create mode 100644 c/pennask/dkretz/gfx/bt2.png create mode 100644 c/pennask/dkretz/gfx/bt3.png create mode 100644 c/pennask/dkretz/gfx/bt4.png create mode 100644 c/pennask/dkretz/gfx/bt5.png create mode 100644 c/pennask/dkretz/gfx/bt6.png create mode 100644 c/pennask/dkretz/gfx/bt7.png create mode 100644 c/pennask/dkretz/gfx/bt7_n.png create mode 100644 c/pennask/dkretz/gfx/bt8.png create mode 100644 c/pennask/dkretz/gfx/bt9.png create mode 100644 c/pennask/dkretz/gfx/down.jpg create mode 100644 c/pennask/dkretz/gfx/down.png create mode 100644 c/pennask/dkretz/gfx/greek.png create mode 100644 c/pennask/dkretz/gfx/greekrough.png create mode 100644 c/pennask/dkretz/gfx/horiz.png create mode 100644 c/pennask/dkretz/gfx/icon-i.png create mode 100644 c/pennask/dkretz/gfx/icon-n.png create mode 100644 c/pennask/dkretz/gfx/igreek.png create mode 100644 c/pennask/dkretz/gfx/quit.png create mode 100644 c/pennask/dkretz/gfx/returnpage.png create mode 100644 c/pennask/dkretz/gfx/rtnpg.png create mode 100644 c/pennask/dkretz/gfx/savenxt.png create mode 100644 c/pennask/dkretz/gfx/savequit.png create mode 100644 c/pennask/dkretz/gfx/savetmp.png create mode 100644 c/pennask/dkretz/gfx/tags/bar1.png create mode 100644 c/pennask/dkretz/gfx/tags/bar2.png create mode 100644 c/pennask/dkretz/gfx/tags/bold.png create mode 100644 c/pennask/dkretz/gfx/tags/caps.png create mode 100644 c/pennask/dkretz/gfx/tags/exit.png create mode 100644 c/pennask/dkretz/gfx/tags/greek.png create mode 100644 c/pennask/dkretz/gfx/tags/help.png create mode 100644 c/pennask/dkretz/gfx/tags/italic.png create mode 100644 c/pennask/dkretz/gfx/tags/sub.png create mode 100644 c/pennask/dkretz/gfx/tags/sup.png create mode 100644 c/pennask/dkretz/gfx/tags/underline.png create mode 100644 c/pennask/dkretz/gfx/up.jpg create mode 100644 c/pennask/dkretz/gfx/up.png create mode 100644 c/pennask/dkretz/gfx/vert.png create mode 100644 c/pennask/dkretz/gfx/wchk-off.png create mode 100644 c/pennask/dkretz/gfx/wchk-on.png create mode 100644 c/pennask/gfx/a1_down.png create mode 100644 c/pennask/gfx/a1_left.png create mode 100644 c/pennask/gfx/a1_right.png create mode 100644 c/pennask/gfx/a1_up.png create mode 100644 c/pennask/gfx/a2_down.png create mode 100644 c/pennask/gfx/a2_left.png create mode 100644 c/pennask/gfx/a2_right.png create mode 100644 c/pennask/gfx/a2_up.png create mode 100644 c/pennask/gfx/bad.png create mode 100644 c/pennask/gfx/broken.png create mode 100644 c/pennask/gfx/bt1.png create mode 100644 c/pennask/gfx/bt10.png create mode 100644 c/pennask/gfx/bt11.png create mode 100644 c/pennask/gfx/bt12.png create mode 100644 c/pennask/gfx/bt13.png create mode 100644 c/pennask/gfx/bt14.png create mode 100644 c/pennask/gfx/bt15.png create mode 100644 c/pennask/gfx/bt16.png create mode 100644 c/pennask/gfx/bt17.png create mode 100644 c/pennask/gfx/bt18.png create mode 100644 c/pennask/gfx/bt1_n.png create mode 100644 c/pennask/gfx/bt2.png create mode 100644 c/pennask/gfx/bt3.png create mode 100644 c/pennask/gfx/bt4.png create mode 100644 c/pennask/gfx/bt5.png create mode 100644 c/pennask/gfx/bt6.png create mode 100644 c/pennask/gfx/bt7.png create mode 100644 c/pennask/gfx/bt7_n.png create mode 100644 c/pennask/gfx/bt8.png create mode 100644 c/pennask/gfx/bt9.png create mode 100644 c/pennask/gfx/down.jpg create mode 100644 c/pennask/gfx/down.png create mode 100644 c/pennask/gfx/gear.png create mode 100644 c/pennask/gfx/greek.png create mode 100644 c/pennask/gfx/greekrough.png create mode 100644 c/pennask/gfx/horiz.png create mode 100644 c/pennask/gfx/icon-i.png create mode 100644 c/pennask/gfx/icon-n.png create mode 100644 c/pennask/gfx/igreek.png create mode 100644 c/pennask/gfx/quit.png create mode 100644 c/pennask/gfx/returnpage.png create mode 100644 c/pennask/gfx/rtnpg.png create mode 100644 c/pennask/gfx/save.jpg create mode 100644 c/pennask/gfx/save2.jpg create mode 100644 c/pennask/gfx/savenxt.png create mode 100644 c/pennask/gfx/savequit.png create mode 100644 c/pennask/gfx/savetmp.png create mode 100644 c/pennask/gfx/tags/bar1.png create mode 100644 c/pennask/gfx/tags/bar2.png create mode 100644 c/pennask/gfx/tags/bold.png create mode 100644 c/pennask/gfx/tags/caps.png create mode 100644 c/pennask/gfx/tags/exit.png create mode 100644 c/pennask/gfx/tags/greek.png create mode 100644 c/pennask/gfx/tags/help.png create mode 100644 c/pennask/gfx/tags/italic.png create mode 100644 c/pennask/gfx/tags/sub.png create mode 100644 c/pennask/gfx/tags/sup.png create mode 100644 c/pennask/gfx/tags/underline.png create mode 100644 c/pennask/gfx/up.jpg create mode 100644 c/pennask/gfx/up.png create mode 100644 c/pennask/gfx/vert.png create mode 100644 c/pennask/gfx/wchk-off.png create mode 100644 c/pennask/gfx/wchk-on.png create mode 100644 c/pennask/pennask.bak/action.php create mode 100644 c/pennask/pennask.bak/ahmic/processpage.php create mode 100644 c/pennask/pennask.bak/ahmic/proofpage.js create mode 100644 c/pennask/pennask.bak/ctrlframe.php create mode 100644 c/pennask/pennask.bak/ctrlframe.php.bak create mode 100644 c/pennask/pennask.bak/dkretz/ahmic/processpage.php create mode 100644 c/pennask/pennask.bak/dkretz/ahmic/proofpage.js create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a1_down.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a1_left.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a1_right.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a1_up.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a2_down.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a2_left.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a2_right.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/a2_up.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bad.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/broken.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt1.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt10.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt11.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt12.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt13.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt14.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt15.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt16.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt17.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt18.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt1_n.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt2.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt3.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt4.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt5.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt6.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt7.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt7_n.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt8.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/bt9.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/down.jpg create mode 100644 c/pennask/pennask.bak/dkretz/gfx/down.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/greek.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/greekrough.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/horiz.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/icon-i.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/icon-n.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/igreek.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/quit.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/returnpage.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/rtnpg.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/savenxt.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/savequit.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/savetmp.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/bar1.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/bar2.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/bold.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/caps.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/exit.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/greek.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/help.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/italic.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/sub.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/sup.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/tags/underline.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/up.jpg create mode 100644 c/pennask/pennask.bak/dkretz/gfx/up.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/vert.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/wchk-off.png create mode 100644 c/pennask/pennask.bak/dkretz/gfx/wchk-on.png create mode 100644 c/pennask/pennask.bak/gfx/a1_down.png create mode 100644 c/pennask/pennask.bak/gfx/a1_left.png create mode 100644 c/pennask/pennask.bak/gfx/a1_right.png create mode 100644 c/pennask/pennask.bak/gfx/a1_up.png create mode 100644 c/pennask/pennask.bak/gfx/a2_down.png create mode 100644 c/pennask/pennask.bak/gfx/a2_left.png create mode 100644 c/pennask/pennask.bak/gfx/a2_right.png create mode 100644 c/pennask/pennask.bak/gfx/a2_up.png create mode 100644 c/pennask/pennask.bak/gfx/bad.png create mode 100644 c/pennask/pennask.bak/gfx/broken.png create mode 100644 c/pennask/pennask.bak/gfx/bt1.png create mode 100644 c/pennask/pennask.bak/gfx/bt10.png create mode 100644 c/pennask/pennask.bak/gfx/bt11.png create mode 100644 c/pennask/pennask.bak/gfx/bt12.png create mode 100644 c/pennask/pennask.bak/gfx/bt13.png create mode 100644 c/pennask/pennask.bak/gfx/bt14.png create mode 100644 c/pennask/pennask.bak/gfx/bt15.png create mode 100644 c/pennask/pennask.bak/gfx/bt16.png create mode 100644 c/pennask/pennask.bak/gfx/bt17.png create mode 100644 c/pennask/pennask.bak/gfx/bt18.png create mode 100644 c/pennask/pennask.bak/gfx/bt1_n.png create mode 100644 c/pennask/pennask.bak/gfx/bt2.png create mode 100644 c/pennask/pennask.bak/gfx/bt3.png create mode 100644 c/pennask/pennask.bak/gfx/bt4.png create mode 100644 c/pennask/pennask.bak/gfx/bt5.png create mode 100644 c/pennask/pennask.bak/gfx/bt6.png create mode 100644 c/pennask/pennask.bak/gfx/bt7.png create mode 100644 c/pennask/pennask.bak/gfx/bt7_n.png create mode 100644 c/pennask/pennask.bak/gfx/bt8.png create mode 100644 c/pennask/pennask.bak/gfx/bt9.png create mode 100644 c/pennask/pennask.bak/gfx/down.jpg create mode 100644 c/pennask/pennask.bak/gfx/down.png create mode 100644 c/pennask/pennask.bak/gfx/greek.png create mode 100644 c/pennask/pennask.bak/gfx/greekrough.png create mode 100644 c/pennask/pennask.bak/gfx/horiz.png create mode 100644 c/pennask/pennask.bak/gfx/icon-i.png create mode 100644 c/pennask/pennask.bak/gfx/icon-n.png create mode 100644 c/pennask/pennask.bak/gfx/igreek.png create mode 100644 c/pennask/pennask.bak/gfx/quit.png create mode 100644 c/pennask/pennask.bak/gfx/returnpage.png create mode 100644 c/pennask/pennask.bak/gfx/rtnpg.png create mode 100644 c/pennask/pennask.bak/gfx/save.jpg create mode 100644 c/pennask/pennask.bak/gfx/save2.jpg create mode 100644 c/pennask/pennask.bak/gfx/savenxt.png create mode 100644 c/pennask/pennask.bak/gfx/savequit.png create mode 100644 c/pennask/pennask.bak/gfx/savetmp.png create mode 100644 c/pennask/pennask.bak/gfx/tags/bar1.png create mode 100644 c/pennask/pennask.bak/gfx/tags/bar2.png create mode 100644 c/pennask/pennask.bak/gfx/tags/bold.png create mode 100644 c/pennask/pennask.bak/gfx/tags/caps.png create mode 100644 c/pennask/pennask.bak/gfx/tags/exit.png create mode 100644 c/pennask/pennask.bak/gfx/tags/greek.png create mode 100644 c/pennask/pennask.bak/gfx/tags/help.png create mode 100644 c/pennask/pennask.bak/gfx/tags/italic.png create mode 100644 c/pennask/pennask.bak/gfx/tags/sub.png create mode 100644 c/pennask/pennask.bak/gfx/tags/sup.png create mode 100644 c/pennask/pennask.bak/gfx/tags/underline.png create mode 100644 c/pennask/pennask.bak/gfx/up.jpg create mode 100644 c/pennask/pennask.bak/gfx/up.png create mode 100644 c/pennask/pennask.bak/gfx/vert.png create mode 100644 c/pennask/pennask.bak/gfx/wchk-off.png create mode 100644 c/pennask/pennask.bak/gfx/wchk-on.png create mode 100644 c/pennask/pennask.bak/processpage.php create mode 100644 c/pennask/pennask.bak/proof.php create mode 100644 c/pennask/pennask.bak/proof.php.bak create mode 100644 c/pennask/pennask.bak/proof_frame.php create mode 100644 c/pennask/pennask.bak/proof_frame.php.bak create mode 100644 c/pennask/pennask.bak/proofpage.css create mode 100644 c/pennask/pennask.bak/proofpage.js create mode 100644 c/pennask/pennask.bak/proofpage.php create mode 100644 c/pennask/pennask.bak/wc.php.bak create mode 100644 c/pennask/pennask.bak/wctest.php create mode 100644 c/pennask/processpage.php create mode 100644 c/pennask/proof.php create mode 100644 c/pennask/proof.php.bak create mode 100644 c/pennask/proof_frame.php create mode 100644 c/pennask/proof_frame.php.bak create mode 100644 c/pennask/proofpage.css create mode 100644 c/pennask/proofpage.js create mode 100644 c/pennask/proofpage.php create mode 100644 c/pennask/wc.php.bak create mode 100644 c/pennask/wctest.php create mode 100644 c/phpinfo.php create mode 100644 c/pinc/BrowseUtility.inc create mode 100644 c/pinc/Diff.class.php create mode 100644 c/pinc/DifferenceEngine.php create mode 100644 c/pinc/DifferenceEngineWrapper.php create mode 100644 c/pinc/DpContext.class.php create mode 100644 c/pinc/DpDb.php create mode 100644 c/pinc/DpDbi.class.php create mode 100644 c/pinc/DpEnchant.class.php create mode 100644 c/pinc/DpFile.class.php create mode 100644 c/pinc/DpForm.class.php create mode 100644 c/pinc/DpPage.class.php create mode 100644 c/pinc/DpPhpbb3.class.php create mode 100644 c/pinc/DpProject.class.php create mode 100644 c/pinc/DpQualProject.class.php create mode 100644 c/pinc/DpTable.class.php create mode 100644 c/pinc/DpTable.class.php.bak create mode 100644 c/pinc/DpTable2.class.php create mode 100644 c/pinc/DpUser.class.php create mode 100644 c/pinc/DpVersion.class.php create mode 100644 c/pinc/DpZip.class.php create mode 100644 c/pinc/Profileclass.inc create mode 100644 c/pinc/Project.inc create mode 100644 c/pinc/Quiz.inc create mode 100644 c/pinc/RoundDescriptor.inc create mode 100644 c/pinc/RoundsInfo.php create mode 100644 c/pinc/SettingsClass.inc create mode 100644 c/pinc/SortUtility.inc create mode 100644 c/pinc/Stage.inc create mode 100644 c/pinc/TallyBoard.inc create mode 100644 c/pinc/ThemedTable.inc create mode 100644 c/pinc/abort.inc create mode 100644 c/pinc/access_log.inc create mode 100644 c/pinc/authors.inc create mode 100644 c/pinc/button_defs.inc create mode 100644 c/pinc/chart.inc create mode 100644 c/pinc/comment_inclusions.inc create mode 100644 c/pinc/daily_pages.html create mode 100644 c/pinc/daily_pages.js create mode 100644 c/pinc/daily_pages.php create mode 100644 c/pinc/day_chart.php create mode 100644 c/pinc/doctype.inc create mode 100644 c/pinc/dpc_edit.php create mode 100644 c/pinc/dpctls.php create mode 100644 c/pinc/dpinit.php create mode 100644 c/pinc/dpinit2.php create mode 100644 c/pinc/dpsql.inc create mode 100644 c/pinc/faq.inc create mode 100644 c/pinc/filter_project_list.inc create mode 100644 c/pinc/genres.inc create mode 100644 c/pinc/gettext_setup.inc create mode 100644 c/pinc/gradual.inc create mode 100644 c/pinc/help/README.txt create mode 100644 c/pinc/help/conf/authz create mode 100644 c/pinc/help/conf/passwd create mode 100644 c/pinc/help/conf/svnserve.conf create mode 100644 c/pinc/help/db/current create mode 100644 c/pinc/help/db/format create mode 100644 c/pinc/help/db/fs-type create mode 100644 c/pinc/help/db/fsfs.conf create mode 100644 c/pinc/help/db/min-unpacked-rev create mode 100644 c/pinc/help/db/rep-cache.db create mode 100644 c/pinc/help/db/revprops/0/0 create mode 100644 c/pinc/help/db/revs/0/0 create mode 100644 c/pinc/help/db/txn-current create mode 100644 c/pinc/help/db/txn-current-lock create mode 100644 c/pinc/help/db/uuid create mode 100644 c/pinc/help/db/write-lock create mode 100644 c/pinc/help/format create mode 100644 c/pinc/help/hooks/post-commit.tmpl create mode 100644 c/pinc/help/hooks/post-lock.tmpl create mode 100644 c/pinc/help/hooks/post-revprop-change.tmpl create mode 100644 c/pinc/help/hooks/post-unlock.tmpl create mode 100644 c/pinc/help/hooks/pre-commit.tmpl create mode 100644 c/pinc/help/hooks/pre-lock.tmpl create mode 100644 c/pinc/help/hooks/pre-revprop-change.tmpl create mode 100644 c/pinc/help/hooks/pre-unlock.tmpl create mode 100644 c/pinc/help/hooks/start-commit.tmpl create mode 100644 c/pinc/help/locks/db-logs.lock create mode 100644 c/pinc/help/locks/db.lock create mode 100644 c/pinc/helpers.php create mode 100644 c/pinc/http_headers.inc create mode 100644 c/pinc/iso_3166_list.inc create mode 100644 c/pinc/iso_639_list.inc create mode 100644 c/pinc/iso_639_loc_list.inc create mode 100644 c/pinc/iso_lang_list.inc create mode 100644 c/pinc/js_newpophelp.inc create mode 100644 c/pinc/js_newwin.inc create mode 100644 c/pinc/lang_data.inc create mode 100644 c/pinc/languages.inc create mode 100644 c/pinc/links.php create mode 100644 c/pinc/list_projects.inc create mode 100644 c/pinc/lists.php create mode 100644 c/pinc/maintenance_mode.inc create mode 100644 c/pinc/marc_format.inc create mode 100644 c/pinc/maybe_mail.inc create mode 100644 c/pinc/mentorbanner.inc create mode 100644 c/pinc/metarefresh.inc create mode 100644 c/pinc/misc.inc create mode 100644 c/pinc/month_chart.php create mode 100644 c/pinc/new_user_mails.inc create mode 100644 c/pinc/page_header.inc create mode 100644 c/pinc/page_table.inc create mode 100644 c/pinc/page_tally.inc create mode 100644 c/pinc/pg old.inc create mode 100644 c/pinc/pg.inc create mode 100644 c/pinc/phases.php create mode 100644 c/pinc/postcomments.inc create mode 100644 c/pinc/prefs_options.inc create mode 100644 c/pinc/privacy.inc create mode 100644 c/pinc/project_edit.inc create mode 100644 c/pinc/project_events.inc create mode 100644 c/pinc/project_states.inc create mode 100644 c/pinc/project_states_old.inc create mode 100644 c/pinc/projectinfo.inc create mode 100644 c/pinc/quizzes.inc create mode 100644 c/pinc/randrule.php create mode 100644 c/pinc/release_queue.inc create mode 100644 c/pinc/resolution.inc create mode 100644 c/pinc/root create mode 100644 c/pinc/rounds.php create mode 100644 c/pinc/select_list.inc create mode 100644 c/pinc/showstartexts.inc create mode 100644 c/pinc/showtexts.inc create mode 100644 c/pinc/simple_proof_text.inc create mode 100644 c/pinc/site_news.inc create mode 100644 c/pinc/site_specific.inc create mode 100644 c/pinc/site_vars.php create mode 100644 c/pinc/slim_header.inc create mode 100644 c/pinc/smoothread.inc create mode 100644 c/pinc/special_colors.inc create mode 100644 c/pinc/stages.inc create mode 100644 c/pinc/stats.php create mode 100644 c/pinc/tabs.inc create mode 100644 c/pinc/templates/base_graphics/donate.psd create mode 100644 c/pinc/templates/base_graphics/l_curve.psd create mode 100644 c/pinc/templates/base_graphics/logo.psd create mode 100644 c/pinc/templates/base_graphics/r_curve.psd create mode 100644 c/pinc/templates/base_graphics/tab.psd create mode 100644 c/pinc/templates/base_graphics/tab_on.psd create mode 100644 c/pinc/templates/base_graphics/tabs_howto.txt create mode 100644 c/pinc/templates/base_graphics/theme.tpl create mode 100644 c/pinc/templates/classic_grey/graphics/donate.gif create mode 100644 c/pinc/templates/classic_grey/graphics/l_curve.gif create mode 100644 c/pinc/templates/classic_grey/graphics/logo.gif create mode 100644 c/pinc/templates/classic_grey/graphics/oldlogo.gif create mode 100644 c/pinc/templates/classic_grey/graphics/r_curve.gif create mode 100644 c/pinc/templates/classic_grey/graphics/tabs_bg.png create mode 100644 c/pinc/templates/classic_grey/graphics/tabs_left.png create mode 100644 c/pinc/templates/classic_grey/graphics/tabs_left_on.png create mode 100644 c/pinc/templates/classic_grey/graphics/tabs_right.png create mode 100644 c/pinc/templates/classic_grey/graphics/tabs_right_on.png create mode 100644 c/pinc/templates/classic_grey/main.css create mode 100644 c/pinc/templates/classic_grey/theme.tpl create mode 100644 c/pinc/templates/comment_files/BG1a.txt create mode 100644 c/pinc/templates/comment_files/BG1b.txt create mode 100644 c/pinc/templates/comment_files/BGr2.txt create mode 100644 c/pinc/templates/comment_files/ammu.txt create mode 100644 c/pinc/templates/comment_files/bae1.txt create mode 100644 c/pinc/templates/comment_files/bell.txt create mode 100644 c/pinc/templates/comment_files/bem1.txt create mode 100644 c/pinc/templates/comment_files/diac.txt create mode 100644 c/pinc/templates/comment_files/eets.txt create mode 100644 c/pinc/templates/comment_files/grw0.txt create mode 100644 c/pinc/templates/comment_files/jon1.txt create mode 100644 c/pinc/templates/comment_files/nar2.txt create mode 100644 c/pinc/templates/comment_files/pgnm.txt create mode 100644 c/pinc/templates/comment_files/port.txt create mode 100644 c/pinc/templates/comment_files/samp.txt create mode 100644 c/pinc/templates/comment_files/ted0.txt create mode 100644 c/pinc/templates/comment_files/wrrn.txt create mode 100644 c/pinc/templates/default_graphics/tabs_left.png create mode 100644 c/pinc/templates/default_graphics/tabs_left_on.png create mode 100644 c/pinc/templates/default_graphics/tabs_right.png create mode 100644 c/pinc/templates/default_graphics/tabs_right_on.png create mode 100644 c/pinc/templates/project_gutenberg/graphics/donate.gif create mode 100644 c/pinc/templates/project_gutenberg/graphics/dpclogo5.png create mode 100644 c/pinc/templates/project_gutenberg/graphics/l_curve.gif create mode 100644 c/pinc/templates/project_gutenberg/graphics/logo.gif create mode 100644 c/pinc/templates/project_gutenberg/graphics/r_curve.gif create mode 100644 c/pinc/templates/project_gutenberg/graphics/tabs_bg.png create mode 100644 c/pinc/templates/project_gutenberg/graphics/tabs_left.png create mode 100644 c/pinc/templates/project_gutenberg/graphics/tabs_left_on.png create mode 100644 c/pinc/templates/project_gutenberg/graphics/tabs_right.png create mode 100644 c/pinc/templates/project_gutenberg/graphics/tabs_right_on.png create mode 100644 c/pinc/templates/project_gutenberg/main.css create mode 100644 c/pinc/templates/project_gutenberg/theme.tpl create mode 100644 c/pinc/templates/royal_blues/graphics/donate.gif create mode 100644 c/pinc/templates/royal_blues/graphics/l_curve.gif create mode 100644 c/pinc/templates/royal_blues/graphics/logo.gif create mode 100644 c/pinc/templates/royal_blues/graphics/oldlogo.gif create mode 100644 c/pinc/templates/royal_blues/graphics/r_curve.gif create mode 100644 c/pinc/templates/royal_blues/graphics/tabs_bg.png create mode 100644 c/pinc/templates/royal_blues/graphics/tabs_left.png create mode 100644 c/pinc/templates/royal_blues/graphics/tabs_left_on.png create mode 100644 c/pinc/templates/royal_blues/graphics/tabs_right.png create mode 100644 c/pinc/templates/royal_blues/graphics/tabs_right_on.png create mode 100644 c/pinc/templates/royal_blues/main.css create mode 100644 c/pinc/templates/royal_blues/theme.tpl create mode 100644 c/pinc/templates/theme.tpl create mode 100644 c/pinc/theme.inc create mode 100644 c/pinc/topic.inc create mode 100644 c/pinc/udb_user.php create mode 100644 c/pinc/user_is.inc create mode 100644 c/pinc/username.inc create mode 100644 c/pinc/variables_in_use.txt create mode 100644 c/pinc/wordcheck_engine.inc create mode 100644 c/pinc/words.php create mode 100644 c/pinc/xml.inc create mode 100644 c/pizza.html create mode 100644 c/post_comments.php create mode 100644 c/post_text_srv.php create mode 100644 c/project.php create mode 100644 c/project_text.php create mode 100644 c/proof/ctrlframe.php create mode 100644 c/proof/gfx/a1_down.png create mode 100644 c/proof/gfx/a1_left.png create mode 100644 c/proof/gfx/a1_right.png create mode 100644 c/proof/gfx/a1_up.png create mode 100644 c/proof/gfx/a2_down.png create mode 100644 c/proof/gfx/a2_left.png create mode 100644 c/proof/gfx/a2_right.png create mode 100644 c/proof/gfx/a2_up.png create mode 100644 c/proof/gfx/bad.png create mode 100644 c/proof/gfx/broken.png create mode 100644 c/proof/gfx/bt1.png create mode 100644 c/proof/gfx/bt10.png create mode 100644 c/proof/gfx/bt11.png create mode 100644 c/proof/gfx/bt12.png create mode 100644 c/proof/gfx/bt13.png create mode 100644 c/proof/gfx/bt14.png create mode 100644 c/proof/gfx/bt15.png create mode 100644 c/proof/gfx/bt16.png create mode 100644 c/proof/gfx/bt17.png create mode 100644 c/proof/gfx/bt18.png create mode 100644 c/proof/gfx/bt1_n.png create mode 100644 c/proof/gfx/bt2.png create mode 100644 c/proof/gfx/bt3.png create mode 100644 c/proof/gfx/bt4.png create mode 100644 c/proof/gfx/bt5.png create mode 100644 c/proof/gfx/bt6.png create mode 100644 c/proof/gfx/bt7.png create mode 100644 c/proof/gfx/bt7_n.png create mode 100644 c/proof/gfx/bt8.png create mode 100644 c/proof/gfx/bt9.png create mode 100644 c/proof/gfx/down.jpg create mode 100644 c/proof/gfx/down.png create mode 100644 c/proof/gfx/greek.png create mode 100644 c/proof/gfx/greekrough.png create mode 100644 c/proof/gfx/horiz.png create mode 100644 c/proof/gfx/icon-i.png create mode 100644 c/proof/gfx/icon-n.png create mode 100644 c/proof/gfx/igreek.png create mode 100644 c/proof/gfx/quit.png create mode 100644 c/proof/gfx/returnpage.png create mode 100644 c/proof/gfx/rtnpg.png create mode 100644 c/proof/gfx/savenxt.png create mode 100644 c/proof/gfx/savequit.png create mode 100644 c/proof/gfx/savetmp.png create mode 100644 c/proof/gfx/tags/bar1.png create mode 100644 c/proof/gfx/tags/bar2.png create mode 100644 c/proof/gfx/tags/bold.png create mode 100644 c/proof/gfx/tags/caps.png create mode 100644 c/proof/gfx/tags/exit.png create mode 100644 c/proof/gfx/tags/greek.png create mode 100644 c/proof/gfx/tags/help.png create mode 100644 c/proof/gfx/tags/italic.png create mode 100644 c/proof/gfx/tags/sub.png create mode 100644 c/proof/gfx/tags/sup.png create mode 100644 c/proof/gfx/tags/underline.png create mode 100644 c/proof/gfx/up.png create mode 100644 c/proof/gfx/vert.png create mode 100644 c/proof/gfx/wchk-off.png create mode 100644 c/proof/gfx/wchk-on.png create mode 100644 c/proof/processpage.php create mode 100644 c/proof/proof.php create mode 100644 c/proof/proof_frame.php create mode 100644 c/proof/proofpage.css create mode 100644 c/proof/proofpage.js create mode 100644 c/proof/proofpage.php create mode 100644 c/proofdev/ctrlframe.php create mode 100644 c/proofdev/gfx/a1_down.png create mode 100644 c/proofdev/gfx/a1_left.png create mode 100644 c/proofdev/gfx/a1_right.png create mode 100644 c/proofdev/gfx/a1_up.png create mode 100644 c/proofdev/gfx/a2_down.png create mode 100644 c/proofdev/gfx/a2_left.png create mode 100644 c/proofdev/gfx/a2_right.png create mode 100644 c/proofdev/gfx/a2_up.png create mode 100644 c/proofdev/gfx/bad.png create mode 100644 c/proofdev/gfx/broken.png create mode 100644 c/proofdev/gfx/bt1.png create mode 100644 c/proofdev/gfx/bt10.png create mode 100644 c/proofdev/gfx/bt11.png create mode 100644 c/proofdev/gfx/bt12.png create mode 100644 c/proofdev/gfx/bt13.png create mode 100644 c/proofdev/gfx/bt14.png create mode 100644 c/proofdev/gfx/bt15.png create mode 100644 c/proofdev/gfx/bt16.png create mode 100644 c/proofdev/gfx/bt17.png create mode 100644 c/proofdev/gfx/bt18.png create mode 100644 c/proofdev/gfx/bt1_n.png create mode 100644 c/proofdev/gfx/bt2.png create mode 100644 c/proofdev/gfx/bt3.png create mode 100644 c/proofdev/gfx/bt4.png create mode 100644 c/proofdev/gfx/bt5.png create mode 100644 c/proofdev/gfx/bt6.png create mode 100644 c/proofdev/gfx/bt7.png create mode 100644 c/proofdev/gfx/bt7_n.png create mode 100644 c/proofdev/gfx/bt8.png create mode 100644 c/proofdev/gfx/bt9.png create mode 100644 c/proofdev/gfx/down.jpg create mode 100644 c/proofdev/gfx/down.png create mode 100644 c/proofdev/gfx/greek.png create mode 100644 c/proofdev/gfx/greekrough.png create mode 100644 c/proofdev/gfx/horiz.png create mode 100644 c/proofdev/gfx/icon-i.png create mode 100644 c/proofdev/gfx/icon-n.png create mode 100644 c/proofdev/gfx/igreek.png create mode 100644 c/proofdev/gfx/quit.png create mode 100644 c/proofdev/gfx/returnpage.png create mode 100644 c/proofdev/gfx/rtnpg.png create mode 100644 c/proofdev/gfx/savenxt.png create mode 100644 c/proofdev/gfx/savequit.png create mode 100644 c/proofdev/gfx/savetmp.png create mode 100644 c/proofdev/gfx/tags/bar1.png create mode 100644 c/proofdev/gfx/tags/bar2.png create mode 100644 c/proofdev/gfx/tags/bold.png create mode 100644 c/proofdev/gfx/tags/caps.png create mode 100644 c/proofdev/gfx/tags/exit.png create mode 100644 c/proofdev/gfx/tags/greek.png create mode 100644 c/proofdev/gfx/tags/help.png create mode 100644 c/proofdev/gfx/tags/italic.png create mode 100644 c/proofdev/gfx/tags/sub.png create mode 100644 c/proofdev/gfx/tags/sup.png create mode 100644 c/proofdev/gfx/tags/underline.png create mode 100644 c/proofdev/gfx/up.jpg create mode 100644 c/proofdev/gfx/up.png create mode 100644 c/proofdev/gfx/vert.png create mode 100644 c/proofdev/gfx/wchk-off.png create mode 100644 c/proofdev/gfx/wchk-on.png create mode 100644 c/proofdev/processpage.php create mode 100644 c/proofdev/proof.php create mode 100644 c/proofdev/proof_frame.php create mode 100644 c/proofdev/proofpage.css create mode 100644 c/proofdev/proofpage.css.bak create mode 100644 c/proofdev/proofpage.js create mode 100644 c/proofdev/proofpage.js.bak create mode 100644 c/proofdev/proofpage.php create mode 100644 c/proofdev/wctest.php create mode 100644 c/proofpage.js create mode 100644 c/pt.inc create mode 100644 c/quals/candidate.php create mode 100644 c/quals/evaluator.php create mode 100644 c/quals/qual_loader.php create mode 100644 c/quals/qualmaster.php create mode 100644 c/query.php create mode 100644 c/quick.php create mode 100644 c/quiz/cross.png create mode 100644 c/quiz/generic/hints.php create mode 100644 c/quiz/generic/main.php create mode 100644 c/quiz/generic/orig.php create mode 100644 c/quiz/generic/proof.php create mode 100644 c/quiz/generic/quiz_defaults.inc create mode 100644 c/quiz/generic/quiz_fixedtexts.inc create mode 100644 c/quiz/generic/returnfeed.php create mode 100644 c/quiz/generic/right.php create mode 100644 c/quiz/quiz_proof.php create mode 100644 c/quiz/small_theme.inc create mode 100644 c/quiz/start.php create mode 100644 c/quiz/tick.png create mode 100644 c/quiz/tuts/tut1.php create mode 100644 c/quiz/tuts/tut2.php create mode 100644 c/quiz/tuts/tut3.php create mode 100644 c/quiz/tuts/tut4.php create mode 100644 c/quiz/tuts/tut5.php create mode 100644 c/regex.txt create mode 100644 c/role_list.php create mode 100644 c/s.php create mode 100644 c/sample/Usertest.php create mode 100644 c/sample/f_prep_ereg_headers.inc create mode 100644 c/sample/f_prep_text_scanos.inc create mode 100644 c/sample/preptxt.pl create mode 100644 c/sample/readme.txt create mode 100644 c/sample/shift_range.php create mode 100644 c/sample/tif2png.php create mode 100644 c/sample/v_ereg_latin1.inc create mode 100644 c/sample/v_prep_easy_errors.inc create mode 100644 c/sample/v_prep_text_hyphens.inc create mode 100644 c/sample/v_prep_text_scanos_0_m.inc create mode 100644 c/sample/v_prep_text_scanos_n_z.inc create mode 100644 c/search.php create mode 100644 c/search2.php create mode 100644 c/spaceyquotes.php create mode 100644 c/stats/PPV_avail.php create mode 100644 c/stats/PP_unknown.php create mode 100644 c/stats/checkedout.php create mode 100644 c/stats/dump_pagestats.php create mode 100644 c/stats/faq_data.php create mode 100644 c/stats/includes/common.inc create mode 100644 c/stats/jpgraph_files/average_hour_users_logging_on.php create mode 100644 c/stats/jpgraph_files/common.inc create mode 100644 c/stats/jpgraph_files/cumulative_month_proj.php create mode 100644 c/stats/jpgraph_files/cumulative_total_proj_graph.php create mode 100644 c/stats/jpgraph_files/cumulative_total_proj_summary_graph.php create mode 100644 c/stats/jpgraph_files/curr_month_proj.php create mode 100644 c/stats/jpgraph_files/pages_daily.php create mode 100644 c/stats/jpgraph_files/percent_users_who_proof.php create mode 100644 c/stats/jpgraph_files/pie.inc create mode 100644 c/stats/jpgraph_files/tallyboard_deltas.php create mode 100644 c/stats/jpgraph_files/total_pages_by_month_graph.php create mode 100644 c/stats/jpgraph_files/total_proj_graph.php create mode 100644 c/stats/jpgraph_files/users_by_country.php create mode 100644 c/stats/jpgraph_files/users_by_language.php create mode 100644 c/stats/jpgraph_files/users_by_month_joined.php create mode 100644 c/stats/jpgraph_files/users_by_pages_proofed_graph.php create mode 100644 c/stats/jpgraph_files/users_logging_on.php create mode 100644 c/stats/members/daily_counts.php create mode 100644 c/stats/members/jointeam.php create mode 100644 c/stats/members/mbr_list.php create mode 100644 c/stats/members/mbr_xml.php create mode 100644 c/stats/members/member.inc create mode 100644 c/stats/members/member_stats.php create mode 100644 c/stats/members/memberstats.xsd create mode 100644 c/stats/members/quitteam.php create mode 100644 c/stats/misc_stats1.php create mode 100644 c/stats/misc_user_stats.php create mode 100644 c/stats/pages_proofed_graphs.php create mode 100644 c/stats/pm_stats.php create mode 100644 c/stats/pp_stats.php create mode 100644 c/stats/ppv_stats.php create mode 100644 c/stats/projects_Xed_graphs.php create mode 100644 c/stats/proof_stats.php create mode 100644 c/stats/release_queue.php create mode 100644 c/stats/renewals_status.php create mode 100644 c/stats/requested_books.php create mode 100644 c/stats/software.php create mode 100644 c/stats/statestats.inc create mode 100644 c/stats/statestats.php create mode 100644 c/stats/stats.png create mode 100644 c/stats/stats_central.php create mode 100644 c/stats/target.png create mode 100644 c/stats/teams/new_team.php create mode 100644 c/stats/teams/tdetail.php create mode 100644 c/stats/teams/team.inc create mode 100644 c/stats/teams/team_round_counts.php create mode 100644 c/stats/teams/team_topic.php create mode 100644 c/stats/teams/teamlist.php create mode 100644 c/stats/teams/teams_xml.php create mode 100644 c/stats/teams/teamstats.xsd create mode 100644 c/stats/teams/tedit.php create mode 100644 c/stats/teams/tlist.php create mode 100644 c/stats/temp_PM_stats.php create mode 100644 c/stats/to_be_released.php create mode 100644 c/stats/user_logon_stats.php create mode 100644 c/tasks.php create mode 100644 c/test.json.js create mode 100644 c/textsrv.php create mode 100644 c/tools/DAvid.php create mode 100644 c/tools/active_projects.php create mode 100644 c/tools/anomalies.php create mode 100644 c/tools/bad.php create mode 100644 c/tools/bots.php create mode 100644 c/tools/change_sr_commitment.php create mode 100644 c/tools/cleanup.php create mode 100644 c/tools/dancer.php create mode 100644 c/tools/download_images.php create mode 100644 c/tools/edittext.php create mode 100644 c/tools/generic.php create mode 100644 c/tools/guiprep.php create mode 100644 c/tools/holds.php create mode 100644 c/tools/logout.php create mode 100644 c/tools/main.css create mode 100644 c/tools/newsletter_stats.php create mode 100644 c/tools/oldprojects.php create mode 100644 c/tools/p1counts.php create mode 100644 c/tools/p1release.php create mode 100644 c/tools/pending_access_requests.php create mode 100644 c/tools/pool.php create mode 100644 c/tools/post_proofers/pp_cruiser.php create mode 100644 c/tools/post_proofers/ppv_report.php create mode 100644 c/tools/post_proofers/smooth_reading.php create mode 100644 c/tools/posted.php create mode 100644 c/tools/pp.php create mode 100644 c/tools/pp_artifacts.php create mode 100644 c/tools/pp_or_ppv.php create mode 100644 c/tools/pper.php create mode 100644 c/tools/pper0.php create mode 100644 c/tools/ppv.php create mode 100644 c/tools/prep.php create mode 100644 c/tools/projdiff.php create mode 100644 c/tools/project_manager/DifferenceEngine.inc create mode 100644 c/tools/project_manager/DifferenceEngine.php create mode 100644 c/tools/project_manager/DifferenceEngineWrapper.inc create mode 100644 c/tools/project_manager/DifferenceEngineWrapper.php create mode 100644 c/tools/project_manager/add_files.php create mode 100644 c/tools/project_manager/createproject.php create mode 100644 c/tools/project_manager/diff.php create mode 100644 c/tools/project_manager/displayimage.php create mode 100644 c/tools/project_manager/downloadproofed.php create mode 100644 c/tools/project_manager/dpdiff.css create mode 100644 c/tools/project_manager/dpdiff.js create mode 100644 c/tools/project_manager/edit_common.inc create mode 100644 c/tools/project_manager/edit_pages.php create mode 100644 c/tools/project_manager/editproject.php create mode 100644 c/tools/project_manager/handle_bad_page.php create mode 100644 c/tools/project_manager/image_source_edit.php create mode 100644 c/tools/project_manager/image_sources.php create mode 100644 c/tools/project_manager/manage_image_sources.php create mode 100644 c/tools/project_manager/page_table.inc create mode 100644 c/tools/project_manager/pagedetail.php create mode 100644 c/tools/project_manager/pagelist.php create mode 100644 c/tools/project_manager/pagelog.php create mode 100644 c/tools/project_manager/post_files.inc create mode 100644 c/tools/project_manager/projectmgr.inc create mode 100644 c/tools/project_manager/projectmgr.php create mode 100644 c/tools/project_manager/show_image_sources.php create mode 100644 c/tools/project_manager/show_specials.php create mode 100644 c/tools/project_manager/showimagesources.php create mode 100644 c/tools/project_manager/user_roles.php create mode 100644 c/tools/project_topic_anomalies.php create mode 100644 c/tools/proof.php create mode 100644 c/tools/proofers/button_menu.inc create mode 100644 c/tools/proofers/ctrl_frame.php create mode 100644 c/tools/proofers/ctrlframe.php create mode 100644 c/tools/proofers/dp_proof.js create mode 100644 c/tools/proofers/dp_scroll.js create mode 100644 c/tools/proofers/dpctls.bak.php create mode 100644 c/tools/proofers/dpspell.js create mode 100644 c/tools/proofers/for_mentors.php create mode 100644 c/tools/proofers/gfx/a1_down.png create mode 100644 c/tools/proofers/gfx/a1_left.png create mode 100644 c/tools/proofers/gfx/a1_right.png create mode 100644 c/tools/proofers/gfx/a1_up.png create mode 100644 c/tools/proofers/gfx/a2_down.png create mode 100644 c/tools/proofers/gfx/a2_left.png create mode 100644 c/tools/proofers/gfx/a2_right.png create mode 100644 c/tools/proofers/gfx/a2_up.png create mode 100644 c/tools/proofers/gfx/bad.png create mode 100644 c/tools/proofers/gfx/broken.png create mode 100644 c/tools/proofers/gfx/bt1.png create mode 100644 c/tools/proofers/gfx/bt10.png create mode 100644 c/tools/proofers/gfx/bt11.png create mode 100644 c/tools/proofers/gfx/bt12.png create mode 100644 c/tools/proofers/gfx/bt13.png create mode 100644 c/tools/proofers/gfx/bt14.png create mode 100644 c/tools/proofers/gfx/bt15.png create mode 100644 c/tools/proofers/gfx/bt16.png create mode 100644 c/tools/proofers/gfx/bt17.png create mode 100644 c/tools/proofers/gfx/bt18.png create mode 100644 c/tools/proofers/gfx/bt1_n.png create mode 100644 c/tools/proofers/gfx/bt2.png create mode 100644 c/tools/proofers/gfx/bt3.png create mode 100644 c/tools/proofers/gfx/bt4.png create mode 100644 c/tools/proofers/gfx/bt5.png create mode 100644 c/tools/proofers/gfx/bt6.png create mode 100644 c/tools/proofers/gfx/bt7.png create mode 100644 c/tools/proofers/gfx/bt7_n.png create mode 100644 c/tools/proofers/gfx/bt8.png create mode 100644 c/tools/proofers/gfx/bt9.png create mode 100644 c/tools/proofers/gfx/greek.png create mode 100644 c/tools/proofers/gfx/greekrough.png create mode 100644 c/tools/proofers/gfx/horiz.png create mode 100644 c/tools/proofers/gfx/icon-i.png create mode 100644 c/tools/proofers/gfx/icon-n.png create mode 100644 c/tools/proofers/gfx/igreek.png create mode 100644 c/tools/proofers/gfx/quit.png create mode 100644 c/tools/proofers/gfx/returnpage.png create mode 100644 c/tools/proofers/gfx/rtnpg.png create mode 100644 c/tools/proofers/gfx/savenxt.png create mode 100644 c/tools/proofers/gfx/savequit.png create mode 100644 c/tools/proofers/gfx/savetmp.png create mode 100644 c/tools/proofers/gfx/tags/bar1.png create mode 100644 c/tools/proofers/gfx/tags/bar2.png create mode 100644 c/tools/proofers/gfx/tags/bold.png create mode 100644 c/tools/proofers/gfx/tags/caps.png create mode 100644 c/tools/proofers/gfx/tags/exit.png create mode 100644 c/tools/proofers/gfx/tags/greek.png create mode 100644 c/tools/proofers/gfx/tags/help.png create mode 100644 c/tools/proofers/gfx/tags/italic.png create mode 100644 c/tools/proofers/gfx/tags/sub.png create mode 100644 c/tools/proofers/gfx/tags/sup.png create mode 100644 c/tools/proofers/gfx/tags/underline.png create mode 100644 c/tools/proofers/gfx/vert.png create mode 100644 c/tools/proofers/gfx/wchk-off.png create mode 100644 c/tools/proofers/gfx/wchk-on.png create mode 100644 c/tools/proofers/greek2ascii.html create mode 100644 c/tools/proofers/greek2ascii.php create mode 100644 c/tools/proofers/image_frame_std.php create mode 100644 c/tools/proofers/images_index.php create mode 100644 c/tools/proofers/iprocesstext.php create mode 100644 c/tools/proofers/iproof.bak.php create mode 100644 c/tools/proofers/itctrlframe.php create mode 100644 c/tools/proofers/itproof.php create mode 100644 c/tools/proofers/itproof_frame.php create mode 100644 c/tools/proofers/itproofpage.php create mode 100644 c/tools/proofers/mktable.php create mode 100644 c/tools/proofers/morenonascii.php create mode 100644 c/tools/proofers/my.php create mode 100644 c/tools/proofers/my_projects.php create mode 100644 c/tools/proofers/pnonascii.inc create mode 100644 c/tools/proofers/posted_notice.php create mode 100644 c/tools/proofers/ppage.php create mode 100644 c/tools/proofers/processpage.php create mode 100644 c/tools/proofers/processtext.php create mode 100644 c/tools/proofers/proctext.php create mode 100644 c/tools/proofers/project_topic.php create mode 100644 c/tools/proofers/proof.php create mode 100644 c/tools/proofers/proof_frame.inc create mode 100644 c/tools/proofers/proof_frame.php create mode 100644 c/tools/proofers/proof_frame_enh.inc create mode 100644 c/tools/proofers/proof_frame_std.inc create mode 100644 c/tools/proofers/proof_page.php create mode 100644 c/tools/proofers/proof_page_enh.php create mode 100644 c/tools/proofers/proofpage.css create mode 100644 c/tools/proofers/proofpage.js create mode 100644 c/tools/proofers/proofpage.php create mode 100644 c/tools/proofers/r.php create mode 100644 c/tools/proofers/report_bad_page.php create mode 100644 c/tools/proofers/review_work.php create mode 100644 c/tools/proofers/round.php create mode 100644 c/tools/proofers/rshell.php create mode 100644 c/tools/proofers/spellcheck.inc create mode 100644 c/tools/proofers/spellcheck.php create mode 100644 c/tools/proofers/spellcheck.php.bak create mode 100644 c/tools/proofers/spellcheck_text.inc create mode 100644 c/tools/proofers/srchrep.php create mode 100644 c/tools/proofers/text_frame_std.php create mode 100644 c/tools/proofers/toolbox.inc create mode 100644 c/tools/proofers/wordcheck.inc create mode 100644 c/tools/qc.php create mode 100644 c/tools/quals/qual.php create mode 100644 c/tools/quals/qualpages.php create mode 100644 c/tools/quals/qualproof.php create mode 100644 c/tools/regexercise.php create mode 100644 c/tools/request_access.php create mode 100644 c/tools/round.php create mode 100644 c/tools/setlangcookie.php create mode 100644 c/tools/shell.php create mode 100644 c/tools/site_admin/displayrandrules.php create mode 100644 c/tools/site_admin/hold_roles.php create mode 100644 c/tools/site_admin/newsedit.php create mode 100644 c/tools/site_admin/personnel.php create mode 100644 c/tools/site_admin/proj_approvals.php create mode 100644 c/tools/site_admin/projectlength.php create mode 100644 c/tools/site_admin/shared_postednums.php create mode 100644 c/tools/site_admin/sitenews.php create mode 100644 c/tools/site_admin/stats_repair.php create mode 100644 c/tools/site_admin/user_roles.php create mode 100644 c/tools/t.php create mode 100644 c/tools/trace.php create mode 100644 c/tools/udb_user.php create mode 100644 c/tools/upload.css create mode 100644 c/tools/upload.html create mode 100644 c/tools/upload.js create mode 100644 c/tools/upload.php create mode 100644 c/tools/upload_text.php create mode 100644 c/tools/zip_images.php create mode 100644 c/update_user_counts.php create mode 100644 c/uploads/sandbag-tutorial.html create mode 100644 c/uploads/sandbag-tutorial.pdf create mode 100644 c/upwidget.php create mode 100644 c/user_pages.php create mode 100644 c/usernames.php create mode 100644 c/userprefs.php create mode 100644 c/vtest.php create mode 100644 c/wc.php create mode 100644 c/wc/project_words.php create mode 100644 c/wc/scannos.php create mode 100644 c/wc/scannos.txt create mode 100644 c/wc/wcontext.php create mode 100644 c/wc/wdiff.php create mode 100644 c/wc/word_freq_table.php create mode 100644 c/wc/wordcheck/en.bad.txt create mode 100644 c/wc/wordcheck/en.good.txt create mode 100644 c/wc/wordcontext.php create mode 100644 c/wc/wordcontext.php~ create mode 100644 c/word/proofpage.css create mode 100644 c/word/proofpage.css.bak create mode 100644 c/word/proofpage.js create mode 100644 c/word/proofpage.php create mode 100644 c/wp.php create mode 100644 c/wpajax.php create mode 100644 c/wpinsert.php create mode 100644 index.php diff --git a/Diff/Diff.php b/Diff/Diff.php new file mode 100644 index 0000000..db920a8 --- /dev/null +++ b/Diff/Diff.php @@ -0,0 +1,453 @@ +, and is used/adapted with his permission. + * + * $Horde: framework/Text_Diff/Diff.php,v 1.11.2.12 2009/01/06 15:23:41 jan Exp $ + * + * Copyright 2004 Geoffrey T. Dairiki + * Copyright 2004-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @package Text_Diff + * @author Geoffrey T. Dairiki + */ +class Text_Diff { + + /** + * Array of changes. + * + * @var array + */ + var $_edits; + + /** + * Computes diffs between sequences of strings. + * + * @param string $engine Name of the diffing engine to use. 'auto' + * will automatically select the best. + * @param array $params Parameters to pass to the diffing engine. + * Normally an array of two arrays, each + * containing the lines from a file. + */ + function Text_Diff($engine, $params) + { + // Backward compatibility workaround. + if (!is_string($engine)) { + $params = array($engine, $params); + $engine = 'auto'; + } + + if ($engine == 'auto') { + $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; + } else { + $engine = basename($engine); + } + + require_once 'Text/Diff/Engine/' . $engine . '.php'; + $class = 'Text_Diff_Engine_' . $engine; + $diff_engine = new $class(); + + $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); + } + + /** + * Returns the array of differences. + */ + function getDiff() + { + return $this->_edits; + } + + /** + * returns the number of new (added) lines in a given diff. + * + * @since Text_Diff 1.1.0 + * @since Horde 3.2 + * + * @return integer The number of new lines + */ + function countAddedLines() + { + $count = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_add') || + is_a($edit, 'Text_Diff_Op_change')) { + $count += $edit->nfinal(); + } + } + return $count; + } + + /** + * Returns the number of deleted (removed) lines in a given diff. + * + * @since Text_Diff 1.1.0 + * @since Horde 3.2 + * + * @return integer The number of deleted lines + */ + function countDeletedLines() + { + $count = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_delete') || + is_a($edit, 'Text_Diff_Op_change')) { + $count += $edit->norig(); + } + } + return $count; + } + + /** + * Computes a reversed diff. + * + * Example: + * + * $diff = new Text_Diff($lines1, $lines2); + * $rev = $diff->reverse(); + * + * + * @return Text_Diff A Diff object representing the inverse of the + * original diff. Note that we purposely don't return a + * reference here, since this essentially is a clone() + * method. + */ + function reverse() + { + if (version_compare(zend_version(), '2', '>')) { + $rev = clone($this); + } else { + $rev = $this; + } + $rev->_edits = array(); + foreach ($this->_edits as $edit) { + $rev->_edits[] = $edit->reverse(); + } + return $rev; + } + + /** + * Checks for an empty diff. + * + * @return boolean True if two sequences were identical. + */ + function isEmpty() + { + foreach ($this->_edits as $edit) { + if (!is_a($edit, 'Text_Diff_Op_copy')) { + return false; + } + } + return true; + } + + /** + * Computes the length of the Longest Common Subsequence (LCS). + * + * This is mostly for diagnostic purposes. + * + * @return integer The length of the LCS. + */ + function lcs() + { + $lcs = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_copy')) { + $lcs += count($edit->orig); + } + } + return $lcs; + } + + /** + * Gets the original set of lines. + * + * This reconstructs the $from_lines parameter passed to the constructor. + * + * @return array The original sequence of strings. + */ + function getOriginal() + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->orig) { + array_splice($lines, count($lines), 0, $edit->orig); + } + } + return $lines; + } + + /** + * Gets the final set of lines. + * + * This reconstructs the $to_lines parameter passed to the constructor. + * + * @return array The sequence of strings. + */ + function getFinal() + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->final) { + array_splice($lines, count($lines), 0, $edit->final); + } + } + return $lines; + } + + /** + * Removes trailing newlines from a line of text. This is meant to be used + * with array_walk(). + * + * @param string $line The line to trim. + * @param integer $key The index of the line in the array. Not used. + */ + function trimNewlines(&$line, $key) + { + $line = str_replace(array("\n", "\r"), '', $line); + } + + /** + * Determines the location of the system temporary directory. + * + * @static + * + * @access protected + * + * @return string A directory name which can be used for temp files. + * Returns false if one could not be found. + */ + function _getTempDir() + { + $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', + 'c:\windows\temp', 'c:\winnt\temp'); + + /* Try PHP's upload_tmp_dir directive. */ + $tmp = ini_get('upload_tmp_dir'); + + /* Otherwise, try to determine the TMPDIR environment variable. */ + if (!strlen($tmp)) { + $tmp = getenv('TMPDIR'); + } + + /* If we still cannot determine a value, then cycle through a list of + * preset possibilities. */ + while (!strlen($tmp) && count($tmp_locations)) { + $tmp_check = array_shift($tmp_locations); + if (@is_dir($tmp_check)) { + $tmp = $tmp_check; + } + } + + /* If it is still empty, we have failed, so return false; otherwise + * return the directory determined. */ + return strlen($tmp) ? $tmp : false; + } + + /** + * Checks a diff for validity. + * + * This is here only for debugging purposes. + */ + function _check($from_lines, $to_lines) + { + if (serialize($from_lines) != serialize($this->getOriginal())) { + trigger_error("Reconstructed original doesn't match", E_USER_ERROR); + } + if (serialize($to_lines) != serialize($this->getFinal())) { + trigger_error("Reconstructed final doesn't match", E_USER_ERROR); + } + + $rev = $this->reverse(); + if (serialize($to_lines) != serialize($rev->getOriginal())) { + trigger_error("Reversed original doesn't match", E_USER_ERROR); + } + if (serialize($from_lines) != serialize($rev->getFinal())) { + trigger_error("Reversed final doesn't match", E_USER_ERROR); + } + + $prevtype = null; + foreach ($this->_edits as $edit) { + if ($prevtype == get_class($edit)) { + trigger_error("Edit sequence is non-optimal", E_USER_ERROR); + } + $prevtype = get_class($edit); + } + + return true; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + */ +class Text_MappedDiff extends Text_Diff { + + /** + * Computes a diff between sequences of strings. + * + * This can be used to compute things like case-insensitve diffs, or diffs + * which ignore changes in white-space. + * + * @param array $from_lines An array of strings. + * @param array $to_lines An array of strings. + * @param array $mapped_from_lines This array should have the same size + * number of elements as $from_lines. The + * elements in $mapped_from_lines and + * $mapped_to_lines are what is actually + * compared when computing the diff. + * @param array $mapped_to_lines This array should have the same number + * of elements as $to_lines. + */ + function Text_MappedDiff($from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines) + { + assert(count($from_lines) == count($mapped_from_lines)); + assert(count($to_lines) == count($mapped_to_lines)); + + parent::Text_Diff($mapped_from_lines, $mapped_to_lines); + + $xi = $yi = 0; + for ($i = 0; $i < count($this->_edits); $i++) { + $orig = &$this->_edits[$i]->orig; + if (is_array($orig)) { + $orig = array_slice($from_lines, $xi, count($orig)); + $xi += count($orig); + } + + $final = &$this->_edits[$i]->final; + if (is_array($final)) { + $final = array_slice($to_lines, $yi, count($final)); + $yi += count($final); + } + } + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op { + + var $orig; + var $final; + + function &reverse() + { + trigger_error('Abstract method', E_USER_ERROR); + } + + function norig() + { + return $this->orig ? count($this->orig) : 0; + } + + function nfinal() + { + return $this->final ? count($this->final) : 0; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_copy extends Text_Diff_Op { + + function Text_Diff_Op_copy($orig, $final = false) + { + if (!is_array($final)) { + $final = $orig; + } + $this->orig = $orig; + $this->final = $final; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_copy($this->final, $this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_delete extends Text_Diff_Op { + + function Text_Diff_Op_delete($lines) + { + $this->orig = $lines; + $this->final = false; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_add($this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_add extends Text_Diff_Op { + + function Text_Diff_Op_add($lines) + { + $this->final = $lines; + $this->orig = false; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_delete($this->final); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_change extends Text_Diff_Op { + + function Text_Diff_Op_change($orig, $final) + { + $this->orig = $orig; + $this->final = $final; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_change($this->final, $this->orig); + return $reverse; + } + +} diff --git a/Diff/Diff/Engine/native.php b/Diff/Diff/Engine/native.php new file mode 100644 index 0000000..84168c0 --- /dev/null +++ b/Diff/Diff/Engine/native.php @@ -0,0 +1,438 @@ + 2, and some optimizations) are from + * Geoffrey T. Dairiki . The original PHP version of this + * code was written by him, and is used/adapted with his permission. + * + * $Horde: framework/Text_Diff/Diff/Engine/native.php,v 1.7.2.5 2009/01/06 15:23:41 jan Exp $ + * + * Copyright 2004-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author Geoffrey T. Dairiki + * @package Text_Diff + */ +class Text_Diff_Engine_native { + + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + $n_from = count($from_lines); + $n_to = count($to_lines); + + $this->xchanged = $this->ychanged = array(); + $this->xv = $this->yv = array(); + $this->xind = $this->yind = array(); + unset($this->seq); + unset($this->in_seq); + unset($this->lcs); + + // Skip leading common lines. + for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { + if ($from_lines[$skip] !== $to_lines[$skip]) { + break; + } + $this->xchanged[$skip] = $this->ychanged[$skip] = false; + } + + // Skip trailing common lines. + $xi = $n_from; $yi = $n_to; + for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { + if ($from_lines[$xi] !== $to_lines[$yi]) { + break; + } + $this->xchanged[$xi] = $this->ychanged[$yi] = false; + } + + // Ignore lines which do not exist in both files. + for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { + $xhash[$from_lines[$xi]] = 1; + } + for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { + $line = $to_lines[$yi]; + if (($this->ychanged[$yi] = empty($xhash[$line]))) { + continue; + } + $yhash[$line] = 1; + $this->yv[] = $line; + $this->yind[] = $yi; + } + for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { + $line = $from_lines[$xi]; + if (($this->xchanged[$xi] = empty($yhash[$line]))) { + continue; + } + $this->xv[] = $line; + $this->xind[] = $xi; + } + + // Find the LCS. + $this->_compareseq(0, count($this->xv), 0, count($this->yv)); + + // Merge edits when possible. + $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); + $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); + + // Compute the edit operations. + $edits = array(); + $xi = $yi = 0; + while ($xi < $n_from || $yi < $n_to) { + assert($yi < $n_to || $this->xchanged[$xi]); + assert($xi < $n_from || $this->ychanged[$yi]); + + // Skip matching "snake". + $copy = array(); + while ($xi < $n_from && $yi < $n_to + && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { + $copy[] = $from_lines[$xi++]; + ++$yi; + } + if ($copy) { + $edits[] = &new Text_Diff_Op_copy($copy); + } + + // Find deletes & adds. + $delete = array(); + while ($xi < $n_from && $this->xchanged[$xi]) { + $delete[] = $from_lines[$xi++]; + } + + $add = array(); + while ($yi < $n_to && $this->ychanged[$yi]) { + $add[] = $to_lines[$yi++]; + } + + if ($delete && $add) { + $edits[] = &new Text_Diff_Op_change($delete, $add); + } elseif ($delete) { + $edits[] = &new Text_Diff_Op_delete($delete); + } elseif ($add) { + $edits[] = &new Text_Diff_Op_add($add); + } + } + + return $edits; + } + + /** + * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, + * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized + * segments. + * + * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of + * NCHUNKS+1 (X, Y) indexes giving the diving points between sub + * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), + * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == + * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). + * + * This function assumes that the first lines of the specified portions of + * the two files do not match, and likewise that the last lines do not + * match. The caller must trim matching lines from the beginning and end + * of the portions it is going to specify. + */ + function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) + { + $flip = false; + + if ($xlim - $xoff > $ylim - $yoff) { + /* Things seems faster (I'm not sure I understand why) when the + * shortest sequence is in X. */ + $flip = true; + list ($xoff, $xlim, $yoff, $ylim) + = array($yoff, $ylim, $xoff, $xlim); + } + + if ($flip) { + for ($i = $ylim - 1; $i >= $yoff; $i--) { + $ymatches[$this->xv[$i]][] = $i; + } + } else { + for ($i = $ylim - 1; $i >= $yoff; $i--) { + $ymatches[$this->yv[$i]][] = $i; + } + } + + $this->lcs = 0; + $this->seq[0]= $yoff - 1; + $this->in_seq = array(); + $ymids[0] = array(); + + $numer = $xlim - $xoff + $nchunks - 1; + $x = $xoff; + for ($chunk = 0; $chunk < $nchunks; $chunk++) { + if ($chunk > 0) { + for ($i = 0; $i <= $this->lcs; $i++) { + $ymids[$i][$chunk - 1] = $this->seq[$i]; + } + } + + $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); + for (; $x < $x1; $x++) { + $line = $flip ? $this->yv[$x] : $this->xv[$x]; + if (empty($ymatches[$line])) { + continue; + } + $matches = $ymatches[$line]; + reset($matches); + while (list(, $y) = each($matches)) { + if (empty($this->in_seq[$y])) { + $k = $this->_lcsPos($y); + assert($k > 0); + $ymids[$k] = $ymids[$k - 1]; + break; + } + } + while (list(, $y) = each($matches)) { + if ($y > $this->seq[$k - 1]) { + assert($y <= $this->seq[$k]); + /* Optimization: this is a common case: next match is + * just replacing previous match. */ + $this->in_seq[$this->seq[$k]] = false; + $this->seq[$k] = $y; + $this->in_seq[$y] = 1; + } elseif (empty($this->in_seq[$y])) { + $k = $this->_lcsPos($y); + assert($k > 0); + $ymids[$k] = $ymids[$k - 1]; + } + } + } + } + + $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); + $ymid = $ymids[$this->lcs]; + for ($n = 0; $n < $nchunks - 1; $n++) { + $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); + $y1 = $ymid[$n] + 1; + $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); + } + $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); + + return array($this->lcs, $seps); + } + + function _lcsPos($ypos) + { + $end = $this->lcs; + if ($end == 0 || $ypos > $this->seq[$end]) { + $this->seq[++$this->lcs] = $ypos; + $this->in_seq[$ypos] = 1; + return $this->lcs; + } + + $beg = 1; + while ($beg < $end) { + $mid = (int)(($beg + $end) / 2); + if ($ypos > $this->seq[$mid]) { + $beg = $mid + 1; + } else { + $end = $mid; + } + } + + assert($ypos != $this->seq[$end]); + + $this->in_seq[$this->seq[$end]] = false; + $this->seq[$end] = $ypos; + $this->in_seq[$ypos] = 1; + return $end; + } + + /** + * Finds LCS of two sequences. + * + * The results are recorded in the vectors $this->{x,y}changed[], by + * storing a 1 in the element for each line that is an insertion or + * deletion (ie. is not in the LCS). + * + * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. + * + * Note that XLIM, YLIM are exclusive bounds. All line numbers are + * origin-0 and discarded lines are not counted. + */ + function _compareseq ($xoff, $xlim, $yoff, $ylim) + { + /* Slide down the bottom initial diagonal. */ + while ($xoff < $xlim && $yoff < $ylim + && $this->xv[$xoff] == $this->yv[$yoff]) { + ++$xoff; + ++$yoff; + } + + /* Slide up the top initial diagonal. */ + while ($xlim > $xoff && $ylim > $yoff + && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { + --$xlim; + --$ylim; + } + + if ($xoff == $xlim || $yoff == $ylim) { + $lcs = 0; + } else { + /* This is ad hoc but seems to work well. $nchunks = + * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = + * max(2,min(8,(int)$nchunks)); */ + $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; + list($lcs, $seps) + = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); + } + + if ($lcs == 0) { + /* X and Y sequences have no common subsequence: mark all + * changed. */ + while ($yoff < $ylim) { + $this->ychanged[$this->yind[$yoff++]] = 1; + } + while ($xoff < $xlim) { + $this->xchanged[$this->xind[$xoff++]] = 1; + } + } else { + /* Use the partitions to split this problem into subproblems. */ + reset($seps); + $pt1 = $seps[0]; + while ($pt2 = next($seps)) { + $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); + $pt1 = $pt2; + } + } + } + + /** + * Adjusts inserts/deletes of identical lines to join changes as much as + * possible. + * + * We do something when a run of changed lines include a line at one end + * and has an excluded, identical line at the other. We are free to + * choose which identical line is included. `compareseq' usually chooses + * the one at the beginning, but usually it is cleaner to consider the + * following identical line to be the "change". + * + * This is extracted verbatim from analyze.c (GNU diffutils-2.7). + */ + function _shiftBoundaries($lines, &$changed, $other_changed) + { + $i = 0; + $j = 0; + + assert('count($lines) == count($changed)'); + $len = count($lines); + $other_len = count($other_changed); + + while (1) { + /* Scan forward to find the beginning of another run of + * changes. Also keep track of the corresponding point in the + * other file. + * + * Throughout this code, $i and $j are adjusted together so that + * the first $i elements of $changed and the first $j elements of + * $other_changed both contain the same number of zeros (unchanged + * lines). + * + * Furthermore, $j is always kept so that $j == $other_len or + * $other_changed[$j] == false. */ + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + + while ($i < $len && ! $changed[$i]) { + assert('$j < $other_len && ! $other_changed[$j]'); + $i++; $j++; + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + } + + if ($i == $len) { + break; + } + + $start = $i; + + /* Find the end of this run of changes. */ + while (++$i < $len && $changed[$i]) { + continue; + } + + do { + /* Record the length of this run of changes, so that we can + * later determine whether the run has grown. */ + $runlength = $i - $start; + + /* Move the changed region back, so long as the previous + * unchanged line matches the last changed one. This merges + * with previous changed regions. */ + while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { + $changed[--$start] = 1; + $changed[--$i] = false; + while ($start > 0 && $changed[$start - 1]) { + $start--; + } + assert('$j > 0'); + while ($other_changed[--$j]) { + continue; + } + assert('$j >= 0 && !$other_changed[$j]'); + } + + /* Set CORRESPONDING to the end of the changed run, at the + * last point where it corresponds to a changed run in the + * other file. CORRESPONDING == LEN means no such point has + * been found. */ + $corresponding = $j < $other_len ? $i : $len; + + /* Move the changed region forward, so long as the first + * changed line matches the following unchanged one. This + * merges with following changed regions. Do this second, so + * that if there are no merges, the changed region is moved + * forward as far as possible. */ + while ($i < $len && $lines[$start] == $lines[$i]) { + $changed[$start++] = false; + $changed[$i++] = 1; + while ($i < $len && $changed[$i]) { + $i++; + } + + assert('$j < $other_len && ! $other_changed[$j]'); + $j++; + if ($j < $other_len && $other_changed[$j]) { + $corresponding = $i; + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + } + } + } while ($runlength != $i - $start); + + /* If possible, move the fully-merged run of changes back to a + * corresponding run in the other file. */ + while ($corresponding < $i) { + $changed[--$start] = 1; + $changed[--$i] = 0; + assert('$j > 0'); + while ($other_changed[--$j]) { + continue; + } + assert('$j >= 0 && !$other_changed[$j]'); + } + } + } + +} diff --git a/Diff/Diff/Engine/shell.php b/Diff/Diff/Engine/shell.php new file mode 100644 index 0000000..7f858cb --- /dev/null +++ b/Diff/Diff/Engine/shell.php @@ -0,0 +1,164 @@ + + * @package Text_Diff + * @since 0.3.0 + */ +class Text_Diff_Engine_shell { + + /** + * Path to the diff executable + * + * @var string + */ + var $_diffCommand = 'diff'; + + /** + * Returns the array of differences. + * + * @param array $from_lines lines of text from old file + * @param array $to_lines lines of text from new file + * + * @return array all changes made (array with Text_Diff_Op_* objects) + */ + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + $temp_dir = Text_Diff::_getTempDir(); + + // Execute gnu diff or similar to get a standard diff file. + $from_file = tempnam($temp_dir, 'Text_Diff'); + $to_file = tempnam($temp_dir, 'Text_Diff'); + $fp = fopen($from_file, 'w'); + fwrite($fp, implode("\n", $from_lines)); + fclose($fp); + $fp = fopen($to_file, 'w'); + fwrite($fp, implode("\n", $to_lines)); + fclose($fp); + $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); + unlink($from_file); + unlink($to_file); + + if (is_null($diff)) { + // No changes were made + return array(new Text_Diff_Op_copy($from_lines)); + } + + $from_line_no = 1; + $to_line_no = 1; + $edits = array(); + + // Get changed lines by parsing something like: + // 0a1,2 + // 1,2c4,6 + // 1,5d6 + preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, + $matches, PREG_SET_ORDER); + + foreach ($matches as $match) { + if (!isset($match[5])) { + // This paren is not set every time (see regex). + $match[5] = false; + } + + if ($match[3] == 'a') { + $from_line_no--; + } + + if ($match[3] == 'd') { + $to_line_no--; + } + + if ($from_line_no < $match[1] || $to_line_no < $match[4]) { + // copied lines + assert('$match[1] - $from_line_no == $match[4] - $to_line_no'); + array_push($edits, + new Text_Diff_Op_copy( + $this->_getLines($from_lines, $from_line_no, $match[1] - 1), + $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); + } + + switch ($match[3]) { + case 'd': + // deleted lines + array_push($edits, + new Text_Diff_Op_delete( + $this->_getLines($from_lines, $from_line_no, $match[2]))); + $to_line_no++; + break; + + case 'c': + // changed lines + array_push($edits, + new Text_Diff_Op_change( + $this->_getLines($from_lines, $from_line_no, $match[2]), + $this->_getLines($to_lines, $to_line_no, $match[5]))); + break; + + case 'a': + // added lines + array_push($edits, + new Text_Diff_Op_add( + $this->_getLines($to_lines, $to_line_no, $match[5]))); + $from_line_no++; + break; + } + } + + if (!empty($from_lines)) { + // Some lines might still be pending. Add them as copied + array_push($edits, + new Text_Diff_Op_copy( + $this->_getLines($from_lines, $from_line_no, + $from_line_no + count($from_lines) - 1), + $this->_getLines($to_lines, $to_line_no, + $to_line_no + count($to_lines) - 1))); + } + + return $edits; + } + + /** + * Get lines from either the old or new text + * + * @access private + * + * @param array &$text_lines Either $from_lines or $to_lines + * @param int &$line_no Current line number + * @param int $end Optional end line, when we want to chop more + * than one line. + * + * @return array The chopped lines + */ + function _getLines(&$text_lines, &$line_no, $end = false) + { + if (!empty($end)) { + $lines = array(); + // We can shift even more + while ($line_no <= $end) { + array_push($lines, array_shift($text_lines)); + $line_no++; + } + } else { + $lines = array(array_shift($text_lines)); + $line_no++; + } + + return $lines; + } + +} diff --git a/Diff/Diff/Engine/string.php b/Diff/Diff/Engine/string.php new file mode 100644 index 0000000..9352e60 --- /dev/null +++ b/Diff/Diff/Engine/string.php @@ -0,0 +1,250 @@ + + * $patch = file_get_contents('example.patch'); + * $diff = new Text_Diff('string', array($patch)); + * $renderer = new Text_Diff_Renderer_inline(); + * echo $renderer->render($diff); + * + * + * $Horde: framework/Text_Diff/Diff/Engine/string.php,v 1.5.2.7 2009/07/24 13:04:43 jan Exp $ + * + * Copyright 2005 �rjan Persson + * Copyright 2005-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author �rjan Persson + * @package Text_Diff + * @since 0.2.0 + */ +class Text_Diff_Engine_string { + + /** + * Parses a unified or context diff. + * + * First param contains the whole diff and the second can be used to force + * a specific diff type. If the second parameter is 'autodetect', the + * diff will be examined to find out which type of diff this is. + * + * @param string $diff The diff content. + * @param string $mode The diff mode of the content in $diff. One of + * 'context', 'unified', or 'autodetect'. + * + * @return array List of all diff operations. + */ + function diff($diff, $mode = 'autodetect') + { + // Detect line breaks. + $lnbr = "\n"; + if (strpos($diff, "\r\n") !== false) { + $lnbr = "\r\n"; + } elseif (strpos($diff, "\r") !== false) { + $lnbr = "\r"; + } + + // Make sure we have a line break at the EOF. + if (substr($diff, -strlen($lnbr)) != $lnbr) { + $diff .= $lnbr; + } + + if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { + return PEAR::raiseError('Type of diff is unsupported'); + } + + if ($mode == 'autodetect') { + $context = strpos($diff, '***'); + $unified = strpos($diff, '---'); + if ($context === $unified) { + return PEAR::raiseError('Type of diff could not be detected'); + } elseif ($context === false || $unified === false) { + $mode = $context !== false ? 'context' : 'unified'; + } else { + $mode = $context < $unified ? 'context' : 'unified'; + } + } + + // Split by new line and remove the diff header, if there is one. + $diff = explode($lnbr, $diff); + if (($mode == 'context' && strpos($diff[0], '***') === 0) || + ($mode == 'unified' && strpos($diff[0], '---') === 0)) { + array_shift($diff); + array_shift($diff); + } + + if ($mode == 'context') { + return $this->parseContextDiff($diff); + } else { + return $this->parseUnifiedDiff($diff); + } + } + + /** + * Parses an array containing the unified diff. + * + * @param array $diff Array of lines. + * + * @return array List of all diff operations. + */ + function parseUnifiedDiff($diff) + { + $edits = array(); + $end = count($diff) - 1; + for ($i = 0; $i < $end;) { + $diff1 = array(); + switch (substr($diff[$i], 0, 1)) { + case ' ': + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); + $edits[] = new Text_Diff_Op_copy($diff1); + break; + + case '+': + // get all new lines + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff1); + break; + + case '-': + // get changed or removed lines + $diff2 = array(); + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); + + while ($i < $end && substr($diff[$i], 0, 1) == '+') { + $diff2[] = substr($diff[$i++], 1); + } + if (count($diff2) == 0) { + $edits[] = new Text_Diff_Op_delete($diff1); + } else { + $edits[] = new Text_Diff_Op_change($diff1, $diff2); + } + break; + + default: + $i++; + break; + } + } + + return $edits; + } + + /** + * Parses an array containing the context diff. + * + * @param array $diff Array of lines. + * + * @return array List of all diff operations. + */ + function parseContextDiff(&$diff) + { + $edits = array(); + $i = $max_i = $j = $max_j = 0; + $end = count($diff) - 1; + while ($i < $end && $j < $end) { + while ($i >= $max_i && $j >= $max_j) { + // Find the boundaries of the diff output of the two files + for ($i = $j; + $i < $end && substr($diff[$i], 0, 3) == '***'; + $i++); + for ($max_i = $i; + $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; + $max_i++); + for ($j = $max_i; + $j < $end && substr($diff[$j], 0, 3) == '---'; + $j++); + for ($max_j = $j; + $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; + $max_j++); + } + + // find what hasn't been changed + $array = array(); + while ($i < $max_i && + $j < $max_j && + strcmp($diff[$i], $diff[$j]) == 0) { + $array[] = substr($diff[$i], 2); + $i++; + $j++; + } + + while ($i < $max_i && ($max_j-$j) <= 1) { + if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { + break; + } + $array[] = substr($diff[$i++], 2); + } + + while ($j < $max_j && ($max_i-$i) <= 1) { + if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { + break; + } + $array[] = substr($diff[$j++], 2); + } + if (count($array) > 0) { + $edits[] = new Text_Diff_Op_copy($array); + } + + if ($i < $max_i) { + $diff1 = array(); + switch (substr($diff[$i], 0, 1)) { + case '!': + $diff2 = array(); + do { + $diff1[] = substr($diff[$i], 2); + if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { + $diff2[] = substr($diff[$j++], 2); + } + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); + $edits[] = new Text_Diff_Op_change($diff1, $diff2); + break; + + case '+': + do { + $diff1[] = substr($diff[$i], 2); + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff1); + break; + + case '-': + do { + $diff1[] = substr($diff[$i], 2); + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); + $edits[] = new Text_Diff_Op_delete($diff1); + break; + } + } + + if ($j < $max_j) { + $diff2 = array(); + switch (substr($diff[$j], 0, 1)) { + case '+': + do { + $diff2[] = substr($diff[$j++], 2); + } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff2); + break; + + case '-': + do { + $diff2[] = substr($diff[$j++], 2); + } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); + $edits[] = new Text_Diff_Op_delete($diff2); + break; + } + } + } + + return $edits; + } + +} diff --git a/Diff/Diff/Engine/xdiff.php b/Diff/Diff/Engine/xdiff.php new file mode 100644 index 0000000..241d2e5 --- /dev/null +++ b/Diff/Diff/Engine/xdiff.php @@ -0,0 +1,66 @@ + + * @package Text_Diff + */ +class Text_Diff_Engine_xdiff { + + /** + */ + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + /* Convert the two input arrays into strings for xdiff processing. */ + $from_string = implode("\n", $from_lines); + $to_string = implode("\n", $to_lines); + + /* Diff the two strings and convert the result to an array. */ + $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); + $diff = explode("\n", $diff); + + /* Walk through the diff one line at a time. We build the $edits + * array of diff operations by reading the first character of the + * xdiff output (which is in the "unified diff" format). + * + * Note that we don't have enough information to detect "changed" + * lines using this approach, so we can't add Text_Diff_Op_changed + * instances to the $edits array. The result is still perfectly + * valid, albeit a little less descriptive and efficient. */ + $edits = array(); + foreach ($diff as $line) { + if (!strlen($line)) { + continue; + } + switch ($line[0]) { + case ' ': + $edits[] = &new Text_Diff_Op_copy(array(substr($line, 1))); + break; + + case '+': + $edits[] = &new Text_Diff_Op_add(array(substr($line, 1))); + break; + + case '-': + $edits[] = &new Text_Diff_Op_delete(array(substr($line, 1))); + break; + } + } + + return $edits; + } + +} diff --git a/Diff/Diff/Mapped.php b/Diff/Diff/Mapped.php new file mode 100644 index 0000000..dc46e5e --- /dev/null +++ b/Diff/Diff/Mapped.php @@ -0,0 +1,55 @@ + + */ +class Text_Diff_Mapped extends Text_Diff { + + /** + * Computes a diff between sequences of strings. + * + * This can be used to compute things like case-insensitve diffs, or diffs + * which ignore changes in white-space. + * + * @param array $from_lines An array of strings. + * @param array $to_lines An array of strings. + * @param array $mapped_from_lines This array should have the same size + * number of elements as $from_lines. The + * elements in $mapped_from_lines and + * $mapped_to_lines are what is actually + * compared when computing the diff. + * @param array $mapped_to_lines This array should have the same number + * of elements as $to_lines. + */ + function Text_Diff_Mapped($from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines) + { + assert(count($from_lines) == count($mapped_from_lines)); + assert(count($to_lines) == count($mapped_to_lines)); + + parent::Text_Diff($mapped_from_lines, $mapped_to_lines); + + $xi = $yi = 0; + for ($i = 0; $i < count($this->_edits); $i++) { + $orig = &$this->_edits[$i]->orig; + if (is_array($orig)) { + $orig = array_slice($from_lines, $xi, count($orig)); + $xi += count($orig); + } + + $final = &$this->_edits[$i]->final; + if (is_array($final)) { + $final = array_slice($to_lines, $yi, count($final)); + $yi += count($final); + } + } + } + +} diff --git a/Diff/Diff/Renderer.php b/Diff/Diff/Renderer.php new file mode 100644 index 0000000..3a51650 --- /dev/null +++ b/Diff/Diff/Renderer.php @@ -0,0 +1,237 @@ + $value) { + $v = '_' . $param; + if (isset($this->$v)) { + $this->$v = $value; + } + } + } + + /** + * Get any renderer parameters. + * + * @return array All parameters of this renderer object. + */ + function getParams() + { + $params = array(); + foreach (get_object_vars($this) as $k => $v) { + if ($k[0] == '_') { + $params[substr($k, 1)] = $v; + } + } + + return $params; + } + + /** + * Renders a diff. + * + * @param Text_Diff $diff A Text_Diff object. + * + * @return string The formatted output. + */ + function render($diff) + { + $xi = $yi = 1; + $block = false; + $context = array(); + + $nlead = $this->_leading_context_lines; + $ntrail = $this->_trailing_context_lines; + + $output = $this->_startDiff(); + + $diffs = $diff->getDiff(); + foreach ($diffs as $i => $edit) { + /* If these are unchanged (copied) lines, and we want to keep + * leading or trailing context lines, extract them from the copy + * block. */ + if (is_a($edit, 'Text_Diff_Op_copy')) { + /* Do we have any diff blocks yet? */ + if (is_array($block)) { + /* How many lines to keep as context from the copy + * block. */ + $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail; + if (count($edit->orig) <= $keep) { + /* We have less lines in the block than we want for + * context => keep the whole block. */ + $block[] = $edit; + } else { + if ($ntrail) { + /* Create a new block with as many lines as we need + * for the trailing context. */ + $context = array_slice($edit->orig, 0, $ntrail); + $block[] = new Text_Diff_Op_copy($context); + } + /* @todo */ + $output .= $this->_block($x0, $ntrail + $xi - $x0, + $y0, $ntrail + $yi - $y0, + $block); + $block = false; + } + } + /* Keep the copy block as the context for the next block. */ + $context = $edit->orig; + } else { + /* Don't we have any diff blocks yet? */ + if (!is_array($block)) { + /* Extract context lines from the preceding copy block. */ + $context = array_slice($context, count($context) - $nlead); + $x0 = $xi - count($context); + $y0 = $yi - count($context); + $block = array(); + if ($context) { + $block[] = new Text_Diff_Op_copy($context); + } + } + $block[] = $edit; + } + + if ($edit->orig) { + $xi += count($edit->orig); + } + if ($edit->final) { + $yi += count($edit->final); + } + } + + if (is_array($block)) { + $output .= $this->_block($x0, $xi - $x0, + $y0, $yi - $y0, + $block); + } + + return $output . $this->_endDiff(); + } + + function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) + { + $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); + + foreach ($edits as $edit) { + switch (strtolower(get_class($edit))) { + case 'text_diff_op_copy': + $output .= $this->_context($edit->orig); + break; + + case 'text_diff_op_add': + $output .= $this->_added($edit->final); + break; + + case 'text_diff_op_delete': + $output .= $this->_deleted($edit->orig); + break; + + case 'text_diff_op_change': + $output .= $this->_changed($edit->orig, $edit->final); + break; + } + } + + return $output . $this->_endBlock(); + } + + function _startDiff() + { + return ''; + } + + function _endDiff() + { + return ''; + } + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + if ($xlen > 1) { + $xbeg .= ',' . ($xbeg + $xlen - 1); + } + if ($ylen > 1) { + $ybeg .= ',' . ($ybeg + $ylen - 1); + } + + // this matches the GNU Diff behaviour + if ($xlen && !$ylen) { + $ybeg--; + } elseif (!$xlen) { + $xbeg--; + } + + return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; + } + + function _startBlock($header) + { + return $header . "\n"; + } + + function _endBlock() + { + return ''; + } + + function _lines($lines, $prefix = ' ') + { + return $prefix . implode("\n$prefix", $lines) . "\n"; + } + + function _context($lines) + { + return $this->_lines($lines, ' '); + } + + function _added($lines) + { + return $this->_lines($lines, '> '); + } + + function _deleted($lines) + { + return $this->_lines($lines, '< '); + } + + function _changed($orig, $final) + { + return $this->_deleted($orig) . "---\n" . $this->_added($final); + } + +} diff --git a/Diff/Diff/Renderer/context.php b/Diff/Diff/Renderer/context.php new file mode 100644 index 0000000..af53801 --- /dev/null +++ b/Diff/Diff/Renderer/context.php @@ -0,0 +1,77 @@ +_second_block = "--- $ybeg ----\n"; + return "***************\n*** $xbeg ****"; + } + + function _endBlock() + { + return $this->_second_block; + } + + function _context($lines) + { + $this->_second_block .= $this->_lines($lines, ' '); + return $this->_lines($lines, ' '); + } + + function _added($lines) + { + $this->_second_block .= $this->_lines($lines, '+ '); + return ''; + } + + function _deleted($lines) + { + return $this->_lines($lines, '- '); + } + + function _changed($orig, $final) + { + $this->_second_block .= $this->_lines($final, '! '); + return $this->_lines($orig, '! '); + } + +} diff --git a/Diff/Diff/Renderer/inline.php b/Diff/Diff/Renderer/inline.php new file mode 100644 index 0000000..5dd20d2 --- /dev/null +++ b/Diff/Diff/Renderer/inline.php @@ -0,0 +1,172 @@ +'; + + /** + * Suffix for inserted text. + */ + var $_ins_suffix = ''; + + /** + * Prefix for deleted text. + */ + var $_del_prefix = ''; + + /** + * Suffix for deleted text. + */ + var $_del_suffix = ''; + + /** + * Header for each change block. + */ + var $_block_header = ''; + + /** + * What are we currently splitting on? Used to recurse to show word-level + * changes. + */ + var $_split_level = 'lines'; + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + return $this->_block_header; + } + + function _startBlock($header) + { + return $header; + } + + function _lines($lines, $prefix = ' ', $encode = true) + { + if ($encode) { + array_walk($lines, array(&$this, '_encode')); + } + + if ($this->_split_level == 'words') { + return implode('', $lines); + } else { + return implode("\n", $lines) . "\n"; + } + } + + function _added($lines) + { + array_walk($lines, array(&$this, '_encode')); + $lines[0] = $this->_ins_prefix . $lines[0]; + $lines[count($lines) - 1] .= $this->_ins_suffix; + return $this->_lines($lines, ' ', false); + } + + function _deleted($lines, $words = false) + { + array_walk($lines, array(&$this, '_encode')); + $lines[0] = $this->_del_prefix . $lines[0]; + $lines[count($lines) - 1] .= $this->_del_suffix; + return $this->_lines($lines, ' ', false); + } + + function _changed($orig, $final) + { + /* If we've already split on words, don't try to do so again - just + * display. */ + if ($this->_split_level == 'words') { + $prefix = ''; + while ($orig[0] !== false && $final[0] !== false && + substr($orig[0], 0, 1) == ' ' && + substr($final[0], 0, 1) == ' ') { + $prefix .= substr($orig[0], 0, 1); + $orig[0] = substr($orig[0], 1); + $final[0] = substr($final[0], 1); + } + return $prefix . $this->_deleted($orig) . $this->_added($final); + } + + $text1 = implode("\n", $orig); + $text2 = implode("\n", $final); + + /* Non-printing newline marker. */ + $nl = "\0"; + + /* We want to split on word boundaries, but we need to + * preserve whitespace as well. Therefore we split on words, + * but include all blocks of whitespace in the wordlist. */ + $diff = new Text_Diff('native', + array($this->_splitOnWords($text1, $nl), + $this->_splitOnWords($text2, $nl))); + + /* Get the diff in inline format. */ + $renderer = new Text_Diff_Renderer_inline + (array_merge($this->getParams(), + array('split_level' => 'words'))); + + /* Run the diff and get the output. */ + return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; + } + + function _splitOnWords($string, $newlineEscape = "\n") + { + // Ignore \0; otherwise the while loop will never finish. + $string = str_replace("\0", '', $string); + + $words = array(); + $length = strlen($string); + $pos = 0; + + while ($pos < $length) { + // Eat a word with any preceding whitespace. + $spaces = strspn(substr($string, $pos), " \n"); + $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); + $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); + $pos += $spaces + $nextpos; + } + + return $words; + } + + function _encode(&$string) + { + $string = htmlspecialchars($string); + } + +} diff --git a/Diff/Diff/Renderer/unified.php b/Diff/Diff/Renderer/unified.php new file mode 100644 index 0000000..f990f72 --- /dev/null +++ b/Diff/Diff/Renderer/unified.php @@ -0,0 +1,67 @@ +_lines($lines, ' '); + } + + function _added($lines) + { + return $this->_lines($lines, '+'); + } + + function _deleted($lines) + { + return $this->_lines($lines, '-'); + } + + function _changed($orig, $final) + { + return $this->_deleted($orig) . $this->_added($final); + } + +} diff --git a/Diff/Diff/ThreeWay.php b/Diff/Diff/ThreeWay.php new file mode 100644 index 0000000..5b0357c --- /dev/null +++ b/Diff/Diff/ThreeWay.php @@ -0,0 +1,276 @@ + + */ +class Text_Diff_ThreeWay extends Text_Diff { + + /** + * Conflict counter. + * + * @var integer + */ + var $_conflictingBlocks = 0; + + /** + * Computes diff between 3 sequences of strings. + * + * @param array $orig The original lines to use. + * @param array $final1 The first version to compare to. + * @param array $final2 The second version to compare to. + */ + function Text_Diff_ThreeWay($orig, $final1, $final2) + { + if (extension_loaded('xdiff')) { + $engine = new Text_Diff_Engine_xdiff(); + } else { + $engine = new Text_Diff_Engine_native(); + } + + $this->_edits = $this->_diff3($engine->diff($orig, $final1), + $engine->diff($orig, $final2)); + } + + /** + */ + function mergedOutput($label1 = false, $label2 = false) + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->isConflict()) { + /* FIXME: this should probably be moved somewhere else. */ + $lines = array_merge($lines, + array('<<<<<<<' . ($label1 ? ' ' . $label1 : '')), + $edit->final1, + array("======="), + $edit->final2, + array('>>>>>>>' . ($label2 ? ' ' . $label2 : ''))); + $this->_conflictingBlocks++; + } else { + $lines = array_merge($lines, $edit->merged()); + } + } + + return $lines; + } + + /** + * @access private + */ + function _diff3($edits1, $edits2) + { + $edits = array(); + $bb = new Text_Diff_ThreeWay_BlockBuilder(); + + $e1 = current($edits1); + $e2 = current($edits2); + while ($e1 || $e2) { + if ($e1 && $e2 && is_a($e1, 'Text_Diff_Op_copy') && is_a($e2, 'Text_Diff_Op_copy')) { + /* We have copy blocks from both diffs. This is the (only) + * time we want to emit a diff3 copy block. Flush current + * diff3 diff block, if any. */ + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + $ncopy = min($e1->norig(), $e2->norig()); + assert($ncopy > 0); + $edits[] = new Text_Diff_ThreeWay_Op_copy(array_slice($e1->orig, 0, $ncopy)); + + if ($e1->norig() > $ncopy) { + array_splice($e1->orig, 0, $ncopy); + array_splice($e1->final, 0, $ncopy); + } else { + $e1 = next($edits1); + } + + if ($e2->norig() > $ncopy) { + array_splice($e2->orig, 0, $ncopy); + array_splice($e2->final, 0, $ncopy); + } else { + $e2 = next($edits2); + } + } else { + if ($e1 && $e2) { + if ($e1->orig && $e2->orig) { + $norig = min($e1->norig(), $e2->norig()); + $orig = array_splice($e1->orig, 0, $norig); + array_splice($e2->orig, 0, $norig); + $bb->input($orig); + } + + if (is_a($e1, 'Text_Diff_Op_copy')) { + $bb->out1(array_splice($e1->final, 0, $norig)); + } + + if (is_a($e2, 'Text_Diff_Op_copy')) { + $bb->out2(array_splice($e2->final, 0, $norig)); + } + } + + if ($e1 && ! $e1->orig) { + $bb->out1($e1->final); + $e1 = next($edits1); + } + if ($e2 && ! $e2->orig) { + $bb->out2($e2->final); + $e2 = next($edits2); + } + } + } + + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + return $edits; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_ThreeWay_Op { + + function Text_Diff_ThreeWay_Op($orig = false, $final1 = false, $final2 = false) + { + $this->orig = $orig ? $orig : array(); + $this->final1 = $final1 ? $final1 : array(); + $this->final2 = $final2 ? $final2 : array(); + } + + function merged() + { + if (!isset($this->_merged)) { + if ($this->final1 === $this->final2) { + $this->_merged = &$this->final1; + } elseif ($this->final1 === $this->orig) { + $this->_merged = &$this->final2; + } elseif ($this->final2 === $this->orig) { + $this->_merged = &$this->final1; + } else { + $this->_merged = false; + } + } + + return $this->_merged; + } + + function isConflict() + { + return $this->merged() === false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_ThreeWay_Op_copy extends Text_Diff_ThreeWay_Op { + + function Text_Diff_ThreeWay_Op_Copy($lines = false) + { + $this->orig = $lines ? $lines : array(); + $this->final1 = &$this->orig; + $this->final2 = &$this->orig; + } + + function merged() + { + return $this->orig; + } + + function isConflict() + { + return false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_ThreeWay_BlockBuilder { + + function Text_Diff_ThreeWay_BlockBuilder() + { + $this->_init(); + } + + function input($lines) + { + if ($lines) { + $this->_append($this->orig, $lines); + } + } + + function out1($lines) + { + if ($lines) { + $this->_append($this->final1, $lines); + } + } + + function out2($lines) + { + if ($lines) { + $this->_append($this->final2, $lines); + } + } + + function isEmpty() + { + return !$this->orig && !$this->final1 && !$this->final2; + } + + function finish() + { + if ($this->isEmpty()) { + return false; + } else { + $edit = new Text_Diff_ThreeWay_Op($this->orig, $this->final1, $this->final2); + $this->_init(); + return $edit; + } + } + + function _init() + { + $this->orig = $this->final1 = $this->final2 = array(); + } + + function _append(&$array, $lines) + { + array_splice($array, sizeof($array), 0, $lines); + } + +} diff --git a/Diff/Diff3.php b/Diff/Diff3.php new file mode 100644 index 0000000..e9aea9f --- /dev/null +++ b/Diff/Diff3.php @@ -0,0 +1,276 @@ + + */ +class Text_Diff3 extends Text_Diff { + + /** + * Conflict counter. + * + * @var integer + */ + var $_conflictingBlocks = 0; + + /** + * Computes diff between 3 sequences of strings. + * + * @param array $orig The original lines to use. + * @param array $final1 The first version to compare to. + * @param array $final2 The second version to compare to. + */ + function Text_Diff3($orig, $final1, $final2) + { + if (extension_loaded('xdiff')) { + $engine = new Text_Diff_Engine_xdiff(); + } else { + $engine = new Text_Diff_Engine_native(); + } + + $this->_edits = $this->_diff3($engine->diff($orig, $final1), + $engine->diff($orig, $final2)); + } + + /** + */ + function mergedOutput($label1 = false, $label2 = false) + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->isConflict()) { + /* FIXME: this should probably be moved somewhere else. */ + $lines = array_merge($lines, + array('<<<<<<<' . ($label1 ? ' ' . $label1 : '')), + $edit->final1, + array("======="), + $edit->final2, + array('>>>>>>>' . ($label2 ? ' ' . $label2 : ''))); + $this->_conflictingBlocks++; + } else { + $lines = array_merge($lines, $edit->merged()); + } + } + + return $lines; + } + + /** + * @access private + */ + function _diff3($edits1, $edits2) + { + $edits = array(); + $bb = new Text_Diff3_BlockBuilder(); + + $e1 = current($edits1); + $e2 = current($edits2); + while ($e1 || $e2) { + if ($e1 && $e2 && is_a($e1, 'Text_Diff_Op_copy') && is_a($e2, 'Text_Diff_Op_copy')) { + /* We have copy blocks from both diffs. This is the (only) + * time we want to emit a diff3 copy block. Flush current + * diff3 diff block, if any. */ + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + $ncopy = min($e1->norig(), $e2->norig()); + assert($ncopy > 0); + $edits[] = new Text_Diff3_Op_copy(array_slice($e1->orig, 0, $ncopy)); + + if ($e1->norig() > $ncopy) { + array_splice($e1->orig, 0, $ncopy); + array_splice($e1->final, 0, $ncopy); + } else { + $e1 = next($edits1); + } + + if ($e2->norig() > $ncopy) { + array_splice($e2->orig, 0, $ncopy); + array_splice($e2->final, 0, $ncopy); + } else { + $e2 = next($edits2); + } + } else { + if ($e1 && $e2) { + if ($e1->orig && $e2->orig) { + $norig = min($e1->norig(), $e2->norig()); + $orig = array_splice($e1->orig, 0, $norig); + array_splice($e2->orig, 0, $norig); + $bb->input($orig); + } + + if (is_a($e1, 'Text_Diff_Op_copy')) { + $bb->out1(array_splice($e1->final, 0, $norig)); + } + + if (is_a($e2, 'Text_Diff_Op_copy')) { + $bb->out2(array_splice($e2->final, 0, $norig)); + } + } + + if ($e1 && ! $e1->orig) { + $bb->out1($e1->final); + $e1 = next($edits1); + } + if ($e2 && ! $e2->orig) { + $bb->out2($e2->final); + $e2 = next($edits2); + } + } + } + + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + return $edits; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff3_Op { + + function Text_Diff3_Op($orig = false, $final1 = false, $final2 = false) + { + $this->orig = $orig ? $orig : array(); + $this->final1 = $final1 ? $final1 : array(); + $this->final2 = $final2 ? $final2 : array(); + } + + function merged() + { + if (!isset($this->_merged)) { + if ($this->final1 === $this->final2) { + $this->_merged = &$this->final1; + } elseif ($this->final1 === $this->orig) { + $this->_merged = &$this->final2; + } elseif ($this->final2 === $this->orig) { + $this->_merged = &$this->final1; + } else { + $this->_merged = false; + } + } + + return $this->_merged; + } + + function isConflict() + { + return $this->merged() === false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff3_Op_copy extends Text_Diff3_Op { + + function Text_Diff3_Op_Copy($lines = false) + { + $this->orig = $lines ? $lines : array(); + $this->final1 = &$this->orig; + $this->final2 = &$this->orig; + } + + function merged() + { + return $this->orig; + } + + function isConflict() + { + return false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff3_BlockBuilder { + + function Text_Diff3_BlockBuilder() + { + $this->_init(); + } + + function input($lines) + { + if ($lines) { + $this->_append($this->orig, $lines); + } + } + + function out1($lines) + { + if ($lines) { + $this->_append($this->final1, $lines); + } + } + + function out2($lines) + { + if ($lines) { + $this->_append($this->final2, $lines); + } + } + + function isEmpty() + { + return !$this->orig && !$this->final1 && !$this->final2; + } + + function finish() + { + if ($this->isEmpty()) { + return false; + } else { + $edit = new Text_Diff3_Op($this->orig, $this->final1, $this->final2); + $this->_init(); + return $edit; + } + } + + function _init() + { + $this->orig = $this->final1 = $this->final2 = array(); + } + + function _append(&$array, $lines) + { + array_splice($array, sizeof($array), 0, $lines); + } + +} diff --git a/Diff/docs/examples/1.txt b/Diff/docs/examples/1.txt new file mode 100644 index 0000000..976c447 --- /dev/null +++ b/Diff/docs/examples/1.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 1.txt +This line is the same. diff --git a/Diff/docs/examples/2.txt b/Diff/docs/examples/2.txt new file mode 100644 index 0000000..6fa8051 --- /dev/null +++ b/Diff/docs/examples/2.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 2.txt +This line is the same. diff --git a/Diff/docs/examples/diff.php b/Diff/docs/examples/diff.php new file mode 100644 index 0000000..66914c2 --- /dev/null +++ b/Diff/docs/examples/diff.php @@ -0,0 +1,39 @@ +#!/usr/bin/php + \n\n"; + exit; +} + +/* Make sure both files exist. */ +if (!is_readable($argv[1])) { + echo "$argv[1] not found or not readable.\n\n"; +} +if (!is_readable($argv[2])) { + echo "$argv[2] not found or not readable.\n\n"; +} + +/* Load the lines of each file. */ +$lines1 = file($argv[1]); +$lines2 = file($argv[2]); + +/* Create the Diff object. */ +$diff = new Text_Diff('auto', array($lines1, $lines2)); + +/* Output the diff in unified format. */ +$renderer = new Text_Diff_Renderer_unified(); +echo $renderer->render($diff); diff --git a/Diff/tests/1.txt b/Diff/tests/1.txt new file mode 100644 index 0000000..976c447 --- /dev/null +++ b/Diff/tests/1.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 1.txt +This line is the same. diff --git a/Diff/tests/2.txt b/Diff/tests/2.txt new file mode 100644 index 0000000..6fa8051 --- /dev/null +++ b/Diff/tests/2.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 2.txt +This line is the same. diff --git a/Diff/tests/3.txt b/Diff/tests/3.txt new file mode 100644 index 0000000..0c26fe9 --- /dev/null +++ b/Diff/tests/3.txt @@ -0,0 +1,4 @@ +This line is the same. +This line is different in 1.txt +This line is the same. +This line is new in 3.txt diff --git a/Diff/tests/4.txt b/Diff/tests/4.txt new file mode 100644 index 0000000..7cbc69d --- /dev/null +++ b/Diff/tests/4.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 4.txt +This line is the same. diff --git a/Diff/tests/5.txt b/Diff/tests/5.txt new file mode 100644 index 0000000..d48db22 --- /dev/null +++ b/Diff/tests/5.txt @@ -0,0 +1,5 @@ +This is a test. +Adding random text to simulate files. +Various Content. +More Content. +Testing diff and renderer. diff --git a/Diff/tests/6.txt b/Diff/tests/6.txt new file mode 100644 index 0000000..5b421cd --- /dev/null +++ b/Diff/tests/6.txt @@ -0,0 +1,7 @@ +This is a test. +Adding random text to simulate files. +Inserting a line. +Various Content. +Replacing content. +Testing similarities and renderer. +Append content. diff --git a/Diff/tests/context.patch b/Diff/tests/context.patch new file mode 100644 index 0000000..2a4fad9 --- /dev/null +++ b/Diff/tests/context.patch @@ -0,0 +1,11 @@ +*** 1.txt 2005-03-21 13:37:59.000000000 +0100 +--- 2.txt 2005-03-21 13:38:00.000000000 +0100 +*************** +*** 1,3 **** + This line is the same. +! This line is different in 1.txt + This line is the same. +--- 1,3 ---- + This line is the same. +! This line is different in 2.txt + This line is the same. diff --git a/Diff/tests/context.phpt b/Diff/tests/context.phpt new file mode 100644 index 0000000..5891ea4 --- /dev/null +++ b/Diff/tests/context.phpt @@ -0,0 +1,25 @@ +--TEST-- +Text_Diff: Context renderer +--FILE-- +render($diff); +?> +--EXPECT-- +*************** +*** 1,3 **** + This line is the same. +! This line is different in 1.txt + This line is the same. +--- 1,3 ---- + This line is the same. +! This line is different in 2.txt + This line is the same. diff --git a/Diff/tests/context2.phpt b/Diff/tests/context2.phpt new file mode 100644 index 0000000..6d8f248 --- /dev/null +++ b/Diff/tests/context2.phpt @@ -0,0 +1,31 @@ +--TEST-- +Text_Diff: Context renderer 2 +--FILE-- +render($diff); +?> +--EXPECT-- +*************** +*** 1,5 **** + This is a test. + Adding random text to simulate files. + Various Content. +! More Content. +! Testing diff and renderer. +--- 1,7 ---- + This is a test. + Adding random text to simulate files. ++ Inserting a line. + Various Content. +! Replacing content. +! Testing similarities and renderer. +! Append content. diff --git a/Diff/tests/diff.phpt b/Diff/tests/diff.phpt new file mode 100644 index 0000000..add291f --- /dev/null +++ b/Diff/tests/diff.phpt @@ -0,0 +1,62 @@ +--TEST-- +Text_Diff: Basic diff operation +--FILE-- + +--EXPECT-- +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + [1] => text_diff_op_change object + ( + [orig] => array + ( + [0] => this line is different in 1.txt + ) + + [final] => array + ( + [0] => this line is different in 2.txt + ) + + ) + + [2] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + ) + +) diff --git a/Diff/tests/inline.phpt b/Diff/tests/inline.phpt new file mode 100644 index 0000000..b3d1ba7 --- /dev/null +++ b/Diff/tests/inline.phpt @@ -0,0 +1,19 @@ +--TEST-- +Text_Diff: Inline renderer +--FILE-- +render($diff); +?> +--EXPECT-- +This line is the same. +This line is different in 1.txt2.txt +This line is the same. diff --git a/Diff/tests/inline2.phpt b/Diff/tests/inline2.phpt new file mode 100644 index 0000000..153a39f --- /dev/null +++ b/Diff/tests/inline2.phpt @@ -0,0 +1,37 @@ +--TEST-- +Text_Diff: Inline renderer 2 +--FILE-- +render($diff); +?> +--EXPECT-- +This is a test. +Adding random text to simulate files. +Inserting a line. +Various Content. +More Content.Replacing content. +Testing diffsimilarities and renderer. +Append content. diff --git a/Diff/tests/pear_bug12740.phpt b/Diff/tests/pear_bug12740.phpt new file mode 100644 index 0000000..56b4ced --- /dev/null +++ b/Diff/tests/pear_bug12740.phpt @@ -0,0 +1,30 @@ +--TEST-- +Text_Diff: PEAR Bug #12740 (failed assertion) +--FILE-- +The tax credit amounts to 30% of the cost of the system, with a +maximum of 2,000. This credit is separate from the 500 home improvement +credit. +

Fuel Cells
+
  • Your fuel 123456789
  • +QQ; + +$b = << of gas emissions by 2050 +
  • Raise car fuel economy to 50 mpg by 2017
  • +
  • Increase access to mass transit systems
  • +QQ; + +$diff = new Text_Diff('native', array(explode("\n", $b), explode("\n", $a))); +$renderer = new Text_Diff_Renderer_inline(); +$renderer->render($diff); + +?> +--EXPECT-- diff --git a/Diff/tests/pear_bug4879.phpt b/Diff/tests/pear_bug4879.phpt new file mode 100644 index 0000000..5bb657b --- /dev/null +++ b/Diff/tests/pear_bug4879.phpt @@ -0,0 +1,30 @@ +--TEST-- +Text_Diff: PEAR Bug #4879 (inline renderer hangs on numbers in input string) +--FILE-- +render($diff); +?> +--EXPECT-- +Common text +Bob had 1 apple,10 apples, Alice had 2.1. +Bon appetit! diff --git a/Diff/tests/pear_bug6251.phpt b/Diff/tests/pear_bug6251.phpt new file mode 100644 index 0000000..86af082 --- /dev/null +++ b/Diff/tests/pear_bug6251.phpt @@ -0,0 +1,45 @@ +--TEST-- +Text_Diff: PEAR Bug #6251 (too much trailing context) +--FILE-- + 3, 'trailing_context_lines' => 3)); + +// We need to use var_dump, as the test runner strips trailing empty lines. +var_dump($renderer->render($diff)); +?> +--EXPECT-- +string(54) "@@ -1,5 +1,5 @@ + +-Original Text ++Modified Text + + + +" diff --git a/Diff/tests/pear_bug6428.phpt b/Diff/tests/pear_bug6428.phpt new file mode 100644 index 0000000..9d5b982 --- /dev/null +++ b/Diff/tests/pear_bug6428.phpt @@ -0,0 +1,18 @@ +--TEST-- +Text_Diff: PEAR Bug #6428 (problem with single digits after space) +--FILE-- +render($diff); +?> +--EXPECT-- +Line 1 1 +Another line diff --git a/Diff/tests/string.phpt b/Diff/tests/string.phpt new file mode 100644 index 0000000..9001198 --- /dev/null +++ b/Diff/tests/string.phpt @@ -0,0 +1,145 @@ +--TEST-- +Text_Diff: Text_Diff_Engine_string test. +--FILE-- +getDiff(), 'PEAR_Error')); +echo "\n"; +$diff_u2 = new Text_Diff('string', array($unified2, 'unified')); +echo strtolower(print_r($diff_u2, true)); + +$context = file_get_contents(dirname(__FILE__) . '/context.patch'); +$diff_c = new Text_Diff('string', array($context)); +echo strtolower(print_r($diff_c, true)); + +?> +--EXPECT-- +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + [1] => text_diff_op_change object + ( + [orig] => array + ( + [0] => this line is different in 1.txt + ) + + [final] => array + ( + [0] => this line is different in 2.txt + ) + + ) + + [2] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + ) + +) +true +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_change object + ( + [orig] => array + ( + [0] => for the first time in u.s. history number of private contractors and troops are equal + ) + + [final] => array + ( + [0] => number of private contractors and troops are equal for first time in u.s. history + ) + + ) + + ) + +) +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + [1] => text_diff_op_change object + ( + [orig] => array + ( + [0] => this line is different in 1.txt + ) + + [final] => array + ( + [0] => this line is different in 2.txt + ) + + ) + + [2] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + ) + +) diff --git a/Diff/tests/unified.patch b/Diff/tests/unified.patch new file mode 100644 index 0000000..b2b3f25 --- /dev/null +++ b/Diff/tests/unified.patch @@ -0,0 +1,7 @@ +--- 1.txt 2005-03-21 13:37:59.000000000 +0100 ++++ 2.txt 2005-03-21 13:38:00.000000000 +0100 +@@ -1,3 +1,3 @@ + This line is the same. +-This line is different in 1.txt ++This line is different in 2.txt + This line is the same. diff --git a/Diff/tests/unified.phpt b/Diff/tests/unified.phpt new file mode 100644 index 0000000..4c279dd --- /dev/null +++ b/Diff/tests/unified.phpt @@ -0,0 +1,21 @@ +--TEST-- +Text_Diff: Unified renderer +--FILE-- +render($diff); +?> +--EXPECT-- +@@ -1,3 +1,3 @@ + This line is the same. +-This line is different in 1.txt ++This line is different in 2.txt + This line is the same. diff --git a/Diff/tests/unified2.phpt b/Diff/tests/unified2.phpt new file mode 100644 index 0000000..303b329 --- /dev/null +++ b/Diff/tests/unified2.phpt @@ -0,0 +1,26 @@ +--TEST-- +Text_Diff: Unified renderer 2 +--FILE-- +render($diff); +?> +--EXPECT-- +@@ -1,5 +1,7 @@ + This is a test. + Adding random text to simulate files. ++Inserting a line. + Various Content. +-More Content. +-Testing diff and renderer. ++Replacing content. ++Testing similarities and renderer. ++Append content. diff --git a/Diff/tests/xdiff.phpt b/Diff/tests/xdiff.phpt new file mode 100644 index 0000000..0be5379 --- /dev/null +++ b/Diff/tests/xdiff.phpt @@ -0,0 +1,24 @@ +--TEST-- +Text_Diff: Text_Diff_Engine_xdiff test. +--SKIPIF-- + +--FILE-- +render($diff); + +?> +--EXPECT-- +@@ -1,3 +1,3 @@ + This line is the same. +-This line is different in 1.txt ++This line is different in 2.txt + This line is the same. diff --git a/c/.idea/.name b/c/.idea/.name new file mode 100644 index 0000000..3410062 --- /dev/null +++ b/c/.idea/.name @@ -0,0 +1 @@ +c \ No newline at end of file diff --git a/c/.idea/c.iml b/c/.idea/c.iml new file mode 100644 index 0000000..6b8184f --- /dev/null +++ b/c/.idea/c.iml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/c/.idea/encodings.xml b/c/.idea/encodings.xml new file mode 100644 index 0000000..e206d70 --- /dev/null +++ b/c/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/c/.idea/inspectionProfiles/Project_Default.xml b/c/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..07b00cc --- /dev/null +++ b/c/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,219 @@ + + + + \ No newline at end of file diff --git a/c/.idea/inspectionProfiles/profiles_settings.xml b/c/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/c/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/c/.idea/misc.xml b/c/.idea/misc.xml new file mode 100644 index 0000000..e399830 --- /dev/null +++ b/c/.idea/misc.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + General + + + PHP + + + + + XSLT + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/c/.idea/modules.xml b/c/.idea/modules.xml new file mode 100644 index 0000000..734d0c6 --- /dev/null +++ b/c/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/c/.idea/scopes/scope_settings.xml b/c/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..922003b --- /dev/null +++ b/c/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/c/.idea/vcs.xml b/c/.idea/vcs.xml new file mode 100644 index 0000000..def6a6a --- /dev/null +++ b/c/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/c/.idea/workspace.xml b/c/.idea/workspace.xml new file mode 100644 index 0000000..62fa21f --- /dev/null +++ b/c/.idea/workspace.xml @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1385753937101 + 1385753937101 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/c/a.php b/c/a.php new file mode 100644 index 0000000..451e3ee --- /dev/null +++ b/c/a.php @@ -0,0 +1,32 @@ +[^<]*<\/sc>/ui"; +$regex2 = "/((\n|\A)[^\n]*)[^<]{2,4}<\/sc>([^\n]*)/ui"; + +$ids = $dpdb->SqlValues("SELECT projectid FROM projects WHERE phase = 'PP'"); +$n = 0; +foreach($ids as $id) { + $proj = new DpProject($id); + $text = $proj->RoundText("F2"); +// dump($id); +// preg_match_all($regex1, $text, $matches1); + preg_match_all($regex2, $text, $matches2); +// dump(count($matches)); +// dump(++$n . " $id " . count($matches1[0]) . " " . count($matches2[0])); +// if(count($matches1[0]) > 1000) { + if(count($matches2[0]) > 10) { +// for($i = 0; $i < 100; $i++ ) { + foreach($matches2[0] as $m) { + dump(h($m)); + } + } +} + diff --git a/c/accounts/login.php b/c/accounts/login.php new file mode 100644 index 0000000..512451b --- /dev/null +++ b/c/accounts/login.php @@ -0,0 +1,27 @@ +IsLoggedIn() && $userNM != "" && $userPW != "") { + $User->Logout(); +} + +//if($userNM && $userPW) { +// $User = new DpThisUser($userNM, $userPW); +// if(! $User->IsLoggedIn()) { +// $destination = $forum_login_url; +// } +//} + +divert($destination); diff --git a/c/accounts/signin.php b/c/accounts/signin.php new file mode 100644 index 0000000..e4e744a --- /dev/null +++ b/c/accounts/signin.php @@ -0,0 +1,11 @@ +Make sure your caps lock is not on."); +theme("", "footer"); +?> diff --git a/c/activity_hub.php b/c/activity_hub.php new file mode 100644 index 0000000..b269ac8 --- /dev/null +++ b/c/activity_hub.php @@ -0,0 +1,384 @@ + "/c/js/dp_ajax.js"); +//$opts = array("hdr_include" => "c.php"); +theme($ahtitle, "header", $opts); + +echo "\n"; + + +echo " +
    + $ahtitle +

    + ".link_to_metal_list("Gold", "Recently Published Ebooks")." +

    +
    \n"; + +/* +echo " +
    +
    + Trouble with login? + +
    +
    \n"; +*/ + +show_admin_links(); + +if ( $User->PageCount() <= 300 && $User->InboxCount() > 0 ) { + echo + "
    +
    \n"; + + echo _(" +

    You have received a private message in your Inbox!

    "); + echo _("

    This could be from somebody sending you feedback on some of the + pages you had proofread earlier. We strongly recommend you READ your + messages. In the links at the top of this page, there is one that says + My Inbox. Just click on that to open your Inbox.

    "); + echo _("

    (After a while this explanatory paragraph will not appear when + you have new messages, but the link to your Inbox will always be up + there and when you have new messages that will be shown in the link)

    "); + echo "
    "; +} + + + +if ($User->PageCount() <= 100) { + echo " +
    +
    \n"); +} + + +// Site News +echo " +
    +
    \n"; + +show_news_for_page("HUB"); + +echo "
    \n"; + +$feedback_url = "$forums_url/viewtopic.php?f=3&t=388"; +echo " + + +
    +
      \n"; + +if ( $User->IsProjectManager() ) { + echo " +
    • " . link_to_project_manager("Manage My Projects") . "
    • \n"; +} + +// ---------------------------------- + +$acounts = array(); +$rows = $dpdb->SqlObjects(" + SELECT phase, COUNT(1) AS scount + FROM projects + GROUP BY phase + ORDER BY phase"); +foreach($rows as $row) { + $acounts[$row->phase] = $row->scount; +} + + + +// Providing Content +echo " +
    • " . _("Providing Content") + . "
      " + . _("Want to help out the site by providing material for us to proofread? ") + . "" + . _("Find out how!") + . " +
    • \n"; + +/** @var Round $round */ +foreach ( $Context->Rounds() as $round ) { + $roundid = $round->RoundId(); + $phase_icon_path = "$dyn_dir/stage_icons/$roundid.jpg"; + $phase_icon_url = "$dyn_url/stage_icons/$roundid.jpg"; + if ( file_exists($phase_icon_path) ) { + $round_img = "($roundid)"; + } + else { + $round_img = "($roundid)"; + } + $rname = RoundIdName($roundid); + $rdesc = RoundIdDescription($roundid); + $rlink = link_to_round($roundid, $rname); + + echo " +
    • +
      + $round_img $rlink
      $rdesc

      \n"; + + summarize_projects($roundid); +} + +$phase = "PP"; +$rname = NameForPhase($phase); +$rdesc = DescriptionForPhase($phase); +$rlink = link_to_pp($rname); +echo " +
    • +
      + ($phase) $rlink
      $rdesc

      \n"; +summarize_projects( $phase ); + +$n_checked_out = $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM projects + WHERE postproofer='{$User->Username()}' + AND phase='PP'"); +if ($n_checked_out) { + echo sprintf( _("You currently have %d projects checked out in this phase."), $n_checked_out ); + echo "
      \n"; +} + + +$phase = "SR"; +$rname = _("Smooth Reading"); +$rdesc = _("Nearly completed projects are often made available for reading and checkproofing before posting."); +$rlink = link_to_smooth_reading($rname); +echo " +
    • +
      + ($phase) $rlink
      $rdesc

      \n"; + + +// ---------------------------------------------------- + +$phase = "PPV"; +$rname = NameForPhase($phase); +$rdesc = DescriptionForPhase($phase); +$rlink = link_to_ppv($rname); +echo " +
      +
    • ($phase) $rlink
      $rdesc

      \n"; +summarize_projects( $phase ); + +$n_checked_out = $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM projects + WHERE ppverifier='{$User->Username()}' + AND phase='PPV'"); +if ($n_checked_out) { + echo sprintf( _("You currently have %d projects checked out in this phase."), $n_checked_out ); + echo "
      \n"; +} + +echo " +
    • +
    \n"; + + +theme("", "footer"); + +function summarize_projects( $phase) { + global $dpdb; + + if($phase == "P1" || $phase == "P2" || $phase == "P3" || $phase == "F1" || $phase == "F2") { + $row = $dpdb->SqlOneRow(" + SELECT SUM(CASE WHEN NOT EXISTS (SELECT 1 FROM project_holds + WHERE projectid = p.projectid + AND phase = '$phase') + THEN 1 ELSE 0 + END) navail, + COUNT(1) ntotal + FROM projects p WHERE p.phase = '$phase'"); + $navail = $row["navail"]; + $ntotal = $row["ntotal"]; + $nwaiting = $ntotal - $navail; + + echo _(" + + + + + + + +
    $nwaiting$navail$ntotal
    \n"); + return; + } + + + if($phase == "PP") { + $row = $dpdb->SqlOneRow(" + SELECT SUM(IFNULL(postproofer, '') = '') navail, + COUNT(1) ntotal, + SUM(smoothread_deadline > UNIX_TIMESTAMP() ) nsmooth + FROM projects where phase = '$phase'"); + $navail = $row["navail"]; + $ntotal = $row["ntotal"]; + $nchecked_out = $ntotal - $navail; + $nsmooth = $row["nsmooth"]; + echo _(" + + + + + + \n"); + echo " + +
    $navail$nchecked_out$nsmooth$ntotal
    \n"; + } + else { + $row = $dpdb->SqlOneRow(" + SELECT SUM(CASE WHEN IFNULL(ppverifier, '') = '' THEN 1 ELSE 0 END) navail, + COUNT(1) ntotal + FROM projects where phase = '$phase'"); + $navail = $row["navail"]; + $ntotal = $row["ntotal"]; + $nchecked_out = $ntotal - $navail; + echo _(" + + + + + \n"); + echo " + +
    $navail$nchecked_out$ntotal
    \n"; + } + + + +} + +function show_admin_links() { + global $User; + if(! $User->IsLoggedIn()) { + return; + } + echo " + + \n"; + +} diff --git a/c/ad_hoc.php b/c/ad_hoc.php new file mode 100644 index 0000000..4489858 --- /dev/null +++ b/c/ad_hoc.php @@ -0,0 +1,194 @@ +SqlRows(" + SELECT pagename, version FROM page_last_versions + WHERE projectid = '$projectid' + "); + +$str = ""; +foreach($pgs as $pg) { + $pagename = $pg['pagename']; + $version = $pg['version']; + $str .= PageVersionText( $projectid, $pagename, $version ); +} + +dump("text length: " . mb_strlen($str)); + +$Context->ZipSendString($projectid . "_PP", $str); +exit; + + +/* +$sql = "SELECT projectid, pagename, version, crc32, textlen + FROM page_versions"; + +$rows = $dpdb->SqlRows($sql); +foreach($rows as $row) { + dump($row); + $projectid = $row['projectid']; + $pagename = $row['pagename']; + $version = $row['version']; + $crc32 = $row['crc32']; + $textlen = $row['textlen']; + $text = PageVersionText($projectid, $pagename, $version); + $tcrc32 = (string) crc32($text); + $ttextlen = mb_strlen($text); + + $sql = "UPDATE page_versions SET crc32 = ?, textlen = ? + WHERE projectid = ? AND pagename = ? AND version = ?"; + $args = array(&$tcrc32, &$ttextlen, &$projectid, &$pagename, &$version); + $n = $dpdb->SqlExecutePS($sql, $args); + say("$projectid $pagename $version $crc32 $textlen $tcrc32 " . ($crc32 == $tcrc32 ? "same" : "not same") ); +} +exit; +*/ + + +//include "../c/pt.inc"; + + +//$projectid = 'p150813001'; +//$pagename = "001"; + +$project = new DpProject($projectid); + + +echo_page_table($project); +exit; +//$version = $project->AddPageVersionRow( "001", "P2", "PROOF", "A"); +//$project->ClonePageVersionText( "001" ); +//$project->AddPageVersionRows("P2", "PROOF", "A"); +$names = $project->PageNames(); +foreach($names as $pagename) { + $ret = $project->CloneLastVersionText($pagename); + dump($ret); +} +exit; + +dump($project->IsAvailable()); +dump($project->IsAvailableForActiveUser()); +dump($project->next_available_page_for_user()); +dump($project->next_retrievable_page_for_user()); +exit; +//$pagename = "312"; + +//$page = new DpPage($projectid, $pagename); +//dump($page->Text()); +//dump(text_lines($page->Text())); +//dump($project->ActiveText()); +//dump($project->EnchantedWords("en")); +//exit; + + +//dump($page->FlagWordsArray("en")); +//dump(PageVersionPath($projectid, $pagename, 1)); +//dump($project->ActivePageArray()); + + + +$project = new DpProject($projectid); +//dump($project->ActiveText()); +//$ew = $project->EnchantedWords("en", $project->ActiveText(), $project->ProjectId());; +//dump($ew->WordsArray()); +exit; + +dump($projectid); +dump($project->CompletedCount()); +dump($project->AvailableCount()); +dump($project->CheckedOutCount()); +$project->RecalcPageCounts(); +dump($project->CompletedCount()); +dump($project->AvailableCount()); +dump($project->CheckedOutCount()); +exit; +//$project->SetQueueHold("P1"); +//$project->SetQCHold("P1"); +/* +$projectid = "projectID51870bf940cce"; +$project = new DpProject($projectid); +dump(count($project->BadWordCountNotZero("en"))); + +include "wc/scannos.php"; +$s = array_keys($scannos); +//dump(array_slice($s,0,5)); +ksort($s); +// array(array(word, count)) +//$wds = $project->FlagWordsByCountAlpha("en"); +//dump(array_slice($wds, 0, 10)); + +// word => count +//$a = $project->RoundText("OCR"); +// which keys of scannos are in keys of counts +//dump($a); + +$pagetitle = "massive word check"; + +echo " + + + +$pagetitle + + + +
    \n"; + +$pids = $dpdb->SqlValues(" + SELECT p.projectid FROM projects p + JOIN phases ON p.phase = phases.phase + WHERE p.phase IN ('P2', 'P3', 'F1', 'F2') + AND p.language = 'en' + ORDER BY phases.sequence"); +say("Count " . count($pids) . " projects"); +$i = 0; + + +foreach($pids as $pid) { + $i++; + $proj = new DpProject($pid); + $phase = $proj->Phase(); + $title = $proj->NameOfWork(); + $words = text_to_words($proj->ActiveText()); + ksort($words); +// dump(array_slice($words,0,5)); +// dump(count(array_intersect($words, array("the"=>"the", "THE" => "THE")))); + $a = array_unique(array_intersect($words, $s)); +// dump(count($a)); +// die(); +// dump(memory_get_peak_usage()); +// $a = array_intersect($words, $s); +// dump(memory_get_peak_usage()); + if(count($a) > 0) { + dump("$i $pid $phase $title - " . count($a) . " of " . count($words)); + dump($a); + } +// $n1 = RegexCount('\\08D', "uis", $proj->RoundText("OCR")); +// $n2 = RegexCount('\\08D', "uis", $proj->RoundText("P1")); +// $n3 = RegexCount('\\08D', "uis", $proj->RoundText("P2")); +// $n4 = RegexCount('\\08D', "uis", $proj->RoundText("P3")); + +// if($n1 > 0 || $n2 > 0 || $n3 > 0 ) { +// say("$i $pid $n1 $n2 $n3"); +// } +// if($i >= 50) { +// break; +// } +} + + + + +say("
    "); + +*/ + + diff --git a/c/adhoc.html b/c/adhoc.html new file mode 100644 index 0000000..f7e79d6 --- /dev/null +++ b/c/adhoc.html @@ -0,0 +1,41 @@ + + + + + Use the mouse wheel on the field below. +
    +
    +
    +
    + The last roll amount: + diff --git a/c/admin.php b/c/admin.php new file mode 100644 index 0000000..db79d67 --- /dev/null +++ b/c/admin.php @@ -0,0 +1,61 @@ + $goal) { + if($goal > 0) { + $dpdb->SqlExecute(" + REPLACE INTO phase_goals + (phase, goal_date, goal) + VALUES + ('$phase', CURRENT_DATE(), $goal)"); + $dpdb->SqlExecute(" + UPDATE phase_goals + SET goal = '$goal' + WHERE phase = '$phase' + AND goal_date > CURRENT_DATE()"); + } +} + +$rows = $dpdb->SqlRows("SELECT pg.phase, pg.goal + FROM phase_goals pg + JOIN phases p ON pg.phase = p.phase + WHERE pg.goal_date = CURRENT_DATE() + ORDER BY p.sequence"); + +$tbl = new DpTable("tblgoals", "dptable lfloat"); +$tbl->addColumn("addColumn("^Goal", "goal"); +$tbl->addColumn("^New Goal", "phase", "eNewGoal"); +$tbl->SetRows($rows); + +echo $basic_header; +echo "

    Admin

    +
      +
    1. Here are the goal settings for today.
    2. +
    3. You can only change goals for today, but changes will affect the future as well.
    4. +
    5. Any new values you enter for a phase will change the goal for today and all future days.
    6. +
    7. Any values you leave blank will remain as they are.
    8. +
    +
    \n"; + +$tbl->EchoTable(); + +echo "
    + +
    + +"; +exit; + + +function eNewGoal($phase) { + return "\n"; +} + + diff --git a/c/ah.php b/c/ah.php new file mode 100644 index 0000000..d1d0924 --- /dev/null +++ b/c/ah.php @@ -0,0 +1,344 @@ +SqlObjects(" +SELECT DATE_FORMAT(d.dateval, '%m-%d') mmdd, + SUM(CASE WHEN round_id = 'P1' THEN page_count ELSE 0 END) p1count, + SUM(CASE WHEN round_id = 'P2' THEN page_count ELSE 0 END) p2count, + SUM(CASE WHEN round_id = 'P3' THEN page_count ELSE 0 END) p3count, + SUM(CASE WHEN round_id = 'F1' THEN page_count ELSE 0 END) f1count, + SUM(CASE WHEN round_id = 'F2' THEN page_count ELSE 0 END) f2count +FROM days d +JOIN user_round_pages urp + ON urp.count_time BETWEEN d.min_unixtime AND d.max_unixtime +WHERE d.dateval > DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) +GROUP BY d.dateval +ORDER BY d.dateval"); + +$data = array(); +$data[0] = array("Day", "P1", "P2", "P3", "F1", "F2"); + +foreach($rows as $row) { + $data[] = array($row->mmdd, $row->p1count, $row->p2count, + $row->p3count, $row->f1count, $row->f2count); +} + + +$dary = json_encode($data); +$dary = preg_replace("/\"(\d\d\d)\"/", "$1", $dary); + + +$ahtitle = _("Activity Hub"); + +echo +" + + + + +DPC: Activity Hub + + + + + + + + +\n"; + +// theme($ahtitle, "header"); +html_logobar($ahtitle); + +echo " +
    + $ahtitle +
    \n"; + + +if($User->IsSiteManager() || $User->IsProjectFacilitator() || $User->IsProjectManager()) { + echo " + + +
    +
    + \n"; +} + +$pagecount = $User->PageCount(); +echo _("

    Welcome to the DP Activity Hub. From this page you can view the +phases of DP production. Follow the links to the specific areas of the site.

    "); + + +if ($pagecount <= 300) { + if ($User->InboxCount() > 0) { + echo + "
    +
    \n"; + + echo _(" +

    You have received a private message in your Inbox!

    "); + echo _("

    This could be from somebody sending you feedback on some of the + pages you had proofread earlier. We strongly recommend you READ your + messages. In the links at the top of this page, there is one that says + My Inbox. Just click on that to open your Inbox.

    "); + echo _("

    (After a while this explanatory paragraph will not appear when + you have new messages, but the link to your Inbox will always be up + there and when you have new messages that will be shown in the link)

    "); + echo "
    "; + } +} + + + +if ($pagecount <= 100) { + echo " +
    +
    +

    " + ._("Welcome") + ."

    \n" + ._("

    Please see our ") ."" + ._("Beginner's Forum") + ."". _(" for answers to common questions.

    +
    \n"); +} + + +// Site News +echo " +
    +
    \n"; + +show_news_for_page("HUB"); + +echo "
    \n"; + +$feedback_url = "$forums_url/viewtopic.php?f=3&t=388"; +echo " +\n"; + + +// Show any mentor banners. +if($User->MayMentor()) { + mentor_banner($round); +} +// ============================================================================= + +echo " +
    +
      \n"; + +if ( user_is_PM() ) { + echo " +
    • " . link_to_project_manager("Manage My Projects") . "
    • \n"; +} + +// ---------------------------------- + +$acounts = array(); +$rows = $dpdb->SqlObjects(" + SELECT phase, COUNT(1) AS scount + FROM projects + GROUP BY phase + ORDER BY phase"); +foreach($rows as $row) { + $acounts[$row->phase] = $row->scount; +} + + + +// Providing Content +echo " +
    • " . _("Providing Content") + . "
      " + . _("Want to help out the site by providing material for us to proofread? ") + . "" + . _("Find out how!") + . " +
    • \n"; + +foreach ( $Context->Rounds() as $roundid ) { + $phase_icon_path = "$dyn_dir/stage_icons/$roundid.jpg"; + $phase_icon_url = "$dyn_url/stage_icons/$roundid.jpg"; + if ( file_exists($phase_icon_path) ) { + $round_img = "($roundid)"; + } + else { + $round_img = "($roundid)"; + } + $rname = RoundIdName($roundid); + $rdesc = RoundIdDescription($roundid); + $rlink = link_to_round($roundid, $rname); + + echo " +
    • +
      + $round_img $rlink
      $rdesc

      \n"; + + summarize_projects($roundid); +} + +$phase = "PP"; +$rname = NameForPhase($phase); +$rdesc = DescriptionForPhase($phase); +$rlink = link_to_pp($rname); +echo " +
    • +
      + ($phase) $rlink
      $rdesc

      \n"; +summarize_projects( $phase ); + +$n_checked_out = $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM projects + WHERE postproofer='{$User->Username()}' + AND phase='PP'"); +if ($n_checked_out) { + echo sprintf( _("You currently have %d projects checked out in this phase."), $n_checked_out ); + echo "
      \n"; +} + +// ---------------------------------------------------- + +$phase = "PPV"; +$rname = NameForPhase($phase); +$rdesc = DescriptionForPhase($phase); +$rlink = link_to_ppv($rname); +echo " +
      +
    • ($phase) $rlink
      $rdesc

      \n"; +summarize_projects( $phase ); + +$n_checked_out = $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM projects + WHERE ppverifier='{$User->Username()}' + AND phase='PPV'"); +if ($n_checked_out) { + echo sprintf( _("You currently have %d projects checked out in this phase."), $n_checked_out ); + echo "
      \n"; +} + +echo " +
    • +
    \n"; + + +theme("", "footer"); + +function summarize_projects( $phase) { + global $dpdb; + + if($phase == "P1" || $phase == "P2" || $phase == "P3" || $phase == "F1" || $phase == "F2") { + $row = $dpdb->SqlOneRow(" + SELECT SUM(CASE WHEN NOT EXISTS (SELECT 1 FROM project_holds + WHERE projectid = p.projectid + AND phase = '$phase') + THEN 1 ELSE 0 + END) navail, + COUNT(1) ntotal + FROM projects p WHERE p.phase = '$phase'"); + $navail = $row["navail"]; + $ntotal = $row["ntotal"]; + $nwaiting = $ntotal - $navail; + + echo _(" + + + + + + + +
    $nwaiting$navail$ntotal
    \n"); + return; + } + + if($phase == "PP") { + $row = $dpdb->SqlOneRow(" + SELECT SUM(CASE WHEN IFNULL(postproofer, '') = '' THEN 1 ELSE 0 END) navail, + COUNT(1) ntotal + FROM projects where phase = '$phase'"); + } + else { + $row = $dpdb->SqlOneRow(" + SELECT SUM(CASE WHEN IFNULL(ppverifier, '') = '' THEN 1 ELSE 0 END) navail, + COUNT(1) ntotal + FROM projects where phase = '$phase'"); + } + $navail = $row["navail"]; + $ntotal = $row["ntotal"]; + $nchecked_out = $ntotal - $navail; + + echo _(" + + + + + + + +
    $navail$nchecked_out$ntotal
    \n"); + + +} + +?> diff --git a/c/backlog.php b/c/backlog.php new file mode 100644 index 0000000..cac8610 --- /dev/null +++ b/c/backlog.php @@ -0,0 +1,57 @@ +SqlObjects(" + SELECT p.phase, + COUNT(1) nprojects, + SUM(n_pages) npages, + ROUND(SUM(n_pages) / pg.goal) ndays + FROM projects p + JOIN phases ph ON p.phase = ph.phase + JOIN phase_goals pg ON p.phase = pg.phase + AND pg.goal_date = CURRENT_DATE() + WHERE p.phase IN ('P1', 'P2', 'P3', 'F1', 'F2') + GROUP BY p.phase + ORDER BY sequence"); + + +?> + + + + google.load("visualization", "1", {packages:["corechart"]}); + google.setOnLoadCallback(drawChart); + + function drawChart() { + var chart = new google.visualization.ColumnChart(document.getElementById('chart_div')); + var data = new google.visualization.DataTable(); + data.addColumn('string', 'Phase'); + data.addColumn('number', 'Days (@ Goal)'); + data.addColumn('number', 'Pages'); +phase', + $phase->ndays, + $phase->npages]);\n"; + } +?> + chart.draw(data, { + title: "Round Pool Size (Pages and Days at Goal)", + curveType: "function", + width: 300, + height: 200, + vAxes: {0: {logScale: false}, + 1: {logScale: false}}, + series:{ + 0:{targetAxisIndex:0}, + 1:{targetAxisIndex:1}}} + ); + } + + + +
    + + diff --git a/c/browse.php b/c/browse.php new file mode 100644 index 0000000..172c65f --- /dev/null +++ b/c/browse.php @@ -0,0 +1,33 @@ +Exists() + or die("No such project - $projectid"); + +$pages = $project->PageRows(); +$pgsrc = url_for_page_image($projectid, $pages[0]["image"]); + +echo " + + + + {$project->Title()} + + +
    + +
    + +
    + \n"; +} + +function url_for_upload_widget($projectid = "", $pagename = "") { + global $code_url; + return "$code_url/upwidget.php" + ."?projectid=$projectid" + ."&pagename=$pagename"; +} + +// -- fadedpage + +function url_for_fadedpage_catalog( $postednum ) { + return "http://www.fadedpage.com/showbook.php?pid={$postednum}"; +} + +function link_to_fadedpage_catalog( $postednum, $prompt="FadedPage" ) { + return link_to_url(url_for_fadedpage_catalog($postednum), $prompt); +} +function url_for_fadedpage() { + return "http://www.fadedpage.com"; +} +function link_to_fadedpage( $prompt = "FadedPage" ) { + return link_to_url(url_for_fadedpage(), $prompt); +} + +/** + * Members + */ + + +function link_to_member_list($prompt = "") { + return link_to_url(url_for_member_list(), $prompt); +} + +function url_for_member_list() { + global $code_url; + return "$code_url/stats/members/member_list.php"; +} + + +function link_to_member_stats($username, $prompt = "") { + return link_to_url(url_for_member_stats($username), $prompt); +} + +function url_for_member_stats($username) { + global $code_url; + return "$code_url/stats/members/member_stats.php" + . "?username=$username"; +} + +function url_for_team_stats($tid, $roundid = "") { + global $code_url; + return $roundid + ? "$code_url/stats/teams/tdetail.php?tid=$tid&roundid=$roundid" + : "$code_url/stats/teams/tdetail.php?tid=$tid"; +} + +function link_to_team_stats($tid, $roundid, $prompt = "") { + if($prompt == "") { + $prompt = $roundid; + } + return link_to_url(url_for_team_stats($tid, $roundid), $prompt); +} + +function link_to_user_roles($username, $prompt = null) { + if(! $prompt) $prompt = $username; + return link_to_url(url_for_user_roles($username), $prompt); +} + +function url_for_user_roles($username) { + global $code_url; + return build_path($code_url, "tools/site_admin/user_roles.php" + ."?username=$username" + ."&qrysubmituser=1"); +} + +function link_to_round_stats($round, $prompt = "") { + if(! $prompt) $prompt = $round; + return link_to_url(url_for_round_stats($round), $prompt); +} + +function url_for_round_stats($round) { + global $code_url; + return "$code_url/stats/proof_stats.php?roundid=$round"; +} + +function link_to_round_charts($round, $prompt = "") { + if(! $prompt) $prompt = $round; + return link_to_url(url_for_round_charts($round), $prompt); +} + +function url_for_round_charts($round) { + global $code_url; + return "$code_url/stats/pages_proofed_graphs.php?roundid=$round"; +} + +function link_to_misc_stats($round, $prompt = "") { + if(! $prompt) $prompt = $round; + return link_to_url(url_for_misc_stats($round), $prompt); +} + +function url_for_misc_stats($round) { + global $code_url; + return "$code_url/stats/misc_stats1.php?roundid=$round"; +} + +function url_for_create_team() { + global $code_url; + return "$code_url/stats/teams/new_team.php"; +} + +function link_to_create_team($prompt = "Create a new team") { + return link_to_url(url_for_create_team(), $prompt); +} + +function url_for_metal_list($metal) { + global $code_url; + return "$code_url/list_etexts.php?{$metal}"; +} + +function link_to_metal_list($metal, $prompt = "", $isnew=false) { + if(!$prompt) $prompt = $metal; + return link_to_url(url_for_metal_list($metal), $prompt, $isnew ); +} + +// -- wordcontext + +function url_for_word_context($projectid, $mode, $options = "") { + global $wc_url; + return "$wc_url/wordcontext.php" + ."?projectid={$projectid}" + ."&mode={$mode}" + . (($options) ? "&$options" : ""); +} + +function url_for_ad_hoc_word_context($projectid) { + return url_for_word_context($projectid, "adhoc"); +} + +function url_for_flagged_word_context($projectid) { + return url_for_word_context($projectid, "aspell"); +} + + + +// -- wordcheck flags (word context) + +function link_to_wordcheck_flags( + $projectid, $prompt, $is_new_tab = false) { + return link_to_url( + url_for_wordcheck_flags($projectid), $prompt, $is_new_tab); +} + +function url_for_wordcheck_flags($projectid) { + return url_for_word_context($projectid, "flagged"); +} + +// -- wordcheck stats + +function link_to_wordcheck_stats($projectid, $prompt) { + return link_to_url( url_for_wordcheck_stats($projectid), $prompt); +} + +function url_for_wordcheck_stats($projectid) { + global $wc_url; + return "$wc_url/wordcheck_stats.php?projectid=$projectid"; +} + +// -- ad hoc words + +function link_to_regex_words($projectid, $prompt) { + return link_to_url(url_for_regex_words($projectid), $prompt); +} + +function url_for_regex_words($projectid) { + return url_for_word_context($projectid, "regex"); +} + +// -- ad hoc words + +function link_to_adhoc_words($projectid, $prompt) { + return link_to_url(url_for_adhoc_words($projectid), $prompt); +} + +function url_for_adhoc_words($projectid) { + return url_for_word_context($projectid, "adhoc"); +} + +// -- wdiff + +function link_to_wdiff_results($projectid, $langcode, $prompt) { + return link_to_url( + url_for_wdiff_results($projectid, $langcode), $prompt); +} + +function url_for_wdiff_results($projectid, $langcode) { + global $wc_url; + return "$wc_url/wdiff.php?projectid=$projectid" + ."&langcode=$langcode"; +} + +// -- hyphenated words + +function link_to_hyphenated_words($projectid, $prompt) { + return link_to_url( + url_for_hyphenated_words($projectid), $prompt); +} + +function url_for_hyphenated_words($projectid) { + return url_for_word_context($projectid, "hyphenated"); +} + + +// -- diff suggestions + +function link_to_diff_suggestions($projectid, $prompt) { + return link_to_url( + url_for_diff_suggestions($projectid), $prompt); +} + +function url_for_diff_suggestions($projectid) { + global $wc_url; + return "$wc_url/scannos.php?projectid=$projectid"; +} + + +// -- good words + +function link_to_good_words( + $projectid, $prompt, $is_new_tab = false) { + return link_to_url(url_for_good_words($projectid), $prompt, + $is_new_tab); +} + +function url_for_good_words($projectid) { + return url_for_word_context($projectid, "good"); +} + +// -- suggested words + +function link_to_suggested_words( + $projectid, $prompt, $is_new_tab = false) { + return link_to_url( + url_for_suggested_words($projectid), $prompt, $is_new_tab); +} + +function url_for_suggested_words($projectid) { + return url_for_word_context($projectid, "suggested"); +} + +// -- suspect words + +function link_to_suspect_words($projectid, $prompt, $is_new_tab = false) { + return link_to_url(url_for_suspect_words($projectid), $prompt, + $is_new_tab); +} + +function url_for_suspect_words($projectid) { + return url_for_word_context($projectid, "suspect"); +} + +function link_to_refresh_suspect_words($projectid, $prompt, + $is_new_tab = false, $options) { + return link_to_url(url_for_refresh_suspect_words($projectid, $options), + $prompt, $is_new_tab); +} + +function url_for_refresh_suspect_words($projectid, $options) { + return url_for_word_context($projectid, "suspect", $options); +} + +// -- bad words + +function link_to_bad_words($projectid, $prompt, $is_new_tab = false) { + return link_to_url(url_for_bad_words($projectid), $prompt, + $is_new_tab); +} + +function url_for_bad_words($projectid) { + return url_for_word_context($projectid, "bad"); +} + +function link_to_project_words($projectid, $prompt="Words", $newtab = false) { + return link_to_url( url_for_project_words($projectid), $prompt, $newtab); +} + +function url_for_project_words($projectid) { + global $wc_url; + return "$wc_url/project_words.php" + ."?projectid={$projectid}"; +} diff --git a/c/pinc/list_projects.inc b/c/pinc/list_projects.inc new file mode 100644 index 0000000..aeea572 --- /dev/null +++ b/c/pinc/list_projects.inc @@ -0,0 +1,68 @@ +SqlOneValue(" + SELECT COUNT(1) FROM projects + $where"); +} + +// List the specified projects, +// giving brief information about each. +function list_projects( $metal, $limit = "20", $sort = "title", $dir = "A") { + global $dpdb; + + $dir = $dir == "A" ? "ASC" : "DESC"; + $where = metal_where($metal); + $rows = $dpdb->SqlRows(" + SELECT *, + nameofwork title, + authorsname author, + DATE(FROM_UNIXTIME(phase_change_date)) moddate + FROM projects + $where + ORDER BY $sort $dir + LIMIT $limit"); + + echo "
    "; + echo "\n"; + + $counter = 0; + foreach($rows as $project) { + $counter++; + $title = maybe_convert($project['nameofwork']); + $author = maybe_convert($project['authorsname']); + $language = $project['language']; + $n_pages = $project["n_pages"]; + $moddate = $project["moddate"]; + $postednum = $project['postednum']; + + echo "$counter) \"$title\" $author ($language)
    + " . _("$n_pages pages; ") . "$moddate
    \n"; + // Download info + if ( !$postednum ) { + echo link_to_fadedpage_catalog($postednum) . "

    \n"; + } + } +} +// vim: sw=4 ts=4 expandtab diff --git a/c/pinc/lists.php b/c/pinc/lists.php new file mode 100644 index 0000000..7fd80b8 --- /dev/null +++ b/c/pinc/lists.php @@ -0,0 +1,501 @@ + _("Undefined"), + "proof" => _("Proof"), + "reproof" => _("Reproof"), + "markup" => _("Markup"), + "check" => _("Check"), + "special" => _("Special"), + "complete" => _("Complete"), + "test" => _("Test") +// "easy" => _("Easy"), +// "average" => _("Average"), +// "hard" => _("Difficult") +); +*/ + +$site_difficulties = array( + "easy" => _("Easy"), + "average" => _("Average"), + "hard" => _("Hard") +); + +$site_languages = array( + "eng" => _("English"), + "fra" => _("French"), + "deu" => _("German"), + "ita" => _("Italian"), + "hun" => _("Hungarian"), + "tur" => _("Turkish"), + "esp" => _("Spanish"), + "por" => _("Portuguese"), + "lat" => _("Latin"), + "dut" => _("Dutch"), + "dan" => _("Danish"), + "swe" => _("Swedish"), + "grc" => _("Greek, Ancient"), + "gla" => _("Gaelic"), + "heb" => _("Hebrew"), + "epo" => _("Esperanto"), + "sco" => _("Scots"), + "pol" => _("Polish"), + "san" => _("Sanskrit") +); + + +$font_faces = array('courier' => 'Courier New', + 'times' => 'Times', + 'arial' => 'Arial', + 'monospaced' => 'monospace', + 'dpcustommono2' => 'DPCustomMono2', + 'lucidaconsole' => 'Lucida Console', + 'dejavu' => 'DejaVu Sans Mono', + 'monaco' => 'Monaco'); + +$font_sizes = array( + '8pt' => '8pt' , + '9pt' => '9pt' , + '10pt' => '10pt', + '11pt' => '11pt', + '12pt' => '12pt', + '13pt' => '13pt', + '14pt' => '14pt', + '15pt' => '15pt', + '16pt' => '16pt', + '18pt' => '18pt', + '20pt' => '20pt', + '24pt' => '24pt', + '30pt' => '30pt' + ); + +$site_genres = array( + 'Other' => _('Other'), + 'Adventure' => _('Adventure'), + 'Agriculture' => _('Agriculture'), + 'Archaeology' => _('Archaeology'), + 'Art' => _('Art'), + 'Animals' => _('Animals'), + 'Anthropology' => _('Anthropology'), + 'Architecture' => _('Architecture'), + 'Astronomy' => _('Astronomy'), + 'Autobiography' => _('Autobiography'), + 'Bibliography' => _('Bibliography'), + 'Biography' => _('Biography'), + 'Biology' => _('Biology'), + 'Business' => _('Business'), + 'Chemistry' => _('Chemistry'), + 'Collection' => _('Collection'), + 'Comics' => _('Comics'), + 'Cooking' => _('Cooking'), + 'Correspondence' => _('Correspondence'), + 'Crafts' => _('Crafts'), + 'Diary' => _('Diary'), + 'Dictionary' => _('Dictionary'), + 'Drama' => _('Drama'), + 'Economics' => _('Economics'), + 'Education' => _('Education'), + 'Encyclopedia' => _('Encyclopedia'), + 'Engineering' => _('Engineering'), + 'Essay' => _('Essay'), + 'Folklore' => _('Folklore'), + 'General Fiction' => _('General Fiction'), + 'Geography' => _('Geography'), + 'Geology' => _('Geology'), + 'Grammar' => _('Grammar'), + 'Health' => _('Health'), + 'History' => _('History'), + 'Historical Fiction' => _('Historical Fiction'), + 'Horror' => _('Horror'), + 'Horticulture' => _('Horticulture'), + 'Humor' => _('Humor'), + 'Instructional' => _('Instructional'), + 'Juvenile' => _('Juvenile'), + 'Law' => _('Law'), + 'Linguistics' => _('Linguistics'), + 'Literature' => _('Literature'), + 'Mathematics' => _('Mathematics'), + 'Medicine' => _('Medicine'), + 'Military' => _('Military'), + 'Mixed Form' => _('Mixed Form'), + 'Monograph' => _('Monograph'), + 'Music' => _('Music'), + 'Musicology' => _('Musicology'), + 'Mystery' => _('Mystery'), + 'Mythology' => _('Mythology'), + 'Nature' => _('Nature'), + 'Natural Science' => _('Natural Science'), + 'Non-Fiction' => _('Non-Fiction'), + 'Periodical' => _('Periodical'), + 'Philosophy' => _('Philosophy'), + 'Physics' => _('Physics'), + 'Picture Book' => _('Picture Book'), + 'Poetry' => _('Poetry'), + 'Political Science' => _('Political Science'), + 'Psychology' => _('Psychology'), + 'Recreation' => _('Recreation'), + 'Religious' => _('Religious'), + 'Reference' => _('Reference'), + 'Romance' => _('Romance'), + 'Satire' => _('Satire'), + 'Science' => _('Science'), + 'Science Fiction' => _('Science Fiction'), + 'Short Story' => _('Short Story'), + 'Sociology' => _('Sociology'), + 'Speech' => _('Speech'), + 'Spirituality' => _('Spirituality'), + 'Sports' => _('Sports'), + 'Technology' => _('Technology'), + 'Travel' => _('Travel'), + 'Veterinary' => _('Veterinary'), + 'Western' => _('Western'), + 'Zoology' => _('Zoology'), +); + +// these languages may be associated with projects +// should be in the order to be displayed as a list +$_active_languages_array_2 = array( + "it", "nl", "eo", "en", "fi", "fr", "de", "de-alt", "la", + "pt", "es", "sv", "ar", "bn", "bg", "ca", "cs", + "da", "el", "et", "eu", + "fo", "fa", "ga", "gl", "grc", "he", + "hi", "hr", "hu", "hy", "is", "it", "ku", "lv", + "lt", "nn", "nb", "no", "pl", "ro", + "ru", "sr", "hr", "sk", "sl", + "ta", "te", "tl", "uk", "und", "cy"); + +$wclangs = array( + "cs" => "Czech", + "da" => "Danish", + "nl" => "Dutch", + "en" => "English", + "fi" => "Finnish", + "fr" => "French", + "de" => "German", + "grc" => "Greek ancient", + "el" => "Greek modern", + "eo" => "Esperanto", + "he" => "Hebrew", + "it" => "Italian", + "la" => "Latin", + "no" => "Norwegian", + "pt" => "Portuguese", + "sk" => "Slovak", + "es" => "Spanish", + "sv" => "Swedish" +); + +$lang_codes = array( + "ab" => "Abkhazian", + "aa" => "Afar", + "af" => "Afrikaans", + "ak" => "Akan", + "sq" => "Albanian", + "am" => "Amharic", + "ar" => "Arabic", + "an" => "Aragonese", + "hy" => "Armenian", + "as" => "Assamese", + "av" => "Avaric", + "ae" => "Avestan", + "ay" => "Aymara", + "az" => "Azerbaijani", + "bm" => "Bambara", + "ba" => "Bashkir", + "eu" => "Basque", + "be" => "Belarusian", + "bn" => "Bengali", + "bh" => "Bihari", + "bi" => "Bislama", + "nb" => "Bokmål", + "bs" => "Bosnian", + "br" => "Breton", + "bg" => "Bulgarian", + "my" => "Burmese", + "ca" => "Catalan", + "km" => "Central Khmer", + "ch" => "Chamorro", + "ce" => "Chechen", + "ny" => "Chichewa", + "zh" => "Chinese", + "cv" => "Chuvash", + "kw" => "Cornish", + "co" => "Corsican", + "cr" => "Cree", + "hr" => "Croatian", + "cs" => "Czech", + "da" => "Danish", + "dv" => "Divehi", + "nl" => "Dutch", + "dz" => "Dzongkha", + "en" => "English", + "eo" => "Esperanto", + "et" => "Estonian", + "ee" => "Ewe", + "fo" => "Faroese", + "fj" => "Fijian", + "fi" => "Finnish", + "fr" => "French", + "fy" => "Frisian", + "ff" => "Fulah", + "gd" => "Gaelic", + "gl" => "Galician", + "lg" => "Ganda", + "ka" => "Georgian", + "de" => "German", + "de-alt" => "German (de-alt)", + "grc" => "Greek ancient", + "el" => "Greek modern", + "gn" => "Guarani", + "gu" => "Gujarati", + "ht" => "Haitian", + "ha" => "Hausa", + "he" => "Hebrew", + "hz" => "Herero", + "hi" => "Hindi", + "ho" => "Hiri Motu", + "hu" => "Hungarian", + "is" => "Icelandic", + "io" => "Ido", + "ig" => "Igbo", + "id" => "Indonesian", + "ia" => "Interlingua", + "ie" => "Interlingue", + "iu" => "Inuktitut", + "ik" => "Inupiaq", + "ga" => "Irish", + "it" => "Italian", + "ja" => "Japanese", + "jv" => "Javanese", + "kl" => "Kalaallisut", + "kn" => "Kannada", + "kr" => "Kanuri", + "ks" => "Kashmiri", + "kk" => "Kazakh", + "ki" => "Kikuyu", + "rw" => "Kinyarwanda", + "ky" => "Kirghiz", + "kv" => "Komi", + "kg" => "Kongo", + "ko" => "Korean", + "kj" => "Kuanyama", + "ku" => "Kurdish", + "lo" => "Lao", + "la" => "Latin", + "lv" => "Latvian", + "li" => "Limburgan", + "ln" => "Lingala", + "lt" => "Lithuanian", + "lu" => "Luba-Katanga", + "lb" => "Luxembourgish", + "mk" => "Macedonian", + "mg" => "Malagasy", + "ms" => "Malay", + "ml" => "Malayalam", + "mt" => "Maltese", + "gv" => "Manx", + "mi" => "Maori", + "mr" => "Marathi", + "mh" => "Marshallese", + "mn" => "Mongolian", + "na" => "Nauru", + "nv" => "Navajo", + "nd" => "Ndebele N.", + "nr" => "Ndebele S.", + "ng" => "Ndonga", + "ne" => "Nepali", + "no" => "Norwegian", + "nn" => "Norwegian Nynorsk", + "oc" => "Occitan", + "oj" => "Ojibwa", + "or" => "Oriya", + "om" => "Oromo", + "os" => "Ossetian", + "pi" => "Pali", + "pa" => "Panjabi", + "fa" => "Persian", + "pl" => "Polish", + "pt" => "Portuguese", + "ps" => "Pushto", + "qu" => "Quechua", + "ro" => "Romanian", + "rm" => "Romansh", + "rn" => "Rundi", + "ru" => "Russian", + "se" => "Sami N", + "sm" => "Samoan", + "sg" => "Sango", + "sa" => "Sanskrit", + "sc" => "Sardinian", + "sr" => "Serbian", + "sn" => "Shona", + "ii" => "Sichuan Yi", + "sd" => "Sindhi", + "si" => "Sinhala", + "cu" => "Slavic", + "sk" => "Slovak", + "sl" => "Slovenian", + "so" => "Somali", + "st" => "Sotho", + "es" => "Spanish", + "su" => "Sundanese", + "sw" => "Swahili", + "ss" => "Swati", + "sv" => "Swedish", + "tl" => "Tagalog", + "ty" => "Tahitian", + "tg" => "Tajik", + "ta" => "Tamil", + "tt" => "Tatar", + "te" => "Telugu", + "th" => "Thai", + "bo" => "Tibetan", + "ti" => "Tigrinya", + "to" => "Tonga", + "ts" => "Tsonga", + "tn" => "Tswana", + "tr" => "Turkish", + "tk" => "Turkmen", + "tw" => "Twi", + "ug" => "Uighur", + "uk" => "Ukrainian", + "und" => "Undeterminate", + "ur" => "Urdu", + "uz" => "Uzbek", + "ve" => "Venda", + "vi" => "Vietnamese", + "vo" => "Volapük", + "wa" => "Walloon", + "cy" => "Welsh", + "wo" => "Wolof", + "xh" => "Xhosa", + "yi" => "Yiddish", + "yo" => "Yoruba", + "za" => "Zhuang", + "zu" => "Zulu", +); + +$Honorifics = array( + "P1" => array( + 0 => _('Novice'), + 25 => _('Proofreading Pupil'), + 100 => _('Proofreading Apprentice'), + 500 => _('Proofreading Scholar'), + 1000 => _('Proofreading Prodigy'), + 2500 => _('Prefect of Proofreaders'), + 5000 => _('Proofreading Graduate'), + 10000 => _('Proofreading Alumnus'), + 20000 => _('Fellow of Proofreading'), + 30000 => _('Doctor of Proofreading'), + 40000 => _('Proofreading Don'), + 50000 => _('Dean of Proofreading'), + 60000 => _('Proofreading Proctor'), + 70000 => _('Principal Proofreader'), + 80000 => _('Master Proofreader'), + 90000 => _('Prefect of Proofreaders'), + 99000 => _('Supervising Proofreader'), + 100000 => _('Proofreading Professor'), + 110000 => _('Peer of Proofreading'), + 120000 => _('Doyen of Proofreading'), + 130000 => _('Proofreading Chancellor'), + 140000 => _('Proofreading Primate'), + 150000 => _('Paramount Proofreader')), + + "P2" => array( + 0 => _('Precise Proofreader'), + 25 => _('Picky Proofreader'), + 100 => _('Painstaking Proofreader'), + 500 => _('Punctilious Proofreader'), + 1000 => _('Persnickety Proofreader'), + 2500 => _('Particular Proofreader'), + 5000 => _('Proficient Proofreader'), + 10000 => _('Proper Proofreader'), + 20000 => _('Prudent Proofreader'), + 30000 => _('Proofreading Personage'), + 40000 => _('Proofreading Poppet'), + 50000 => _('Plighted Proofreader'), + 60000 => _('Proofreading Proctor'), + 70000 => _('Principal Proofreader'), + 80000 => _('Prime Proofreader'), + 90000 => _('Primal Proofreader'), + 99000 => _('Proofreading Personality'), + 100000 => _('Proofreading Professional'), + 110000 => _('Peerless Proofreader'), + 120000 => _('Plighted Proofreader'), + 130000 => _('Paraproofreader'), + 140000 => _('Proofreading Panjandrum'), + 150000 => _('Perfectionist Proofreader')), + "P3" => array( + 0 => _('Specialist Proofreader'), + 25 => _('Precious Proofreader'), + 100 => _('Prized Proofreader'), + 500 => _('Premiere Proofreader'), + 1000 => _('Proofreading Perfectionist'), + 2500 => _('Pillar of Proofreading'), + 5000 => _('Proofreading Purist'), + 10000 => _('Proofreader of Precision'), + 20000 => _('Archetypal Proofreader'), + 30000 => _('Proofreading Nonpareil'), + 40000 => _('Paradigmatic Proofreader'), + 50000 => _('Preeminent Proofreader'), + 60000 => _('Prime Proofreader'), + 70000 => _('Proofreader of Plenariness'), + 80000 => _('Perpetual Proofreader'), + 90000 => _('Prefect of Proofreaders'), + 99000 => _('Impeccable Proofreader'), + 100000 => _('Proofreader of Persistence'), + 110000 => _('Patent Proofreader'), + 120000 => _('Proofreading Philosopher'), + 130000 => _('Patron of Proofreaders'), + 140000 => _('Proofreading Partner'), + 150000 => _('Pioneer of Proofreaders')), + "F1" => array( + 0 => _('Formatting Neophyte'), + 25 => _('Formatting Intern'), + 100 => _('Journeyman Formatter'), + 500 => _('Crafter of Texts'), + 1000 => _('Detailer of Books'), + 2500 => _('Fastidious Formatter'), + 5000 => _('Foremost Formatter'), + 10000 => _('Fine Formatter'), + 20000 => _('Flamboyant Formatter'), + 30000 => _('Fabulous Formatter'), + 40000 => _('Upgrader of Texts'), + 50000 => _('Famous Formatter'), + 60000 => _('Indefatigible Formatter'), + 70000 => _('Finisher of Texts'), + 80000 => _('Formatter of Choice'), + 90000 => _('Capital Formatter'), + 99000 => _('Formatter with Flair'), + 100000 => _('Formatter of Finesse'), + 110000 => _('Formatter with Forte'), + 120000 => _('First-Class Formatter'), + 130000 => _('Formatter of Favour'), + 140000 => _('Formatter of Refinement'), + 150000 => _('Flawless Formatter')), + + "F2" => array( + 0 => _('Refurbisher of Texts'), + 25 => _('Sprucer of Texts'), + 100 => _('Formatter Savant'), + 500 => _('Formatting Wunderkind'), + 1000 => _('Elite Formatter'), + 2500 => _('Polisher of Texts'), + 5000 => _('Formatting Artiste'), + 10000 => _('Cultivator of Texts'), + 20000 => _('Formatter of Enrichment'), + 30000 => _('Designing Formatter'), + 40000 => _('Formatting Artisan'), + 50000 => _('Formatting Afficiando'), + 60000 => _('Guru of Formatters'), + 70000 => _('Formatting Familiar'), + 80000 => _('Formatting Virtuoso'), + 90000 => _('Formatter of Excellence'), + 99000 => _('Exquisite Formatter'), + 100000 => _('Elite Formatter'), + 110000 => _('Formatting Genius'), + 120000 => _('Formatter of Fine Feats'), + 130000 => _('Harmoniser of Texts'), + 140000 => _('Formatting Architect'), + 150000 => _('Preserver of Texts')) +); diff --git a/c/pinc/maintenance_mode.inc b/c/pinc/maintenance_mode.inc new file mode 100644 index 0000000..7128463 --- /dev/null +++ b/c/pinc/maintenance_mode.inc @@ -0,0 +1,23 @@ +

    $pguser $message

    "; + exit(); + } + } +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/marc_format.inc b/c/pinc/marc_format.inc new file mode 100644 index 0000000..05d4fbc --- /dev/null +++ b/c/pinc/marc_format.inc @@ -0,0 +1,270 @@ + "Art", "b" => "Biography", 3 => "Comedy", "c" => "Comic Strip", 4 => "Cooking", "d" => "Drama", "e" => "Essay", 1 => "Fiction", "g" => "Geography", 5 => "Historical", 6 => "History", 7 => "Humor", 'Humor', "i" => "Letter", "l" => "Linquistics", 8 => "Math", 9 => "Medicine", "m" => "Mixed Form", "v" => 'Music', 0 => "Non Fiction", "f" => "Novel", "y" => "Periodical", "p" => "Poetry", "r" => "Romance", "z" => "Science", "h" => "Satire", "j" => "Short Story", "s" => "Speech", "u" => "Unknown", "|" => "Unknown"); + +function marc_key_search($rec, $tag, $subfield) { + foreach ($rec as $key => $value) { + if (!empty($subfield)) { + if (preg_match("/^\(3,$tag\)\(3,[0123456789[:space:]]+\)\(3,$subfield\)$/", $value[0])) { + return $key; + } + } else { + if (preg_match("/^\(3,$tag\)\(3,[0123456789@[:space:]]+\)$/", $value[0])) { + return $key; + } + } + } +} + +function marc_title($rec) { + $marc_title = $rec[marc_key_search($rec,"245","a")][1]; + $marc_title = trim(preg_replace("/\/$|:$/", "", $marc_title)); + $marc_edition = $rec[marc_key_search($rec,"250","a")][1]; + $marc_edition = trim($marc_edition); + + if (isset($marc_edition)) { $marc_title = $marc_title.", ".$marc_edition; } + + // Task 849, strip all trailing comma/semicolon/colon from title. + // Space is needed below as there is one at the end of $marc_title + return preg_replace('/[,;: ]+$/', '', $marc_title); +} + +function marc_author($rec) { + $marc_author_100 = $rec[marc_key_search($rec,"100","a")][1]; + $marc_author_100 = trim(preg_replace("/,$/", "", $marc_author_100)); + + if (empty($marc_author_100)) { + $marc_author_700 = $rec[marc_key_search($rec,"700","a")][1]; + $marc_author_700 = trim(preg_replace("/,$/", "", $marc_author_700)); + } + + if (empty($marc_author_100) && empty($marc_author_700)) { + $marc_author_710 = $rec[marc_key_search($rec,"710","a")][1]; + $marc_author_710 = trim($marc_author_710); + } + + if (empty($marc_author_100) && empty($marc_author_700)) { + $marc_author = $marc_author_710; + } elseif (empty($marc_author_100) && isset($marc_author_700)) { + $marc_author = $marc_author_700; + } else { + $marc_author = $marc_author_100; + } + + return $marc_author; +} + +function marc_lccn($rec) { + $marc_lccn = $rec[marc_key_search($rec,"010","a")][1]; + $marc_lccn = trim($marc_lccn); + return $marc_lccn; +} + +function marc_isbn($rec) { + $marc_isbn = $rec[marc_key_search($rec,"020","a")][1]; + $marc_isbn = trim(substr($marc_isbn, 0, 10)); + return $marc_isbn; +} + +function marc_pages($rec) { + $marc_pages = $rec[marc_key_search($rec,"300","a")][1]; + $marc_pages = trim(preg_replace("/:$/", "", $marc_pages)); + return $marc_pages; +} + +function marc_date($rec) { + $marc_date = $rec[marc_key_search($rec,"260","c")][1]; + $marc_date = trim(preg_replace("/.$/", "", $marc_date)); + return $marc_date; +} + +function marc_language($rec) { + $marc_008 = $rec[marc_key_search($rec,"008","")][1]; + $marc_language = substr($marc_008, 35, 3); + $marc_language = convert_short_lang($marc_language); + return $marc_language; +} + +function marc_literary_form($rec) { + global $literary_form_array; + $marc_008 = $rec[marc_key_search($rec,"008","")][1]; + $marc_literary_form = substr($marc_008, 33, 1); + $marc_literary_form = $literary_form_array[$marc_literary_form]; + return $marc_literary_form; +} + +function marc_subject($rec) { + $i = 0; + $marc_subject = ""; + + while ($i < count($rec)) { + if (preg_match("/^\(3,650\)\(3,([^)]*)\)\(3,a\)$/", $rec[$i][0])) { + $marc_subject .= " ".trim($rec[$i][1]).","; + } + $i++; + } + + $marc_subject = trim(preg_replace("/,$/", "", $marc_subject)); + return $marc_subject; +} + +function marc_description($rec) { + $marc_description = $rec[marc_key_search($rec,"520","a")][1]; + $marc_description = trim(preg_replace("/:$/", "", $marc_description)); + return $marc_description; +} + +function marc_publisher($rec) { + $marc_publisher_name = $rec[marc_key_search($rec,"260","b")][1]; + $marc_publisher_name = trim(preg_replace("/,$/", "", $marc_publisher_name)); + $marc_publisher_date = $rec[marc_key_search($rec,"260","c")][1]; + $marc_publisher_date = trim(preg_replace("/.$/", "", $marc_publisher_date)); + + if (isset($marc_publisher_name) && isset($marc_publisher_date)) { + $marc_publisher = $marc_publisher_name.", ".$marc_publisher_date; + } else { + $marc_publisher = $marc_publisher_name; + } + + return $marc_publisher; +} + +function convert_short_lang($marc_language) { + global $lang_list; + $totalLanguages = count($lang_list); + $i = 0; + while ($i <= $totalLanguages) { + if ((substr($lang_list[$i]["lang_code"], 0, 3) == $marc_language) || (substr($lang_list[$i]["lang_code"], 4, 3) == $marc_language)) { + $marc_language = $lang_list[$i]["lang_name"]; + break; + } + $i++; + } + return $marc_language; +} + +function create_dc_xml_oai($projectid, $scannercredit, $genre, $language, $author, $title, $rec) { + $filename = $GLOBALS['projects_dir']."/$projectid/dc.xml"; + + if (!file_exists($filename)) { + touch($filename); + } + + $result = mysql_query("SELECT real_name FROM users WHERE username = '".$GLOBALS['pguser']."'"); + $createdby = "Produced by ".mysql_result($result, 0, "real_name").", "; + if (!empty($scannercredit) && $scannercredit != $GLOBALS['pguser']) { + $result = mysql_query("SELECT real_name FROM users WHERE username = '$scannercredit'"); + $createdby .= mysql_result($result, 0, "real_name").", "; + } + $createdby .= " Simple Simon and the Online Distributed Proofreading Team."; + + $xmlpage = "<"."?"."xml version=\"1.0\" encoding=\"{$GLOBALS['charset']}\" ?"."> + + $title + $author + ".marc_subject($rec)." + ".marc_description($rec)." + Project Gutenberg Canada + $createdby + ".marc_date($rec)." + $genre + XML + {$GLOBALS['code_url']}/project.php?id=$projectid + LCCN: ".marc_lccn($rec)." + $language + http://www.pgdpcanada.net/agreement.php + "; + + $fp = fopen($filename, "w"); + fwrite($fp, $xmlpage); + fclose($fp); +} + +function update_marc_array($rec) { + global $literary_form_array, $lang_list; + + //Update the Name of Work + if (!empty($_POST['nameofwork'])) { $rec[marc_key_search($rec,"245","a")][1] = $_POST['nameofwork']; } + + //Update the Authors Name + if (!empty($_POST['authorsname'])) { + if (!empty($rec[marc_key_search($rec,"100","a")][1]) && $author_set != 1) { + $rec[marc_key_search($rec,"100","a")][1] = $_POST['authorsname']; + $author_set = 1; + } + if (!empty($rec[marc_key_search($rec,"700","a")][1]) && $author_set != 1) { + $rec[marc_key_search($rec,"700","a")][1] = $_POST['authorsname']; + $author_set = 1; + } + if (!empty($rec[marc_key_search($rec,"710","a")][1]) && $author_set != 1) { + $rec[marc_key_search($rec,"710","a")][1] = $_POST['authorsname']; + $author_set = 1; + } + } + + //Update the Primary Language + for ($i=0;$i $tag_value) { + if (strlen($tag_value[0]) == 7) { + $i = 1; + $length = 0; + $directory .= substr($tag_value[0], 3, 3); + + while (substr($rec[$tag+$i][0], 0, 7) == $tag_value[0] && strlen($rec[$tag+$i][0]) != 7) { + if (count($rec[$tag+$i]) == 1) { + if (strlen($rec[$tag+$i][0]) == 12) { $length++; } else { $length = $length + 2; } + } elseif (count($rec[$tag+$i]) == 2) { + if (!preg_match("/^\(3,...\)\(3,@\)$/", $rec[$tag+$i][0])) { $length = $length + 2; } + } + $length = $length + strlen($rec[$tag+$i][1]); + $i++; + } + + if (strlen($directory) == 3) { $start = "00000"; } else { $start = (substr($directory, -12, 4) + substr($directory, -8, 5)); } + + $start = str_pad($start, 5, "0", STR_PAD_LEFT); + $length = str_pad($length+1, 4, "0", STR_PAD_LEFT); + $directory .= $length.$start; + + foreach ($rec as $field => $field_value) { + if (preg_match("/^\(3,".substr($tag_value[0], 3, 3)."\)\(3,[012[:space:]]+\)$/", $field_value[0]) && !in_array(substr($tag_value[0], 3, 3), $stack)) { + $data .= "\x1E".substr($field_value[0], 10, 2); + } + if (preg_match("/^\(3,".substr($tag_value[0], 3, 3)."\)\(3,[012[:space:]]+\)\(3,.\)$/", $field_value[0]) && !in_array(substr($tag_value[0], 3, 3), $stack)) { + $data .= "\x1F".substr($field_value[0], -2, 1).$field_value[1]; + } + if (preg_match("/^\(3,".substr($tag_value[0], 3, 3)."\)\(3,@\)$/", $field_value[0])) { + $data .= "\x1E".$field_value[1]; + } + } + array_push($stack, substr($tag_value[0], 3, 3)); + } + } + + $data .= "\x1E\x1D"; + $leader = str_pad((strlen($directory)+strlen($data)+24), 5, "0", STR_PAD_LEFT)."cam 22".str_pad((strlen($directory)+25), 5, "0", STR_PAD_LEFT)." u 4500"; + $raw_marc = $leader.$directory.$data; + return $raw_marc; +} +?> diff --git a/c/pinc/maybe_mail.inc b/c/pinc/maybe_mail.inc new file mode 100644 index 0000000..359ab53 --- /dev/null +++ b/c/pinc/maybe_mail.inc @@ -0,0 +1,9 @@ +" ); +} diff --git a/c/pinc/mentorbanner.inc b/c/pinc/mentorbanner.inc new file mode 100644 index 0000000..8b3acd7 --- /dev/null +++ b/c/pinc/mentorbanner.inc @@ -0,0 +1,36 @@ +SqlOneValue(" + SELECT + MAX(DATEDIFF(CURRENT_DATE(), FROM_UNIXTIME(modifieddate))) days_ago + FROM projects + WHERE difficulty = 'beginner' + AND LANGUAGE = 'English' + AND state = 'P2.proj_avail'"); + + switch ($oldest) { + case 0: + return; + case 1: + case 2: + $font_boost = "1.1em"; + $font_col = '#339933'; + break; + case 3: + case 4: + $font_boost = "1.2em"; + $font_col = "#FF6600"; + break; + default: + $font_boost = "1.3em"; + $font_col = "#FF0000"; + break; + } + + echo "
    " + . _("Oldest English MENTORS ONLY book in P2 is $oldest days old.") + . "
    +
    \n"; +} diff --git a/c/pinc/metarefresh.inc b/c/pinc/metarefresh.inc new file mode 100644 index 0000000..26a7d2e --- /dev/null +++ b/c/pinc/metarefresh.inc @@ -0,0 +1,43 @@ +$title\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo $body, "\n"; + +/* + if ($testing) { + echo "\n
    \n"; + echo _("Normally, you would be directed to the next page in $seconds seconds. + However, as we are in testing mode, this has been increased to $sec seconds. + If you don't want to wait that long, + or if you want this page inserted into your browser history, + click here."); + echo ""; + } +*/ + echo ""; +} +?> diff --git a/c/pinc/misc.inc b/c/pinc/misc.inc new file mode 100644 index 0000000..db61942 --- /dev/null +++ b/c/pinc/misc.inc @@ -0,0 +1,240 @@ +0 strings, return an array +// [$left_common, $middles, $right_common] +// where +// $left_common is the maximal common prefix of the strings; +// $right_common is the maximal common suffix, subject to the constraint that it +// cannot include characters covered by the common prefix; and +// $middles is an array of N strings, each being that part of the corresponding +// input string that is not covered by the common prefix and suffix. +// +// That is, +// $strings[$i] == $left_common . $middles[$i] . $right_common +// for all $i. +function factor_strings( $strings ) { + assert( count($strings) > 0 ); + + // Find the shortest string + $str_with_minlen = NULL; + $minlen = NULL; + foreach ( $strings as $string ) { + $len = strlen($string); + if (is_null($minlen) || $len < $minlen) { + $minlen = $len; + $str_with_minlen = $string; + } + } + + $base = $str_with_minlen; + + // -------------------------------------------------------------- + + for ( $L = 0; ; $L++ ) { + // Invariant: all strings match in their first $L characters. + + if ($L == $minlen) break; + + // Do they match in their first $L+1 characters? + // Examine the ($L+1)th character, i.e. the one at index $L. + + $c = substr( $base, $L, 1 ); + foreach ( $strings as $string ) { + if ( substr( $string, $L, 1 ) == $c ) { + // good so far + } + else { + // mismatch. + // The invariant does not hold for $L+1. + // So $L is the maximum value that satisfies the invariant. + break 2; + } + } + // No mismatch found for any string for index $L. + // So the invariant holds for $L+1. + } + $left_match_length = $L; + + // -------------------------------------------------------------- + + for ( $R = 0; ; $R++ ) { + // Invariant: all strings match in their last $R characters. + + if ( $left_match_length + $R == $minlen ) + break; + + // Do they match in their last $R+1 characters? + // Examine the ($R+1)th-last character, i.e., the one at index -($R+1). + // e.g. when $R == 0, examine the last character, at index -1 + // when $R == 1, examine the 2nd-last character, at index -2 + + $c = substr($base,-($R+1),1); + + foreach ( $strings as $string ) { + if ( substr( $string, -($R+1), 1 ) != $c ) { + // mismatch. + // The invariant does not hold for $R+1. + // So $R is the maximum value that satisfies the invariant. + break 2; + } + } + // No mismatch found for any string at that index. + // So the invariant holds for $R+1. + } + $right_match_length = $R; + + // -------------------------------------------------------------- + + $left_common = NULL; + $right_common = NULL; + $middles = array(); + + foreach ( $strings as $string ) { + assert( $left_match_length >= 0 ); + assert( $right_match_length >= 0 ); + assert( $left_match_length + $right_match_length <= strlen($string) ); + + if ( $left_match_length == strlen($string) ) { + // substr() misbehaves + $left = $string; + $middle = ''; + $right = ''; + } + else { + $left = substr( $string, 0, $left_match_length ); + + if ( $right_match_length == 0 ) { + $middle = substr( $string, $left_match_length ); + $right = ''; + } + else { + $middle = substr( $string, $left_match_length, -$right_match_length ); + $right = substr( $string, -$right_match_length ); + } + } + + if ( is_null($left_common) ) { + $left_common = $left; + $right_common = $right; + } + else { + assert( $left == $left_common ); + assert( $right == $right_common ); + } + + $middles[] = $middle; + } + + return array( $left_common, $middles, $right_common ); +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/month_chart.php b/c/pinc/month_chart.php new file mode 100644 index 0000000..28f8c34 --- /dev/null +++ b/c/pinc/month_chart.php @@ -0,0 +1,99 @@ + + " . makeMonthlyChart($phase). " + \n"; +} + +function makeMonthlyChart($phase) { + global $dpdb; + $psql = monthly_sql($phase); + $obj = $dpdb->SqlObjects($psql); + $data = array(); + foreach($obj as $o) { + $moyr = "{$o->mo}/{$o->yr}"; + $data[$moyr] = $o->pages; + } + return echoMonthlyChart($phase, $data, "div_monthly_{$phase}"); +} + +function echoMonthlyChart($phase, $data, $div_id) { + $str = " + + + "; + return $str; +} + +function monthly_sql($phase) { + if($phase == "All") { + return " + SELECT + MONTH(FROM_UNIXTIME(count_time)) mo + , YEAR(FROM_UNIXTIME(count_time)) yr + , SUM(page_count) pages + FROM + user_round_pages + WHERE count_time < UNIX_TIMESTAMP(CAST(DATE_FORMAT(CURRENT_DATE() ,'%Y-%m-01') as DATE)) + GROUP BY + MONTH(FROM_UNIXTIME(count_time)), + YEAR(FROM_UNIXTIME(count_time)) + ORDER BY + YEAR(FROM_UNIXTIME(count_time)), + MONTH(FROM_UNIXTIME(count_time))"; + } + else { + return " + SELECT + MONTH(FROM_UNIXTIME(count_time)) mo + , YEAR(FROM_UNIXTIME(count_time)) yr + , SUM(page_count) pages + FROM + user_round_pages + WHERE round_id = '$phase' + AND count_time < UNIX_TIMESTAMP(CAST(DATE_FORMAT(CURRENT_DATE() ,'%Y-%m-01') as DATE)) + GROUP BY + round_id, + MONTH(FROM_UNIXTIME(count_time)), + YEAR(FROM_UNIXTIME(count_time)) + ORDER BY + round_id, + YEAR(FROM_UNIXTIME(count_time)), + MONTH(FROM_UNIXTIME(count_time))"; + } +} diff --git a/c/pinc/new_user_mails.inc b/c/pinc/new_user_mails.inc new file mode 100644 index 0000000..deffe0c --- /dev/null +++ b/c/pinc/new_user_mails.inc @@ -0,0 +1,218 @@ +\nX-Sender: <$general_help_email_addr>\nX-Mailer: PHP\nReturn-Path: <$general_help_email_addr>\n"); +} + +function maybe_welcome_mail($email, $real_name, $username) { + + global $PG_home_url, $code_url, $reset_password_url, $auto_email_addr; + + $welcome = _("Welcome to the Distributed Proofreaders' Canada Site!"); + + maybe_mail($email, $welcome, " + +Hello $real_name, + +This is an autogenerated message, containing introductory information +about Distributed Proofreaders Canada. + +We want to first thank you for joining DP Canada. That is the +first step in helping us proofread books for Project Gutenberg Canada +<$PG_home_url>. + +To make sure you will be able to access and use our web site +properly, please check that your browser settings are as follows: + +- javascript enabled +- cookies accepted (at least from us at $site_url) +- popup windows allowed (at least from us at $site_url) + +Also, please ensure your PC clock is set to the correct date +and time. + +As a new user, we recommend you read over our main page +<$code_url/> for an overview of the site, +a selection of the works that we are working on, along +with the books that have been completed through the site. +The Beginning Proofreaders FAQ <$code_url/faq/ProoferFAQ.php> +also provides a nice overview of the site. The " +. link_to_proofing_guidelines("Proofreading Guidelines") ." +cover most proofreading +questions, and it is worth browsing through early on, but +don't feel you have to memorize everything in it immediately - +it really comes into its own as a detailed reference whenever +you are unsure of how to handle something. You may find that the +shorter, printable Handy Guide <$code_url/faq/proofing_summary.pdf> +offers a useful introduction to the most common of our standards, +and it may be worth keeping a printed copy by the computer (or an +online copy open in another window) as you proofread. + +Once you understand the work being done through this site, +the best thing to do is get started! Here's a step-by-step +process once you log in: + +- When you log in you are taken to the Activity Hub. Take + special note of the navigational bar at the top of the screen. + It appears on many pages on site, and towards the right contains + many useful links, such as to our FAQs (help), the discussion + Forums, your personal Inbox, etc. Next, scroll down and follow + the \"Proofreading Round 1\" link to see a listing of the books + currently available in first round. Each book on the site goes + through multiple rounds of proofreading. When you first start, + you are only shown the books in the first round. Other rounds + will be available to you later on. + +- Select a book that you would like to read a little bit on. + +- Follow the link for the title you want to work on. This will open + the Project Comments page for this project (book). + +- Among the contents of the Project Comments page may be some + special instructions from the Project Manager. Please read these + carefully as they supersede the Proofreading Guidelines, for that + project. + +- Follow the \"Start Proofreading\" link near the bottom of the page, + this will open the proofreading interface. + +- Compare the text in the text box to what is in the image, making + corrections for differences between the two and any additional + items described in the comments. You can pull the comments back + up by clicking on the link below the text box. + +- Once you are finished with this page, click on either + \"Save as 'Done'\" or \"Save as 'Done' & Proof Next\" + +That is all there is to completing your first page. + +Here are some brief answers to common questions: + +Q: What books should I start on? + +A: You can start on any that look interesting to you. As a new + beginner, you might want to consider a book marked BEGINNERS ONLY, + as these will be given especially close attention by experienced + second round proofreaders who will send you messages containing + feedback on your proofreading if you make any serious errors, via + our on-site messaging system. (Be sure to check your personal Inbox + regularly.) After you've done a few pages of a BEGINNERS ONLY + project, you might want to sample one of the several EASY + projects usually available. (Don't be afraid to try any project; + if you run into a page you decide you'd rather not do, you can + always press the \"Return Page to Round\" button and let someone + else tackle it.) + +Q: I'm not sure how to use the interface or how I should mark + something up. + +A: You can get help for the various buttons on the proofreading interface + by pressing the ? button near the lower right corner. If there's + something in the image you are unsure about, you can mark it with + a [**your comment], which is our special universal signal for the next person + working on the page to pay extra attention to a particular spot + because there is something unusual there. Remember there will be + several other pairs of eyes looking at this page before it gets + posted to Project Gutenberg Canada, so don't feel you are carrying the + whole thing on your shoulders alone - the system is set up so + we can all help each other and back each other up! + + If you have specific questions on a book, you can post a message + in the forum thread reserved for it by following the link + labeled \"Discuss this project\" that appears on the Project + Comments page. Each project has a forum thread of its own; you + can post a question or message via the \"Reply\" button near the + bottom of the forum screen. It's often worthwhile reading through + the discussion on a project even if you don't have a specific + question, just to see what other proofreaders have asked and answered + or warned each other about. (There are also several other forums + dedicated to various phases of our operation. You can reach them + by following the Forums link near the right hand end of the + navigation bar at the top of many of the pages on site. The + General Forum in particular is a great place to get your feet + wet, browse and start to get a sense of the community of + proofreaders here, to make suggestions or to ask general + questions. You can learn a lot just by following some of the + discussions. ***We strongly encourage everyone to participate in + the Forums!***) + + (By the way, when you register on the main site you are automatically + also registered on the site forums, but you will have to log on + to them to access them. You do NOT need to register separately for + the forums - in fact, if you try to, you will receive a \"username + already exists\" error, since the forums will already have your + username recorded from when you registered at the main site!) + +Q: How do I know if I'm doing OK? + +A: If you select a BEGINNERS ONLY project, you are more likely to + receive some feedback. If you are making major errors on any + project someone will let you know. If you want to increase your + chances of receiving some feedback, you can leave a message to + the second round proofreader at the top of the page, in square + brackets [ ] and starting with two *, such as + + [** new proofreader, how am I doing?] + or + [** feedback welcome!] + + It's up to the individual second round proofreader, but many will + respond to such a request. + + +Remember, every page you do helps make these books available to +the world, for free, forever, more rapidly. We hope that you will +continue to use our site, and that you enjoy your time on our site. +We're delighted to have you join us, as each page we proofread is +another small step closer to building the greatest library in history! + +Thanks, + +The Distributed Proofreaders Canada Team + +PS - Your user name, in case you forget, is $username. +If your password doesn't work, go to +<$reset_password_url> +to have it reset. + ", + "From: DPHelp <$general_help_email_addr>\nX-Sender: <$general_help_email_addr>\nX-Mailer: PHP\nReturn-Path: <$general_help_email_addr>\n"); +} +?> diff --git a/c/pinc/page_header.inc b/c/pinc/page_header.inc new file mode 100644 index 0000000..8f71332 --- /dev/null +++ b/c/pinc/page_header.inc @@ -0,0 +1,24 @@ + +
    + $title +
    \n"; + } + else { + echo "

    $title

    \n"; + } +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/page_table.inc b/c/pinc/page_table.inc new file mode 100644 index 0000000..a2f6e24 --- /dev/null +++ b/c/pinc/page_table.inc @@ -0,0 +1,193 @@ +ProjectId(); + $phaseindex = $project->PhaseIndex(); + $phase = $project->Phase(); + $rows = $dpdb->SqlRows(" + SELECT '$projectid' projectid, + $phaseindex phaseindex, + '$phase' phase, + fileid, + image, + master_text, + round1_text, + round2_text, + round3_text, + round4_text, + round5_text, + round1_user, + round2_user, + round3_user, + round4_user, + round5_user, + FROM_UNIXTIME(round1_time) round1_time, + FROM_UNIXTIME(round2_time) round2_time, + FROM_UNIXTIME(round3_time) round3_time, + FROM_UNIXTIME(round4_time) round4_time, + FROM_UNIXTIME(round5_time) round5_time, + LENGTH(master_text) OCR_text_length, + LENGTH(round1_text) round1_text_length, + LENGTH(round2_text) round2_text_length, + LENGTH(round3_text) round3_text_length, + LENGTH(round4_text) round4_text_length, + LENGTH(round5_text) round5_text_length, + CASE WHEN BINARY master_text = BINARY round1_text + THEN 0 ELSE 1 END AS is_diff_1, + CASE WHEN BINARY round1_text = BINARY round2_text + THEN 0 ELSE 1 END AS is_diff_2, + CASE WHEN BINARY round2_text = BINARY round3_text + THEN 0 ELSE 1 END AS is_diff_3, + CASE WHEN BINARY round3_text = BINARY round4_text + THEN 0 ELSE 1 END AS is_diff_4, + CASE WHEN BINARY round4_text = BINARY round5_text + THEN 0 ELSE 1 END AS is_diff_5, + state + FROM $projectid + ORDER BY fileid"); + $tbl = new DpTable(); + + if($project->UserMayManage()) { + $tbl->AddCaption(null, 4); // leave one for the rownumber? + $tbl->AddColumn(chk_caption(), null, "rowchkbox", "width: 4em"); + } + else { + $tbl->AddCaption(null, 2); + } + + $tbl->AddCaption(null, 4); // leave one for the rownumber? + $tbl->AddColumn("^Image", "fileid", "eimage"); + $tbl->AddColumn(">Text", "textlength_m", "mtext"); + $tbl->AddColumn("^State", "state", "estate", "w4em"); + + if($phaseindex > 0) { + $tbl->AddCaption("^".$phaseindex, 4); + + $tbl->AddColumn("^Diff?", "is_diff_1", "ediff"); + $tbl->AddColumn("^Date", "round1_time", "etime"); + $tbl->AddColumn("^User", "round1_user", "euser"); + $tbl->AddColumn("^Text", "round1", "etext"); + } + if($phaseindex > 1) { + $tbl->AddCaption("^".$phaseindex, 4); + + $tbl->AddColumn("^Diff", "is_diff_2", "ediff"); + $tbl->AddColumn("^Date", "round2_time", "etime"); + $tbl->AddColumn("^User", "round2_user", "euser"); + $tbl->AddColumn("^Text", "round2", "etext"); + } + if($phaseindex > 2) { + $tbl->AddCaption("^".$phaseindex, 4); + + $tbl->AddColumn("^Diff", "is_diff_3", "ediff"); + $tbl->AddColumn("^Date", "round3_time", "etime"); + $tbl->AddColumn("^User", "round3_user", "euser"); + $tbl->AddColumn("^Text", "round3", "etext"); + } + if($phaseindex > 3) { + $tbl->AddCaption("^".$phaseindex, 4); + + $tbl->AddColumn("^Diff", "is_diff_4", "ediff"); + $tbl->AddColumn("^Date", "round4_time", "etime"); + $tbl->AddColumn("^User", "round4_user", "euser"); + $tbl->AddColumn("^Text", "round4", "etext"); + } + if($phaseindex > 4) { + $tbl->AddCaption("^".$phaseindex, 3); + + $tbl->AddColumn("^Date", "round5_time", "etime"); + $tbl->AddColumn("^User", "round5_user", "euser"); + $tbl->AddColumn("^Text", "round4", "etext"); + } + $tbl->AddColumn("^Clear", "fileid", "eclear"); + $tbl->AddColumn("^Edit", "fileid", "eedit"); + $tbl->AddColumn("^Bad
    Fix", "fileid", "efix"); + $tbl->AddColumn("^Delete", "fileid", "edelete"); + + $tbl->SetRows($rows); + $tbl->EchoTableNumbered(); +} + +function chk_caption() { + return "^All
    "; +} +function rowchkbox($row) { + $name = 'imagefile['.$row['image'].']'; + return ""; +} +function eimage($pagename, $row) { + $projectid = $row['projectid']; + $imagefile = $row['image']; + + return $pagename != "" + ? link_to_view_image($projectid, $pagename, $pagename, true) + : "$imagefile"; +} + +function enumber($num, $row) { + $projectid = $row['projectid']; + $pagename = $row['fileid']; + return link_to_page_text($projectid, $pagename, number_format($num), true); +} + +function mtext($size, $row) { + $projectid = $row["projectid"]; + $pagename = $row["fileid"]; + $phase = "OCR"; + return link_to_page_text($projectid, $pagename, $phase, $size, true); +} + +function etext($pfx, $row) { + global $User; + $projectid = $row["projectid"]; + $pagename = $row["fileid"]; + $phase = $row["phase"]; + $userval = $row["{$pfx}_user"]; + $size = $row["{$pfx}_text_length"]; + if($userval == $User->Username()) { + return "
    " + .link_to_page_text($projectid, $pagename, $phase, $size, true) + ."
    \n"; + } + return link_to_page_text($projectid, $pagename, $phase, $size, true); +} +function estate($state) { + return preg_replace("/^.*_/", "", $state); +} +function ediff($pagename, $row) { + $projectid = $row["projectid"]; + $phase = $row["phase"]; + return link_to_diff($projectid, $pagename, $phase, "diff", true); +} +function etime($time) { + return $time == 0 ? "" : $time; +} +function euser($proofer) { + global $User; + $username = $User->Username(); + if($proofer == "") { + return ""; + } + return $proofer == $username + ? "
    $proofer
    " + : link_to_pm($proofer, $proofer, true); +} + +function eclear($pagename) { + return "\n"; +} +function eedit($pagename, $row) { + $projectid = $row["projectid"]; + return link_to_proof_page($projectid, $pagename, "Edit", true); +} +function efix($pagename, $row) { + $projectid = $row["projectid"]; + return link_to_fix($projectid, $pagename, true); +} +function edelete($pagename) { + return "\n"; +} + diff --git a/c/pinc/page_tally.inc b/c/pinc/page_tally.inc new file mode 100644 index 0000000..87e6bf4 --- /dev/null +++ b/c/pinc/page_tally.inc @@ -0,0 +1,395 @@ +id] = + sprintf( _('Pages saved-as-done in round %s'), $round->id ); +} + +// ----------------------------------------------------------------------------- + +// The following variables assume that the site has been configured with an +// "Entry-Level Round" (ELR): a single round where new users start out and +// become familiar with the site. The page-tallies from this round are +// distinguished from others in that they are (deemed to be) a fair indicator +// of the user's experience. + +// This assignment particularly assumes that the ELR is the first round +$ELR_round = get_Round_for_round_number(1); + +$users_ELR_page_tallyboard = new TallyBoard( $ELR_round->id, 'U' ); +$teams_ELR_page_tallyboard = new TallyBoard( $ELR_round->id, 'T' ); + +// See TallyBoard.inc for explanation of these two strings: +// +list($joined_with_user_ELR_page_tallies,$user_ELR_page_tally_column) = + $users_ELR_page_tallyboard->get_sql_joinery_for_current_tallies( 'u_id' ); + +// ----------------------------------------------------------------------------- + +/* +// Add $amount to the user's page tally, +// and to the page tally of each team that the user currently belongs to. +function page_tallies_add( $tally_name, $username, $amount ) { + // get the user's u_id, and the teams that he/she belongs to + $result = mysql_query(" + SELECT u_id, team_1, team_2, team_3 + FROM users + WHERE username = '$username'"); + list($u_id, $team_1, $team_2, $team_3) = mysql_fetch_row($result); + + // update page tally for user + $user_tallyboard = new TallyBoard( $tally_name, 'U' ); + $user_tallyboard->add_to_tally( $u_id, $amount ); + + // update page tally for site + $site_tallyboard = new TallyBoard( $tally_name, 'S' ); + $site_tallyboard->add_to_tally( 1, $amount ); + + // update page tally for each team + $team_tallyboard = new TallyBoard( $tally_name, 'T' ); + // (The 'array_unique' shouldn't be necessary, but just in case.) + foreach (array_unique(array($team_1, $team_2, $team_3)) as $team_id) { + if ( $team_id != 0 ) { + $team_tallyboard->add_to_tally( $team_id, $amount ); + } + } +} +*/ + +// ----------------------------------------------------------------------------- + +// Not actually tally-specific, but that's all it's used for. +/* +function get_daily_average( $start_time, $total ) { + $now = time(); + $seconds_since_start = $now - $start_time; + $days_since_start = $seconds_since_start / 86400; + return $total / $days_since_start; +} +*/ + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +// Return the user's page tally for the Entry-Level Round. +/* +function user_get_ELR_page_tally( $username ) { + global $joined_with_user_ELR_page_tallies, $user_ELR_page_tally_column; + + $res = mysql_query(" + SELECT $user_ELR_page_tally_column + FROM users $joined_with_user_ELR_page_tallies + WHERE username='$username'") or die(mysql_error()); + + if ( mysql_num_rows($res) == 0 ) { + // No row matched username='$username'. + // This probably shouldn't happen. + return 0; + } + + return mysql_result($res,0); +} +*/ + +// ----------------------------------------------------------------------------- + +/* +// +// $radius is the (maximum) number of neighbors (on each side) to include in +// the neighborhood. (It will include fewer that the maximum iff the target +// user is within $radius of the corresponding end of the ranked list.) +// +// Return the page-tally neighborhood of $username. +// This is an array: +// The keys are integers from the range [-$radius, +$radius], +// indicating a user's position relative to the target user (w.r.t. page tally). +// (So key=0 refers to the target user.) +// For a given key, the corresponding value is a PageTally_Neighbor object +// supplying various information about the page-tally neighbor. +function user_get_page_tally_neighborhood( $tally_name, $username, $radius ) { + $result = mysql_query(" + SELECT u_id FROM users + WHERE username='$username'"); + if ( mysql_num_rows($result) == 0 ) { + // The target user does not appear in the 'users' table. + // This shouldn't ever happen. + die( "User '$username' does not appear in the 'users' table." ); + } + else if ( mysql_num_rows($result) > 1 ) { + // This shouldn't ever happen either. + die( "username='$username' matched more than one row in 'users' table." ); + } + list($u_id) = mysql_fetch_row($result); + + $tallyboard = new TallyBoard( $tally_name, 'U' ); + $nb = $tallyboard->get_neighborhood( + $u_id, $radius, + 'users', + 'u_id', + 'username, u_privacy, date_created, u_id', + 'current_tally', + 'current_rank'); + + $neighbors = array(); + foreach ( $nb as $rel_posn => $row ) { + if ( should_anonymize( $row['username'], $row['u_privacy'] ) ) { + $neighbor_is_anonymized = TRUE; + $neighbor_username = NULL; + $neighbor_date_joined = NULL; + } + else { + $neighbor_is_anonymized = FALSE; + $neighbor_username = $row['username']; + $neighbor_date_joined = $row['date_created']; + } + + $neighbors[$rel_posn] = + new PageTally_Neighbor( + $tallyboard, + $neighbor_is_anonymized, + $neighbor_username, + $neighbor_date_joined, + $row['u_id'], + $row['current_tally'], + $row['current_rank']); + } + + return $neighbors; +} + +class RoundNeighbor +{ + private $_username; + private $_count; + private $_rank; + private $_user; + + function __construct($row) { + $this->_username = $row['username']; + $this->_count = $row['page_count']; + $this->_rank = $row['rank']; + $this->_user = new DpUser($this->_username); + } + + public function PageCount() { + return $this->_count; + } + + public function Rank() { + return $this->_rank; + } + + public function Username() { + return $this->_username; + } + public function PrivateUsername() { + return $this->_user->PrivateUsername(); + } + public function IsAnonymous() { + return $this->_user->Privacy() > 0; + } + public function DateCreatedInt() { + return $this->_user->DateCreatedInt(); + } + public function AgeDays() { + return $this->_user->AgeDays(); + } +} + +class PageTally_Neighbor +{ + function __construct( $tallyboard, $is_anonymized, $username, $date_joined, $u_id, $tally, $rank ) { + $this->tallyboard = $tallyboard; + $this->is_anonymized = $is_anonymized; + $this->username = $username; + $this->date_joined = $date_joined; + $this->u_id = $u_id; + $this->current_page_tally = $tally; + $this->current_page_tally_rank = $rank; + } + + function is_anonymized() { return $this->is_anonymized; } + function get_username() { return $this->username; } + function get_date_joined() { return $this->date_joined; } + function get_u_id() { return $this->u_id; } + public function get_current_page_tally() { + return $this->current_page_tally; + } + public function get_current_page_tally_rank() { + return $this->current_page_tally_rank; + } +} + +// ----------------------------------------------------------------------------- + +// Should we anonymize information about the given user? +function should_anonymize( $username, $user_privacy_setting ) { + return !can_reveal_details_about( $username, $user_privacy_setting ); +} +*/ + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +// Return an object whose attributes are various useful statistics re +// the site page tally: +// curr_day_{goal,actual} +// prev_day_{goal,actual} +// curr_month_{goal,actual} + +function get_site_page_round_summary( $roundid) { + return get_site_page_tally_summary( $roundid); +} + +function get_site_page_tally_summary( $roundid ) { + global $dpdb; + $site_stats = new StdClass; + + // Goals + +// $site_stats->curr_day_goal = $dpdb->SqlOneValue(" + $row = $dpdb->SqlOneRow(" + SELECT pg.goal, + pg1.goal ygoal + FROM phase_goals pg + JOIN phase_goals pg1 + ON pg.phase = pg1.phase + AND pg1.goal_date = DATE_ADD(pg.goal_date, INTERVAL -1 DAY) + WHERE pg.phase = '$roundid' + AND pg.goal_date = CURRENT_DATE()"); + $site_stats->curr_day_goal = $row["goal"]; + $site_stats->prev_day_goal = $row["goal"]; + +// $site_stats->prev_day_goal = $dpdb->SqlOneValue(" +// SELECT goal FROM site_tally_goals +// WHERE tally_name = '$roundid' +// AND date = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)" ); + // get_site_tally_goal_summed( + // $tally_name, + // "date = (CURRENT_DATE - INTERVAL 1 DAY)" ); + + $site_stats->curr_month_goal = $dpdb->SqlOneValue(" + SELECT SUM(goal) FROM phase_goals + WHERE phase = '$roundid' + AND goal_date >= DATE(DATE_FORMAT(NOW() ,'%Y-%m-01')) + AND goal_date < DATE_ADD(DATE(DATE_FORMAT(NOW() ,'%Y-%m-01')), INTERVAL 1 MONTH)"); + // get_site_tally_goal_summed( + // $tally_name, + // "YEAR(date) = YEAR(CURRENT_DATE) AND + // MONTH(date) = MONTH(CURRENT_DATE)" ); + + + // Actuals + + // $tallyboard = new TallyBoard( $tally_name, 'S' ); + +// $holder_id = 1; + + $site_stats->curr_day_actual = $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM page_events_save + WHERE round_id = '$roundid' + AND timestamp >= UNIX_TIMESTAMP(CURRENT_DATE())"); + + $site_stats->prev_day_actual = $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM page_events_save + WHERE round_id = '$roundid' + AND timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 1 day)) + AND timestamp < UNIX_TIMESTAMP(CURRENT_DATE())"); + + $site_stats->curr_month_actual = $dpdb->SqlOneValue(" + SELECT SUM(pagecount) + FROM + ( SELECT SUM(urp.page_count) pagecount + FROM user_round_pages urp + WHERE round_id = '$roundid' + AND count_time >= UNIX_TIMESTAMP(DATE(DATE_FORMAT(NOW() ,'%Y-%m-01'))) + UNION ALL + SELECT COUNT(1) pagecount + FROM page_events_save + WHERE round_id = '$roundid' + AND TIMESTAMP > UNIX_TIMESTAMP(CURRENT_DATE()) + ) a"); + + return $site_stats; +} + +/* +function get_site_count_goal_summed( $roundid, $date_condition ) { + $res = mysql_query(" + SELECT SUM(goal) FROM site_count_goals + WHERE count_name = '$roundid' + AND ($date_condition)") or die(mysql_error()); + return mysql_result($res,0); +} +*/ + +// ----------------------------------------------------------------------------- + +// Return a string containing an SQL 'select' statement +// dealing with site-specific rows from the past_tallies table, +// and corresponding rows from the site_count_goals table. +function select_from_site_past_tallies_and_goals( $tally_name, $select, + $where, $groupby, $orderby, $limit ) { + if (empty($where)) { + $where_addition = ''; + } + else { + $where_addition = + preg_replace( '/^\s*WHERE\s+(.*)$/i', 'AND (\1)', $where ); + } + + $s = " + $select + FROM past_tallies + LEFT JOIN site_tally_goals + ON past_tallies.tally_name = site_tally_goals.tally_name + AND {date} = site_tally_goals.date + WHERE past_tallies.tally_name='$tally_name' + AND holder_type='S' + AND holder_id=1 + $where_addition + $groupby + $orderby + $limit"; + + $date_expr = "FROM_UNIXTIME(past_tallies.timestamp-1,'%Y-%m-%d')"; + $ym_expr = "FROM_UNIXTIME(past_tallies.timestamp-1,'%Y-%m')"; + $y_expr = "FROM_UNIXTIME(past_tallies.timestamp-1,'%Y')"; + + $is_curr_month_expr = "$ym_expr = DATE_FORMAT(NOW(),'%Y-%m')"; + $is_curr_year_expr = "$y_expr = YEAR(NOW())"; + + $s = preg_replace( '/{date}/', $date_expr, $s ); + $s = preg_replace( '/{year_month}/', $ym_expr, $s ); + $s = preg_replace( '/{is_curr_month}/', $is_curr_month_expr, $s ); + $s = preg_replace( '/{is_curr_year}/', $is_curr_year_expr, $s ); + + return $s; +} + +// vim: sw=4 ts=4 expandtab diff --git a/c/pinc/pg old.inc b/c/pinc/pg old.inc new file mode 100644 index 0000000..c9c8eaf --- /dev/null +++ b/c/pinc/pg old.inc @@ -0,0 +1,44 @@ + element +// that links to the PG catalog page for that text. +{ + $url = get_pg_catalog_url_for_etext( $etext_number ); + + if ( is_null($link_text) ) + { + //MS + $link_text = sprintf( _('PGC etext #%d'), $etext_number ); + } + + return "$link_text"; +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/pg.inc b/c/pinc/pg.inc new file mode 100644 index 0000000..815b0d2 --- /dev/null +++ b/c/pinc/pg.inc @@ -0,0 +1,44 @@ + element +// that links to the PG catalog page for that text. +{ + $url = get_pg_catalog_url_for_etext( $etext_number ); + + if ( is_null($link_text) ) + { + //MS + $link_text = sprintf( _('FadedPage etext #%d'), $etext_number ); + } + + return "$link_text"; +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/phases.php b/c/pinc/phases.php new file mode 100644 index 0000000..0e81d27 --- /dev/null +++ b/c/pinc/phases.php @@ -0,0 +1,55 @@ + _('Preparation'), + "description" => _("Images are converted to OCR text, + and both the text and images are checked for completeness and quality.") ); + +$DpPhases["P1"] = array( "name" => _('Proofreading Round 1'), + "description" => _("The text is the output from OCR software. + Compare it carefully with the image.") ); + +$DpPhases["P2"] = array( "name" => _('Proofreading Round 2'), + "description" => _("The texts have been proofread once. + Now carefully compare them with the image again.") ); + +$DpPhases["P3"] = array( "name" => _('Proofreading Round 3'), + "description" => _("The texts have been proofread twice. + Examine them closely for small errors that may have been missed, + paying careful attention to the punctuation.") ); + +$DpPhases["F1"] = array( "name" => _('Formatting Round 1'), + "description" => _("The texts have been proofread. + Now they need to be formatted with markup + (which may in some cases be specific to the project.)") ); + +$DpPhases["F2"] = array( "name" => _('Formatting Round 2'), + "description" => _("The rexts need to be carefully checked to complete any remaining formatting.") ); + +$DpPhases["PP"] = array( "name" => _('Post Processing'), + "description" => _("The texts have completed the rounds, + and now are converted to publication-quality texts.") ); + +$DpPhases["PPV"] = array( "name" => _('PP Verifying'), + "description" => _("A final check to confirm that the project meets DPC and FadedPage standards.") ); + +function PhaseCaption($phase) { + return _("Pages Completed in $phase"); +} + +function NameForPhase($phase) { + global $DpPhases; + return $phase != "" && is_array($DpPhases[$phase]) + ? $DpPhases[$phase]['name'] + : ""; +} + +function DescriptionForPhase($phase) { + global $DpPhases; + return $phase != "" && is_array($DpPhases[$phase]) + ? $DpPhases[$phase]['description'] + : ""; +} + diff --git a/c/pinc/postcomments.inc b/c/pinc/postcomments.inc new file mode 100644 index 0000000..ec531fe --- /dev/null +++ b/c/pinc/postcomments.inc @@ -0,0 +1,20 @@ + . +function get_formatted_postcomments( $projectid ) { + global $dpdb; + $postcomments = $dpdb->SqlOneValue(" + SELECT postcomments FROM projects WHERE projectid='$projectid'"); + + return htmlspecialcharswithnewlines($postcomments); +} + +function htmlspecialcharswithnewlines($string) { + $string = htmlspecialchars($string); + $string = str_replace("\n", "
    ", $string); + return $string; +} + +?> diff --git a/c/pinc/prefs_options.inc b/c/pinc/prefs_options.inc new file mode 100644 index 0000000..7ba2a98 --- /dev/null +++ b/c/pinc/prefs_options.inc @@ -0,0 +1,50 @@ + BROWSER_DEFAULT_STR, + 1 => '8pt', 2 => '9pt', 3 => '10pt', 4 => '11pt', 5 => '12pt', 6 => '13pt', + 7 => '14pt', 8 => '15pt', 9 => '16pt', 10 => '18pt', 11 => '20pt'); + +$u_radius = array('0', '2', '4', '6', '8', '10', '12', '14', '16', '18', '20'); + +$u_intlang_tmp = installed_langs(); +$u_intlang_options[""] = BROWSER_DEFAULT_STR; +foreach($u_intlang_tmp as $k => $v) { + $u_intlang_options[$v] = bilingual_name($v); +} + +$i_pm = array(_("All Projects"), _("Active Projects"), _("Search Page")); + +$i_stats = array(_("Public"), _("Anonymous"), _("Private")); +define('PRIVACY_PUBLIC', 0); +define('PRIVACY_ANONYMOUS', 1); +define('PRIVACY_PRIVATE', 2); +// See ../faq/pophelp/prefs/set_privacy.html +// for definitions of these privacy categories. +?> diff --git a/c/pinc/privacy.inc b/c/pinc/privacy.inc new file mode 100644 index 0000000..82c6445 --- /dev/null +++ b/c/pinc/privacy.inc @@ -0,0 +1,30 @@ + diff --git a/c/pinc/project_edit.inc b/c/pinc/project_edit.inc new file mode 100644 index 0000000..a938181 --- /dev/null +++ b/c/pinc/project_edit.inc @@ -0,0 +1,80 @@ +SqlOneValue(" + SELECT username FROM projects WHERE projectid = '$projectid'"); + if ($User->IsProjectManager()) { + // The current user is the project manager for the project. + return USER_CAN_EDIT_PROJECT; + } + + if ( user_is_a_sitemanager() || user_is_proj_facilitator() ) { + return USER_CAN_EDIT_PROJECT; + } + + return USER_CANNOT_EDIT_PROJECT; +} + +// Politely abort if the current user ($pguser) +// is not allowed to edit the specified project +function abort_if_cant_edit_project( $projectid ) { + global $site_manager_email_addr; + + $result = user_can_edit_project($projectid); + + if ( $result == PROJECT_DOES_NOT_EXIST ) { + echo " +

    + "._("There appears to be no such project")." ($projectid). +

    + "._("If this message is an error, contact the")." "._("site manager").". +

    "._("Back").""; + theme( "", "footer" ); + exit; + } + else if ( $result == USER_CANNOT_EDIT_PROJECT ) { + echo " +

    + "._("You are not allowed to change this project")." ($projectid). +

    + "._("If this message is an error, contact the")." "._("site manager").". +

    "._("Back").""; + theme( "", "footer" ); + exit; + } + else if ( $result == USER_CAN_EDIT_PROJECT ) { + return; + } + else { + echo "unexpected return value from user_can_edit_project: '$result'"; + exit; + } +} + +// Can the current user delete a project in the given state? +// (assuming that the current user can edit/manage the project) +function user_can_delete_project_in_state( $project_state ) { + // PM/PF/SA can delete a project when it's new. + // SA can 'delete' a project when it's in any state but already-deleted. + // (There's a difference to what 'deletion' means in the latter case.) + return ( + $project_state == PROJ_NEW + || $project_state != PROJ_DELETE && user_is_a_sitemanager()); +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/project_events.inc b/c/pinc/project_events.inc new file mode 100644 index 0000000..29bdb08 --- /dev/null +++ b/c/pinc/project_events.inc @@ -0,0 +1,20 @@ +SqlExecute($sql) == 1 ? "" : "Proj log failed" ; +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/project_states.inc b/c/pinc/project_states.inc new file mode 100644 index 0000000..ab7dadd --- /dev/null +++ b/c/pinc/project_states.inc @@ -0,0 +1,407 @@ + array(), + 'SILVER' => array(), + 'GOLD' => array(), +); + +function declare_project_state( $constant_name, $constant_value, $label, + $forum, $phase, $star_metal ) { + global $PROJECT_STATES_IN_ORDER; + global $project_state_label_; + global $project_state_forum_; + global $project_state_phase_; + global $project_states_for_star_metal_; + + define( $constant_name, $constant_value ); + $PROJECT_STATES_IN_ORDER[] = $constant_value; + $project_state_label_[$constant_value] = $label; + $project_state_forum_[$constant_value] = $forum; + $project_state_phase_[$constant_value] = $phase; + if ($star_metal) + $project_states_for_star_metal_[$star_metal][] = $constant_value; +} + +function project_states_text($state) { + global $project_state_label_; + return array_get( $project_state_label_, $state, '' ); +} + +function get_forum_id_for_project_state($state) { + global $project_state_forum_; + return array_get( $project_state_forum_, $state, -1 ); +} + +function get_phase_containing_project_state($state) { + global $project_state_phase_; + return array_get( $project_state_phase_, $state, 'NONE' ); +} + +// ----------------------------------------------- + +function declare_project_states_for_round( $round_id, $round_name ) { + global $projects_forum_idx; + global $waiting_projects_forum_idx; + + declare_project_state( + "PROJ_{$round_id}_BAD_PROJECT", + "$round_id.proj_bad", + "$round_name: " . _("Bad Project"), + $projects_forum_idx, + 'PAGE_EDITING', ''); + declare_project_state( + "PROJ_{$round_id}_UNAVAILABLE", + "$round_id.proj_unavail", + "$round_name: " . _("Unavailable"), + ($round_id == 'P1' ? $waiting_projects_forum_idx : $projects_forum_idx ), + 'PAGE_EDITING', ''); + declare_project_state( + "PROJ_{$round_id}_WAITING_FOR_RELEASE", + "$round_id.proj_waiting", + "$round_name: " . _("Waiting for Release"), + ($round_id == 'P1' ? $waiting_projects_forum_idx : $projects_forum_idx ), + 'PAGE_EDITING', ''); + declare_project_state( + "PROJ_{$round_id}_AVAILABLE", + "$round_id.proj_avail", + "$round_name: " . _("Available"), + $projects_forum_idx, + 'PAGE_EDITING', + 'BRONZE'); + declare_project_state( + "PROJ_{$round_id}_COMPLETE", + "$round_id.proj_done", + "$round_name: " . _("Completed"), + $projects_forum_idx, + 'PAGE_EDITING', + ''); +} + +// ----------------------------------------------- + +// Note that the order in which these project states are declared +// is the order in which they will be displayed in various contexts +// (via $PROJECT_STATES_IN_ORDER). + + +// PR + + +// for the initial creation of a project +declare_project_state( + "PROJ_NEW", + "project_new", + _("New Project"), + $waiting_projects_forum_idx, + 'NEW', + ''); + +if ($site_supports_metadata) { + declare_project_state( + "PROJ_NEW_WAITING_APPROVAL", + "project_new_waiting_app", + _("Awaiting Approval"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_UNAPPROVED", + "project_new_unapp", + _("Unapproved Project"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_APPROVED", + "project_new_app", + _("Approved Project"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_FILE_UPLOADED", + "project_new_uploaded", + _("Files Uploaded"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_METADATA_FIRST", + "project_md_first", + _("Metadata First Round"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_METADATA_BAD", + "project_md_bad", + _("Bad Metadata"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_METADATA_SECOND", + "project_md_second", + _("Metadata Second Round"), + $waiting_projects_forum_idx, + 'NONE', + ''); + declare_project_state( + "PROJ_NEW_PREPROCESSING", + "project_new_preprocess", + _("Preprocessing"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_PENDING_PM", + "project_new_pend_pm", + _("Pending Project Manager"), + $waiting_projects_forum_idx, + 'NONE', + ''); +} + + +// PROOF +declare_project_states_for_round( 'P1', _('Proofreading Round 1') ); +declare_project_states_for_round( 'P2', _('Proofreading Round 2') ); +declare_project_states_for_round( 'P3', _('Proofreading Round 3') ); + +// FORMAT +declare_project_states_for_round( 'F1', _('Formatting Round 1') ); +declare_project_states_for_round( 'F2', _('Formatting Round 2') ); + + +// POST +declare_project_state( + "PROJ_POST_FIRST_UNAVAILABLE", + "proj_post_first_unavailable", + _("Unavailable for Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER'); +declare_project_state( + "PROJ_POST_FIRST_AVAILABLE", + "proj_post_first_available", + _("Available for Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER'); + +declare_project_state( + "PROJ_POST_FIRST_CHECKED_OUT", + "proj_post_first_checked_out", + _("In Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER'); + +declare_project_state( + "PROJ_POST_SECOND_AVAILABLE", + "proj_post_second_available", + _("Available for Verifying Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER'); + +declare_project_state( + "PROJ_POST_SECOND_CHECKED_OUT", + "proj_post_second_checked_out", + _("Verifying Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER'); +declare_project_state( + "PROJ_POST_COMPLETE", + "proj_post_complete", + _("Completed Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER'); + + + +// SUBMIT (was GB) +declare_project_state( + "PROJ_SUBMIT_PG_POSTED", + "proj_submit_pgposted", + _("Posted"), + $posted_projects_forum_idx, + 'GB', + 'GOLD'); + +// CORRECT +declare_project_state( + "PROJ_CORRECT_AVAILABLE", + "proj_correct_available", + _("Verify Corrections"), + $posted_projects_forum_idx, + 'NONE', + 'GOLD'); +declare_project_state( + "PROJ_CORRECT_CHECKED_OUT", + "proj_correct_checked_out", + _("Verifying Corrections"), + $posted_projects_forum_idx, + 'NONE', + 'GOLD'); + +// for complete project +declare_project_state( + "PROJ_COMPLETE", + "project_complete", + _("Project Complete"), + -1, + 'COMPLETE', + ''); + +// for the 'deletion' of a project +declare_project_state( + "PROJ_DELETE", + "project_delete", + _("Delete Project"), + -1, + 'NONE', + ''); + +// ----------------------------------------------------------------------------- + +// Define constants for use in SQL queries: +// SQL_CONDITION_BRONZE +// SQL_CONDITION_SILVER +// SQL_CONDITION_GOLD + +foreach ( $project_states_for_star_metal_ as $star_metal => $project_states ) { + $sql_constant_name = "SQL_CONDITION_$star_metal"; + $sql_condition = '('; + foreach ( $project_states as $project_state ) { + if ($sql_condition != '(') { + $sql_condition .= ' OR '; + } + $sql_condition .= "state='$project_state'"; + } + $sql_condition .= ')'; + + define( $sql_constant_name, $sql_condition ); +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +// In an SQL query, if you "ORDER BY state", it will use alphabetical order, +// which is not very useful. Instead, ORDER BY the result of this function, +// and it will use the canonical order-of-declaration for project states. +function sql_collater_for_project_state( $state_column ) { + global $PROJECT_STATES_IN_ORDER; + $s = "FIELD($state_column"; + foreach ( $PROJECT_STATES_IN_ORDER as $project_state ) { + $s .= ",'$project_state'"; + } + $s .= ")"; + return $s; +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +// $which is a word denoting a possible status of a project +// (created, proofed, PPd, or posted). +// Return an object whose attributes hold various constants that +// are useful for: +// -- finding, +// -- counting, or +// -- plotting a graph of +// projects having that status. +// (Somewhat ad hoc, but useful.) +function get_project_status_descriptor( $which ) { + $obj = new stdClass; + + switch ( $which ) { + case 'created': + $obj->state_selector = " + ( state NOT LIKE 'project_new%' AND state != 'project_delete')"; + $obj->color = 'green'; + + $obj->Xed_title = _('Created'); + $obj->projects_Xed_title = _('Projects Created'); + $obj->graphs_title = _('Created Projects Graphs'); + $obj->per_day_title = _('Projects Created Each Day'); + $obj->cumulative_title = _('Cumulative Projects Created'); + break; + + case 'proofed': + $obj->state_selector = "( + state LIKE 'proj_submit%' + OR state LIKE 'proj_correct%' + OR state LIKE 'proj_post%')"; + $obj->color = 'blue'; + + $obj->Xed_title = _('Proofread'); + $obj->projects_Xed_title = _('Projects Proofread'); + $obj->graphs_title = _('Proofed Projects Graphs'); + $obj->per_day_title = _('Projects Proofed Each Day'); + $obj->cumulative_title = _('Cumulative Projects Proofed'); + break; + + case 'PPd': + $obj->state_selector = " + ( state LIKE 'proj_submit%' + OR state LIKE 'proj_correct%' + OR state LIKE 'proj_post_second%')"; + $obj->color = 'silver'; + $obj->Xed_title = _('Post-Processed'); + $obj->projects_Xed_title = _('Projects Post-Processed'); + $obj->graphs_title = _('PPd Projects Graphs'); + $obj->per_day_title = _('Projects Post-Processed Each Day'); + $obj->cumulative_title = _('Cumulative Projects PPd'); + break; + + case 'posted': + $obj->state_selector = " + ( state LIKE 'proj_submit%' OR state LIKE 'proj_correct%')"; + $obj->color = 'gold'; + $obj->Xed_title = _('Posted'); + $obj->projects_Xed_title = _('Projects Posted'); + $obj->graphs_title = _('Posted Projects Graphs'); + $obj->per_day_title = _('Projects Posted Each Day'); + $obj->cumulative_title = _('Cumulative Projects Posted'); + break; + + default: + die("bad value for 'which': '$which'"); + } + + return $obj; +} + +?> diff --git a/c/pinc/project_states_old.inc b/c/pinc/project_states_old.inc new file mode 100644 index 0000000..e8793fe --- /dev/null +++ b/c/pinc/project_states_old.inc @@ -0,0 +1,455 @@ + array(), + 'SILVER' => array(), + 'GOLD' => array(), +); + +function declare_project_state( + $constant_name, + $constant_value, + $label, + $forum, + $phase, + $star_metal ) +{ + global $PROJECT_STATES_IN_ORDER; + global $project_state_label_; + global $project_state_forum_; + global $project_state_phase_; + global $project_states_for_star_metal_; + + define( $constant_name, $constant_value ); + $PROJECT_STATES_IN_ORDER[] = $constant_value; + $project_state_label_[$constant_value] = $label; + $project_state_forum_[$constant_value] = $forum; + $project_state_phase_[$constant_value] = $phase; + if ($star_metal) $project_states_for_star_metal_[$star_metal][] = $constant_value; +} + +function project_states_text($state) +{ + global $project_state_label_; + return array_get( $project_state_label_, $state, '' ); +} + +function get_forum_id_for_project_state($state) +{ + global $project_state_forum_; + return array_get( $project_state_forum_, $state, -1 ); +} + +function get_phase_containing_project_state($state) +{ + global $project_state_phase_; + return array_get( $project_state_phase_, $state, 'NONE' ); +} + +// ----------------------------------------------- + +function declare_project_states_for_round( $round_id, $round_name ) +{ + global $projects_forum_idx; + global $waiting_projects_forum_idx; + + declare_project_state( + "PROJ_{$round_id}_BAD_PROJECT", + "$round_id.proj_bad", + "$round_name: " . _("Bad Project"), + $projects_forum_idx, + 'PAGE_EDITING', + '' + ); + declare_project_state( + "PROJ_{$round_id}_UNAVAILABLE", + "$round_id.proj_unavail", + "$round_name: " . _("Unavailable"), + ($round_id == 'P1' ? $waiting_projects_forum_idx : $projects_forum_idx ), + 'PAGE_EDITING', + '' + ); + declare_project_state( + "PROJ_{$round_id}_WAITING_FOR_RELEASE", + "$round_id.proj_waiting", + "$round_name: " . _("Waiting for Release"), + ($round_id == 'P1' ? $waiting_projects_forum_idx : $projects_forum_idx ), + 'PAGE_EDITING', + '' + ); + declare_project_state( + "PROJ_{$round_id}_AVAILABLE", + "$round_id.proj_avail", + "$round_name: " . _("Available"), + $projects_forum_idx, + 'PAGE_EDITING', + 'BRONZE' + ); + declare_project_state( + "PROJ_{$round_id}_COMPLETE", + "$round_id.proj_done", + "$round_name: " . _("Completed"), + $projects_forum_idx, + 'PAGE_EDITING', + '' + ); +} + +// ----------------------------------------------- + +// Note that the order in which these project states are declared +// is the order in which they will be displayed in various contexts +// (via $PROJECT_STATES_IN_ORDER). + + +// PR + + +// for the initial creation of a project +declare_project_state( + "PROJ_NEW", + "project_new", + _("New Project"), + $waiting_projects_forum_idx, + 'NEW', + '' +); + +if ($site_supports_metadata) +{ + declare_project_state( + "PROJ_NEW_WAITING_APPROVAL", + "project_new_waiting_app", + _("Awaiting Approval"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_UNAPPROVED", + "project_new_unapp", + _("Unapproved Project"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_APPROVED", + "project_new_app", + _("Approved Project"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_FILE_UPLOADED", + "project_new_uploaded", + _("Files Uploaded"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_METADATA_FIRST", + "project_md_first", + _("Metadata First Round"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_METADATA_BAD", + "project_md_bad", + _("Bad Metadata"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_METADATA_SECOND", + "project_md_second", + _("Metadata Second Round"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_PREPROCESSING", + "project_new_preprocess", + _("Preprocessing"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); + declare_project_state( + "PROJ_NEW_PENDING_PM", + "project_new_pend_pm", + _("Pending Project Manager"), + $waiting_projects_forum_idx, + 'NONE', + '' + ); +} + + +// PROOF +declare_project_states_for_round( 'P1', _('Proofreading Round 1') ); +declare_project_states_for_round( 'P2', _('Proofreading Round 2') ); +declare_project_states_for_round( 'P3', _('Proofreading Round 3') ); + +// FORMAT +declare_project_states_for_round( 'F1', _('Formatting Round 1') ); +declare_project_states_for_round( 'F2', _('Formatting Round 2') ); + + +// POST +declare_project_state( + "PROJ_POST_FIRST_UNAVAILABLE", + "proj_post_first_unavailable", + _("Unavailable for Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER' +); +declare_project_state( + "PROJ_POST_FIRST_AVAILABLE", + "proj_post_first_available", + _("Available for Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER' +); + +declare_project_state( + "PROJ_POST_FIRST_CHECKED_OUT", + "proj_post_first_checked_out", + _("In Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER' +); + +declare_project_state( + "PROJ_POST_SECOND_AVAILABLE", + "proj_post_second_available", + _("Available for Verifying Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER' +); + +declare_project_state( + "PROJ_POST_SECOND_CHECKED_OUT", + "proj_post_second_checked_out", + _("Verifying Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER' +); +declare_project_state( + "PROJ_POST_COMPLETE", + "proj_post_complete", + _("Completed Post-Processing"), + $pp_projects_forum_idx, + 'PP', + 'SILVER' +); + + + +// SUBMIT (was GB) +declare_project_state( + "PROJ_SUBMIT_PG_POSTED", + "proj_submit_pgposted", + _("Posted to Project Gutenberg Canada"), + $posted_projects_forum_idx, + 'GB', + 'GOLD' +); + +// CORRECT +declare_project_state( + "PROJ_CORRECT_AVAILABLE", + "proj_correct_available", + _("Verify Corrections"), + $posted_projects_forum_idx, + 'NONE', + 'GOLD' +); +declare_project_state( + "PROJ_CORRECT_CHECKED_OUT", + "proj_correct_checked_out", + _("Verifying Corrections"), + $posted_projects_forum_idx, + 'NONE', + 'GOLD' +); + +// for complete project +declare_project_state( + "PROJ_COMPLETE", + "project_complete", + _("Project Complete"), + -1, + 'COMPLETE', + '' +); + +// for the 'deletion' of a project +declare_project_state( + "PROJ_DELETE", + "project_delete", + _("Delete Project"), + -1, + 'NONE', + '' +); + +// ----------------------------------------------------------------------------- + +// Define constants for use in SQL queries: +// SQL_CONDITION_BRONZE +// SQL_CONDITION_SILVER +// SQL_CONDITION_GOLD + +foreach ( $project_states_for_star_metal_ as $star_metal => $project_states ) +{ + $sql_constant_name = "SQL_CONDITION_$star_metal"; + $sql_condition = '('; + foreach ( $project_states as $project_state ) + { + if ($sql_condition != '(') + { + $sql_condition .= ' OR '; + } + $sql_condition .= "state='$project_state'"; + } + $sql_condition .= ')'; + + define( $sql_constant_name, $sql_condition ); +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +function sql_collater_for_project_state( $state_column ) +// In an SQL query, if you "ORDER BY state", it will use alphabetical order, +// which is not very useful. Instead, ORDER BY the result of this function, +// and it will use the canonical order-of-declaration for project states. +{ + global $PROJECT_STATES_IN_ORDER; + $s = "FIELD($state_column"; + foreach ( $PROJECT_STATES_IN_ORDER as $project_state ) + { + $s .= ",'$project_state'"; + } + $s .= ")"; + return $s; +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +function get_project_status_descriptor( $which ) +// $which is a word denoting a possible status of a project +// (created, proofed, PPd, or posted). +// Return an object whose attributes hold various constants that +// are useful for: +// -- finding, +// -- counting, or +// -- plotting a graph of +// projects having that status. +// (Somewhat ad hoc, but useful.) +{ + $obj = new stdClass; + + switch ( $which ) + { + case 'created': + $obj->state_selector = "( + state NOT LIKE 'project_new%' AND state != 'project_delete' + )"; + $obj->color = 'green'; + $obj->Xed_title = _('Created'); + $obj->projects_Xed_title = _('Projects Created'); + $obj->graphs_title = _('Created Projects Graphs'); + $obj->per_day_title = _('Projects Created Each Day'); + $obj->cumulative_title = _('Cumulative Projects Created'); + break; + + case 'proofed': + $obj->state_selector = "( + state LIKE 'proj_submit%' + OR state LIKE 'proj_correct%' + OR state LIKE 'proj_post%' + )"; + $obj->color = 'blue'; + $obj->Xed_title = _('Proofread'); + $obj->projects_Xed_title = _('Projects Proofread'); + $obj->graphs_title = _('Proofed Projects Graphs'); + $obj->per_day_title = _('Projects Proofed Each Day'); + $obj->cumulative_title = _('Cumulative Projects Proofed'); + break; + + case 'PPd': + $obj->state_selector = "( + state LIKE 'proj_submit%' + OR state LIKE 'proj_correct%' + OR state LIKE 'proj_post_second%' + )"; + $obj->color = 'silver'; + $obj->Xed_title = _('Post-Processed'); + $obj->projects_Xed_title = _('Projects Post-Processed'); + $obj->graphs_title = _('PPd Projects Graphs'); + $obj->per_day_title = _('Projects Post-Processed Each Day'); + $obj->cumulative_title = _('Cumulative Projects PPd'); + break; + + case 'posted': + $obj->state_selector = "( + state LIKE 'proj_submit%' + OR state LIKE 'proj_correct%' + )"; + $obj->color = 'gold'; + $obj->Xed_title = _('Posted to PG'); + $obj->projects_Xed_title = _('Projects Posted'); + $obj->graphs_title = _('Posted Projects Graphs'); + $obj->per_day_title = _('Projects Posted to PGC Each Day'); + $obj->cumulative_title = _('Cumulative Projects Posted to PGC'); + break; + + default: + die("bad value for 'which': '$which'"); + } + + return $obj; +} + +?> diff --git a/c/pinc/projectinfo.inc b/c/pinc/projectinfo.inc new file mode 100644 index 0000000..d8b1bae --- /dev/null +++ b/c/pinc/projectinfo.inc @@ -0,0 +1,17 @@ +SqlOneValue(" + SELECT COUNT(1) FROM $projectid + WHERE state='$page_state'"); +} + +function Project_getNumPages( $projectid ) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT COUNT(*) FROM $projectid"); +} + +// vim: sw=4 ts=4 expandtab +?> diff --git a/c/pinc/quizzes.inc b/c/pinc/quizzes.inc new file mode 100644 index 0000000..284b202 --- /dev/null +++ b/c/pinc/quizzes.inc @@ -0,0 +1,31 @@ + 'formatting1', + _('Page two: Section headings, hyphens and em-dashes') => 'formatting2', + _('Page three: Chapter headings and thought breaks') => 'formatting3', + _('Page four: Poetry, blockquotes and lists') => 'formatting4', + _('Page five: Illustrations and footnotes') => 'formatting5'), + array( 'maximum_age' => 6 * 30 * 24 * 60 * 60) // 6 months +); + + +$PQ = new Quiz( "PQ", "Proofreading Quiz", + _("This quiz covers the corrections you should make in the proofreading rounds."), + array( _('Page One') => 'step1', + _('Page Two') => 'step2', + _('Page Three') => 'step3', + _('Page Four') => 'step4', + _('Page Five') => 'step5'), + array( 'maximum_age' => 6 * 30 * 24 * 60 * 60) // 6 months +); +*/ diff --git a/c/pinc/randrule.php b/c/pinc/randrule.php new file mode 100644 index 0000000..bcc9da8 --- /dev/null +++ b/c/pinc/randrule.php @@ -0,0 +1,27 @@ +SqlOneValue(" + SELECT count(*) AS numrules FROM rules"); + + $randid = rand(0, $num_rules); + + $rule = $dpdb->SqlOneRow(" + SELECT subject, rule, doc FROM rules + WHERE id = $randid"); + + return <<$rule[subject]

    + +

    $rule[rule]

    + +

    See the $rule[subject] section of the Proofreading Guidelines

    +EOT; +} +?> diff --git a/c/pinc/release_queue.inc b/c/pinc/release_queue.inc new file mode 100644 index 0000000..db8347d --- /dev/null +++ b/c/pinc/release_queue.inc @@ -0,0 +1,22 @@ + diff --git a/c/pinc/resolution.inc b/c/pinc/resolution.inc new file mode 100644 index 0000000..f2629da --- /dev/null +++ b/c/pinc/resolution.inc @@ -0,0 +1,5 @@ + diff --git a/c/pinc/root b/c/pinc/root new file mode 100644 index 0000000..70cd64b --- /dev/null +++ b/c/pinc/root @@ -0,0 +1,25 @@ +From root@powerweb.testfusionmedia.com Fri Sep 27 02:15:01 2013 +Return-Path: +Received: from powerweb.testfusionmedia.com (localhost [127.0.0.1]) + by powerweb.testfusionmedia.com (8.14.4/8.14.4) with ESMTP id r8R6F142007843 + for ; Fri, 27 Sep 2013 02:15:01 -0400 +Received: (from dkretz@localhost) + by powerweb.testfusionmedia.com (8.14.4/8.14.4/Submit) id r8R6F1Bf007842; + Fri, 27 Sep 2013 02:15:01 -0400 +Date: Fri, 27 Sep 2013 02:15:01 -0400 +Message-Id: <201309270615.r8R6F1Bf007842@powerweb.testfusionmedia.com> +X-Authentication-Warning: powerweb.testfusionmedia.com: dkretz set sender to root using -f +From: root@powerweb.testfusionmedia.com (Cron Daemon) +To: dkretz@powerweb.testfusionmedia.com +Subject: Cron /sharehome/htdocs/c/tools/project_manager/auto.sh > /sharehome/cronlogs/automodify.log +Content-Type: text/plain; charset=UTF-8 +Auto-Submitted: auto-generated +X-Cron-Env: +X-Cron-Env: +X-Cron-Env: +X-Cron-Env: +X-Cron-Env: +Status: O + +PHP Notice: Undefined index: REQUEST_URI in /sharehome/htdocs/c/pinc/dp_main.inc on line 38 + diff --git a/c/pinc/rounds.php b/c/pinc/rounds.php new file mode 100644 index 0000000..891d8fa --- /dev/null +++ b/c/pinc/rounds.php @@ -0,0 +1,249 @@ + "PREP", 1 => "P1", 2 => "P2", 3 => "P3", 4 => "F1", 5 => "F2", + 6 => "PP", 7 => "PPV", 8 => "POSTED"); + } + + function PhaseForRoundId($roundid) { + switch($roundid) { + case "OCR": + return "PREP"; + case "P1": + case "P2": + case "P3": + case "F1": + case "F2": + return $roundid; + default: + return null; + } + } + + function PhaseForIndex($index) { + $p = PhasesInOrder(); + return $p[$index]; + } + + function IndexForPhase($phase) { + $p = PhasesInOrder(); + return array_search($phase, $p); + } + + function RoundIdsInOrder() { + return array("P1", "P2", "P3", "F1", "F2"); + // global $dpdb; + // static $_ids; + // if(!isset($_ids)) { + // $sql = " + // SELECT roundid FROM rounds + // ORDER BY round_index"; + // $_ids = $dpdb->SqlValues($sql); + // } + // return $_ids; + } + + function RoundCount() { + return 5; + } + + function RoundIndexForId($roundid) { + switch(strtoupper($roundid)) { + case "OCR": + return 0; + case "P1": + return 1; + case "P2": + return 2; + case "P3": + return 3; + case "F1": + return 4; + case "F2": + return 5; + default: + return null; + } + } + + function RoundIdBefore($roundid) { + switch($roundid) { + case "P1": + return "PREP"; + case "P2": + return "P1"; + case "P3": + return "P2"; + case "F1": + return "P3"; + case "F2": + return "F1"; + default: + return null; + } + // $index = RoundIndexForId($roundid); + // if($index == 0) + // return null; + // return RoundIdForIndex($index - 1); + } + + function RoundIdAfter($roundid) { + switch($roundid) { + case "OCR": + return "P1"; + case "P1": + return "P2"; + case "P2": + return "P3"; + case "P3": + return "F1"; + case "F1": + return "F2"; + case "F2": + return "proj_post_first_available"; + default: + return null; + } + // $index = RoundIndexForId($roundid); + // if($index >= 6) + // return null; + // return RoundIdForIndex(RoundIndexForId($roundid) + 1); + } + + function RoundIdForIndex($index) { + switch($index) { + case 0: + return "OCR"; + case 1: + return "P1"; + case 2: + return "P2"; + case 3: + return "P3"; + case 4: + return "F1"; + case 5: + return "F2"; + default: + return null; + + } + } + + function UserFieldForRoundIndex($index) { + if($index < 1 || $index > 5) { + return ""; + } + return sprintf("%s%d%s", "round", $index, "_user"); + } + + function TimeFieldForRoundIndex($index) { + return sprintf("%s%d%s", "round", $index, "_time"); + } + + function TextFieldForRoundIndex($index) { + if($index == 0) { + return "master_text"; + } + return sprintf("%s%d%s", "round", $index, "_text"); + } + + + function TextFieldForPhase($phase) { + switch($phase) { + case "PREP": + return "master_text"; + case "P1": + return "round1_text"; + case "P2": + return "round2_text"; + case "P3": + return "round3_text"; + case "F1": + return "round4_text"; + case "F2": + return "round5_text"; + default: + return "round5_text"; + } + } + + function TextFieldForRoundId($roundid) { + switch($roundid) { + case "OCR": + return "master_text"; + case "P1": + return "round1_text"; + case "P2": + return "round2_text"; + case "P3": + return "round3_text"; + case "F1": + return "round4_text"; + case "F2": + return "round5_text"; + default: + return "round5_text"; + } + } + + function PreviousUserFieldForRoundid($roundid) { + switch($roundid) { + case "P2": + return "round1_user"; + case "P3": + return "round2_user"; + case "F1": + return "round3_user"; + case "F2": + return "round4_user"; + default: + return null; + } + } + + function UserFieldForRoundId($roundid) { + switch($roundid) { + case "P1": + return "round1_user"; + case "P2": + return "round2_user"; + case "P3": + return "round3_user"; + case "F1": + return "round4_user"; + case "F2": + return "round5_user"; + default: + return null; + } + } + + function TimeFieldForRoundId($roundid) { + return TimeFieldForRoundIndex(RoundIndexForId($roundid)); + } + + + function FirstRoundId() { + return RoundIdForIndex(0); + } + + function PreviousRoundIdForRoundId($roundid) { + $idx = RoundIndexForId($roundid) - 1; + if($idx < 1) { + return null; + } + return RoundIdForIndex($idx); + } + + function NextRoundIdForRoundId($roundid) { + $idx = RoundIndexForId($roundid) + 1; + if($idx > 5 ){ + return null; + } + return RoundIdForIndex($idx); + } + + function RoundUrl($roundid) { + global $proof_url; + return "{$proof_url}/round.php?roundid={$roundid}"; + } diff --git a/c/pinc/select_list.inc b/c/pinc/select_list.inc new file mode 100644 index 0000000..241a98c --- /dev/null +++ b/c/pinc/select_list.inc @@ -0,0 +1,17 @@ +SqlValues(" + SELECT distinct $field FROM projects + WHERE $states + ORDER BY $field"); + + foreach($values as $val) { + $to_echo .= "\n"; +} + +/*************************************************************************************** +* +* function sr_echo_withdrawal_form: create button and call page for database access +* inputs: projectid +* output: none +* +* Remarks: +* This calls a transient page executing the database function for revoking a commitment +* and provides the current URI for return to current page. +* +****************************************************************************************/ + +function sr_echo_withdrawal_form($projectid) { + global $code_url; + + $next_url = $_SERVER['REQUEST_URI']; + $button_text = _("Withdraw SR commitment"); + + echo " +
    + + + + +
    \n"; + +} + + +?> diff --git a/c/pinc/special_colors.inc b/c/pinc/special_colors.inc new file mode 100644 index 0000000..e2a3848 --- /dev/null +++ b/c/pinc/special_colors.inc @@ -0,0 +1,123 @@ +
    "; + + $currspecs_result = mysql_query(" + SELECT distinct special_code as spec FROM projects + WHERE $projects_where_clause + "); + + $curr_specs_array = array(); + + while ($cs_row = mysql_fetch_assoc($currspecs_result)) { + + $curr_specs_array[] = $cs_row['spec']; + } + + $specs_result = mysql_query(" + SELECT spec_code, display_name, color FROM special_days + WHERE 1 = 1 + ORDER BY open_month desc, open_day desc + "); + + $running_length = 0; + $span_prefix = ""; + $span_suffix = " "; + + while ($sr_row = mysql_fetch_assoc($specs_result)) { + if (in_array($sr_row['spec_code'], $curr_specs_array)) { + echo $span_prefix.$sr_row['color'].$span_midfix.$sr_row['display_name'].$span_suffix ; + $running_length = $running_length + strlen($sr_row['display_name']) + 1; + if ($running_length > 60) { + echo "
    "; + $running_length = 0; + } + } + } + + if ($running_length > 0) { + echo "
    "; + } + + echo $span_prefix."CCFFFF".$span_midfix._("Authors with recent birthdays").$span_suffix; + echo $span_prefix."33CCFF".$span_midfix._("Authors with birthdays today").$span_suffix; + echo "
    "; + echo $span_prefix."FFFF66".$span_midfix._("Other Special").$span_suffix; + echo "
    "; + echo "
    "; + +} + +?> diff --git a/c/pinc/stages.inc b/c/pinc/stages.inc new file mode 100644 index 0000000..233892b --- /dev/null +++ b/c/pinc/stages.inc @@ -0,0 +1,360 @@ + array('search_and_replace', + 'greek_transliterator'), + 'tool_buttons' => array('remove_markup', + 'upper_case', + 'title_case', + 'lower_case'), + 'tool_links' => array('greek', + 'note', + 'curlybraces', + 'brackets', + 'blank_page'), +); +$pi_tools_for_F = array( 'popup_links' => 'ALL', + 'tool_buttons' => 'ALL', + 'tool_links' => 'ALL', +); + +new Round( + 'P1', + _('Proofreading Round 1'), + array(), + 'IMMEDIATE', + _("The page-texts are the output from OCR software and need to have the text carefully compared to the image."), + $site_url."/wiki/index.php/Proofreading_Guidelines", + array( + 0 => '#FFE4B5', // mocassin + 1 => '#FFF8DC', // cornsilk + ), + $pi_tools_for_P, + array(), + array( + 0 => _('Novice'), + 25 => _('Proofreading Pupil'), + 100 => _('Proofreading Apprentice'), + 500 => _('Proofreading Scholar'), + 1000 => _('Proofreading Prodigy'), + 2500 => _('Prefect of Proofreaders'), + 5000 => _('Proofreading Graduate'), + 10000 => _('Proofreading Alumnus'), + 20000 => _('Fellow of Proofreading'), + 30000 => _('Doctor of Proofreading'), + 40000 => _('Proofreading Don'), + 50000 => _('Dean of Proofreading'), + 60000 => _('Proofreading Proctor'), + 70000 => _('Principal Proofreader'), + 80000 => _('Master Proofreader'), + 90000 => _('Prefect of Proofreaders'), + 99000 => _('Supervising Proofreader'), + 100000 => _('Proofreading Professor'), + 110000 => _('Peer of Proofreading'), + 120000 => _('Doyen of Proofreading'), + 130000 => _('Proofreading Chancellor'), + 140000 => _('Proofreading Primate'), + 150000 => _('Paramount Proofreader'), + ) +); + +// ----------------------------------------------------------------------------- + +new Round( + 'P2', + _('Proofreading Round 2'), + array( 'P1' => 300, 'days since reg' => 21, 'quiz/P' => 1 ), + 'REQ-AUTO', + _("The page-texts have been proofread once, and now need to carefully compared to the image again."), + $site_url."/wiki/index.php/Proofreading_Guidelines", + array( + 0 => '#FFE4B5', // mocassin + 1 => '#FFF8DC', // cornsilk + ), + $pi_tools_for_P, + array( 'P1' ), + array( + 0 => _('Precise Proofreader'), + 25 => _('Picky Proofreader'), + 100 => _('Painstaking Proofreader'), + 500 => _('Punctilious Proofreader'), + 1000 => _('Persnickety Proofreader'), + 2500 => _('Particular Proofreader'), + 5000 => _('Proficient Proofreader'), + 10000 => _('Proper Proofreader'), + 20000 => _('Prudent Proofreader'), + 30000 => _('Proofreading Personage'), + 40000 => _('Proofreading Poppet'), + 50000 => _('Plighted Proofreader'), + 60000 => _('Proofreading Proctor'), + 70000 => _('Principal Proofreader'), + 80000 => _('Prime Proofreader'), + 90000 => _('Primal Proofreader'), + 99000 => _('Proofreading Personality'), + 100000 => _('Proofreading Professional'), + 110000 => _('Peerless Proofreader'), + 120000 => _('Plighted Proofreader'), + 130000 => _('Paraproofreader'), + 140000 => _('Proofreading Panjandrum'), + 150000 => _('Perfectionist Proofreader'), + ) +); + +// ----------------------------------------------------------------------------- + +new Round( + 'P3', + _('Proofreading Round 3'), + array( 'P1+P2' => 400, 'F1' => 50, 'days since reg' => 42, 'quiz/P' => 1 ), + 'REQ-HUMAN', + _("The page-texts have already been proofread, but now need to be examined closely for small errors that may have been missed."), + $site_url."/wiki/index.php/Proofreading_Guidelines", + array( + 0 => '#DDA0DD', // plum + 1 => '#D8BFD8', // thistle + ), + $pi_tools_for_P, + array( 'P1', 'P2' ), + array( + 0 => _('Specialist Proofreader'), + 25 => _('Precious Proofreader'), + 100 => _('Prized Proofreader'), + 500 => _('Premiere Proofreader'), + 1000 => _('Proofreading Perfectionist'), + 2500 => _('Pillar of Proofreading'), + 5000 => _('Proofreading Purist'), + 10000 => _('Proofreader of Precision'), + 20000 => _('Archetypal Proofreader'), + 30000 => _('Proofreading Nonpareil'), + 40000 => _('Paradigmatic Proofreader'), + 50000 => _('Preeminent Proofreader'), + 60000 => _('Prime Proofreader'), + 70000 => _('Proofreader of Plenariness'), + 80000 => _('Perpetual Proofreader'), + 90000 => _('Prefect of Proofreaders'), + 99000 => _('Impeccable Proofreader'), + 100000 => _('Proofreader of Persistence'), + 110000 => _('Patent Proofreader'), + 120000 => _('Proofreading Philosopher'), + 130000 => _('Patron of Proofreaders'), + 140000 => _('Proofreading Partner'), + 150000 => _('Pioneer of Proofreaders'), + ) +); + +// ----------------------------------------------------------------------------- + +new Round( + 'F1', + _('Formatting Round 1'), + array( 'P1' => 300, 'days since reg' => 21, 'quiz/F' => 1 ), + 'REQ-AUTO', + _("The page-texts have been proofread, and now need to be formatted with markup which may be specific to the project."), + $site_url."/wiki/index.php/Formatting_Guidelines", + array( + 0 => '#FFE4B5', // mocassin + 1 => '#FFF8DC', // cornsilk + ), + $pi_tools_for_F, + array(), + array( + 0 => _('Formatting Neophyte'), + 25 => _('Formatting Intern'), + 100 => _('Journeyman Formatter'), + 500 => _('Crafter of Texts'), + 1000 => _('Detailer of Books'), + 2500 => _('Fastidious Formatter'), + 5000 => _('Foremost Formatter'), + 10000 => _('Fine Formatter'), + 20000 => _('Flamboyant Formatter'), + 30000 => _('Fabulous Formatter'), + 40000 => _('Upgrader of Texts'), + 50000 => _('Famous Formatter'), + 60000 => _('Indefatigible Formatter'), + 70000 => _('Finisher of Texts'), + 80000 => _('Formatter of Choice'), + 90000 => _('Capital Formatter'), + 99000 => _('Formatter with Flair'), + 100000 => _('Formatter of Finesse'), + 110000 => _('Formatter with Forte'), + 120000 => _('First-Class Formatter'), + 130000 => _('Formatter of Favour'), + 140000 => _('Formatter of Refinement'), + 150000 => _('Flawless Formatter'), + ) +); + +// ----------------------------------------------------------------------------- + +new Round( + 'F2', + _('Formatting Round 2'), + array( 'F1' => 400, 'days since reg' => 91 ), // 'F1' => 1000, 3 months after rollout + 'REQ-HUMAN', // "peer approval" + _("The page-texts in this round need to be carefully checked to refine the formatting markup."), + $site_url."/wiki/index.php/Formatting_Guidelines", + array( + 0 => '#DDA0DD', // plum + 1 => '#D8BFD8', // thistle + ), + $pi_tools_for_F, + array( 'F1' ), + array( + 0 => _('Refurbisher of Texts'), + 25 => _('Sprucer of Texts'), + 100 => _('Formatter Savant'), + 500 => _('Formatting Wunderkind'), + 1000 => _('Elite Formatter'), + 2500 => _('Polisher of Texts'), + 5000 => _('Formatting Artiste'), + 10000 => _('Cultivator of Texts'), + 20000 => _('Formatter of Enrichment'), + 30000 => _('Designing Formatter'), + 40000 => _('Formatting Artisan'), + 50000 => _('Formatting Afficiando'), + 60000 => _('Guru of Formatters'), + 70000 => _('Formatting Familiar'), + 80000 => _('Formatting Virtuoso'), + 90000 => _('Formatter of Excellence'), + 99000 => _('Exquisite Formatter'), + 100000 => _('Elite Formatter'), + 110000 => _('Formatting Genius'), + 120000 => _('Formatter of Fine Feats'), + 130000 => _('Harmoniser of Texts'), + 140000 => _('Formatting Architect'), + 150000 => _('Preserver of Texts'), + ) +); + +// --------------------------- + +// After creating all rounds: + +define('MAX_NUM_PAGE_EDITING_ROUNDS', 5); +assert( $n_rounds == MAX_NUM_PAGE_EDITING_ROUNDS ); + +declare_mentoring_pair( 'P1', 'P2' ); + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +$someone_maintains_the_PP_faq = + sprintf( _("%s (%s) maintains our Post-Processing FAQ."), + 'Julie Barkley DP-INT', + url_for_pm('simple simon'), + 'simple simon', + "$code_url/faq/post_proof.php" ); + +new Pool( + 'PP', + _('Post-Processing'), + array( 'F1' => 400 ), + 'REQ-AUTO', + _('After going through various rounds of proofreading and formatting, the books need to be massaged into a final e-text.'), + 'post_proof.php', + array( + '#cccccc', + '#ffffff' + ), + + PROJ_POST_FIRST_CHECKED_OUT, + PROJ_POST_FIRST_AVAILABLE, + + _("Manager"), + 'username', + + array( + "

    ", + _("Each book listed below has gone through two rounds of proofreading and two rounds of formatting, and now needs to be massaged into a final e-text."), + _("Once you have checked out and downloaded a book it will remain checked out to you until you check it back in."), + _("When you have finished your work on the book, select Upload for Verification from the drop-down list for that project."), + _("If you have several files to submit for a single project (say a text and HTML version), zip them up together first."), + "

    ", + + "

    ", + "" . _("First Time Here?") . "", + _("Please read the FAQ as it covers all the steps needed to post-process an e-text."), + _("Select an easy work to get started on (usually fiction with a low page count is a good starter book; projects whose manager is BEGIN make excellent first projects for a new post-processor)."), + sprintf( _("Check out the Post-Processing Forum to post all your questions."), $post_processing_forum_url ), + _("If nothing interests you right now, check back later and there will be more!"), + "

    ", + ) +); + +// ----------------------------------------------------------------------------- + +new Stage( + 'SR', + _('Smooth Reading'), + array(), + 'IMMEDIATE', + _('Before a PPer has submitted a final e-text, they can optionally make it available for Smooth Reading. Anyone can volunteer to Smooth Read a text, which is basically just reading through it and marking possible errors before returning it to the Post-Processor.'), + NULL, + array( + '#CCFFCC', + '#CCFF99', + ), + "tools/post_proofers/smooth_reading.php" +); + +// ----------------------------------------------------------------------------- + +new Pool( + 'PPV', + _('Post-Processing Verification'), + array(), + 'NOREQ', // "Peer approval. Also gives F2 access." + _('Once a PPer has submitted a final e-text, it needs to be checked by a PPVer before it is posted to PGC.'), + 'ppv.php', + array( + '#99FFFF', // "harshflourolightblue" + '#EAF7F7', // "paledarkskyblue" + ), + + PROJ_POST_SECOND_CHECKED_OUT, + PROJ_POST_SECOND_AVAILABLE, + + _("Post-Processor"), + 'postproofer', + + array( + "

    ", + _("In this pool, experienced volunteers verify texts that have already been Post-Processed, and mentor new Post-Processors."), + "", + sprintf( _("Before working in this pool, make sure you read the new Post-Processing Verification Guidelines and use the PPV Report Card for each project you PPV."), + "http://www.pgdpcanada.net/wiki/index.php/Post-Processing_Verification_Guidelines", + "$code_url/faq/ppv_report.txt" ), + "", + "

    ", + + "

    ", + sprintf( _("As always, the Post-Processing Forum is available for any of your questions."), + $post_processing_forum_url ), + "

    ", + ) +); + +// ----------------------------------------------------------------------------- + + +// vim: sw=4 ts=4 expandtab diff --git a/c/pinc/stats.php b/c/pinc/stats.php new file mode 100644 index 0000000..9c48352 --- /dev/null +++ b/c/pinc/stats.php @@ -0,0 +1,95 @@ +SqlOneValue(" + SELECT goal FROM phase_goals + WHERE phase = '$phase' + AND goal_date = '$phdate'"); +} + +function PhaseGoalToday($phase) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT goal FROM phase_goals + WHERE phase = '$phase' + AND goal_date = CURRENT_DATE()"); +} +function PhaseGoalYesterday($phase) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT goal FROM phase_goals + WHERE phase = '$phase' + AND goal_date = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)"); +} + +function PhaseGoalMonth($phase) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT SUM(goal) FROM phase_goals + WHERE phase = '$phase' + AND goal_date >= DATE(DATE_FORMAT(NOW() ,'%Y-%m-01')) + AND goal_date < DATE_ADD(DATE(DATE_FORMAT( + NOW(), + '%Y-%m-01')), INTERVAL 1 MONTH)"); +} + +function PhaseCountToday($phase) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM page_events_save + WHERE round_id = '$phase' + AND timestamp >= UNIX_TIMESTAMP(CURRENT_DATE())"); +} + +function PhaseCountYesterday($phase) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT COUNT(1) FROM page_events_save + WHERE round_id = '$phase' + AND timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 1 day)) + AND timestamp < UNIX_TIMESTAMP(CURRENT_DATE())"); +} + +function PhaseCountMonth($phase) { + global $dpdb; + return $dpdb->SqlOneValue(" + SELECT SUM(pagecount) + FROM + ( SELECT SUM(urp.page_count) pagecount + FROM user_round_pages urp + WHERE round_id = '$phase' + AND count_time >= UNIX_TIMESTAMP(DATE(DATE_FORMAT(NOW() ,'%Y-%m-01'))) + UNION ALL + SELECT COUNT(1) pagecount + FROM page_events_save + WHERE round_id = '$phase' + AND TIMESTAMP > UNIX_TIMESTAMP(CURRENT_DATE()) + ) a"); +} + +function ExtendPhaseGoals() { + global $dpdb; + + $ago = $dpdb->SqlOneValue(" + SELECT DATEDIFF(MAX(goal_date), CURRENT_DATE()) FROM phase_goals + "); + dump($ago); + + for($i = $ago; $i <= 31; $i++) { + $dpdb->SqlExecute(" + REPLACE INTO phase_goals + (goal_date, PHASE, goal) + SELECT DATE_ADD(CURRENT_DATE(), INTERVAL $i DAY), PHASE, goal + FROM phase_goals + WHERE goal_date = ( + SELECT MAX(goal_date) FROM phase_goals + )"); + } +} + +// vim: sw=4 ts=4 expandtab + + diff --git a/c/pinc/tabs.inc b/c/pinc/tabs.inc new file mode 100644 index 0000000..dbb380d --- /dev/null +++ b/c/pinc/tabs.inc @@ -0,0 +1,125 @@ + + + + + diff --git a/c/pinc/templates/base_graphics/donate.psd b/c/pinc/templates/base_graphics/donate.psd new file mode 100644 index 0000000000000000000000000000000000000000..f551fb11529281bc22c8c97e6dab8400f8628ef9 GIT binary patch literal 11090 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 z zZE?N%vS@NhQ#8E>+&fMGgFC7U90E^jD#5zT&@wx7Mpm)|gXo+J2GR}E5qKCoozTIoqS=1(3Inqi+Ndc&lv!8p?`JkzHh2XYKfQ=# z!UbY5oB(MDcsm?+C2Zg*LYMh>xl2c{$ zu?DLX20_GkHU&w1X*GOrRfv=M@Lv%f^^Ry#HTh|oJR~Hd=-VGtqU7mxkYgeCvYNNuoP0~ zsRh9QMyg{>oR)OKPZ2OtBJtP(V~El;UKSm%3;rb3BBY4ZI^`D;qC30=gebyGB6Q~b zVbAOD|9hQ!9WXc&|w3vGxq^GVDdhXh6 znJHeHLGss3xm1`hI6nLC%pWrg1@4p2e=ecB0{7_;e-L*C_UOr3bXQ;x|2Tv03d}c` z(Ou!lS#(tR>Muf1%%Qu&FX*mt0p0QQyd#i0^yS$Fo?HF+Yp2j1&)xU@*K_EOXCHd` nH+09dYx3vN9nb73qC0-whvH`h literal 0 HcmV?d00001 diff --git a/c/pinc/templates/base_graphics/logo.psd b/c/pinc/templates/base_graphics/logo.psd new file mode 100644 index 0000000000000000000000000000000000000000..77150c68074f4c52cbbe68c29e0bab004745a6bf GIT binary patch literal 173015 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 ahXBd2w_q6pr$!OE&lR`u$O`h(9sd)&g2EaA literal 0 HcmV?d00001 diff --git a/c/pinc/templates/base_graphics/r_curve.psd b/c/pinc/templates/base_graphics/r_curve.psd new file mode 100644 index 0000000000000000000000000000000000000000..a4ed5af0ec163cef9e338698ed51e28b386151de GIT binary patch literal 7759 zcmeHM+m91f82_g2-U_1#MiCMmQ7K+}-Ai{H)`i_wc9X4aU{#_qX4+1>W2ZB9I%T`~ zpf75S@zDn_4`^ci1AM50fy4*n?V(;!f-x})N+KYH0=s0p_504ubX#dwtMRRKa=vrE z%lXcCe&^EU>)`10KH$LooY<_z%0o9$AHR*ugQJsC*WHX+$7mg4y1PiQ{+=Bpg{&A) zONJ1WQnEVi`Qykjk02+8J&*NA1JUf5G%HUW)TMm~AD)RHOvi^3o{gET1vb?< zE=QNMhODWA7}N5`uqU6F6Oq25fpENkK=cj{3`pK!FcJ2O;c(2G3=f0{LdjmKufNyh z7VLG4*=V%+j0g~$GLxZM1z`sYqS45>7SCrS)tDTAz(g#e#c|r~tY&DrSuJY^(6?Fu zJN(xD?+9Nz^DvJFQWszou1J{A1>^y;0M(|S z^9-q*s;d7*$B-e{01n_7=U^P+W+KwfctQeEaqKj!rQ3p1fEC+K#5%{2n5!k$&JzN3 zfeueW9P-#600}jAHj$ZGq+UjQNLj{)uin5`Sm6^6-_LYm1;O2Fp-UcWQ1D>D!7pTVgta0&cINi>&|8YG>fV$6uC2H6d93CBqVV=^}} z6P=1-W|kaw+u{b}o>@&lxJ!{!Hc~g5i=VK?II=4tCB?jAV7KRhq#I4lAGO7e=4)c9 zF-_6*I&g0?{g3XhDR2lptf_=`kD+DvQ=jpGX27|oq!g?z5s**f!;`RqvvYVz|kJtTCZ*xMghV)S&nXj{l$R+9xw&-k>O*6MjB zmrYtcJCRCUA^+W2*+)K-1)YxGx?|P~N9>haHrUYa@Zh3#1FZpIHKfik3xI!&RM(U^ zFX=*%Az-3J=dlZ>5T$v%EIM8n{7I-sND=3C#;+j6R`?$fVhFE>(9ZjOue@{Su>aUk z)(Sa1Nli<+(!AjLYHAOT=Jw^vzZ}sGJy^Q2bm1>Ol@91AS6!RK@i$K_Rx9A#`s`p&s};w&Z-^p;^xEmtl?r!`$i-5* z=(=+L=dV9rETX&e51)LvR3vxjzx}9EM0ZzD9$hY?yDQ%vE*8<@L5;@BM37?G300000 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/base_graphics/tab.psd b/c/pinc/templates/base_graphics/tab.psd new file mode 100644 index 0000000000000000000000000000000000000000..9e38e0d355097781c3e5fc9402f582769af1b8d8 GIT binary patch literal 28810 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/base_graphics/tab_on.psd b/c/pinc/templates/base_graphics/tab_on.psd new file mode 100644 index 0000000000000000000000000000000000000000..b1c179b03d7d92c49d0f4f4a52c5315a06712597 GIT binary patch literal 29078 zcmeHOcUV+M*PpwcWhqNlY^wrmqb!|OK%@u?f`E#~M3>zQtZZ|OfSM?Xny872z1LV1 zO-w8?MMaG<@wK<8$%`6Wq6T9@McMDn-NIrtiSPF$f0%oD?%eY`=giERGw06Compaf zW#=LSSuPelrXxg5Lp;Q^utFQtyBBdry z{Ojkt#3H34PCO_wGc;3|L>4R4M(fGk(f#t|qf6wm3UNX_zekz0Os!LsMwzHgtXE5LxaL%x`_()GBsJM)t87Q!BJu; zP_HPI<|Lv%iyLgl8A7} zEDjQIK?rWMgAe`&zvvvgu$fyx0A2~lo$=2YQmi#<4aHjB^Fu>t6FYR3ohMCG8jM7rt8SI z>kfXtt|Qy7+oU=`qcp~cS#5ZR{m;0rO!k642Z4j*07;Ydq|8Vr!yO+M8X5s_eNdPr zPZBPTh?Yvix`s-mp`krOp3%gO#;i=OLRnb;S28svsz}@> z1B9K#+FFHNTBy~lWyW}!PN!1Jsh2inlty8lx9kn>5z?gk{6<*DbC^D1A`P)m%`m?H z0~cM%OF5Z#7wxW>^1w?e)6qq{>!m#KQp$96(e8RF54@Bz9bL4$UdjV6rA$W`?XH*d zz)LC9(M7xKr9ALb%KvM0@tZdHNe%4im%`RP-uq|XqRs-`Q5vHkoFXu6PwHGCkdnDl zDU~FQM~KRGn}RNaJiSa~(8=_qMqW-ySl*PREu=0e59yH%X^;Ww;HgI>&~j96E#p^8 z6G}ImDGDJ4VJV{xh4ER21-saB8D&>XJ8nx^bC<$SR0@f;6h4LFWCZJoEhis*`$-9d z%6XsCNkbupg&Xy=4cMGt}0rV~kVf|@u~nGXRYXfd?wc^C6K7C%p7 zHvfNQxNgd22zt@tH+aHjLp%y$KY&jdJuSCY6ZaQFO&<5dkeLpNrL7p+PL>ejqXE#9 zMx=yW1-+_3K`0#Lwo@od*_t@;;8cn#!%_VFOjaYYqQ<0B!2>si0|zr2g(0h8gdC8y z;2gP80*Ep_PpcEDw3;Ho)RjRN8Xa*jqgHLja7czwPEoN{PMO9rz}6dS7^uoHfRJcb z51Wz!+XHSc1=5op%H|g7wI*FN7DuaB!Z8}DF{vSsASD-<4x9481MDI*8MVDh4XKBX zW(6=%Ub&96D)TMMn1dzh>LL+5{_gfOVUsd1B|i_UvN{(#zd0wYC6$H}nxPk($ z5d!LWd}rw5;%C*Vx3d$j2npaO66z@0@}9a;>@*OiWhgaT286#_W7OyL?j_0}JVeAj z4B_ttZz2S`Om5I+=BDC4Lg^_i`l zeL%lG%7g=-nE~{qQA)BD=#xPEt4wMo(0Cm6Qj;=x8Clq8{zg(>40I^a0)1Xi63{&$ zssu$2bb$kHga`y(l%&;_Q+*=pB=0POgX0)c8d<6$jmDsCIPaF}6`~}qS|`)M%w%aZ z&V@X%Z$;qbC`oKoR8Uwj9%pRV9|~c=~a;rjU+YyKM_~3YPI7nBL@?h*x`}L;^cFh+P4)q1&`s}_F zC0kx$5q7E^j=oKL5v&~Kq$udwApV~-I+*2PN4FfZki;t#QZx{vOsOe??$#)j)PcWJ z^P(R9AG0~wfJsYS1L3*45qS*@M(#(v5cAd{#PW1T%%Mv`LfHE)!)YMGZ{DDG*DP@l zG{~v6S;D~67sH^WrUjIglP8j!^rI{)Ec{@@9PNg@P)pPnbwr(Dehx#?s5|P3Qcxe1 z1uL_`=nYtl6(cpQ%SzE$RDmX;sb~h8gBGG?Xf;}oHlZzOJNg3cL0_Zq&{1>>okz9k z3i<`rp$DjeAP6quLUqjJ}LK#_NnC#z@9!Mit{d z#(c&~#s`dTj6IC+7^fJuj9(b{nTYAk^kKGV1~FrpNz5$f5N07$&wPtHg*lhGlDUbw zlX-x7f?3PF$$Z4(usm5JRuHQ@D~&aPC1;Ify~UcwTF6?*+Q!<)I>EZgs$(^>UD&PJ zUD;B0Iy;|T#4cq|V$Wr-VQ*#cXP;tUVL#w-I6fRPCz_MS8O#~M8N->zS;E=O+08k| zxy-rG<#JncyK>{WSzH;{$eqMp!2N)`i+h}Vh5L}_%xlLBXzqy12Lmy7Y7z;$n1p z&t<*KUY8$T9=dwE2D_%aDqP38E^^)GdffH4o0D6BTcX<=Zlm4ix_#ny#Ou3uXu61#9rxMBfO@1edu-AtIpfQJHmUQcbWGh?=QV;eV9IhKIuLxpXokZ zd`|m3_HE;v=u7&(QvdR6N~t?##K+opFLU7H1M_O`j% z)~9XHwj%Y0HuzN#~&EUD+fCDLWw$dyf}q5pQ9&DnE(ZGqX9QOUZx6m5;vX_3WM;^LkjBu+P*v#a z(DM=xNgqk2WT)h}ur6Wputi}f!(GBt!^eg12)`52HG+&-8gVw#Gcq%Ba%4^9)2Qeu zeblC?8`1vJ!=o2RpNa8`$&Q&8^Gz%}wpZ-9*e_xqNu#7j=@#j)-GjQ9bl=eZdJl0A zvd8Kkm*YCb$>LVT)y9kBhsQ6EuT5y5AWK-8aH(g-NA+;!VV`^RR$lham?@nW<^-Y_Zb|$?| zx;%Y-dR?FBK5zEf*H_Rtx9`HfmomC!=reX^GBW#Q&dR*dFQA{M-}Wq&m7X;#>xXP{ z_Q>qd`*Zqd_g~ciYK|mlY|epP&)i|T8*(4y^~#%`cYZ*p0j2>p1KkD=9k_mA{h;JQ z)q`sDL-OCu|8B6~VCCQ)L%2f*4p}qg{%a|(&3Wz0(8!^ahMs<1{Ce5z2jB2}L-od& z!`z0+hJ7-eJ$%sc4a1+vvSce|_Y2Ys78lgXljQT{zbJYtW-D%xabz`ltuU^zy6}2Y zT+yte8^sC5bBk{(lavdUcSfX*ST>@*B&%d?iCHyBwOP$m4_AMt@z9iL_G#N{%e2RI zU3HUmwIih?=Zvh=_tmd45Qf(cJB(him^x(YWSVHYI4XYBqEQb^2bO+PCM?sG9V+iq z{!aO|(W#@~AHy0WA5$~7{n(1J7vD^LbH!W4TLo{`jO#eAYTT9ay~nSs;8&DX{HHRs zvbyr#gh3N_R<)@bUv+t6?}-~HxlYngIy1TZ>KJD9gCGXCE*Zf}Ldxxh-O#Bv-qpL5^%AB=rwrKX0+4trQ zn{#k(#N1```14HjYUgLn-?6}d!Hfk@78Wl&wW!yk&5K(verIw062+3^OM5Qew5-jt zsmmTOS1v!hqW6kzD+5=~UBy{7YSq=%16Ln-Kj!`QYy8$sUGsFUW^L`doOS!wN3UPM zq4kF88yOo-8*h9t^n;@xCV#kNQ_!Xrn|(G<{Rn+z`snA6hktx}OW!RupTvB!>C=Eu z7jO04I%ONNt$bVE_TufeI|lDK_F13LYIb(tx%Knl&)0s@{)A}ywjrn%_ zcTwMMI}~|n>whBuv-NP);cZ8vkL)-advxcq9>=~qo^X86iR2SspG-gb-Kl=3j-4KG z`s|sZXKK$X&R+js_5Gc5qs}#)AAf;;VagBgKg|8H^^Yt6+xfqnYoltvyqJ9P(52i< z=P%1I|MHXJrzcmcuDV>Ed#&BI_1D9$e{m!A#?hZ&`}xW*x?dV@PP!$$wfJ_Y+n@g0 z^VdUl`E^(B=~3?$zASzW?I`^@E1`DGysdT=yvE(SgT<9$#xHeZqY* z|7qu^I~)5pUNEc8X6jqRi&_of#Q>AScm<7E7a+mwiRExhfvkn4{chmzMlBFwK5MQ; z?tN0zQxU-+P#XLp^DQKxen~VeDHAkqBUcI`#drkS&F4`S67YCDC!WB`Ng#CQI}5$t z1Ohkj7M`Boo}Mj)0_w6pEa2IcaB+5aadmNbb#?c0b#?W^iK~|-i}0@$VBU>{JZR2x zCeZ;ggalJan16sB0ls-3kpNb*VW|Qa7>q9_G>*mQaCuIAXX05Q?0_+CLU%;42quHY zU~@S@V}|FtQ?y<27@|$GtlGd*|#a2#?TL9!uf|ROi-RydyV6 z`mEeCAuxGXo+71Yl`+cq_<&2~Z=Y1{Jz=_hH&r})^~6u->^u3>z4y27KXv8)z`{|J z=C0ZH_35h*qI(Z2DxExU?e+s_uGI?>g8|mED4Vz(b|hs&dx-}NEEw6rlO0wu(+gX$ zC+ApQxPQS#ePwl0uD9F}aVLO-4d4bw)*J^TR{1JY21FUjOLh}pY=OAR1oJs0U{ZAo zQ3AT>I`8;n`QyS?OC~28)~%}^QPjQFlQ|_1vig|Oj(jtEa3bNi&cgR zKBW$bOi=>Um3_lcm)@H@?4)#z-?u}e3kxDRlAFc#!_tn;xth1u0|YH!Kl1_Ng(Wn)~BUM!uHbC*8j~r#jt# z_Uh{NfX@Ea&tVLZZhtaokr_?AWk&1t+kRievA?~B<9~Y%-&5mUd+H_6g_L^Z-B2QI zPij#CY*UKh`E*x14CQZ8^hMJ~3@M(?;X}7N9N;0UuRB5wOqX&<>()Q#*)2 z$9BLBfoB)o>R^VwY)fH~HnSZe(M`C|+IRY~8q^Hit}M*sfnQ*k?P%z4XvxssC2R#zu9W_d>G3Y_Y zQpw8o6fRdPFov5tCy=WOR2bvV!E&Xhu*@o_aEYcw>xfkbU12jUSK;z`a8nm9qp(bm z!_VEyYI+dxq6KW zqtFCIEWD0{Hen?~3yJH(daJYoF&17I!tNraTLDoI@R1#wDe+@FZlrL79Y3Y;6FYuF z;iq=oK;cF^evDX9K6J0Ox<`mfVJmz{soRA0l;u_t*uT&wz-^)F3fOp}{ZIh`Px}GC z_Ou`9G2s=A0RndK1u)mUT2oBf{{Gc-zh&iv-}?%fP#?fLuo6}SRpv%?-%3xQmY6n4 zC0;3_daJAg^d8!21n7|+nE^evqeegtcJvg`6FYhW=&2nw0BW?O$AGW_*s2QiBS28S z6+OhrO4n0XTC}jOHa<<$KA~fPjsZFb{sl2W&+>n`mZ4{PdR0(irbohm!ANLb71Mo9 z_w_3m1N1CU&+_yvMvw4x4A3z^$G|Ha1D4+fWXp`yf1JSY80a(nKbrSx@6g`)BMv4A3z^$H1!@1N00>NA{~3+4T21{fibl c2Iv@||A&wM|1J9ex9Aw4V}Oo '#ffffff', + 'background-position' => 'top', + 'padding-left' => '9px', + ); +* '9px' is the width of tabs_left.png created below and shouldn't need to be changed +* Obviously, '$royal_blues' should be something else +* '#ffffff' should likely be something else + +Create background image +* Create a new image, 10 pixels wide and 90 pixels high (approximately) +* Play around with the gradient tool, creating a vertical gradient +* Save as tabs_bg.png + +Note: In all of the four files referenced below, you may want to tweak the color of the border. + +Create parts of active tabs +For each of tabs_left_on.png and tabs_right_on.png, do this: +* Open the file from the gutenberg theme +* Select the greenish color using the sampler and "Select->Color Range..." +* Fill the selected area with the new color +* Save using the same filename but in the new directory using "Help->Export transparent image" + +Create parts of inactive tabs +For each of tabs_left.png and tabs_right.png, do this: +* Open the file from the gutenberg theme +* Select the greenish color using the sampler and "Select->Color Range..." +* Fill the selected area with approximately 70% of the new color +* Save using the same filename but in the new directory using "Help->Export transparent image" \ No newline at end of file diff --git a/c/pinc/templates/base_graphics/theme.tpl b/c/pinc/templates/base_graphics/theme.tpl new file mode 100644 index 0000000..273cf00 --- /dev/null +++ b/c/pinc/templates/base_graphics/theme.tpl @@ -0,0 +1,59 @@ + '#ffffff', + 'background-position' => 'bottom', + 'padding-left' => '5px', + // + // If you provide a key 'use_default_graphics' with a TRUE value, + // a default tab-layout will be used. You can still specify + // a background-color using a 'background'-key. If you don't, + // the $theme['color_navbar_bg']-value will be used. + // 'use_default_graphics' => true, +); +?> \ No newline at end of file diff --git a/c/pinc/templates/classic_grey/graphics/donate.gif b/c/pinc/templates/classic_grey/graphics/donate.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ca03eaea76ab0e03602a2e28f2b6f5712cb7ac0 GIT binary patch literal 857 zcmV-f1E%~(Nk%w1VLkvK0K@kg(bd|Bpt!We)5z1_*Wu{^Az1eK z`b1@m=j`yLx5}Nc#N+YzaEz(p=j~Q@n0%J8=k@yT@$_heq9jOjySuyT>FEYEW+FCC zl&8G_008Ru{Qv*|A^8LV00000EC2ui06qX8000I5AlGnYX`X1Rt}IztL*dPIZQppV z?>10;z@TtQEE?8H4gy|9}Eiv2p<&}0Tx*jW2^&(0T2)u5bo?0#JlO4cs?F&g~f!=btw7k(%ZAmCAe1ojSe`ygSb0tLj@2nBLL zfPn%R5=fvJp+Ou6U_k~jP*YuykVP?;IX3abgtfaC1o){fz=a9Q*xZ4Z>}Y^EO}i~h z>5I>d2A6?eIDo)I13VuNIEXWgp~4Sy3Ir%>&Hw@mb5cg&z?s?4OEqi;fv|vqtEs6q ztX6QqXM@oii0!g42LS`P4y$E~V1NNe0LB*(wCdTzf;JOsK+tf34VeWJ08pF|0Ks}P zoM@18+@^nn;C=x?09RZo6$AkeI3PgQTL(;_fjj1uL!bbh1%W_)c1(c=ys&`@QSGhB(~mR5F|C5izaq2vcp9!chzNA{s* za{1+*bAl8GHED(a}Dmf9%?8??8Z`EED(kGSh5!IN?7LZ= literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/graphics/l_curve.gif b/c/pinc/templates/classic_grey/graphics/l_curve.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ed80a4b781e64a439750f2a8f5665dd434a07c0 GIT binary patch literal 183 zcmV;o07(BwNk%w1VGRHb0K@ER?Ck98>+9<3>gDC-(@(b3S*(9h4$ z&d$!w&CSfr%>V!YA^8LW0018VEC2ui01W^P000FvpeK%GX=0S46lHfkh9C>1HYLL> lj~PVhGZ9Bp00uo3gfX~bEQ6NAa~JtdJ&oyZp%sJx06S?`YpVbN literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/graphics/logo.gif b/c/pinc/templates/classic_grey/graphics/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e39e0f6719b10af4477124cb0b4613f460f02bee GIT binary patch literal 2954 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/graphics/oldlogo.gif b/c/pinc/templates/classic_grey/graphics/oldlogo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d162b4daa50dadbf6ccf08efc7f00710a0ea5e5b GIT binary patch literal 18948 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 YbTc^JX-sRn8RBT~g(qF=M+XD|I|Pj%1ONa4 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/graphics/r_curve.gif b/c/pinc/templates/classic_grey/graphics/r_curve.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3f9d71df724810de4e4ed93629f1427620d507f GIT binary patch literal 878 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 IM6N<$f)OScw*UYD literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/graphics/tabs_right.png b/c/pinc/templates/classic_grey/graphics/tabs_right.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c04f8fda4addb3463b99e968b8768d6d946d74 GIT binary patch literal 4361 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/graphics/tabs_right_on.png b/c/pinc/templates/classic_grey/graphics/tabs_right_on.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1dd236f62315c960405e854e114be9a78cfea4 GIT binary patch literal 4365 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 PK$pI@iB`4doyY$N@cQMs literal 0 HcmV?d00001 diff --git a/c/pinc/templates/classic_grey/main.css b/c/pinc/templates/classic_grey/main.css new file mode 100644 index 0000000..74eb086 --- /dev/null +++ b/c/pinc/templates/classic_grey/main.css @@ -0,0 +1,4 @@ + +tt { + color: #c00; +} diff --git a/c/pinc/templates/classic_grey/theme.tpl b/c/pinc/templates/classic_grey/theme.tpl new file mode 100644 index 0000000..f59bc25 --- /dev/null +++ b/c/pinc/templates/classic_grey/theme.tpl @@ -0,0 +1,48 @@ + '#cccccc', + 'background-position' => 'top', + 'padding-left' => '9px', +); +?> \ No newline at end of file diff --git a/c/pinc/templates/comment_files/BG1a.txt b/c/pinc/templates/comment_files/BG1a.txt new file mode 100644 index 0000000..1dd3817 --- /dev/null +++ b/c/pinc/templates/comment_files/BG1a.txt @@ -0,0 +1,6 @@ +

    Welcome New Volunteers!!

    +

    This is a BEGINNERS ONLY/FEEDBACK project. We have set this book aside for our newest proofreaders. You are doing the first of two proofing passes over these pages, making sure the words and punctuation in the text box match those in the scanned picture (or image) of the printed page. When the book has completed the first round of proofing, more experienced proofers will do a second round. They will send you some friendly suggestions if you are making any obvious beginner mistakes. Please only do a few pages (5-15) of this book, then move on to something else. It may be a week before feedback is sent to your DP inbox; so do work on another project that interests you while you're waiting!

    + +

    Please note that the proofers who review your work only see one page at a time; they do not have an overview of all the pages you proof in this book. You might get similar comments from several proofers. Please excuse any repetition!

    + +

    Following these two proofing rounds, these pages will move on to two rounds of formatting, where other volunteers will fine-tune the look of the page. They'll make sure that font variations (such as italics, bold, and small caps), spacing, indentation, footnotes, and the like are correctly marked. In the final stages, a post-processor will transform the proofed and formatted text into a readable e-book. If you wish to be notified when this text is posted to PG, click on the link above to request this.

    \ No newline at end of file diff --git a/c/pinc/templates/comment_files/BG1b.txt b/c/pinc/templates/comment_files/BG1b.txt new file mode 100644 index 0000000..7b78ecc --- /dev/null +++ b/c/pinc/templates/comment_files/BG1b.txt @@ -0,0 +1,124 @@ +

    BASIC INSTRUCTIONS:

    +

    Here are a few basic instructions. Please consult the +Proofreading +Guidelines to go beyond these basics.

    + +

    Make the text look like the page image except as +per below! That means leaving in the breaks at the +ends of the lines, leaving spelling "mistakes", etc. Mostly +your job is to fix mistakes left by the Optical Character +Recognition (OCR) software. Compare the text carefully +to the scanned image of the page, line by line (or word +by word, or letter by letter). Please pay extra-close attention +to punctuation, numbers, and words in ALL CAPS. Run a +spell-check on your page, and verify that any queried +words do, in fact, match the words in the scan. Please do +NOT correct the word in the text if it is a true match to +the word in the scan. Refer to the Proofreading +Guidelines for more information on handling printers' +errors and misspellings.

    + +

    ---1. If a line ends in a hyphenated word, move the first +part of the following line up to rejoin the word, then insert +a line break at the end of the rejoined word. Remove the +hyphen unless it is a compound word normally hyphenated.

    + +

    Scan Example: +
    "I say, Graham, do you know what's hap-
    +pened today? There'll be an awful row about it."

    +

    Corrected Example: +
    "I say, Graham, do you know what's happened
    +today? There'll be an awful row about it."

    + +

    ---2. Leave in (or add) the blank line between paragraphs. +Do not add paragraph indentation, but if the indentation is +present in the text box, it is not necessary to remove it.

    +

    Scan Example: +
    THE ship moved slowly out of the harbour as Tom Woodward slumped +
    in his seat and breathed a sigh of relief. +
        He turned to the package he had dropped next to him on the deck +
    and examined its label.

    +

    Corrected Example: +
    THE ship moved slowly out of the harbour as Tom Woodward slumped +
    in his seat and breathed a sigh of relief.

    +

        He turned to the package he had dropped next to him on the deck +
    and examined its label.

    + +

    ---3. Remove extra space around punctuation. Make it look like common usage today.

    +

    Scan Example: +
    The girl looked at him with tears in her eyes ; she began to cry. +

    Corrected Example: +
    The girl looked at him with tears in her eyes; she began to cry.

    + +

    ---4. Remove spaces in words with contractions like "don't" and "isn't"

    +

    Scan Example: +"Do n't!" he cried. "You 'll ruin the whole thing!" +

    Corrected Example: + +"Don't!" he cried. "You'll ruin the whole thing!"

    + +

    ---5. Fix long dashes (em-dashes) by inserting additional +hyphen character(s) if needed. Proofread these as two hyphens +if the em-dash is short and four hyphens if the em-dash is long. If a +line ends with a dash, move the first word of the following line up to +"clothe the naked dash", then insert a line break following the word +you just moved. See the Proofreading +Guidelines for more details.

    +

    Scan Example: +
    He walked over to the window-a strange look on his face- +
    and tapped on the glass. "Susan!---- Over here!" +

    Corrected Example: +
    He walked over to the window--a strange look on his face--and +
    tapped on the glass. "Susan!----Over here!"

    + +

    ---6. If you have a page with a poem on it, read the Proofreading +Guidelines, to see how to handle it. Set it off from surrounding +text by inserting one blank line before and one blank line after the poem; +it is not necessary to preserve indentation or attempt to center lines.

    + +

    ---7. Italics?, Small Caps? or Bold? If the text you are proofing +includes italics mark-up (<i> and +</i>), small caps mark-up (<sc> and + +</sc>) or bold mark-up (<b> +and </b>) please leave the mark-up for the formatters to review +and correct. Proofers are NOT expected to add or correct this mark-up.

    + +

    ---8. Page Headers and Footers: Running headers/footers may include book +title, author, chapter title, and/or page number. They will be at the very top or +bottom of the page. Remove these, including the page numbers. See the Proofreading +Guidelines for an example. + +

    ---9. Illustrations? Read the Proofreading +Guidelines! Proof the text of the captions, leaving the caption where it falls +on the page. If the caption text was omitted from the OCR'ed text, please type it in. + +

    --10. Footnotes? Read the Proofreading +Guidelines! Leave the note where it falls on the page, and surround the footnote +marker in the text with square brackets, i.e., [1] or [*]. + + +

    --Most of all--Have fun!

    + +

    SHARING INFORMATION, ASKING QUESTIONS, REPORTING PROBLEMS:

    +

    This site has an internal message system. Your personal page shows how many +private messages are waiting in your inbox (in the dark green navbar). Please go +to the forums and login to read your private messages from round 2 proofers. If you +have questions that need a more immediate answer, please click on the "discuss this +project" link above. That will take you to a forum thread that is specific to this project +where you can see what other new people have asked and can get reasonably quick +responses from experienced proofers. There are also several other forums that you +may use to ask questions or make comments that are not project-specific, and still +others designed for amusement.

    + +

    This book scanned and OCR'd pretty cleanly, but if you notice recurring OCR errors, +please post a message in the discussion forum (as described above). That way, we will be +alert for them in post-processing.

    + +

    THANK YOU FOR VOLUNTEERING AT DP, AND FOR YOUR WORK ON THIS BOOK!

    diff --git a/c/pinc/templates/comment_files/BGr2.txt b/c/pinc/templates/comment_files/BGr2.txt new file mode 100644 index 0000000..1dda247 --- /dev/null +++ b/c/pinc/templates/comment_files/BGr2.txt @@ -0,0 +1,5 @@ +

    Thanks to all the new volunteers who have worked on this book. This book has changed from a BEGINNERS ONLY project to a MENTORS project.

    + +

    SECOND ROUND PROOFERS: Please be aware that I promised our new volunteers that "experienced proofers will do a second round. They will send you some friendly suggestions if you are making any obvious beginner mistakes." Remember that formatting issues, with only a very few exceptions, are now being handled in subsequent rounds. Please help by sending feedback and words of encouragement!

    + +

    NOTE:You can find a list of which beginner has done which page, and the number of pages proofed by each, at the For Mentors page.

    \ No newline at end of file diff --git a/c/pinc/templates/comment_files/ammu.txt b/c/pinc/templates/comment_files/ammu.txt new file mode 100644 index 0000000..92cb923 --- /dev/null +++ b/c/pinc/templates/comment_files/ammu.txt @@ -0,0 +1,28 @@ +

    Regarding receipts:

    + +

    The receipts are simple to do. Put one blank line between each receipt, +don't bother to indent (the blank line is sufficient) and mark each donation +amount with a ... before it.

    + +

    Example:

    + +
    RECEIPTS FOR MAY, 1889.
    +
    +MAINE, $352.06.
    +
    +Acton. Cong. Ch. and Soc. ...$3.50
    +
    +Albany. Anna K. Cummings,
    +  for Mountain Work ...2.00
    +
    +Bangor. First Cong. Ch. and Soc. ...38.00
    +
    +Bath. Winter St. Ch. ...140.30
    +
    +Bucksport. Y.P.S.C.E., by Charlotte
    +  S. Barnard, for Pleasant Hill, Tenn. ...20.00
    +
    +Castine. Prof. Fred. W. Foster ...1.44
    + +

    Also, see the UberProjects thread in the forum for questions +and answers.

    diff --git a/c/pinc/templates/comment_files/bae1.txt b/c/pinc/templates/comment_files/bae1.txt new file mode 100644 index 0000000..5417ae6 --- /dev/null +++ b/c/pinc/templates/comment_files/bae1.txt @@ -0,0 +1,7 @@ +

    BAE projects have two special rules that always apply, whether or not the general Guidelines currently say the same thing:
    +* Preserve the page numbers in index, tables of contents, etc.
    +* Preserve information about all diacritical marks, sub-/superscripts and other special characters. Where possible, use the forms shown in the Proofing or Formatting Guidelines.

    + +

    For more information about BAE projects, see the Uber-Project thread.

    + +

    For everything else, refer to the Proofreading Guidelines and Formatting Guidelines.

    \ No newline at end of file diff --git a/c/pinc/templates/comment_files/bell.txt b/c/pinc/templates/comment_files/bell.txt new file mode 100644 index 0000000..a83e010 --- /dev/null +++ b/c/pinc/templates/comment_files/bell.txt @@ -0,0 +1,7 @@ +

    +To the post-processor: +An HTML edition of this is required. Information about the HTML style you +should follow will be given on the overall discussion +thread for this project. Please note that you should be comfortable with +manipulating images. diff --git a/c/pinc/templates/comment_files/bem1.txt b/c/pinc/templates/comment_files/bem1.txt new file mode 100644 index 0000000..2bec8df --- /dev/null +++ b/c/pinc/templates/comment_files/bem1.txt @@ -0,0 +1,42 @@ +

    Blackwood's Edinburgh Magazine

    + +

    Published monthly from April 1817 to December 1980, in Edinburgh +and London, and later in New York, BEM was a mixture of political and +social commentary, and fiction. Many writers had their first work +published in Blackwood's.

    + +

    The images used for this project have been harvested from the +Internet Library of Early Journals (ILEJ). The collection +covers the period January 1843 to December 1863.

    + + +

    Proofing

    + +

    Misspelling in the image should not be changed. Add a [**spelling] +tag to draw PP attention.

    + +

    Please retain all æ ligatures. The œ should be coded as +[OE] or [oe].

    + +

    Refer to the Proofreading +Guidelines for anything else.

    + + +

    Formatting

    + +

    The individual articles of the magazine are to be treated as +chapters, so 4 blank lines before title, and two after. Other +divisions are to be formatted with two lines before titles, and one +after.

    + +

    Refer to the Formatting +Guidelines for anything else.

    + +

    General

    + +

    Please leave notes to the PP that were left by the previous +proofers/formatters.

    + diff --git a/c/pinc/templates/comment_files/diac.txt b/c/pinc/templates/comment_files/diac.txt new file mode 100644 index 0000000..c458eaa --- /dev/null +++ b/c/pinc/templates/comment_files/diac.txt @@ -0,0 +1,18 @@ + +
    +diacritical mark           above  below
    +--------------------------   ------  ------
    +macron (straight line)       [=x]   [x=]
    +2 dots (diaresis or umlaut)  [:x]   [x:]
    +1 dot                        [.x]   [x.]
    +grave accent                 [\x]   [x\]
    +acute (�gu) accent           [/x]   [x/]
    +circumflex                   [^x]   [x^]
    +caron (v-shaped symbol)      [vx]   [xv]
    +breve (u-shaped symbol)      [)x]   [x)]
    +tilde                        [~x]   [x~]
    +cedilla                      [,x]   [x,] 
    +
    + +

    If the diacritical mark is in Latin-1 (i.e. available from the +pulldown list), enter it as one character. diff --git a/c/pinc/templates/comment_files/eets.txt b/c/pinc/templates/comment_files/eets.txt new file mode 100644 index 0000000..8b03a83 --- /dev/null +++ b/c/pinc/templates/comment_files/eets.txt @@ -0,0 +1,26 @@ +

    Additional Proofing Guidelines for this project

    + +

    There are several special characters in these works. So far:
    +
    +The eth (/) and thorn (/) are found in the drop-down boxes.
    +[gh] for the yogh and [Gh] for the capital yogh (it looks like a three),
    +[l~l] for ll with a tilde through them,
    +[h-] for the h with a line through the top,
    +[m~] for a m with a loop back over the character,
    +[n)] for a n with a ) attached to the right side,
    +[rh] for an r with a upwards hook attached to the horizontal stem,
    +[-] for the thorn with a slash through the neck,
    +[et] for the Tironian sign et, which looks like a 7 with the baseline through the middle, possibly with a hook at the bottom (it was replaced with the ampersand in modern writing),
    +[;] for an upside down semicolon,
    +[d+] for the d with a little crook attached to the top right of the d,
    +[s] for the long s (like an f without a crossbar, or with an incomplete crossbar. (This is a change to the standard guidelines.)

    + +

    Use the standard extended characters where necessary.

    + +

    There are many italicized letters in words, to note abbreviations that were expanded. Be sure to mark them. Put sidenotes before the first line they appear on.

    + +

    Mark the headers, except for the page numbers, as sidenotes, as they frequently hold information not on the page.

    + +

    The Uberproject

    + +

    The Early English Text Society is an organization dedicated to printing early English manuscripts, usually but not always Old or Middle English. It was the first organization to print many important manuscripts, including the Pearl, and there are over a hundred volumes printed by them now in the public domain in the United States. We have an Uberproject thread.

    diff --git a/c/pinc/templates/comment_files/grw0.txt b/c/pinc/templates/comment_files/grw0.txt new file mode 100644 index 0000000..2574bee --- /dev/null +++ b/c/pinc/templates/comment_files/grw0.txt @@ -0,0 +1,10 @@ +Please mark Small Caps as < sc > < /sc > (spaces added for display purposes).
    +Please use the block quote markers /# and #/ around the body of letters (in the Letters to the Editor section) and /* */ around the signatures, preserving relative spacing as much as possible. +

    +There are some pages of advertisements at the beginning and end of most issues. Many of these ads repeat from one issue to the next. Please check the uber-project thread to see if the ad on your page has been posted there. If it has, you can just copy the text from the thread, but be sure to check against the image for any subtle changes. If it hasn't been posted, please proof it carefully and then post it. +

    +These issues are from 1897. This is "A Weekly Magazine for Boys and Girls". The LoC search shows that it was published from 1896-1903. I have all of 1897, except for January, plus a few issues from 1898. +

    +The post-processor must make an illustrated html version. High-quality, cropped versions of the illustrations will be found in the images zip file. There are only 2-3 illustrations per issue, along with a couple of variations of the masthead. +

    +Have fun! diff --git a/c/pinc/templates/comment_files/jon1.txt b/c/pinc/templates/comment_files/jon1.txt new file mode 100644 index 0000000..3bbe7ca --- /dev/null +++ b/c/pinc/templates/comment_files/jon1.txt @@ -0,0 +1,20 @@ +

    +To the post-processor: +An HTML edition of this is required. We don't yet have any set standards for +HTML, although these are being developed. In the mean time, make sure that +whatever you produce satisfied the following: +

      +
    • Please make sure that the HTML validates to at least XHTML 1.0 +transitional. +
    • Anchors should be made named 'pageXXX', enabling the reader to jump +straight to a particular page. +
    • If the project has an index, then this index should be formatted as a +nested list, and the page numbers listed should be linked to the page anchors +you've already created. +
    • Edition and printing information should be retained. +
    • Please check the list of images (follow the 'View Images Online' link on +the post-processing page). Any illustrations will have been scanned in +seperately in grayscale or colour, and will generally have been named +imageXX.png. These images should be incorporated into the final HTML +edition. +
    diff --git a/c/pinc/templates/comment_files/nar2.txt b/c/pinc/templates/comment_files/nar2.txt new file mode 100644 index 0000000..259f671 --- /dev/null +++ b/c/pinc/templates/comment_files/nar2.txt @@ -0,0 +1,127 @@ +

    This is a second-time for this text to be proofed. Many small errors +remained after the normal 2 rounds of proofing, so we are trying to +eliminate them prior to post processing.

    +

    Two common reasons for these remaining errors are:

    +
      +
    • The images are copies (of copies of...) typewritten material. They +are difficult to see unless you proof with at least 100% zoom.
    • +
    • The vernacular means you cannot assume anything about a word's +spelling. Reading is not sufficient, you have to compare to the image. Many +people are finding it best to start at the bottom and work backwards so +they do not get trapped by reading such interesting content.
    • +
    + +
    +
    +
    Interview Headers:

    +
    At start of an interview leave four blank lines,
    + /*
    + one item per line
    + one item per line
    + */
    + two blank lines,
    + then start the interview.
    +
    +
    Handwritten Comments:

    +
    If spelling or punctuation was corrected in + handwriting, simply make the correction. If, however, a word or phrase + was added insert it like [HW: this ] or if a question mark was + inserted mark it[HW:?]. +
    +
    Transcriber's Comments:

    +
    + If, for example, a sentence was begun but not + completed you would [TR: sentence unfinished]. Or if a word was + illegible you would mark it [TR: illegible] or if you're not sure of + it 1883[TR:?]. That's a Transcriber's Comment done by you, as opposed + to a Handwritten Comment done by an editor. +

    +Please be careful about removing any Transcriber's Comments in +second round. They are not difficult to remove in PP and, in general, are +helpful. If you're doing second round and want to add a comment, that's great. +
    +
    Typos, Misspellings in the original +document:

    +
    + You will encounter many of these. The post-processor + will have to make decisions on what to correct and what to leave as is + based on many factors. If definitely not part of dialect, mark + such words with * to be sure they're noticed. +
    +
    Difficult to spot errors from the +OCR:

    +
    +
      +
    • "Stealth Scannos": For example, "He" and "We" are both valid words +often mistaken for each + other when the OCR interpreted the typewriter print. "Dey" or +"dey" (dialect for "they") is often + presented as "day" from the OCR software. Look very carefully at +the scans while you are + proofing. Only people can find these! +
    • +
    • Dialect: You will find examples of both "wuz" and "waz", and +"chillun" and "chillen"; only + a careful check against the scan can tell you which is used in any +one instance. +
    • +
    • Check carefully for "1"/"l"/"I"/"!" (digit-one / +lower-case-ell / upper-case-eye / exclamation-mark) + and "0"/"O"/"o" (digit-zero / upper-case-oh / lower-case-oh). + They look alike in some fonts, but don't be fooled. "0h!" is *not* +a word ... fix it to be "Oh!" + "We'!1" shoud be "We'll". +
    • +
    • The OCR commonly mistook the letter B (upper-case B) for a + "B (double-quote, upper-case B). Please keep an eye out for this. +
    • +
    • Some combinations of letters are more likely to have been +missed in the first proofing + rounds. Combinations that tend to misscan:
      + Kl→KL, li→ll, ch→oh, rn↔m
    • +
    • Some individual scannos that were often missed in the first +proofing rounds are:
      + e↔a, e↔s, s→a, c↔o, h→n, +M↔N, H↔M, W→v, W→w, I→i
    • +
    • Perhaps because of so many dialect words, another commonly +missed problem was a missing "i", e.g. "takng" +
    • +
    +
    +
    Punctuation:

    +
    +
      +
    • Comma/period errors, especially commas at ends of sentences.
    • +
    • Extra comma next to period.
    • +
    • Periods sometimes scan as "^".
    • +
    • Extraneous quote marks may appear before letters with leading +lines, like "W" or "N".
    • +
    • Watch quotes in general, also check single/double quote +match-ups.
    • +
    • Apostrophes ("'") sometimes scan as "l" or "f", e.g. "Ilse" +should be "I'se".
    • +
    • Exclamation marks ("!") often scan as lower-case-ell ("l") or +digit-one ("1").
    • +
    +
    +
    Underlines:

    +
    + A few instances of acutual underlining appear in the text. Mark words +underlined for emphasis + "<u>word</u>". +Sometimes it looks like someone just randomly underlined words on a page ... + reading with a pencil trailing. Don't keep these underlines. +
    +
    Initials:

    +
    + If two upper-case initials separated put them together, e.g. "A.H. Jones" +
    +
    New Paragraph at start of page:

    +
    + If you don't mind, you can do something that will be helpful in post +processing. + If the first line on the page is definitely a new paragraph, add a blank +line before it. +
    +
    \ No newline at end of file diff --git a/c/pinc/templates/comment_files/pgnm.txt b/c/pinc/templates/comment_files/pgnm.txt new file mode 100644 index 0000000..db19078 --- /dev/null +++ b/c/pinc/templates/comment_files/pgnm.txt @@ -0,0 +1,3 @@ + +

    PLEASE PRESERVE THE PAGE NUMBERS IN THE INDEX

    +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/c/pinc/templates/comment_files/port.txt b/c/pinc/templates/comment_files/port.txt new file mode 100644 index 0000000..f46646b --- /dev/null +++ b/c/pinc/templates/comment_files/port.txt @@ -0,0 +1,14 @@ +

    Please keep the original spelling. The OCR software has incorrectly "updated" some of the words.

    + +

    Use the new guidelines for footnotes. Mark them as [1], [2], ... in the text. In the place of the page where you find the footnote text write [Footnote 1: text of footnote]

    + +
    + +

    Por favor conserve a ortografia original. O software de reconhecimento de caracters "actualizou" incorrectamente algumas palavras.

    + +

    Use as novas regras para revis�o de notas de rodap�. Marque-as como [1], [2], ... no texto. No local onde est� o texto da nota de rodap� escreva [Footnote 1: texto da nota de rodap�]

    + +
    + +

    Images and OCR supplied by the National Library of Portugal's Digital National Library project.

    + diff --git a/c/pinc/templates/comment_files/samp.txt b/c/pinc/templates/comment_files/samp.txt new file mode 100644 index 0000000..e538e4c --- /dev/null +++ b/c/pinc/templates/comment_files/samp.txt @@ -0,0 +1 @@ +[BLANK] \ No newline at end of file diff --git a/c/pinc/templates/comment_files/ted0.txt b/c/pinc/templates/comment_files/ted0.txt new file mode 100644 index 0000000..ab6758b --- /dev/null +++ b/c/pinc/templates/comment_files/ted0.txt @@ -0,0 +1,19 @@ +

    Please retain page references (like see page number x, or the page numbers +in the Table of Contents or Index), not actual page numbers at the top or +bottom of the page. +

    Please make a HTML edition, including any illustrations, if +any. +

    Formatting is important; please format TOCs, lists of Illustrations, +etc., correctly. +

    Render the OE/oe ligature as [OE] or [oe], as appropriate. Also, keep all +ligatures if they are present in the text. +

    Please note any problems, observations, complains, request +for guidance etc., in that forum. There, we will reach +consensus and make a decision. +

    Please EMAIL me with any problems (missing pages and the like) you may +have. I check my email several times per day and usually respond within 24 +hours. +

    I apologize in advance for any missing pages or other difficulties. +If you encounter such, please post to the Missing Pages Wiki as well as making +a note in the appropriate forum and emailing me. +- Ted diff --git a/c/pinc/templates/comment_files/wrrn.txt b/c/pinc/templates/comment_files/wrrn.txt new file mode 100644 index 0000000..7f9337c --- /dev/null +++ b/c/pinc/templates/comment_files/wrrn.txt @@ -0,0 +1,163 @@ +

    Last updated: 2004-03-26 (see changelog)

    + +

    Contents

    + +

    Use the links to skip to the section of your choice (or scroll as desired).

    + + + +

    Keep Text as Close to Original as +Possible!

    + +

    We've had some mention of people changing things like "* * *" to "..." – +Please do not make such substitutions! Please keep all text as +close to the original as possible. + +

    Copyrighted Materials

    + +

    Some of the content in the Warren Report and its supporting evidentiary and +testimonial volumes is still under copyright. As a result, we are not allowed to +include this copyrighted material in Project Gutenberg. Most (if not all) of this +material has been identified, and place-holders have been included in the page +images to indicate where these copyrighted materials occur.

    + +

    If you come across any materials (e.g., photographs, movie stills, etc.) that you +think may need to be removed, please post a comment in the project thread.

    + +

    Crossed-Out Words

    + +

    In some places, words have been crossed out, removed, or redacted in some other +way. Please mark these in one of the following two ways:

    + +
      +
    • If the word is readable, please print the word and put a note after it like, +[**word crossed out]
    • +
    • If it is not readable, please just put a [**note] where it occurs.
    • +
    + +

    Dashes

    + +

    Recently the Proofing Guidelines changed so that all dashes are now represented +by two hyphens (--). However, in the testimony, it is very clear that some +dashes are longer than others. For longer dashes, please use four hyphens +(----).

    + +

    Note that hyphens should still have only one hyphen (-).

    + +

    Dialogue

    + +

    The testimonial volumes are primarily dialogue. Please mark the speaker's names +as bold (i.e., with <b> and </b> tags), like so:

    + +
    <b>Mr. RANKIN.</b> Mrs. Oswald, did you write in Russian a story of
    +your experiences in the United States?
    +
    +<b>Mrs. OSWALD.</b> Yes, I have. I think that you are familiar with
    +it.
    + +

    (Note: Please include the period inside the bold tags.)

    + +

    Forms

    + +

    The Commission Exhibits contain quite a few forms. The important thing when +transcribing these forms is to get the information out of them; layout is not that +important (except in some cases where the form might contain tabular data).

    + +

    There is an example in the Warren Commission UberProject thread on how forms can +be transcribed: http://www.pgdp.net/phpBB2/viewtopic.php?p=62370#62370

    + +

    Grayscale Images

    + +

    Each text file in the Evidence volumes (XVI-XXVI) has a URL a grayscale image for +that page. These URLs are there for your reference, to help you identify portions +that may not be clear in the black & white version of the page.

    + +

    The grayscale images are hosted by Pluckerbooks.com. Pluckerbooks runs off +d.maddock1's cablemodem connection, so please be nice. Also, because d.maddock1's +ISP blocks port 80 (the standard HTTP port), the site runs off port 81, which means +you may have trouble accessing the images from behind a firewall and/or proxy.

    + +

    Non-Standard Formatting

    + +

    Many of the exhibits (which are given in the later volumes) are things like forms +and charts which will be very hard to format using only ASCII text. We just ask +that you do your best. Don't worry about trying to make sure all the lines are +exact – it's the text and meaning of the documents that are important.

    + +

    Underlined Text

    + +

    Some of the Commission Exhibits contain documents that have underlined text. The +Proofing Guidelines say to mark underlined text similarly to italicized text; +however, we would like for this project to have underlined text +marked with <u< and </u< tags. For example: + +

      Here is some underlined text.
    + +

    Should be marked as:

    + +
      Here is some <u>underlined</u> text.
    + +

    Anything Else

    + +

    Please jump over to the forums if you have any questions about anything else.

    + + + +
    + +

    wrrn.txt Changelog

    + +

    Below is a history of changes made to this set of notes.

    + +
    +

    2004-03-26

    +
      +
    • Added notes on Form and link to example
    • +
    • Removed following sections that applied to the Report only: Image Captions, +Footnotes, Superscripts +
    • Reorganized sections
    • +
    • Added linked TOC to sections
    • +
    • Created changelog
    • +
    +
    diff --git a/c/pinc/templates/default_graphics/tabs_left.png b/c/pinc/templates/default_graphics/tabs_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3a511ce24a8013ec4e1db751adca8dbcfede47 GIT binary patch literal 2833 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/project_gutenberg/graphics/donate.gif b/c/pinc/templates/project_gutenberg/graphics/donate.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ca03eaea76ab0e03602a2e28f2b6f5712cb7ac0 GIT binary patch literal 857 zcmV-f1E%~(Nk%w1VLkvK0K@kg(bd|Bpt!We)5z1_*Wu{^Az1eK z`b1@m=j`yLx5}Nc#N+YzaEz(p=j~Q@n0%J8=k@yT@$_heq9jOjySuyT>FEYEW+FCC zl&8G_008Ru{Qv*|A^8LV00000EC2ui06qX8000I5AlGnYX`X1Rt}IztL*dPIZQppV z?>10;z@TtQEE?8H4gy|9}Eiv2p<&}0Tx*jW2^&(0T2)u5bo?0#JlO4cs?F&g~f!=btw7k(%ZAmCAe1ojSe`ygSb0tLj@2nBLL zfPn%R5=fvJp+Ou6U_k~jP*YuykVP?;IX3abgtfaC1o){fz=a9Q*xZ4Z>}Y^EO}i~h z>5I>d2A6?eIDo)I13VuNIEXWgp~4Sy3Ir%>&Hw@mb5cg&z?s?4OEqi;fv|vqtEs6q ztX6QqXM@oii0!g42LS`P4y$E~V1NNe0LB*(wCdTzf;JOsK+tf34VeWJ08pF|0Ks}P zoM@18+@^nn;C=x?09RZo6$AkeI3PgQTL(;_fjj1uL!bbh1%W_)c1(c=ys&`@QSGhB(~mR5F|C5izaq2vcp9!chzNA{s* za{1+*bAl8GHED(a}Dmf9%?8??8Z`EED(kGSh5!IN?7LZ= literal 0 HcmV?d00001 diff --git a/c/pinc/templates/project_gutenberg/graphics/dpclogo5.png b/c/pinc/templates/project_gutenberg/graphics/dpclogo5.png new file mode 100644 index 0000000000000000000000000000000000000000..cb103a140498f03ae5a593fd6bd42d9ee07bd5f5 GIT binary patch literal 7714 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/project_gutenberg/graphics/l_curve.gif b/c/pinc/templates/project_gutenberg/graphics/l_curve.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd76e45db63ec8d75239da03fac46f86d4a322e3 GIT binary patch literal 846 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 KMNUMnLSTXmh_c%N literal 0 HcmV?d00001 diff --git a/c/pinc/templates/project_gutenberg/graphics/tabs_left.png b/c/pinc/templates/project_gutenberg/graphics/tabs_left.png new file mode 100644 index 0000000000000000000000000000000000000000..af6150ba49753bd66a3e2da5f69753f2e645a67d GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/project_gutenberg/graphics/tabs_right.png b/c/pinc/templates/project_gutenberg/graphics/tabs_right.png new file mode 100644 index 0000000000000000000000000000000000000000..3a46a1ac1588c9ecd029b80ec8c22e42187a8fe9 GIT binary patch literal 4294 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 z%0A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 MV;$vcC9BZ?0g_=%jQ{`u literal 0 HcmV?d00001 diff --git a/c/pinc/templates/project_gutenberg/main.css b/c/pinc/templates/project_gutenberg/main.css new file mode 100644 index 0000000..74eb086 --- /dev/null +++ b/c/pinc/templates/project_gutenberg/main.css @@ -0,0 +1,4 @@ + +tt { + color: #c00; +} diff --git a/c/pinc/templates/project_gutenberg/theme.tpl b/c/pinc/templates/project_gutenberg/theme.tpl new file mode 100644 index 0000000..278b1c2 --- /dev/null +++ b/c/pinc/templates/project_gutenberg/theme.tpl @@ -0,0 +1,48 @@ + '#e0e8dd', + 'background-position' => 'top', + 'padding-left' => '9px', +); +?> diff --git a/c/pinc/templates/royal_blues/graphics/donate.gif b/c/pinc/templates/royal_blues/graphics/donate.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ca03eaea76ab0e03602a2e28f2b6f5712cb7ac0 GIT binary patch literal 857 zcmV-f1E%~(Nk%w1VLkvK0K@kg(bd|Bpt!We)5z1_*Wu{^Az1eK z`b1@m=j`yLx5}Nc#N+YzaEz(p=j~Q@n0%J8=k@yT@$_heq9jOjySuyT>FEYEW+FCC zl&8G_008Ru{Qv*|A^8LV00000EC2ui06qX8000I5AlGnYX`X1Rt}IztL*dPIZQppV z?>10;z@TtQEE?8H4gy|9}Eiv2p<&}0Tx*jW2^&(0T2)u5bo?0#JlO4cs?F&g~f!=btw7k(%ZAmCAe1ojSe`ygSb0tLj@2nBLL zfPn%R5=fvJp+Ou6U_k~jP*YuykVP?;IX3abgtfaC1o){fz=a9Q*xZ4Z>}Y^EO}i~h z>5I>d2A6?eIDo)I13VuNIEXWgp~4Sy3Ir%>&Hw@mb5cg&z?s?4OEqi;fv|vqtEs6q ztX6QqXM@oii0!g42LS`P4y$E~V1NNe0LB*(wCdTzf;JOsK+tf34VeWJ08pF|0Ks}P zoM@18+@^nn;C=x?09RZo6$AkeI3PgQTL(;_fjj1uL!bbh1%W_)c1(c=ys&`@QSGhB(~mR5F|C5izaq2vcp9!chzNA{s* za{1+*bAl8GHED(a}Dmf9%?8??8Z`EED(kGSh5!IN?7LZ= literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/graphics/l_curve.gif b/c/pinc/templates/royal_blues/graphics/l_curve.gif new file mode 100644 index 0000000000000000000000000000000000000000..83868649ec454975f3cd09e376dbbb2b135b892b GIT binary patch literal 186 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/graphics/oldlogo.gif b/c/pinc/templates/royal_blues/graphics/oldlogo.gif new file mode 100644 index 0000000000000000000000000000000000000000..56d6c7306989322337c1a7b9ce50fce0c305fc97 GIT binary patch literal 19997 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/graphics/tabs_bg.png b/c/pinc/templates/royal_blues/graphics/tabs_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..290ab2888ed31d5a075549989523305c9b1c60b8 GIT binary patch literal 2977 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/graphics/tabs_left_on.png b/c/pinc/templates/royal_blues/graphics/tabs_left_on.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbe641a69885762d9c1aae51ad3830aab2eae1e GIT binary patch literal 3365 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/graphics/tabs_right.png b/c/pinc/templates/royal_blues/graphics/tabs_right.png new file mode 100644 index 0000000000000000000000000000000000000000..9d70a8cac0c2dafed38c5b247cb14feed2d8b9b7 GIT binary patch literal 4522 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/graphics/tabs_right_on.png b/c/pinc/templates/royal_blues/graphics/tabs_right_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c43ddf16aaad3998c65efb548384cd7485638a1e GIT binary patch literal 5450 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 literal 0 HcmV?d00001 diff --git a/c/pinc/templates/royal_blues/main.css b/c/pinc/templates/royal_blues/main.css new file mode 100644 index 0000000..74eb086 --- /dev/null +++ b/c/pinc/templates/royal_blues/main.css @@ -0,0 +1,4 @@ + +tt { + color: #c00; +} diff --git a/c/pinc/templates/royal_blues/theme.tpl b/c/pinc/templates/royal_blues/theme.tpl new file mode 100644 index 0000000..849cb1c --- /dev/null +++ b/c/pinc/templates/royal_blues/theme.tpl @@ -0,0 +1,48 @@ + '#ffffff', + 'background-position' => 'top', + 'padding-left' => '9px', +); +?> \ No newline at end of file diff --git a/c/pinc/templates/theme.tpl b/c/pinc/templates/theme.tpl new file mode 100644 index 0000000..278b1c2 --- /dev/null +++ b/c/pinc/templates/theme.tpl @@ -0,0 +1,48 @@ + '#e0e8dd', + 'background-position' => 'top', + 'padding-left' => '9px', +); +?> diff --git a/c/pinc/theme.inc b/c/pinc/theme.inc new file mode 100644 index 0000000..ea915cb --- /dev/null +++ b/c/pinc/theme.inc @@ -0,0 +1,662 @@ +Username(); + +include_once($relPath.'gettext_setup.inc'); +//include_once($relPath."templates/theme.tpl"); + +function theme($nameofpage, $location, $extra_args = array()) { + global $User, $code_url; // $theme, $theme_name; + global $no_stats; + + if(! $User->IsLoggedIn()) { + $no_stats = 1; + } + + $statsbar_align = "right"; + + if (! $no_stats) { + // if stats bar on left + if ($statsbar_align == "left") { + + if ($location == "header") { + +/* + ------------------------------------------------- + header when NOT $no_stats and stats bar on left + ------------------------------------------------- +*/ + + html_header($nameofpage, $extra_args); + html_logobar($nameofpage); + echo " + + + + +
    + Provides a round curve for a navigation bar\n"; + } + +// ------------------------------------------------- +// footer when NOT $no_stats and stats bar on left +// ------------------------------------------------- + + else if ($location == "footer") { + echo "
    \n"; + html_footer(); + } + } + else { + if ($location == "header") { + +// ------------------------------------------------- +// header when NOT $no_stats and stats bar on right +// ********** MOST COMMON CASE *************** +// ------------------------------------------------- + + html_header($nameofpage, $extra_args); + html_logobar($nameofpage); + echo " + + + + +
    \n"; + } + +// ------------------------------------------------- +// footer when NOT $no_stats and stats bar on right +// ------------------------------------------------- + + else if($location == "footer") { + echo " + + +
    \n"; + html_footer(); + } + } + } + else { + // is no_stats + if ($location == "header") { + +// ----------------------------------------------------- +// header when IS $no_stats so no stats bar to position +// ----------------------------------------------------- + + html_header($nameofpage, $extra_args); + html_logobar($nameofpage); + echo " + + + +
     \n"; + } + else if($location == "footer") { + +// ----------------------------------------------------- +// footer when IS $no_stats so no stats bar to position +// ----------------------------------------------------- + + echo "
    \n"; + html_footer(); + } + } +} + +function html_header($nameofpage, $extra_args = array()) { + global $code_url; + + $incl = ""; + $onload = ""; + foreach($extra_args as $key => $val) { + switch($key) { + case "hdr_include": + break; + + case "css_file": + $incl .= "\n"; + break; + + case "css_data": + $incl .= "\n"; + break; + + case "js_text": + case "js_data": + $incl .= "\n"; + break; + + case "js_file": + $incl .= "\n"; + break; + + case "body_onload": + $onload .= " onload='$val'"; + break; + } + } + + echo +" + + + + +\n"; + +echo " + +DPC: ". (isset($nameofpage) + ? "$nameofpage" + : "Distributed Proofreaders Canada" ) +. " +\n"; + echo +"$incl + +\n"; +} + +function html_logobar() { + global $code_url; + global $dpdb; + global $User; + +// $username = $User->Username(); + $numproj = $dpdb->SqlOneValue(" + SELECT COUNT(distinct postednum) FROM projects + WHERE phase = 'POSTED'"); + + echo " + + + + + + + + + +
    + + Distributed Proofreaders + + + + " . sprintf( _('%s titles preserved for the world!'), number_format($numproj)) ." + +
    \n"; + + // -------------------------------------------------------------------- + // navbar + // -------------------------------------------------------------------- + + $divider = " · "; + + echo " + +
    + + + + + \n"; + } + else { + $items = array( link_to_site("DPC")); + $items[] = link_to_activity_hub(); + $items[] = link_to_search("Project Search"); + $items[] = link_to_my_projects(); + $items[] = link_to_preferences(); + + $inbox_text = _("My Inbox"); + $numofPMs = $User->InboxCount(); + if($numofPMs[0] > 0) { + $inbox_text .= sprintf(_(" (%s unread)"), $numofPMs[0]); + } + $items[] = link_to_inbox($inbox_text); + $items[] = link_to_forums(); + $items[] = link_to_wiki(); + $items[] = link_to_logout("Log out ({$User->Username()})"); + + echo implode($divider, $items); + + echo "\n"; + + echo ""; + } + + + echo "\n"; + echo "
     \n"; + + if (! $User->IsLoggedIn()) { + $link_to_forums_login = "Forums"; + $items = array( link_to_site("DPC")); + $items[] = $link_to_forums_login; + echo implode($divider, $items); + echo " + ID: + +  " . _("Password:") . " +   + \n"; + echo link_to_registration(); + echo "  + \n"; + show_quick_links(); + echo " 
    \n"; + echo "
    \n"; +} + +function login_form() { + global $code_url; + $password = _("Password: "); + $signin = _("Sign In: "); + return " +
    + ID: + + $password + + \n" + . link_to_registration() + . link_to_help() + . "
    \n"; +} + +//function headerbar_text($text, $link = '', $with_divider = false) { +// $out = ""; +// +// if ($with_divider) { +// $out .= " · "; +// } +// +// if(!empty($link)) { +// $out .= "$text\n"; +// } +// else { +// $out .= $text; +// } +// +// return $out; +//} + +function html_statsbar() { + global $User; + global $code_url; + global $pagename; + + // Show statistics that are pertinent to the particular request. + // (i.e., to the main content of the page). + + if(isset($pagename) && $pagename == "activityhub") { + // show_backlogs(); + } + $round_id = Arg('round_id', Arg('tally_name')); + + if($round_id == "") { + show_completed_projects(); + } + else { + show_round_specific_stats( $round_id ); + } + + if($User->IsLoggedIn()) { + echo " + \n"; + + + echo "
    \n"; + show_user_teams(); + + echo "
    \n"; + show_key_help_links(); + echo "
    \n"; + } +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +/* +function maybe_show_language_selector() { + global $code_url, $intlang; + $instl=installed_langs(); + $uninstl=uninstalled_langs(); + if(!(count($instl)>1||count($uninstl)>0)) + return; + + if (empty($userP) || (!(empty($userP)) && !($userP['u_intlang']))) { + ?> + + \n\n\n\n"; + echo "Languages below the line are planned to be added to the site, but currently are not; visit this page if you can help us with translating the site into one of them.
    \n"; + } +} +*/ + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +// This parallels the Activity Hub. +function show_quick_links() { + global $User; + + if (! $User->IsLoggedIn()) + return; + + $items = array(); + + if ($User->IsProjectManager() || $User->IsSiteManager()) { + $items[] = link_to_project_manager("PM"); + } + +// foreach(array("P1", "P2", "P3", "F1", "F2", "PP", "PPV") as $phs) { + foreach(array("P1", "P2", "P3", "F1", "F2") as $phs) { + if($User->MayWorkInRound($phs)) { + $items[] = link_to_round($phs); +// $title = PhaseCaption($phs); +// $link = link_to_round($phs); +// echo headerbar_text("$text", "$code_url/$rel_url", $divider); +// $links[] = array(link_to_round($phs), $phs, $phs); + } + } + if($User->MayWorkInRound("PP")) { + $items[] = link_to_pp(); + } + if($User->MayWorkInRound("PPV")) { + $items[] = link_to_ppv(); + } + $items[] = link_to_smooth_reading("SR"); + + $divider = "\n · "; + echo implode($divider, $items); + +// if ( count($links) > 0 ) { +// while ( list($i, list($rel_url, $text, $title)) = each($links) ) { +// $divider = ($i > 0) +// ? true +// : false; +// +// echo headerbar_text("$text", "$code_url/$rel_url", $divider); +// echo "\n"; +// } +// } +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +function show_round_specific_stats( $round_id ) { + global $User; + + // Put the whole thing in a table, just so we can put a box around it. + echo " + + + "; +} + +function honorific_for_count($round_id, $count) { + global $Honorifics; + $dignity = "Novice"; + foreach($Honorifics[$round_id] as $key => $value) { + $dignity = $value; + if($count < $key) { + break; + } + } + return $dignity; +} + +function ename($name) { + global $User; + return $name == $User->Username() + ? "$name" + : $name; +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +function show_user_teams() +{ + global $code_url; + global $dpdb; + global $User; + + $rows = $dpdb->SqlRows(" + SELECT teamname, id FROM user_teams + WHERE id IN ({$User->Team1()}, {$User->Team2()}, {$User->Team3()})"); + + echo " + \n"; +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + + +function show_completed_projects() { + global $dpdb; + + echo _("
    Completed Projects:
    \n"); + echo "\n"; + $rows = $dpdb->SqlRows(" + SELECT COUNT(1) c, MONTH(d) m, MONTHNAME(d) mname, YEAR(d) y + FROM ( + SELECT FROM_UNIXTIME(event_time) d + FROM project_events pe + WHERE event_type = 'post' + AND event_time > + UNIX_TIMESTAMP( DATE( DATE_FORMAT( + DATE_ADD( CURRENT_DATE(), INTERVAL -1 YEAR), '%Y-%m-01'))) + ) tbl + GROUP BY m, y + ORDER BY y, m"); + + foreach($rows as $row) { + $displaydate = "{$row['mname']} {$row['y']}"; + echo " + + + \n"; + } + echo "\n"; +} + +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +function show_key_help_links() { + global $wiki_url; + + echo " + \n"; +} + +function show_backlogs() { + echo " +