From 03cae10316b2a0b958ac0a8c99194605c1779cd8 Mon Sep 17 00:00:00 2001 From: github actions Date: Wed, 1 Sep 2021 02:17:03 +0000 Subject: [PATCH 01/15] Squashed 'buildres/csl/csl-styles/' changes from ec4a4c01ff..2b37392723 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2b37392723 Create betriebswirtschaftliche-forschung-und-praxis.csl (#5609) a52989cc09 Update universitat-zu-koln-seminar-fur-abwl-und-finanzierungslehre.csl (#5610) 47c21bf418 Add historioPLUS (#5611) baf11b49ef Update urad-rs-za-makroekonomske-analize-in-razvoj.csl (#5607) 636affa7f3 Create pain-medicine.csl (#5606) 1d060f9e11 Update sist02.csl (#5568) 54e8904586 Update ucl-university-college-apa.csl (#5597) 9c6308e8cd Creation du style cahiers-du-journalisme.csl (#5595) 7dea54b431 Update universite-du-quebec-a-montreal.csl (#5596) b110d077c2 Update journal-of-paleontology.csl (#5594) 9cc379780c Add workaround for software style in ASA (sociology) (#5464) 459dfb783c Update american-journal-of-sociology.csl (#5604) f73d62f05b Create council-of-science-editors-brackets.csl (#5593) bacf673c18 Remove extra accent (#5598) 55e1d40aeb Update system-dynamics-review.csl (#5599) b8262e4b77 Update independent style for journal-of-cataract-and-refractive-surgery.csl (#5602) 04da306e8f Create quaderni-ministero-dei-beni-e-delle-attivita-culturali-e-del-t… (#5600) 8144588aaf Update journal-of-dental-research.csl (#5601) 4703b5d0c0 [Frontiers in ...] Remove formatting for volume (#5580) 3a3eb0c835 Create journal-of-clinical-and-translational-science.csl (#5588) cf08af8a91 Create clinical-pulmonary-medicine.csl (#5589) 98985b1311 Create cancer-drug-resistance.csl (#5590) 0af101dd8e Create american-journal-of-sociology.csl (#5591) b24e1f5b64 Create san-francisco-estuary-and-watershed-science.csl (#5592) 6f9323cdd4 revise Manchester UP monograph style (note-bib) (#5587) e6f982bea7 Delete harper-adams (#5585) 1eef78fc0c Create international-journal-of-clinical-research.csl (#5584) f28865ea86 OSCOLA.csl: Add publiser info to generic/working paper secondary sources (CSL type "article"). (#5541) 197ceb1ebb Create system-dynamics-review.csl (#5575) 1d33da24e5 Create microcirculation.csl (#5577) d06f6254ef Create iawa-journal.csl (#5576) 4705585ed4 Update for corrections (#5578) c1c7852aa7 Create praxis.csl (#5579) e012054ee6 Create European Review of Agricultural Economics style (#5567) b2fa912932 Create biomarkers.csl (#5582) 1b00ec03eb Create journal-of-international-studies.csl (#5574) 79a5d9c4b6 Switch MLA to 9th edition (#5561) 011fef33ae Update for corrections (#5573) ff5490c8ae Create zeitschrift-fur-geschichtsdidaktik.csl (#5569) 9093f2f806 Create etri-journal.csl (#5570) c9ba757348 Create radiation-protection-dosimetry.csl (#5571) 60632bc950 Create horttechnology.csl (#5572) e63820bfd1 Add a new journal (magnetic resonance in medical sciences) (#5542) b6568850fc Create zeitschrift-fur-papyrologie-und-epigraphik.csl (#5548) 25e1eef4c0 Update technische-universitat-dresden-linguistik.csl (#5563) c0c0da416f Create the-american-journal-of-dermatopathology.csl (#5564) 63f7db9e56 Update journal-of-the-american-association-of-laboratory-animal-scien… (#5566) ba642253cb Update institut-français-darcheologie-orientale-en.csl (#5553) 32e9031c46 Create institut-francais-darcheologie-orientale-domaine-des-etudes-arabes-en.csl (#5551) 23e2cf5e34 Create institut-francais-darcheologie-orientale-domaine-des-etudes-arabes.csl (#5550) 3e1a3f3196 Update institut-français-darcheologie-orientale.csl (#5552) 176997dd1c Update veterinary-pathology.csl (#5554) ee035c10c3 Update mycologia.csl (#5555) eb4b3a625b Create international-journal-of-automotive-technology.csl (#5557) 3c4e727e0d Bump addressable from 2.7.0 to 2.8.0 (#5558) ccb81c8363 Create szociologiai-szemle.csl (#5547) ed9d740000 Update brain.csl to ama.csl dependent (#5546) ab499f27bb Create iran-manual-style (#5350) 6e2b13cb15 Update and rename dependent/estuaries-and-coasts.csl to estuaries-and-coasts.csl (#5534) 8441ff9d91 Create fachhochschule-suedwestfalen.csl (#5459) 8439cf4b2d Create freie-hochschule-stuttgart.csl (#5466) 076c513dec Update midwestern-baptist-theological-seminary.csl (#5420) 350b900f62 Update veterinary-pathology.csl (#5543) 06261c0139 Create United States International Trade Commission.csl (#5508) 7ae505d236 Add support for blog posts (CSL: post-weblog). (#5536) 93c97ea620 Update tud bwl marketing style (#5538) 430879137b Create the-chinese-journal-of-international-politics.csl (#5537) 09f3362d35 Add hanging-indents to infoclio.ch styles (#5540) d4dc67982f Further improvements to norsk-henvisningsstandad-for-rettsvitenskapelige-tekster.csl (#5539) git-subtree-dir: buildres/csl/csl-styles git-subtree-split: 2b373927234b14db4e9b1f300d5eac1bb323a690 --- Gemfile.lock | 2 +- afte-journal.csl | 232 --- american-journal-of-sociology.csl | 224 +++ ...ican-society-for-horticultural-science.csl | 223 +++ american-sociological-association.csl | 26 +- archeosciences.csl | 4 +- ...eira-de-normas-tecnicas-ufrgs-initials.csl | 418 +++-- ...ao-brasileira-de-normas-tecnicas-ufrgs.csl | 373 ++-- ...bswirtschaftliche-forschung-und-praxis.csl | 182 ++ biomarkers.csl | 313 ++++ brain.csl | 188 -- cancer-drug-resistance.csl | 179 ++ council-of-science-editors-brackets.csl | 242 +++ dependent/afte-journal.csl | 15 + dependent/brain.csl | 16 + ...stitut-francais-darcheologie-orientale.csl | 24 - dependent/clinical-pulmonary-medicine.csl | 16 + dependent/estuaries-and-coasts.csl | 19 - ...stitut-francais-darcheologie-orientale.csl | 23 - dependent/hortscience.csl | 17 + dependent/horttechnology.csl | 17 + ...nal-of-cataract-and-refractive-surgery.csl | 5 +- dependent/journal-of-dental-research.csl | 14 - .../journal-of-international-studies.csl | 17 + ...ican-society-for-horticultural-science.csl | 17 + discovery-medicine.csl | 1 - estuaries-and-coasts.csl | 461 +++++ etri-journal.csl | 145 ++ european-review-of-agricultural-economics.csl | 1278 ++++++++++++++ fachhochschule-sudwestfalen.csl | 225 +++ freie-hochschule-stuttgart.csl | 305 ++++ frontiers-medical-journals.csl | 2 +- harper-adams-university-harvard.csl | 423 ----- historio-plus.csl | 360 ++++ iawa-journal.csl | 213 +++ infoclio-de-kurzbelege.csl | 2 +- infoclio-de.csl | 2 +- infoclio-fr-nocaps.csl | 2 +- infoclio-fr-smallcaps.csl | 2 +- ...is-darcheologie-orientale-arab-studies.csl | 672 ++++++++ ...tut-francais-darcheologie-orientale-en.csl | 128 +- ...s-darcheologie-orientale-etudes-arabes.csl | 611 +++++++ institut-francais-darcheologie-orientale.csl | 135 +- ...ional-journal-of-automotive-technology.csl | 145 ++ ...rnational-journal-of-clinical-research.csl | 171 ++ iran-manual-of-style.csl | 658 +++++++ ...-of-clinical-and-translational-science.csl | 225 +++ journal-of-dental-research.csl | 254 +++ journal-of-paleontology.csl | 90 +- ...sociation-of-laboratory-animal-science.csl | 202 +-- les-cahiers-du-journalisme.csl | 328 ++++ magnetic-resonance-in-medical-sciences.csl | 118 ++ manchester-university-press.csl | 4 +- microcirculation.csl | 188 ++ midwestern-baptist-theological-seminary.csl | 26 +- modern-language-association-8th-edition.csl | 324 ++++ modern-language-association.csl | 8 +- mycologia.csl | 16 +- ...andard-for-rettsvitenskapelige-tekster.csl | 39 +- oscola.csl | 6 +- pain-medicine.csl | 329 ++++ praxis.csl | 160 ++ quaderni.csl | 194 +++ radiation-protection-dosimetry.csl | 241 +++ renamed-styles.json | 3 +- ...rancisco-estuary-and-watershed-science.csl | 216 +++ sist02.csl | 7 + system-dynamics-review.csl | 211 +++ szociologiai-szemle.csl | 511 ++++++ ...den-betriebswirtschaftslehre-marketing.csl | 93 +- technische-universitat-dresden-linguistik.csl | 30 +- the-american-journal-of-dermatopathology.csl | 216 +++ ...nese-journal-of-international-politics.csl | 216 +++ ucl-university-college-apa.csl | 473 ++---- ...-states-international-trade-commission.csl | 1505 +++++++++++++++++ ...eminar-fur-abwl-und-finanzierungslehre.csl | 6 +- universite-du-quebec-a-montreal.csl | 387 ++--- ...rs-za-makroekonomske-analize-in-razvoj.csl | 109 +- veterinary-pathology.csl | 23 +- zeitschrift-fur-geschichtsdidaktik.csl | 371 ++++ ...schrift-fur-papyrologie-und-epigraphik.csl | 284 ++++ 81 files changed, 13928 insertions(+), 2232 deletions(-) delete mode 100644 afte-journal.csl create mode 100644 american-journal-of-sociology.csl create mode 100644 american-society-for-horticultural-science.csl create mode 100644 betriebswirtschaftliche-forschung-und-praxis.csl create mode 100644 biomarkers.csl delete mode 100644 brain.csl create mode 100644 cancer-drug-resistance.csl create mode 100644 council-of-science-editors-brackets.csl create mode 100644 dependent/afte-journal.csl create mode 100644 dependent/brain.csl delete mode 100644 dependent/bulletin-de-linstitut-francais-darcheologie-orientale.csl create mode 100644 dependent/clinical-pulmonary-medicine.csl delete mode 100644 dependent/estuaries-and-coasts.csl delete mode 100644 dependent/fouilles-de-linstitut-francais-darcheologie-orientale.csl create mode 100644 dependent/hortscience.csl create mode 100644 dependent/horttechnology.csl delete mode 100644 dependent/journal-of-dental-research.csl create mode 100644 dependent/journal-of-international-studies.csl create mode 100644 dependent/journal-of-the-american-society-for-horticultural-science.csl create mode 100644 estuaries-and-coasts.csl create mode 100644 etri-journal.csl create mode 100644 european-review-of-agricultural-economics.csl create mode 100644 fachhochschule-sudwestfalen.csl create mode 100644 freie-hochschule-stuttgart.csl delete mode 100644 harper-adams-university-harvard.csl create mode 100644 historio-plus.csl create mode 100644 iawa-journal.csl create mode 100644 institut-francais-darcheologie-orientale-arab-studies.csl create mode 100644 institut-francais-darcheologie-orientale-etudes-arabes.csl create mode 100644 international-journal-of-automotive-technology.csl create mode 100644 international-journal-of-clinical-research.csl create mode 100644 iran-manual-of-style.csl create mode 100644 journal-of-clinical-and-translational-science.csl create mode 100644 journal-of-dental-research.csl create mode 100644 les-cahiers-du-journalisme.csl create mode 100644 magnetic-resonance-in-medical-sciences.csl create mode 100644 microcirculation.csl create mode 100644 modern-language-association-8th-edition.csl create mode 100644 pain-medicine.csl create mode 100644 praxis.csl create mode 100644 quaderni.csl create mode 100644 radiation-protection-dosimetry.csl create mode 100644 san-francisco-estuary-and-watershed-science.csl create mode 100644 system-dynamics-review.csl create mode 100644 szociologiai-szemle.csl create mode 100644 the-american-journal-of-dermatopathology.csl create mode 100644 the-chinese-journal-of-international-politics.csl create mode 100644 united-states-international-trade-commission.csl create mode 100644 zeitschrift-fur-geschichtsdidaktik.csl create mode 100644 zeitschrift-fur-papyrologie-und-epigraphik.csl diff --git a/Gemfile.lock b/Gemfile.lock index 3f573f3c5a5..c53fdc40c47 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -20,7 +20,7 @@ GIT GEM remote: https://rubygems.org/ specs: - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) citeproc (1.0.10) namae (~> 1.0) diff --git a/afte-journal.csl b/afte-journal.csl deleted file mode 100644 index 30e8373ff47..00000000000 --- a/afte-journal.csl +++ /dev/null @@ -1,232 +0,0 @@ - - diff --git a/american-journal-of-sociology.csl b/american-journal-of-sociology.csl new file mode 100644 index 00000000000..459a4125840 --- /dev/null +++ b/american-journal-of-sociology.csl @@ -0,0 +1,224 @@ + + diff --git a/american-society-for-horticultural-science.csl b/american-society-for-horticultural-science.csl new file mode 100644 index 00000000000..dcd104571cd --- /dev/null +++ b/american-society-for-horticultural-science.csl @@ -0,0 +1,223 @@ + + diff --git a/american-sociological-association.csl b/american-sociological-association.csl index b5e538ee7c1..407fa190ca0 100644 --- a/american-sociological-association.csl +++ b/american-sociological-association.csl @@ -19,6 +19,11 @@ 2020-09-18T10:38:12+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License + + + version + + - - @@ -73,8 +74,8 @@ - + @@ -83,7 +84,7 @@ - + @@ -150,50 +151,55 @@ - - - - - - - - - + + + - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + diff --git a/journal-of-the-american-association-of-laboratory-animal-science.csl b/journal-of-the-american-association-of-laboratory-animal-science.csl index dbd5bd35d6f..f67d51a2c5d 100644 --- a/journal-of-the-american-association-of-laboratory-animal-science.csl +++ b/journal-of-the-american-association-of-laboratory-animal-science.csl @@ -6,92 +6,85 @@ http://www.zotero.org/styles/journal-of-the-american-association-of-laboratory-animal-science - + Charles Parnot charles.parnot@gmail.com http://twitter.com/cparnot + + Patrick O'Brien + 1559-6109 - 2012-10-09T12:00:00+00:00 + 2021-07-21T07:37:42+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License - - + + - - - - - - - - - + + + - - - - + + + + + - + - + + + + + + + + + + + + + + - + - - - - + + - - + + - - - - - - - - - - - - - - - - - - - + + @@ -106,79 +99,56 @@ - - - - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - + + + diff --git a/les-cahiers-du-journalisme.csl b/les-cahiers-du-journalisme.csl new file mode 100644 index 00000000000..dad21c34e7b --- /dev/null +++ b/les-cahiers-du-journalisme.csl @@ -0,0 +1,328 @@ + + diff --git a/magnetic-resonance-in-medical-sciences.csl b/magnetic-resonance-in-medical-sciences.csl new file mode 100644 index 00000000000..220b756db61 --- /dev/null +++ b/magnetic-resonance-in-medical-sciences.csl @@ -0,0 +1,118 @@ + + diff --git a/manchester-university-press.csl b/manchester-university-press.csl index 580942d14b2..3665a5938ed 100644 --- a/manchester-university-press.csl +++ b/manchester-university-press.csl @@ -22,7 +22,7 @@ Manchester University Press monograph style with full notes and bibliography - 2021-05-31T12:00:00+00:00 + 2021-08-08T12:00:00+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -158,7 +158,7 @@ - + diff --git a/microcirculation.csl b/microcirculation.csl new file mode 100644 index 00000000000..7ffb74987a8 --- /dev/null +++ b/microcirculation.csl @@ -0,0 +1,188 @@ + + diff --git a/midwestern-baptist-theological-seminary.csl b/midwestern-baptist-theological-seminary.csl index 4e09a4ef401..108343ce4ef 100644 --- a/midwestern-baptist-theological-seminary.csl +++ b/midwestern-baptist-theological-seminary.csl @@ -13,7 +13,7 @@ Chicago format with full notes and bibliography with modifications for MBTS - 2019-10-15T23:12:42+00:00 + 2021-04-27T17:00:00+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -1368,27 +1368,15 @@ - + - - - - - - - - - - - - - - - - - + + + + + diff --git a/modern-language-association-8th-edition.csl b/modern-language-association-8th-edition.csl new file mode 100644 index 00000000000..ed88df957ac --- /dev/null +++ b/modern-language-association-8th-edition.csl @@ -0,0 +1,324 @@ + + diff --git a/modern-language-association.csl b/modern-language-association.csl index db5ca58db1b..41eedd6ff2d 100644 --- a/modern-language-association.csl +++ b/modern-language-association.csl @@ -1,7 +1,7 @@ diff --git a/praxis.csl b/praxis.csl new file mode 100644 index 00000000000..bbb16f62c0c --- /dev/null +++ b/praxis.csl @@ -0,0 +1,160 @@ + + diff --git a/quaderni.csl b/quaderni.csl new file mode 100644 index 00000000000..4bc19287d2d --- /dev/null +++ b/quaderni.csl @@ -0,0 +1,194 @@ + + diff --git a/radiation-protection-dosimetry.csl b/radiation-protection-dosimetry.csl new file mode 100644 index 00000000000..c0adf52751e --- /dev/null +++ b/radiation-protection-dosimetry.csl @@ -0,0 +1,241 @@ + + diff --git a/renamed-styles.json b/renamed-styles.json index ac0c117fcbf..1b3131a1857 100644 --- a/renamed-styles.json +++ b/renamed-styles.json @@ -54,6 +54,7 @@ "british-ecological-society": "apa-old-doi-prefix", "british-volume-of-the-journal-of-bone-and-joint-surgery": "the-journal-of-bone-and-joint-surgery", "budownictwo-i-architektura-en": "budownictwo-i-architektura-pl", + "bulletin-de-linstitut-francais-darcheologie-orientale": "institut-francais-darcheologie-orientale", "bulletin-of-materials-science": "springer-humanities-author-date", "bulletin-of-the-medical-library-association": "journal-of-the-medical-library-association", "canadian-journal-of-anaesthesia": "canadian-journal-of-anesthesia", @@ -110,6 +111,7 @@ "federation-of-european-microbiological-societies": "oxford-university-press-scimed-author-date", "fems": "oxford-university-press-scimed-author-date", "firstmonday": "first-monday", + "fouilles-de-linstitut-francais-darcheologie-orientale": "institut-francais-darcheologie-orientale", "friedrich-schiller-university-jena-faculty-of-medicine": "friedrich-schiller-universitat-jena-medizinische-fakultat", "frontiers-in-addictive-disorders": "frontiers", "frontiers-in-affective-disorders-and-psychosomatic-research": "frontiers", @@ -407,7 +409,6 @@ "mla-notes": "modern-language-association-6th-edition-note", "mla-underline": "modern-language-association-7th-edition-underline", "mla-url": "modern-language-association-7th-edition-with-url", - "modern-language-association-8th-edition": "modern-language-association", "modern-language-association-note": "modern-language-association-6th-edition-note", "modern-language-association-underline": "modern-language-association-7th-edition-underline", "modern-language-association-with-url": "modern-language-association-7th-edition-with-url", diff --git a/san-francisco-estuary-and-watershed-science.csl b/san-francisco-estuary-and-watershed-science.csl new file mode 100644 index 00000000000..94ed1374b38 --- /dev/null +++ b/san-francisco-estuary-and-watershed-science.csl @@ -0,0 +1,216 @@ + + diff --git a/sist02.csl b/sist02.csl index ec9324a2294..46f485c9b4e 100644 --- a/sist02.csl +++ b/sist02.csl @@ -67,6 +67,12 @@ + + + + + @@ -167,6 +173,7 @@ + diff --git a/system-dynamics-review.csl b/system-dynamics-review.csl new file mode 100644 index 00000000000..aa11cee4eed --- /dev/null +++ b/system-dynamics-review.csl @@ -0,0 +1,211 @@ + + diff --git a/szociologiai-szemle.csl b/szociologiai-szemle.csl new file mode 100644 index 00000000000..1d99c391391 --- /dev/null +++ b/szociologiai-szemle.csl @@ -0,0 +1,511 @@ + + diff --git a/technische-universitat-dresden-betriebswirtschaftslehre-marketing.csl b/technische-universitat-dresden-betriebswirtschaftslehre-marketing.csl index f3957197e24..c9a8f2937bf 100644 --- a/technische-universitat-dresden-betriebswirtschaftslehre-marketing.csl +++ b/technische-universitat-dresden-betriebswirtschaftslehre-marketing.csl @@ -6,7 +6,7 @@ http://www.zotero.org/styles/technische-universitat-dresden-betriebswirtschaftslehre-marketing - + Christina Wenzel christina.wenzel@slub-dresden.de @@ -15,21 +15,22 @@ Zitierstil entsprechend den Zitierrichtlinien des Lehrstuhls Betriebswirtschaftslehre, insbesondere Marketing,der Fakultät Wirtschaftswissenschaften, Technische Universität Dresden. - 2019-11-06T10:34:10+00:00 + 2021-05-17T10:08:20+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License - o. V. + o. V. Zugriff am gehalten auf et al. Hrsg. + - - + @@ -38,7 +39,7 @@ - + - + @@ -69,7 +70,7 @@ - + @@ -85,9 +86,8 @@ - - - + + @@ -121,23 +121,42 @@ - + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -149,19 +168,19 @@ - + + - - + - - - + + + @@ -175,16 +194,16 @@ - + - + - + @@ -201,13 +220,23 @@ - + + + + + + + + + + + - diff --git a/technische-universitat-dresden-linguistik.csl b/technische-universitat-dresden-linguistik.csl index 1a5f00bf982..19301d851e8 100644 --- a/technische-universitat-dresden-linguistik.csl +++ b/technische-universitat-dresden-linguistik.csl @@ -16,7 +16,7 @@ Zitierstil entsprechend den Vorgaben der linguistischen Professuren am Institut für Germanistik der Technischen Universität Dresden. Der Stil orientiert sich an den Richtlinien von 'Deutsche Sprache: Zeitschrift für Theorie Praxis Dokumentation', hg. vom IDS Mannheim - 2020-04-24T11:56:46+00:00 + 2021-07-19T08:34:39+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -27,6 +27,11 @@ + + + + + @@ -82,19 +87,19 @@ - + - - + + - + @@ -126,36 +131,39 @@ - - - + + + + - - + + + - + + diff --git a/the-american-journal-of-dermatopathology.csl b/the-american-journal-of-dermatopathology.csl new file mode 100644 index 00000000000..b155d40b7f6 --- /dev/null +++ b/the-american-journal-of-dermatopathology.csl @@ -0,0 +1,216 @@ + + diff --git a/the-chinese-journal-of-international-politics.csl b/the-chinese-journal-of-international-politics.csl new file mode 100644 index 00000000000..70d547e1fb8 --- /dev/null +++ b/the-chinese-journal-of-international-politics.csl @@ -0,0 +1,216 @@ + + diff --git a/ucl-university-college-apa.csl b/ucl-university-college-apa.csl index 813e0df4579..2f049d65f2d 100644 --- a/ucl-university-college-apa.csl +++ b/ucl-university-college-apa.csl @@ -1,84 +1,25 @@ diff --git a/universitat-zu-koln-seminar-fur-abwl-und-finanzierungslehre.csl b/universitat-zu-koln-seminar-fur-abwl-und-finanzierungslehre.csl index 7ceb51054b8..5ec97bc82df 100644 --- a/universitat-zu-koln-seminar-fur-abwl-und-finanzierungslehre.csl +++ b/universitat-zu-koln-seminar-fur-abwl-und-finanzierungslehre.csl @@ -12,7 +12,7 @@ Stil für die Universität zu Köln - Seminar für ABWL und Finanzierungslehre, Version Juni 2015. - 2018-06-09T19:36:01+00:00 + 2021-08-27T19:36:01+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -126,7 +126,7 @@ - + @@ -167,7 +167,7 @@ - + diff --git a/universite-du-quebec-a-montreal.csl b/universite-du-quebec-a-montreal.csl index 7b6f0a146e1..fe647fab2f9 100644 --- a/universite-du-quebec-a-montreal.csl +++ b/universite-du-quebec-a-montreal.csl @@ -1,11 +1,11 @@ diff --git a/zeitschrift-fur-papyrologie-und-epigraphik.csl b/zeitschrift-fur-papyrologie-und-epigraphik.csl new file mode 100644 index 00000000000..bb085097996 --- /dev/null +++ b/zeitschrift-fur-papyrologie-und-epigraphik.csl @@ -0,0 +1,284 @@ + + From 913fbc8632527199993dd195e3c23ded86e45e0b Mon Sep 17 00:00:00 2001 From: github actions Date: Wed, 1 Sep 2021 02:17:06 +0000 Subject: [PATCH 02/15] Squashed 'buildres/csl/csl-locales/' changes from ec6d62a9e7..7a507fc008 7a507fc008 Fix spelling of October in Thai locale git-subtree-dir: buildres/csl/csl-locales git-subtree-split: 7a507fc0084edea8376ee5345879ddc2c99829ba --- locales-th-TH.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales-th-TH.xml b/locales-th-TH.xml index d9f9a3922f4..da2f4953411 100644 --- a/locales-th-TH.xml +++ b/locales-th-TH.xml @@ -282,7 +282,7 @@ กรกฎาคม สิงหาคม กันยายน - ตุลาคาม + ตุลาคม พฤศจิกายน ธันวาคม From de91ade654501818866c7897a4fb6289f4f8417d Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Wed, 1 Sep 2021 12:29:59 +0200 Subject: [PATCH 03/15] Observable preferences A (Appearance and Importer) (#8041) Co-authored-by: Tobias Diez Co-authored-by: Benedikt Tutzer --- src/main/java/org/jabref/gui/JabRefFrame.java | 4 +- src/main/java/org/jabref/gui/JabRefMain.java | 2 +- .../BibtexExtractorViewModel.java | 4 +- .../bibtexextractor/ExtractBibtexAction.java | 10 ++- .../jabref/gui/entryeditor/EntryEditor.java | 10 +-- .../gui/externalfiles/ImportHandler.java | 7 +- .../gui/fieldeditors/LinkedFileViewModel.java | 4 +- .../gui/fieldeditors/LinkedFilesEditor.java | 2 +- .../gui/importer/GrobidOptInDialogHelper.java | 15 ++-- .../org/jabref/gui/importer/ImportAction.java | 8 +-- .../appearance/AppearanceTabViewModel.java | 33 +++++---- .../CustomImporterTabViewModel.java | 2 +- .../ImportExportTabViewModel.java | 18 ++--- .../ExternalFilesContentImporter.java | 10 +-- .../logic/importer/ImportFormatReader.java | 11 ++- .../logic/importer/ImporterPreferences.java | 69 +++++++++++++++++++ .../jabref/logic/importer/WebFetchers.java | 5 +- .../fetcher/GrobidCitationFetcher.java | 6 +- .../fileformat/PdfGrobidImporter.java | 6 +- .../fileformat/PdfMergeMetadataImporter.java | 18 ++--- .../ImportSettingsPreferences.java | 40 ----------- .../logic/importer/util/GrobidService.java | 16 ++--- .../preferences/AppearancePreferences.java | 43 ++++++++++-- .../jabref/preferences/JabRefPreferences.java | 48 +++++++------ .../preferences/PreferencesService.java | 8 +-- .../ImportFormatReaderIntegrationTest.java | 3 +- .../ImportFormatReaderTestParameterless.java | 3 +- .../logic/importer/WebFetchersTest.java | 5 +- .../fetcher/GrobidCitationFetcherTest.java | 11 ++- .../fileformat/PdfGrobidImporterTest.java | 10 +-- .../PdfMergeMetadataImporterTest.java | 10 +-- .../importer/util/GrobidServiceTest.java | 8 +-- 32 files changed, 255 insertions(+), 194 deletions(-) create mode 100644 src/main/java/org/jabref/logic/importer/ImporterPreferences.java delete mode 100644 src/main/java/org/jabref/logic/importer/importsettings/ImportSettingsPreferences.java diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index ca566313ffe..59f4e10bb35 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -491,7 +491,7 @@ private Node createToolbar() { new HBox( factory.createIconButton(StandardActions.NEW_ARTICLE, new NewEntryAction(this, StandardEntryType.Article, dialogService, prefs, stateManager)), factory.createIconButton(StandardActions.NEW_ENTRY, new NewEntryAction(this, dialogService, prefs, stateManager)), - factory.createIconButton(StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, new ExtractBibtexAction(stateManager)), + factory.createIconButton(StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, new ExtractBibtexAction(dialogService, prefs, stateManager)), factory.createIconButton(StandardActions.DELETE_ENTRY, new EditAction(StandardActions.DELETE_ENTRY, this, stateManager)) ), @@ -753,7 +753,7 @@ private MenuBar createMenu() { // @formatter:off library.getItems().addAll( factory.createMenuItem(StandardActions.NEW_ENTRY, new NewEntryAction(this, dialogService, prefs, stateManager)), - factory.createMenuItem(StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, new ExtractBibtexAction(stateManager)), + factory.createMenuItem(StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, new ExtractBibtexAction(dialogService, prefs, stateManager)), factory.createMenuItem(StandardActions.DELETE_ENTRY, new EditAction(StandardActions.DELETE_ENTRY, this, stateManager)), new SeparatorMenuItem(), diff --git a/src/main/java/org/jabref/gui/JabRefMain.java b/src/main/java/org/jabref/gui/JabRefMain.java index ca1074ead05..2468cb94819 100644 --- a/src/main/java/org/jabref/gui/JabRefMain.java +++ b/src/main/java/org/jabref/gui/JabRefMain.java @@ -124,7 +124,7 @@ private static void applyPreferences(PreferencesService preferences) { Globals.journalAbbreviationRepository = JournalAbbreviationLoader.loadRepository(preferences.getJournalAbbreviationPreferences()); // Build list of Import and Export formats - Globals.IMPORT_FORMAT_READER.resetImportFormats(preferences.getImportSettingsPreferences(), preferences.getImportFormatPreferences(), + Globals.IMPORT_FORMAT_READER.resetImportFormats(preferences.getImporterPreferences(), preferences.getImportFormatPreferences(), preferences.getXmpPreferences(), Globals.getFileUpdateMonitor()); Globals.entryTypesManager.addCustomOrModifiedTypes(preferences.getBibEntryTypes(BibDatabaseMode.BIBTEX), preferences.getBibEntryTypes(BibDatabaseMode.BIBLATEX)); diff --git a/src/main/java/org/jabref/gui/bibtexextractor/BibtexExtractorViewModel.java b/src/main/java/org/jabref/gui/bibtexextractor/BibtexExtractorViewModel.java index 1e45cc5d989..aee3adde536 100644 --- a/src/main/java/org/jabref/gui/bibtexextractor/BibtexExtractorViewModel.java +++ b/src/main/java/org/jabref/gui/bibtexextractor/BibtexExtractorViewModel.java @@ -62,7 +62,7 @@ public StringProperty inputTextProperty() { } public void startParsing() { - if (preferencesService.getImportSettingsPreferences().isGrobidEnabled()) { + if (preferencesService.getImporterPreferences().isGrobidEnabled()) { parseUsingGrobid(); } else { parseUsingBibtexExtractor(); @@ -76,7 +76,7 @@ private void parseUsingBibtexExtractor() { } private void parseUsingGrobid() { - GrobidCitationFetcher grobidCitationFetcher = new GrobidCitationFetcher(preferencesService.getImportSettingsPreferences(), preferencesService.getImportFormatPreferences()); + GrobidCitationFetcher grobidCitationFetcher = new GrobidCitationFetcher(preferencesService.getImporterPreferences(), preferencesService.getImportFormatPreferences()); BackgroundTask.wrap(() -> grobidCitationFetcher.performSearch(inputTextProperty.getValue())) .onRunning(() -> dialogService.notify(Localization.lang("Your text is being parsed..."))) .onFailure((e) -> { diff --git a/src/main/java/org/jabref/gui/bibtexextractor/ExtractBibtexAction.java b/src/main/java/org/jabref/gui/bibtexextractor/ExtractBibtexAction.java index 86a080f73ff..ce198561af4 100644 --- a/src/main/java/org/jabref/gui/bibtexextractor/ExtractBibtexAction.java +++ b/src/main/java/org/jabref/gui/bibtexextractor/ExtractBibtexAction.java @@ -4,6 +4,7 @@ import org.jabref.gui.StateManager; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.importer.GrobidOptInDialogHelper; +import org.jabref.preferences.PreferencesService; import com.airhacks.afterburner.injection.Injector; @@ -11,14 +12,19 @@ public class ExtractBibtexAction extends SimpleCommand { - public ExtractBibtexAction(StateManager stateManager) { + PreferencesService preferencesService; + DialogService dialogService; + + public ExtractBibtexAction(DialogService dialogService, PreferencesService preferencesService, StateManager stateManager) { + this.preferencesService = preferencesService; + this.dialogService = dialogService; this.executable.bind(needsDatabase(stateManager)); } @Override public void execute() { DialogService dialogService = Injector.instantiateModelOrService(DialogService.class); - GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(dialogService); + GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(dialogService, preferencesService.getImporterPreferences()); dialogService.showCustomDialogAndWait(new ExtractBibtexDialog()); } } diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index 51822fc2adb..a64fea8cc7d 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -359,7 +359,7 @@ private void setupToolBar() { // Add menu for fetching bibliographic information ContextMenu fetcherMenu = new ContextMenu(); SortedSet entryBasedFetchers = WebFetchers.getEntryBasedFetchers( - preferencesService.getImportSettingsPreferences(), + preferencesService.getImporterPreferences(), preferencesService.getImportFormatPreferences(), preferencesService.getFilePreferences(), databaseContext, @@ -369,10 +369,10 @@ private void setupToolBar() { if (fetcher instanceof PdfMergeMetadataImporter.EntryBasedFetcherWrapper) { // Handle Grobid Opt-In in case of the PdfMergeMetadataImporter fetcherMenuItem.setOnAction(event -> { - GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(dialogService); + GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(dialogService, preferencesService.getImporterPreferences()); PdfMergeMetadataImporter.EntryBasedFetcherWrapper pdfMergeMetadataImporter = new PdfMergeMetadataImporter.EntryBasedFetcherWrapper( - preferencesService.getImportSettingsPreferences(), + preferencesService.getImporterPreferences(), preferencesService.getImportFormatPreferences(), preferencesService.getFilePreferences(), databaseContext, @@ -395,8 +395,8 @@ private void fetchAndMerge(EntryBasedFetcher fetcher) { public void setFocusToField(Field field) { DefaultTaskExecutor.runInJavaFXThread(() -> { for (Tab tab : tabbed.getTabs()) { - if ((tab instanceof FieldsEditorTab) && ((FieldsEditorTab) tab).getShownFields().contains(field)) { - FieldsEditorTab fieldsEditorTab = (FieldsEditorTab) tab; + if ((tab instanceof FieldsEditorTab fieldsEditorTab) && fieldsEditorTab.getShownFields() + .contains(field)) { tabbed.getSelectionModel().select(tab); fieldsEditorTab.requestFocus(field); } diff --git a/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java b/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java index 8cb13336e63..d42c9a3a02e 100644 --- a/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java +++ b/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java @@ -58,7 +58,7 @@ public ImportHandler(BibDatabaseContext database, this.linker = new ExternalFilesEntryLinker(externalFileTypes, preferencesService.getFilePreferences(), database); this.contentImporter = new ExternalFilesContentImporter( - preferencesService.getImportSettingsPreferences(), + preferencesService.getImporterPreferences(), preferencesService.getImportFormatPreferences()); this.undoManager = undoManager; } @@ -161,7 +161,7 @@ public void importEntries(List entries) { preferencesService.getTimestampPreferences()); // Generate citation keys - if (preferencesService.getImportSettingsPreferences().generateNewKeyOnImport()) { + if (preferencesService.getImporterPreferences().isGenerateNewKeyOnImport()) { generateKeys(entries); } @@ -171,8 +171,7 @@ public void importEntries(List entries) { private void addToGroups(List entries, Collection groups) { for (GroupTreeNode node : groups) { - if (node.getGroup() instanceof GroupEntryChanger) { - GroupEntryChanger entryChanger = (GroupEntryChanger) node.getGroup(); + if (node.getGroup() instanceof GroupEntryChanger entryChanger) { List undo = entryChanger.add(entries); // TODO: Add undo // if (!undo.isEmpty()) { diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 8e275a61921..af72d5c6482 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -552,7 +552,9 @@ public void parsePdfMetadataAndShowMergeDialog() { dialog.addSource(Localization.lang("Entry"), entry); dialog.addSource(Localization.lang("Verbatim"), wrapImporterToSupplier(new PdfVerbatimBibTextImporter(preferences.getImportFormatPreferences()), filePath)); dialog.addSource(Localization.lang("Embedded"), wrapImporterToSupplier(new PdfEmbeddedBibFileImporter(preferences.getImportFormatPreferences()), filePath)); - dialog.addSource("Grobid", wrapImporterToSupplier(new PdfGrobidImporter(preferences.getImportSettingsPreferences(), preferences.getImportFormatPreferences()), filePath)); + if (preferences.getImporterPreferences().isGrobidEnabled()) { + dialog.addSource("Grobid", wrapImporterToSupplier(new PdfGrobidImporter(preferences.getImporterPreferences(), preferences.getImportFormatPreferences()), filePath)); + } dialog.addSource(Localization.lang("XMP metadata"), wrapImporterToSupplier(new PdfXmpImporter(preferences.getXmpPreferences()), filePath)); dialog.addSource(Localization.lang("Content"), wrapImporterToSupplier(new PdfContentImporter(preferences.getImportFormatPreferences()), filePath)); dialog.showAndWait().ifPresent(newEntry -> { diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 138e4ecec13..a13eeb6a310 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -185,7 +185,7 @@ private Node createFileDisplay(LinkedFileViewModel linkedFile) { parsePdfMetadata.setTooltip(new Tooltip(Localization.lang("Parse Metadata from PDF."))); parsePdfMetadata.visibleProperty().bind(linkedFile.isOfflinePdfProperty()); parsePdfMetadata.setOnAction(event -> { - GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(dialogService); + GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(dialogService, preferencesService.getImporterPreferences()); linkedFile.parsePdfMetadataAndShowMergeDialog(); }); parsePdfMetadata.getStyleClass().setAll("icon-button"); diff --git a/src/main/java/org/jabref/gui/importer/GrobidOptInDialogHelper.java b/src/main/java/org/jabref/gui/importer/GrobidOptInDialogHelper.java index 84ad1db02cf..4809acfc5a2 100644 --- a/src/main/java/org/jabref/gui/importer/GrobidOptInDialogHelper.java +++ b/src/main/java/org/jabref/gui/importer/GrobidOptInDialogHelper.java @@ -1,9 +1,8 @@ package org.jabref.gui.importer; import org.jabref.gui.DialogService; -import org.jabref.gui.Globals; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.l10n.Localization; -import org.jabref.preferences.PreferencesService; /** * Metadata extraction from PDFs and plaintext works very well using Grobid, but we do not want to enable it by default @@ -18,21 +17,19 @@ public class GrobidOptInDialogHelper { * @param dialogService the DialogService to use * @return if the user enabled Grobid, either in the past or after being asked by the dialog. */ - public static boolean showAndWaitIfUserIsUndecided(DialogService dialogService) { - PreferencesService preferences = Globals.prefs; - if (preferences.getImportSettingsPreferences().isGrobidEnabled()) { + public static boolean showAndWaitIfUserIsUndecided(DialogService dialogService, ImporterPreferences preferences) { + if (preferences.isGrobidEnabled()) { return true; } - if (preferences.getImportSettingsPreferences().isGrobidOptOut()) { + if (preferences.isGrobidOptOut()) { return false; } boolean grobidEnabled = dialogService.showConfirmationDialogWithOptOutAndWait( Localization.lang("Remote services"), Localization.lang("Allow sending PDF files and raw citation strings to a JabRef online service (Grobid) to determine Metadata. This produces better results."), Localization.lang("Do not ask again"), - (optOut) -> preferences.storeImportSettingsPreferences(preferences.getImportSettingsPreferences().withGrobidOptOut(optOut)) - ); - preferences.storeImportSettingsPreferences(preferences.getImportSettingsPreferences().withGrobidEnabled(grobidEnabled)); + (optOut) -> preferences.grobidOptOutProperty().setValue(optOut)); + preferences.grobidEnabledProperty().setValue(grobidEnabled); return grobidEnabled; } } diff --git a/src/main/java/org/jabref/gui/importer/ImportAction.java b/src/main/java/org/jabref/gui/importer/ImportAction.java index e67b9ed94b0..9d91d07839d 100644 --- a/src/main/java/org/jabref/gui/importer/ImportAction.java +++ b/src/main/java/org/jabref/gui/importer/ImportAction.java @@ -117,8 +117,8 @@ private List doImport(List files) if (importer.isEmpty()) { // Unknown format: DefaultTaskExecutor.runAndWaitInJavaFXThread(() -> { - if (fileIsPdf(filename) && GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(frame.getDialogService())) { - Globals.IMPORT_FORMAT_READER.resetImportFormats(prefs.getImportSettingsPreferences(), prefs.getImportFormatPreferences(), prefs.getXmpPreferences(), Globals.getFileUpdateMonitor()); + if (fileIsPdf(filename) && GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(frame.getDialogService(), prefs.getImporterPreferences())) { + Globals.IMPORT_FORMAT_READER.resetImportFormats(prefs.getImporterPreferences(), prefs.getImportFormatPreferences(), prefs.getXmpPreferences(), Globals.getFileUpdateMonitor()); } frame.getDialogService().notify(Localization.lang("Importing in unknown format") + "..."); }); @@ -126,8 +126,8 @@ private List doImport(List files) imports.add(Globals.IMPORT_FORMAT_READER.importUnknownFormat(filename, Globals.getFileUpdateMonitor())); } else { DefaultTaskExecutor.runAndWaitInJavaFXThread(() -> { - if (importer.get() instanceof PdfGrobidImporter || importer.get() instanceof PdfMergeMetadataImporter && GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(frame.getDialogService())) { - Globals.IMPORT_FORMAT_READER.resetImportFormats(prefs.getImportSettingsPreferences(), prefs.getImportFormatPreferences(), prefs.getXmpPreferences(), Globals.getFileUpdateMonitor()); + if (importer.get() instanceof PdfGrobidImporter || importer.get() instanceof PdfMergeMetadataImporter && GrobidOptInDialogHelper.showAndWaitIfUserIsUndecided(frame.getDialogService(), prefs.getImporterPreferences())) { + Globals.IMPORT_FORMAT_READER.resetImportFormats(prefs.getImporterPreferences(), prefs.getImportFormatPreferences(), prefs.getXmpPreferences(), Globals.getFileUpdateMonitor()); } frame.getDialogService().notify(Localization.lang("Importing in %0 format", importer.get().getName()) + "..."); }); diff --git a/src/main/java/org/jabref/gui/preferences/appearance/AppearanceTabViewModel.java b/src/main/java/org/jabref/gui/preferences/appearance/AppearanceTabViewModel.java index e67f7cc0c20..bf57b813a4f 100644 --- a/src/main/java/org/jabref/gui/preferences/appearance/AppearanceTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/appearance/AppearanceTabViewModel.java @@ -41,7 +41,7 @@ public class AppearanceTabViewModel implements PreferenceTabViewModel { private final DialogService dialogService; private final PreferencesService preferences; - private final AppearancePreferences initialAppearancePreferences; + private final AppearancePreferences appearancePreferences; private final Validator fontSizeValidator; private final Validator customPathToThemeValidator; @@ -51,7 +51,7 @@ public class AppearanceTabViewModel implements PreferenceTabViewModel { public AppearanceTabViewModel(DialogService dialogService, PreferencesService preferences) { this.dialogService = dialogService; this.preferences = preferences; - this.initialAppearancePreferences = preferences.getAppearancePreferences(); + this.appearancePreferences = preferences.getAppearancePreferences(); fontSizeValidator = new FunctionBasedValidator<>( fontSizeProperty, @@ -78,10 +78,10 @@ public AppearanceTabViewModel(DialogService dialogService, PreferencesService pr @Override public void setValues() { - fontOverrideProperty.setValue(initialAppearancePreferences.shouldOverrideDefaultFontSize()); - fontSizeProperty.setValue(String.valueOf(initialAppearancePreferences.getMainFontSize())); + fontOverrideProperty.setValue(appearancePreferences.shouldOverrideDefaultFontSize()); + fontSizeProperty.setValue(String.valueOf(appearancePreferences.getMainFontSize())); - Theme currentTheme = initialAppearancePreferences.getTheme(); + Theme currentTheme = appearancePreferences.getTheme(); if (currentTheme.getType() == Theme.Type.LIGHT) { themeLightProperty.setValue(true); themeDarkProperty.setValue(false); @@ -100,35 +100,34 @@ public void setValues() { @Override public void storeSettings() { - if (initialAppearancePreferences.shouldOverrideDefaultFontSize() != fontOverrideProperty.getValue()) { + if (appearancePreferences.shouldOverrideDefaultFontSize() != fontOverrideProperty.getValue()) { restartWarnings.add(Localization.lang("Override font settings")); } int newFontSize = Integer.parseInt(fontSizeProperty.getValue()); - if (initialAppearancePreferences.getMainFontSize() != newFontSize) { + if (appearancePreferences.getMainFontSize() != newFontSize) { restartWarnings.add(Localization.lang("Override font size")); } - Theme newTheme = initialAppearancePreferences.getTheme(); - if (themeLightProperty.getValue() && initialAppearancePreferences.getTheme().getType() != Theme.Type.LIGHT) { + Theme newTheme = appearancePreferences.getTheme(); + if (themeLightProperty.getValue() && appearancePreferences.getTheme().getType() != Theme.Type.LIGHT) { restartWarnings.add(Localization.lang("Theme changed to light theme.")); newTheme = new Theme("", preferences); - } else if (themeDarkProperty.getValue() && initialAppearancePreferences.getTheme().getType() != Theme.Type.DARK) { + } else if (themeDarkProperty.getValue() && appearancePreferences.getTheme().getType() != Theme.Type.DARK) { restartWarnings.add(Localization.lang("Theme changed to dark theme.")); newTheme = new Theme(EMBEDDED_DARK_THEME_CSS, preferences); } else if (themeCustomProperty.getValue() && - (!initialAppearancePreferences.getTheme().getCssPathString() - .equalsIgnoreCase(customPathToThemeProperty.getValue()) - || initialAppearancePreferences.getTheme().getType() != Theme.Type.CUSTOM)) { + (!appearancePreferences.getTheme().getCssPathString() + .equalsIgnoreCase(customPathToThemeProperty.getValue()) + || appearancePreferences.getTheme().getType() != Theme.Type.CUSTOM)) { restartWarnings.add(Localization.lang("Theme changed to a custom theme:") + " " + customPathToThemeProperty().getValue()); newTheme = new Theme(customPathToThemeProperty.getValue(), preferences); } - preferences.storeAppearancePreference(new AppearancePreferences( - fontOverrideProperty.getValue(), - newFontSize, - newTheme)); + appearancePreferences.setShouldOverrideDefaultFontSize(fontOverrideProperty.getValue()); + appearancePreferences.setMainFontSize(newFontSize); + appearancePreferences.setTheme(newTheme); preferences.updateTheme(); } diff --git a/src/main/java/org/jabref/gui/preferences/customimporter/CustomImporterTabViewModel.java b/src/main/java/org/jabref/gui/preferences/customimporter/CustomImporterTabViewModel.java index a0cb014e5d3..f6a1b3a5c0c 100644 --- a/src/main/java/org/jabref/gui/preferences/customimporter/CustomImporterTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/customimporter/CustomImporterTabViewModel.java @@ -54,7 +54,7 @@ public void storeSettings() { .map(ImporterViewModel::getLogic) .collect(Collectors.toSet())); Globals.IMPORT_FORMAT_READER.resetImportFormats( - preferences.getImportSettingsPreferences(), + preferences.getImporterPreferences(), preferences.getImportFormatPreferences(), preferences.getXmpPreferences(), Globals.getFileUpdateMonitor()); diff --git a/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java b/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java index 2fe9eaf4913..94d3a082c37 100644 --- a/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java @@ -15,7 +15,7 @@ import org.jabref.gui.commonfxcontrols.SortCriterionViewModel; import org.jabref.gui.preferences.PreferenceTabViewModel; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.preferences.DOIPreferences; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; @@ -41,19 +41,19 @@ public class ImportExportTabViewModel implements PreferenceTabViewModel { private final PreferencesService preferencesService; private final DOIPreferences initialDOIPreferences; - private final ImportSettingsPreferences initialImportSettingsPreferences; + private final ImporterPreferences importerPreferences; private final SaveOrderConfig initialExportOrder; public ImportExportTabViewModel(PreferencesService preferencesService) { this.preferencesService = preferencesService; - this.initialImportSettingsPreferences = preferencesService.getImportSettingsPreferences(); + this.importerPreferences = preferencesService.getImporterPreferences(); this.initialDOIPreferences = preferencesService.getDOIPreferences(); this.initialExportOrder = preferencesService.getExportSaveOrder(); } @Override public void setValues() { - generateKeyOnImportProperty.setValue(initialImportSettingsPreferences.generateNewKeyOnImport()); + generateKeyOnImportProperty.setValue(importerPreferences.isGenerateNewKeyOnImport()); useCustomDOIProperty.setValue(initialDOIPreferences.isUseCustom()); useCustomDOINameProperty.setValue(initialDOIPreferences.getDefaultBaseURI()); @@ -71,14 +71,16 @@ public void setValues() { .map(SortCriterionViewModel::new) .collect(Collectors.toList())); - grobidEnabledProperty.setValue(initialImportSettingsPreferences.isGrobidEnabled()); - grobidURLProperty.setValue(initialImportSettingsPreferences.getGrobidURL()); + grobidEnabledProperty.setValue(importerPreferences.isGrobidEnabled()); + grobidURLProperty.setValue(importerPreferences.getGrobidURL()); } @Override public void storeSettings() { - preferencesService.storeImportSettingsPreferences(new ImportSettingsPreferences( - generateKeyOnImportProperty.getValue(), grobidEnabledProperty.getValue(), preferencesService.getImportSettingsPreferences().isGrobidOptOut(), grobidURLProperty.getValue())); + importerPreferences.setGenerateNewKeyOnImport(generateKeyOnImportProperty.getValue()); + importerPreferences.setGrobidEnabled(grobidEnabledProperty.getValue()); + importerPreferences.setGrobidOptOut(importerPreferences.isGrobidOptOut()); + importerPreferences.setGrobidURL(grobidURLProperty.getValue()); preferencesService.storeDOIPreferences(new DOIPreferences( useCustomDOIProperty.getValue(), diff --git a/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java b/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java index e2c21050c34..7c0265bc8a6 100644 --- a/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java +++ b/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java @@ -5,25 +5,25 @@ import java.nio.file.Path; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.OpenDatabase; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.model.util.FileUpdateMonitor; public class ExternalFilesContentImporter { - private final ImportSettingsPreferences importSettingsPreferences; + private final ImporterPreferences importerPreferences; private final ImportFormatPreferences importFormatPreferences; - public ExternalFilesContentImporter(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences importFormatPreferences) { - this.importSettingsPreferences = importSettingsPreferences; + public ExternalFilesContentImporter(ImporterPreferences importerPreferences, ImportFormatPreferences importFormatPreferences) { + this.importerPreferences = importerPreferences; this.importFormatPreferences = importFormatPreferences; } public ParserResult importPDFContent(Path file) { try { - return new PdfMergeMetadataImporter(importSettingsPreferences, importFormatPreferences).importDatabase(file, StandardCharsets.UTF_8); + return new PdfMergeMetadataImporter(importerPreferences, importFormatPreferences).importDatabase(file, StandardCharsets.UTF_8); } catch (IOException e) { return ParserResult.fromError(e); } diff --git a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java index 92ce2a7848b..57ed4b8c039 100644 --- a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java +++ b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java @@ -31,7 +31,6 @@ import org.jabref.logic.importer.fileformat.RepecNepImporter; import org.jabref.logic.importer.fileformat.RisImporter; import org.jabref.logic.importer.fileformat.SilverPlatterImporter; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.database.BibDatabases; @@ -51,7 +50,7 @@ public class ImportFormatReader { private ImportFormatPreferences importFormatPreferences; - public void resetImportFormats(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences newImportFormatPreferences, XmpPreferences xmpPreferences, FileUpdateMonitor fileMonitor) { + public void resetImportFormats(ImporterPreferences importerPreferences, ImportFormatPreferences newImportFormatPreferences, XmpPreferences xmpPreferences, FileUpdateMonitor fileMonitor) { this.importFormatPreferences = newImportFormatPreferences; formats.clear(); @@ -67,12 +66,12 @@ public void resetImportFormats(ImportSettingsPreferences importSettingsPreferenc formats.add(new ModsImporter(importFormatPreferences)); formats.add(new MsBibImporter()); formats.add(new OvidImporter()); - formats.add(new PdfMergeMetadataImporter(importSettingsPreferences, importFormatPreferences)); + formats.add(new PdfMergeMetadataImporter(importerPreferences, importFormatPreferences)); formats.add(new PdfVerbatimBibTextImporter(importFormatPreferences)); formats.add(new PdfContentImporter(importFormatPreferences)); formats.add(new PdfEmbeddedBibFileImporter(importFormatPreferences)); - if (importSettingsPreferences.isGrobidEnabled()) { - formats.add(new PdfGrobidImporter(importSettingsPreferences, importFormatPreferences)); + if (importerPreferences.isGrobidEnabled()) { + formats.add(new PdfGrobidImporter(importerPreferences, importFormatPreferences)); } formats.add(new PdfXmpImporter(xmpPreferences)); formats.add(new RepecNepImporter(importFormatPreferences)); @@ -106,7 +105,7 @@ private Optional getByCliId(String cliId) { public ParserResult importFromFile(String format, Path file) throws ImportException { Optional importer = getByCliId(format); - if (!importer.isPresent()) { + if (importer.isEmpty()) { throw new ImportException(Localization.lang("Unknown import format") + ": " + format); } diff --git a/src/main/java/org/jabref/logic/importer/ImporterPreferences.java b/src/main/java/org/jabref/logic/importer/ImporterPreferences.java new file mode 100644 index 00000000000..d2da57015f6 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/ImporterPreferences.java @@ -0,0 +1,69 @@ +package org.jabref.logic.importer; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +public class ImporterPreferences { + + private final BooleanProperty generateNewKeyOnImport; + private final BooleanProperty grobidEnabled; + private final BooleanProperty grobidOptOut; + private final StringProperty grobidURL; + + public ImporterPreferences(boolean generateNewKeyOnImport, boolean grobidEnabled, boolean grobidOptOut, String grobidURL) { + this.generateNewKeyOnImport = new SimpleBooleanProperty(generateNewKeyOnImport); + this.grobidEnabled = new SimpleBooleanProperty(grobidEnabled); + this.grobidOptOut = new SimpleBooleanProperty(grobidOptOut); + this.grobidURL = new SimpleStringProperty(grobidURL); + } + + public boolean isGenerateNewKeyOnImport() { + return generateNewKeyOnImport.get(); + } + + public BooleanProperty generateNewKeyOnImportProperty() { + return generateNewKeyOnImport; + } + + public boolean isGrobidEnabled() { + return grobidEnabled.get(); + } + + public BooleanProperty grobidEnabledProperty() { + return grobidEnabled; + } + + public boolean isGrobidOptOut() { + return grobidOptOut.get(); + } + + public BooleanProperty grobidOptOutProperty() { + return grobidOptOut; + } + + public String getGrobidURL() { + return grobidURL.get(); + } + + public StringProperty grobidURLProperty() { + return grobidURL; + } + + public void setGenerateNewKeyOnImport(boolean generateNewKeyOnImport) { + this.generateNewKeyOnImport.set(generateNewKeyOnImport); + } + + public void setGrobidEnabled(boolean grobidEnabled) { + this.grobidEnabled.set(grobidEnabled); + } + + public void setGrobidOptOut(boolean grobidOptOut) { + this.grobidOptOut.set(grobidOptOut); + } + + public void setGrobidURL(String grobidURL) { + this.grobidURL.set(grobidURL); + } +} diff --git a/src/main/java/org/jabref/logic/importer/WebFetchers.java b/src/main/java/org/jabref/logic/importer/WebFetchers.java index 617393abd35..7ad07379070 100644 --- a/src/main/java/org/jabref/logic/importer/WebFetchers.java +++ b/src/main/java/org/jabref/logic/importer/WebFetchers.java @@ -39,7 +39,6 @@ import org.jabref.logic.importer.fetcher.TitleFetcher; import org.jabref.logic.importer.fetcher.ZbMATH; import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.StandardField; @@ -138,7 +137,7 @@ public static SortedSet getIdBasedFetchers(ImportFormatPreferenc /** * @return sorted set containing entry based fetchers */ - public static SortedSet getEntryBasedFetchers(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences importFormatPreferences, FilePreferences filePreferences, BibDatabaseContext databaseContext, Charset defaultEncoding) { + public static SortedSet getEntryBasedFetchers(ImporterPreferences importerPreferences, ImportFormatPreferences importFormatPreferences, FilePreferences filePreferences, BibDatabaseContext databaseContext, Charset defaultEncoding) { SortedSet set = new TreeSet<>(Comparator.comparing(WebFetcher::getName)); set.add(new AstrophysicsDataSystem(importFormatPreferences)); set.add(new DoiFetcher(importFormatPreferences)); @@ -146,7 +145,7 @@ public static SortedSet getEntryBasedFetchers(ImportSettingsP set.add(new MathSciNet(importFormatPreferences)); set.add(new CrossRef()); set.add(new ZbMATH(importFormatPreferences)); - set.add(new PdfMergeMetadataImporter.EntryBasedFetcherWrapper(importSettingsPreferences, importFormatPreferences, filePreferences, databaseContext, defaultEncoding)); + set.add(new PdfMergeMetadataImporter.EntryBasedFetcherWrapper(importerPreferences, importFormatPreferences, filePreferences, databaseContext, defaultEncoding)); return set; } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java index 7f6ff838cdf..4dccde35980 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java @@ -10,9 +10,9 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.SearchBasedFetcher; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.importer.util.GrobidService; import org.jabref.model.entry.BibEntry; @@ -27,8 +27,8 @@ public class GrobidCitationFetcher implements SearchBasedFetcher { private ImportFormatPreferences importFormatPreferences; private GrobidService grobidService; - public GrobidCitationFetcher(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences importFormatPreferences) { - this(importFormatPreferences, new GrobidService(importSettingsPreferences)); + public GrobidCitationFetcher(ImporterPreferences importerPreferences, ImportFormatPreferences importFormatPreferences) { + this(importFormatPreferences, new GrobidService(importerPreferences)); } GrobidCitationFetcher(ImportFormatPreferences importFormatPreferences, GrobidService grobidService) { diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java index 37b848aa823..6b680640d1a 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java @@ -10,8 +10,8 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.ParserResult; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.importer.util.GrobidService; import org.jabref.logic.util.StandardFileType; import org.jabref.model.entry.BibEntry; @@ -26,8 +26,8 @@ public class PdfGrobidImporter extends Importer { private final GrobidService grobidService; private final ImportFormatPreferences importFormatPreferences; - public PdfGrobidImporter(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences importFormatPreferences) { - this.grobidService = new GrobidService(importSettingsPreferences); + public PdfGrobidImporter(ImporterPreferences importerPreferences, ImportFormatPreferences importFormatPreferences) { + this.grobidService = new GrobidService(importerPreferences); this.importFormatPreferences = importFormatPreferences; } diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java index fa3e79e5b06..9d8e62cd08a 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java @@ -16,10 +16,10 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.fetcher.DoiFetcher; import org.jabref.logic.importer.fetcher.IsbnFetcher; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.importer.util.FileFieldParser; import org.jabref.logic.util.StandardFileType; import org.jabref.model.database.BibDatabaseContext; @@ -42,13 +42,13 @@ public class PdfMergeMetadataImporter extends Importer { private final List metadataImporters; private final ImportFormatPreferences importFormatPreferences; - public PdfMergeMetadataImporter(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences importFormatPreferences) { + public PdfMergeMetadataImporter(ImporterPreferences importerPreferences, ImportFormatPreferences importFormatPreferences) { this.importFormatPreferences = importFormatPreferences; this.metadataImporters = new ArrayList<>(); this.metadataImporters.add(new PdfVerbatimBibTextImporter(importFormatPreferences)); this.metadataImporters.add(new PdfEmbeddedBibFileImporter(importFormatPreferences)); - if (importSettingsPreferences.isGrobidEnabled()) { - this.metadataImporters.add(new PdfGrobidImporter(importSettingsPreferences, importFormatPreferences)); + if (importerPreferences.isGrobidEnabled()) { + this.metadataImporters.add(new PdfGrobidImporter(importerPreferences, importFormatPreferences)); } this.metadataImporters.add(new PdfXmpImporter(importFormatPreferences.getXmpPreferences())); this.metadataImporters.add(new PdfContentImporter(importFormatPreferences)); @@ -91,14 +91,14 @@ public ParserResult importDatabase(Path filePath, Charset defaultEncoding) throw for (BibEntry candidate : candidates) { if (candidate.hasField(StandardField.DOI)) { try { - new DoiFetcher(importFormatPreferences).performSearchById(candidate.getField(StandardField.DOI).get()).ifPresent((fromDoi) -> fetchedCandidates.add(fromDoi)); + new DoiFetcher(importFormatPreferences).performSearchById(candidate.getField(StandardField.DOI).get()).ifPresent(fetchedCandidates::add); } catch (FetcherException e) { LOGGER.error("Fetching failed for DOI \"{}\".", candidate.getField(StandardField.DOI).get(), e); } } if (candidate.hasField(StandardField.ISBN)) { try { - new IsbnFetcher(importFormatPreferences).performSearchById(candidate.getField(StandardField.ISBN).get()).ifPresent((fromISBN) -> fetchedCandidates.add(fromISBN)); + new IsbnFetcher(importFormatPreferences).performSearchById(candidate.getField(StandardField.ISBN).get()).ifPresent(fetchedCandidates::add); } catch (FetcherException e) { LOGGER.error("Fetching failed for ISBN \"{}\".", candidate.getField(StandardField.ISBN).get(), e); } @@ -115,7 +115,7 @@ public ParserResult importDatabase(Path filePath, Charset defaultEncoding) throw // Don't merge FILE fields that point to a stored file as we set that to filePath anyway. // Nevertheless, retain online links. if (StandardField.FILE.equals(fieldEntry.getKey()) && - !FileFieldParser.parse(fieldEntry.getValue()).stream().anyMatch((linkedFile) -> linkedFile.isOnlineLink())) { + FileFieldParser.parse(fieldEntry.getValue()).stream().noneMatch(LinkedFile::isOnlineLink)) { continue; } // Only overwrite non-present fields @@ -151,8 +151,8 @@ public static class EntryBasedFetcherWrapper extends PdfMergeMetadataImporter im private final BibDatabaseContext databaseContext; private final Charset defaultEncoding; - public EntryBasedFetcherWrapper(ImportSettingsPreferences importSettingsPreferences, ImportFormatPreferences importFormatPreferences, FilePreferences filePreferences, BibDatabaseContext context, Charset defaultEncoding) { - super(importSettingsPreferences, importFormatPreferences); + public EntryBasedFetcherWrapper(ImporterPreferences importerPreferences, ImportFormatPreferences importFormatPreferences, FilePreferences filePreferences, BibDatabaseContext context, Charset defaultEncoding) { + super(importerPreferences, importFormatPreferences); this.filePreferences = filePreferences; this.databaseContext = context; this.defaultEncoding = defaultEncoding; diff --git a/src/main/java/org/jabref/logic/importer/importsettings/ImportSettingsPreferences.java b/src/main/java/org/jabref/logic/importer/importsettings/ImportSettingsPreferences.java deleted file mode 100644 index 535e5efb514..00000000000 --- a/src/main/java/org/jabref/logic/importer/importsettings/ImportSettingsPreferences.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.jabref.logic.importer.importsettings; - -public class ImportSettingsPreferences { - - private final boolean shouldGenerateNewKeyOnImport; - private final boolean grobidEnabled; - private final boolean grobidOptOut; - private final String grobidURL; - - public ImportSettingsPreferences(boolean shouldGenerateNewKeyOnImport, boolean grobidEnabled, boolean grobidOptOut, String grobidURL) { - this.shouldGenerateNewKeyOnImport = shouldGenerateNewKeyOnImport; - this.grobidEnabled = grobidEnabled; - this.grobidOptOut = grobidOptOut; - this.grobidURL = grobidURL; - } - - public boolean generateNewKeyOnImport() { - return shouldGenerateNewKeyOnImport; - } - - public boolean isGrobidEnabled() { - return grobidEnabled; - } - - public boolean isGrobidOptOut() { - return grobidOptOut; - } - - public String getGrobidURL() { - return grobidURL; - } - - public ImportSettingsPreferences withGrobidEnabled(boolean grobidEnabled) { - return new ImportSettingsPreferences(shouldGenerateNewKeyOnImport, grobidEnabled, grobidOptOut, grobidURL); - } - - public ImportSettingsPreferences withGrobidOptOut(boolean grobidOptOut) { - return new ImportSettingsPreferences(shouldGenerateNewKeyOnImport, grobidEnabled, grobidOptOut, grobidURL); - } -} diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index f381c54a8a0..fb465bad592 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -7,9 +7,9 @@ import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.fileformat.BibtexParser; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.model.entry.BibEntry; import org.jabref.model.util.DummyFileUpdateMonitor; @@ -41,11 +41,11 @@ public int getCode() { } } - private final ImportSettingsPreferences importSettingsPreferences; + private final ImporterPreferences importerPreferences; - public GrobidService(ImportSettingsPreferences importSettingsPreferences) { - this.importSettingsPreferences = importSettingsPreferences; - if (!importSettingsPreferences.isGrobidEnabled()) { + public GrobidService(ImporterPreferences importerPreferences) { + this.importerPreferences = importerPreferences; + if (!importerPreferences.isGrobidEnabled()) { throw new UnsupportedOperationException("Grobid was used but not enabled."); } } @@ -57,7 +57,7 @@ public GrobidService(ImportSettingsPreferences importSettingsPreferences) { * @throws IOException if an I/O excecption during the call ocurred or no BibTeX entry could be determiend */ public Optional processCitation(String rawCitation, ImportFormatPreferences importFormatPreferences, ConsolidateCitations consolidateCitations) throws IOException, ParseException { - Connection.Response response = Jsoup.connect(importSettingsPreferences.getGrobidURL() + "/api/processCitation") + Connection.Response response = Jsoup.connect(importerPreferences.getGrobidURL() + "/api/processCitation") .header("Accept", MediaTypes.APPLICATION_BIBTEX) .data("citations", rawCitation) .data("consolidateCitations", String.valueOf(consolidateCitations.getCode())) @@ -75,7 +75,7 @@ public Optional processCitation(String rawCitation, ImportFormatPrefer } public List processPDF(Path filePath, ImportFormatPreferences importFormatPreferences) throws IOException, ParseException { - Connection.Response response = Jsoup.connect(importSettingsPreferences.getGrobidURL() + "/api/processHeaderDocument") + Connection.Response response = Jsoup.connect(importerPreferences.getGrobidURL() + "/api/processHeaderDocument") .header("Accept", MediaTypes.APPLICATION_BIBTEX) .data("input", filePath.toString(), Files.newInputStream(filePath)) .method(Connection.Method.POST) @@ -91,7 +91,7 @@ public List processPDF(Path filePath, ImportFormatPreferences importFo BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); List result = parser.parseEntries(httpResponse); - result.stream().forEach((entry) -> entry.setCitationKey("")); + result.forEach((entry) -> entry.setCitationKey("")); return result; } } diff --git a/src/main/java/org/jabref/preferences/AppearancePreferences.java b/src/main/java/org/jabref/preferences/AppearancePreferences.java index 09b399536c6..c0becda5194 100644 --- a/src/main/java/org/jabref/preferences/AppearancePreferences.java +++ b/src/main/java/org/jabref/preferences/AppearancePreferences.java @@ -1,27 +1,58 @@ package org.jabref.preferences; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleObjectProperty; + import org.jabref.gui.util.Theme; public class AppearancePreferences { - private final boolean shouldOverrideDefaultFontSize; - private final int mainFontSize; - private final Theme theme; + private final BooleanProperty shouldOverrideDefaultFontSize; + private final IntegerProperty mainFontSize; + private final ObjectProperty theme; public AppearancePreferences(boolean shouldOverrideDefaultFontSize, int mainFontSize, Theme theme) { - this.shouldOverrideDefaultFontSize = shouldOverrideDefaultFontSize; - this.mainFontSize = mainFontSize; - this.theme = theme; + this.shouldOverrideDefaultFontSize = new SimpleBooleanProperty(shouldOverrideDefaultFontSize); + this.mainFontSize = new SimpleIntegerProperty(mainFontSize); + this.theme = new SimpleObjectProperty<>(theme); } public boolean shouldOverrideDefaultFontSize() { + return shouldOverrideDefaultFontSize.get(); + } + + public void setShouldOverrideDefaultFontSize(boolean newValue) { + shouldOverrideDefaultFontSize.set(newValue); + } + + public BooleanProperty shouldOverrideDefaultFontSizeProperty() { return shouldOverrideDefaultFontSize; } public int getMainFontSize() { + return mainFontSize.get(); + } + + public void setMainFontSize(int mainFontSize) { + this.mainFontSize.set(mainFontSize); + } + + public IntegerProperty mainFontSizeProperty() { return mainFontSize; } public Theme getTheme() { + return theme.get(); + } + + public void setTheme(Theme theme) { + this.theme.set(theme); + } + + public ObjectProperty themeProperty() { return theme; } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index f3773c5526d..602f237630d 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -68,9 +68,9 @@ import org.jabref.logic.exporter.SavePreferences; import org.jabref.logic.exporter.TemplateExporter; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.fetcher.DoiFetcher; import org.jabref.logic.importer.fileformat.CustomImporter; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.journals.JournalAbbreviationPreferences; import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.l10n.Language; @@ -108,6 +108,7 @@ import org.jabref.model.push.PushToApplicationConstants; import org.jabref.model.strings.StringUtil; +import com.tobiasdiez.easybind.EasyBind; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -414,6 +415,8 @@ public class JabRefPreferences implements PreferencesService { private Theme globalTheme; private Set customImporters; private String userName; + private AppearancePreferences appearancePreferences; + private ImporterPreferences importerPreferences; // The constructor is made private to enforce this as a singleton class: private JabRefPreferences() { @@ -1991,17 +1994,21 @@ public void updateTheme() { @Override public AppearancePreferences getAppearancePreferences() { - return new AppearancePreferences( + if (appearancePreferences != null) { + return appearancePreferences; + } + + appearancePreferences = new AppearancePreferences( getBoolean(OVERRIDE_DEFAULT_FONT_SIZE), getInt(MAIN_FONT_SIZE), - getTheme()); - } + getTheme() + ); - @Override - public void storeAppearancePreference(AppearancePreferences preferences) { - putBoolean(OVERRIDE_DEFAULT_FONT_SIZE, preferences.shouldOverrideDefaultFontSize()); - putInt(MAIN_FONT_SIZE, preferences.getMainFontSize()); - put(FX_THEME, preferences.getTheme().getCssPathString()); + EasyBind.subscribe(appearancePreferences.shouldOverrideDefaultFontSizeProperty(), newValue -> putBoolean(OVERRIDE_DEFAULT_FONT_SIZE, newValue)); + EasyBind.subscribe(appearancePreferences.mainFontSizeProperty(), newValue -> putInt(MAIN_FONT_SIZE, newValue)); + EasyBind.subscribe(appearancePreferences.themeProperty(), newValue -> put(FX_THEME, newValue.getCssPathString())); + + return appearancePreferences; } //************************************************************************************************************* @@ -2716,24 +2723,23 @@ public void storeProtectedTermsPreferences(ProtectedTermsPreferences preferences } //************************************************************************************************************* - // Import preferences + // Importer preferences //************************************************************************************************************* @Override - public void storeImportSettingsPreferences(ImportSettingsPreferences preferences) { - putBoolean(GENERATE_KEY_ON_IMPORT, preferences.generateNewKeyOnImport()); - putBoolean(GROBID_ENABLED, preferences.isGrobidEnabled()); - putBoolean(GROBID_OPT_OUT, preferences.isGrobidOptOut()); - put(GROBID_URL, preferences.getGrobidURL()); - } - - @Override - public ImportSettingsPreferences getImportSettingsPreferences() { - return new ImportSettingsPreferences( + public ImporterPreferences getImporterPreferences() { + importerPreferences = Objects.requireNonNullElseGet(importerPreferences, () -> new ImporterPreferences( getBoolean(GENERATE_KEY_ON_IMPORT), getBoolean(GROBID_ENABLED), getBoolean(GROBID_OPT_OUT), get(GROBID_URL) - ); + )); + + EasyBind.subscribe(importerPreferences.generateNewKeyOnImportProperty(), newValue -> putBoolean(GENERATE_KEY_ON_IMPORT, newValue)); + EasyBind.subscribe(importerPreferences.grobidEnabledProperty(), newValue -> putBoolean(GROBID_ENABLED, newValue)); + EasyBind.subscribe(importerPreferences.grobidOptOutProperty(), newValue -> putBoolean(GROBID_OPT_OUT, newValue)); + EasyBind.subscribe(importerPreferences.grobidURLProperty(), newValue -> put(GROBID_URL, newValue)); + + return importerPreferences; } } diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index 7c25d7cf7a6..e5ce77b258f 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -28,8 +28,8 @@ import org.jabref.logic.exporter.SavePreferences; import org.jabref.logic.exporter.TemplateExporter; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.fileformat.CustomImporter; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.journals.JournalAbbreviationPreferences; import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.l10n.Language; @@ -259,8 +259,6 @@ public interface PreferencesService { AppearancePreferences getAppearancePreferences(); - void storeAppearancePreference(AppearancePreferences preferences); - //************************************************************************************************************* // File preferences //************************************************************************************************************* @@ -301,9 +299,7 @@ public interface PreferencesService { void storeCustomImportFormats(Set customImporters); - ImportSettingsPreferences getImportSettingsPreferences(); - - void storeImportSettingsPreferences(ImportSettingsPreferences preferences); + ImporterPreferences getImporterPreferences(); //************************************************************************************************************* // Preview preferences diff --git a/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java b/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java index 7233ef6c55a..a9567095d44 100644 --- a/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java +++ b/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java @@ -8,7 +8,6 @@ import java.util.Set; import java.util.stream.Stream; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.util.DummyFileUpdateMonitor; @@ -31,7 +30,7 @@ void setUp() { ImportFormatPreferences importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getEncoding()).thenReturn(StandardCharsets.UTF_8); when(importFormatPreferences.getCustomImportList()).thenReturn(Set.of()); - reader.resetImportFormats(mock(ImportSettingsPreferences.class), importFormatPreferences, mock(XmpPreferences.class), new DummyFileUpdateMonitor()); + reader.resetImportFormats(mock(ImporterPreferences.class), importFormatPreferences, mock(XmpPreferences.class), new DummyFileUpdateMonitor()); } @ParameterizedTest diff --git a/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java b/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java index e49adfd00a8..ba25256bf2e 100644 --- a/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java +++ b/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java @@ -4,7 +4,6 @@ import java.nio.file.Path; import java.util.Set; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.util.DummyFileUpdateMonitor; import org.jabref.model.util.FileUpdateMonitor; @@ -28,7 +27,7 @@ void setUp() { ImportFormatPreferences importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getEncoding()).thenReturn(StandardCharsets.UTF_8); when(importFormatPreferences.getCustomImportList()).thenReturn(Set.of()); - reader.resetImportFormats(mock(ImportSettingsPreferences.class), importFormatPreferences, mock(XmpPreferences.class), fileMonitor); + reader.resetImportFormats(mock(ImporterPreferences.class), importFormatPreferences, mock(XmpPreferences.class), fileMonitor); } @Test diff --git a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java index 9f36a346b74..6c1aa5aeb4d 100644 --- a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java +++ b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java @@ -14,7 +14,6 @@ import org.jabref.logic.importer.fetcher.IsbnViaOttoBibFetcher; import org.jabref.logic.importer.fetcher.JstorFetcher; import org.jabref.logic.importer.fetcher.MrDLibFetcher; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.preferences.FilePreferences; @@ -31,7 +30,7 @@ class WebFetchersTest { private ImportFormatPreferences importFormatPreferences; - private final ClassGraph classGraph = new ClassGraph().enableAllInfo().whitelistPackages("org.jabref"); + private final ClassGraph classGraph = new ClassGraph().enableAllInfo().acceptPackages("org.jabref"); @BeforeEach void setUp() throws Exception { @@ -66,7 +65,7 @@ void getIdBasedFetchersReturnsAllFetcherDerivingFromIdBasedFetcher() throws Exce @Test void getEntryBasedFetchersReturnsAllFetcherDerivingFromEntryBasedFetcher() throws Exception { - Set idFetchers = WebFetchers.getEntryBasedFetchers(mock(ImportSettingsPreferences.class), importFormatPreferences, mock(FilePreferences.class), mock(BibDatabaseContext.class), Charset.defaultCharset()); + Set idFetchers = WebFetchers.getEntryBasedFetchers(mock(ImporterPreferences.class), importFormatPreferences, mock(FilePreferences.class), mock(BibDatabaseContext.class), Charset.defaultCharset()); try (ScanResult scanResult = classGraph.scan()) { ClassInfoList controlClasses = scanResult.getClassesImplementing(EntryBasedFetcher.class.getCanonicalName()); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcherTest.java index d0540fc4865..a2bac4b6ce8 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcherTest.java @@ -8,8 +8,8 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.ParseException; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.logic.importer.util.GrobidService; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -33,8 +33,8 @@ public class GrobidCitationFetcherTest { static ImportFormatPreferences importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); - static ImportSettingsPreferences importSettingsPreferences = new ImportSettingsPreferences(false, true, false, "http://grobid.jabref.org:8070"); - static GrobidCitationFetcher grobidCitationFetcher = new GrobidCitationFetcher(importSettingsPreferences, importFormatPreferences); + static ImporterPreferences importerPreferences = new ImporterPreferences(false, true, false, "http://grobid.jabref.org:8070"); + static GrobidCitationFetcher grobidCitationFetcher = new GrobidCitationFetcher(importerPreferences, importFormatPreferences); static String example1 = "Derwing, T. M., Rossiter, M. J., & Munro, M. J. (2002). Teaching native speakers to listen to foreign-accented speech. Journal of Multilingual and Multicultural Development, 23(4), 245-259."; static BibEntry example1AsBibEntry = new BibEntry(StandardEntryType.Article).withCitationKey("-1") @@ -124,8 +124,7 @@ public void performSearchThrowsExceptionInCaseOfConnectionIssues() throws IOExce when(grobidServiceMock.processCitation(anyString(), any(), any())).thenThrow(new SocketTimeoutException("Timeout")); grobidCitationFetcher = new GrobidCitationFetcher(importFormatPreferences, grobidServiceMock); - assertThrows(FetcherException.class, () -> { - grobidCitationFetcher.performSearch("any text"); - }, "performSearch should throw an FetcherException, when there are underlying IOException."); + assertThrows(FetcherException.class, () -> + grobidCitationFetcher.performSearch("any text"), "performSearch should throw an FetcherException, when there are underlying IOException."); } } diff --git a/src/test/java/org/jabref/logic/importer/fileformat/PdfGrobidImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/PdfGrobidImporterTest.java index 16976058572..3577ffedaa7 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/PdfGrobidImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/PdfGrobidImporterTest.java @@ -8,7 +8,7 @@ import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.util.StandardFileType; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -30,12 +30,12 @@ public class PdfGrobidImporterTest { @BeforeEach public void setUp() { - ImportSettingsPreferences importSettingsPreferences = mock(ImportSettingsPreferences.class, Answers.RETURNS_DEEP_STUBS); - when(importSettingsPreferences.isGrobidEnabled()).thenReturn(true); - when(importSettingsPreferences.getGrobidURL()).thenReturn("http://grobid.jabref.org:8070"); + ImporterPreferences importerPreferences = mock(ImporterPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importerPreferences.isGrobidEnabled()).thenReturn(true); + when(importerPreferences.getGrobidURL()).thenReturn("http://grobid.jabref.org:8070"); importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); - importer = new PdfGrobidImporter(importSettingsPreferences, importFormatPreferences); + importer = new PdfGrobidImporter(importerPreferences, importFormatPreferences); } @Test diff --git a/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java index 29a45c09ad5..282a809a378 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java @@ -6,7 +6,7 @@ import java.util.List; import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.util.StandardFileType; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -28,12 +28,12 @@ class PdfMergeMetadataImporterTest { @BeforeEach void setUp() { - ImportSettingsPreferences importSettingsPreferences = mock(ImportSettingsPreferences.class, Answers.RETURNS_DEEP_STUBS); - when(importSettingsPreferences.isGrobidEnabled()).thenReturn(true); - when(importSettingsPreferences.getGrobidURL()).thenReturn("http://grobid.jabref.org:8070"); + ImporterPreferences importerPreferences = mock(ImporterPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importerPreferences.isGrobidEnabled()).thenReturn(true); + when(importerPreferences.getGrobidURL()).thenReturn("http://grobid.jabref.org:8070"); importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getFieldContentFormatterPreferences().getNonWrappableFields()).thenReturn(List.of()); - importer = new PdfMergeMetadataImporter(importSettingsPreferences, importFormatPreferences); + importer = new PdfMergeMetadataImporter(importerPreferences, importFormatPreferences); } @Test diff --git a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java index cc97c94e5f5..1dc4fc551c7 100644 --- a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java +++ b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java @@ -7,9 +7,9 @@ import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ImporterPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.fileformat.PdfGrobidImporterTest; -import org.jabref.logic.importer.importsettings.ImportSettingsPreferences; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.StandardEntryType; @@ -30,12 +30,12 @@ public class GrobidServiceTest { private static GrobidService grobidService; - private static ImportSettingsPreferences importSettingsPreferences = new ImportSettingsPreferences(false, true, false, "http://grobid.jabref.org:8070"); + private static ImporterPreferences importerPreferences = new ImporterPreferences(false, true, false, "http://grobid.jabref.org:8070"); private static ImportFormatPreferences importFormatPreferences; @BeforeAll public static void setup() { - grobidService = new GrobidService(importSettingsPreferences); + grobidService = new GrobidService(importerPreferences); importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); } @@ -75,7 +75,7 @@ public void processInvalidCitationTest() { @Test public void failsWhenGrobidDisabled() { - ImportSettingsPreferences importSettingsWithGrobidDisabled = importSettingsPreferences.withGrobidEnabled(false); + ImporterPreferences importSettingsWithGrobidDisabled = new ImporterPreferences(false, true, false, "http://grobid.jabref.org:8070"); assertThrows(UnsupportedOperationException.class, () -> new GrobidService(importSettingsWithGrobidDisabled)); } From 9f0430d277f0a7a225ce1970d1d5ae8d13c1d698 Mon Sep 17 00:00:00 2001 From: AidanM11 <41391775+AidanM11@users.noreply.github.com> Date: Wed, 1 Sep 2021 05:31:13 -0500 Subject: [PATCH 04/15] Added option to import CFF files (#7946) --- CHANGELOG.md | 1 + .../logic/importer/ImportFormatReader.java | 2 + .../importer/fileformat/CffImporter.java | 201 ++++++++++++++++++ .../jabref/logic/util/StandardFileType.java | 1 + .../importer/fileformat/CffImporterTest.java | 165 ++++++++++++++ .../fileformat/CffImporterTestDataset.cff | 26 +++ .../fileformat/CffImporterTestDoiSelect.cff | 25 +++ .../fileformat/CffImporterTestInvalid1.cff | 4 + .../fileformat/CffImporterTestInvalid2.cff | 1 + .../CffImporterTestUnknownFields.cff | 24 +++ .../fileformat/CffImporterTestValid.cff | 19 ++ .../CffImporterTestValidMultAuthors.cff | 23 ++ .../CffImporterTestValidSwhIdSelect1.cff | 29 +++ .../CffImporterTestValidSwhIdSelect2.cff | 26 +++ 14 files changed, 547 insertions(+) create mode 100644 src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java create mode 100644 src/test/java/org/jabref/logic/importer/fileformat/CffImporterTest.java create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDataset.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDoiSelect.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid1.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid2.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestUnknownFields.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValid.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidMultAuthors.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect1.cff create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect2.cff diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e415fe2708..4f4adc29bf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve ### Added +- We added import support for CFF files. [#7945](https://github.com/JabRef/jabref/issues/7945) - We added the option to copy the DOI of an entry directly from the context menu copy submenu. [#7826](https://github.com/JabRef/jabref/issues/7826) - We added a fulltext search feature. [#2838](https://github.com/JabRef/jabref/pull/2838) - We improved the deduction of bib-entries from imported fulltext pdfs. [#7947](https://github.com/JabRef/jabref/pull/7947) diff --git a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java index 57ed4b8c039..1e023ebf258 100644 --- a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java +++ b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java @@ -12,6 +12,7 @@ import org.jabref.logic.importer.fileformat.BibTeXMLImporter; import org.jabref.logic.importer.fileformat.BiblioscapeImporter; import org.jabref.logic.importer.fileformat.BibtexImporter; +import org.jabref.logic.importer.fileformat.CffImporter; import org.jabref.logic.importer.fileformat.CopacImporter; import org.jabref.logic.importer.fileformat.EndnoteImporter; import org.jabref.logic.importer.fileformat.EndnoteXmlImporter; @@ -77,6 +78,7 @@ public void resetImportFormats(ImporterPreferences importerPreferences, ImportFo formats.add(new RepecNepImporter(importFormatPreferences)); formats.add(new RisImporter()); formats.add(new SilverPlatterImporter()); + formats.add(new CffImporter()); formats.add(new BiblioscapeImporter()); formats.add(new BibtexImporter(importFormatPreferences, fileMonitor)); diff --git a/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java new file mode 100644 index 00000000000..c683841ae77 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java @@ -0,0 +1,201 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ParserResult; +import org.jabref.logic.util.StandardFileType; +import org.jabref.model.entry.Author; +import org.jabref.model.entry.AuthorList; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.field.UnknownField; +import org.jabref.model.entry.types.StandardEntryType; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; + +public class CffImporter extends Importer { + + @Override + public String getName() { + return "CFF"; + } + + @Override + public StandardFileType getFileType() { + return StandardFileType.CFF; + } + + @Override + public String getId() { + return "cff"; + } + + @Override + public String getDescription() { + return "Importer for the CFF format. Is only used to cite software, one entry per file."; + } + + // POJO classes for yaml data + private static class CffFormat { + private final HashMap values = new HashMap<>(); + + @JsonProperty("authors") + private List authors; + + @JsonProperty("identifiers") + private List ids; + + public CffFormat() { + } + + @JsonAnySetter + private void setValues(String key, String value) { + values.put(key, value); + } + } + + private static class CffAuthor { + private final HashMap values = new HashMap<>(); + + public CffAuthor() { + } + + @JsonAnySetter + private void setValues(String key, String value) { + values.put(key, value); + } + + } + + private static class CffIdentifier { + @JsonProperty("type") + private String type; + @JsonProperty("value") + private String value; + + public CffIdentifier() { + } + } + + @Override + public ParserResult importDatabase(BufferedReader reader) throws IOException { + ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + CffFormat citation = mapper.readValue(reader, CffFormat.class); + HashMap entryMap = new HashMap<>(); + StandardEntryType entryType = StandardEntryType.Software; + + // Map CFF fields to JabRef Fields + HashMap fieldMap = getFieldMappings(); + for (Map.Entry property : citation.values.entrySet()) { + if (fieldMap.containsKey(property.getKey())) { + entryMap.put(fieldMap.get(property.getKey()), property.getValue()); + } else if (property.getKey().equals("type")) { + if (property.getValue().equals("dataset")) { + entryType = StandardEntryType.Dataset; + } + } else if (getUnmappedFields().contains(property.getKey())) { + entryMap.put(new UnknownField(property.getKey()), property.getValue()); + } + } + + // Translate CFF author format to JabRef author format + String authorStr = citation.authors.stream() + .map((author) -> author.values) + .map((vals) -> vals.get("name") != null ? + new Author(vals.get("name"), "", "", "", "") : + new Author(vals.get("given-names"), null, vals.get("name-particle"), + vals.get("family-names"), vals.get("name-suffix"))) + .collect(AuthorList.collect()) + .getAsFirstLastNamesWithAnd(); + entryMap.put(StandardField.AUTHOR, authorStr); + + // Select DOI to keep + if (entryMap.get(StandardField.DOI) == null && citation.ids != null) { + List doiIds = citation.ids.stream() + .filter(id -> id.type.equals("doi")) + .collect(Collectors.toList()); + if (doiIds.size() == 1) { + entryMap.put(StandardField.DOI, doiIds.get(0).value); + } + } + + // Select SWHID to keep + if (citation.ids != null) { + List swhIds = citation.ids.stream() + .filter(id -> id.type.equals("swh")) + .map(id -> id.value) + .collect(Collectors.toList()); + + if (swhIds.size() == 1) { + entryMap.put(StandardField.SWHID, swhIds.get(0)); + } else if (swhIds.size() > 1) { + List relSwhIds = swhIds.stream() + .filter(id -> id.split(":").length > 3) // quick filter for invalid swhids + .filter(id -> id.split(":")[2].equals("rel")) + .collect(Collectors.toList()); + if (relSwhIds.size() == 1) { + entryMap.put(StandardField.SWHID, relSwhIds.get(0)); + } + } + } + + BibEntry entry = new BibEntry(entryType); + entry.setField(entryMap); + + List entriesList = new ArrayList<>(); + entriesList.add(entry); + + return new ParserResult(entriesList); + } + + @Override + public boolean isRecognizedFormat(BufferedReader reader) throws IOException { + + ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + CffFormat citation; + + try { + citation = mapper.readValue(reader, CffFormat.class); + return citation != null && citation.values.get("title") != null; + } catch (IOException e) { + return false; + } + } + + private HashMap getFieldMappings() { + HashMap fieldMappings = new HashMap<>(); + fieldMappings.put("title", StandardField.TITLE); + fieldMappings.put("version", StandardField.VERSION); + fieldMappings.put("doi", StandardField.DOI); + fieldMappings.put("license", StandardField.LICENSE); + fieldMappings.put("repository", StandardField.REPOSITORY); + fieldMappings.put("url", StandardField.URL); + fieldMappings.put("abstract", StandardField.ABSTRACT); + fieldMappings.put("message", StandardField.COMMENT); + fieldMappings.put("date-released", StandardField.DATE); + fieldMappings.put("keywords", StandardField.KEYWORDS); + return fieldMappings; + } + + private List getUnmappedFields() { + List fields = new ArrayList<>(); + + fields.add("commit"); + fields.add("license-url"); + fields.add("repository-code"); + fields.add("repository-artifact"); + + return fields; + } +} diff --git a/src/main/java/org/jabref/logic/util/StandardFileType.java b/src/main/java/org/jabref/logic/util/StandardFileType.java index 7a9d5d08c48..17b207a5145 100644 --- a/src/main/java/org/jabref/logic/util/StandardFileType.java +++ b/src/main/java/org/jabref/logic/util/StandardFileType.java @@ -42,6 +42,7 @@ public enum StandardFileType implements FileType { ZIP("Zip Archive", "zip"), CSS("CSS Styleshet", "css"), YAML("YAML Markup", "yaml"), + CFF("CFF", "cff"), ANY_FILE("Any", "*"); private final List extensions; diff --git a/src/test/java/org/jabref/logic/importer/fileformat/CffImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/CffImporterTest.java new file mode 100644 index 00000000000..5dd61a6d262 --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fileformat/CffImporterTest.java @@ -0,0 +1,165 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; + +import org.jabref.logic.util.StandardFileType; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.field.UnknownField; +import org.jabref.model.entry.types.StandardEntryType; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CffImporterTest { + + private CffImporter importer; + + @BeforeEach + public void setUp() { + importer = new CffImporter(); + } + + @Test + public void testGetFormatName() { + assertEquals("CFF", importer.getName()); + } + + @Test + public void testGetCLIId() { + assertEquals("cff", importer.getId()); + } + + @Test + public void testsGetExtensions() { + assertEquals(StandardFileType.CFF, importer.getFileType()); + } + + @Test + public void testGetDescription() { + assertEquals("Importer for the CFF format. Is only used to cite software, one entry per file.", + importer.getDescription()); + } + + @Test + public void testIsRecognizedFormat() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestValid.cff").toURI()); + assertTrue(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); + } + + @Test + public void testIsRecognizedFormatReject() throws IOException, URISyntaxException { + List list = Arrays.asList("CffImporterTestInvalid1.cff", "CffImporterTestInvalid2.cff"); + + for (String string : list) { + Path file = Path.of(CffImporterTest.class.getResource(string).toURI()); + assertFalse(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); + } + } + + @Test + public void testImportEntriesBasic() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestValid.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry().withField(StandardField.AUTHOR, "Joe van Smith"); + + assertEquals(entry, expected); + } + + @Test + public void testImportEntriesMultipleAuthors() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestValidMultAuthors.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry(); + + assertEquals(entry, expected); + + } + + @Test + public void testImportEntriesSwhIdSelect1() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestValidSwhIdSelect1.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry().withField(StandardField.SWHID, "swh:1:rel:22ece559cc7cc2364edc5e5593d63ae8bd229f9f"); + + assertEquals(entry, expected); + } + + @Test + public void testImportEntriesSwhIdSelect2() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestValidSwhIdSelect2.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry().withField(StandardField.SWHID, "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2"); + + assertEquals(entry, expected); + } + + @Test + public void testImportEntriesDataset() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestDataset.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry(); + expected.setType(StandardEntryType.Dataset); + + assertEquals(entry, expected); + } + + @Test + public void testImportEntriesDoiSelect() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestDoiSelect.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry(); + + assertEquals(entry, expected); + } + + @Test + public void testImportEntriesUnknownFields() throws IOException, URISyntaxException { + Path file = Path.of(CffImporterTest.class.getResource("CffImporterTestUnknownFields.cff").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + BibEntry entry = bibEntries.get(0); + + BibEntry expected = getPopulatedEntry().withField(new UnknownField("commit"), "10ad"); + + assertEquals(entry, expected); + } + + public BibEntry getPopulatedEntry() { + BibEntry entry = new BibEntry(); + entry.setType(StandardEntryType.Software); + + entry.setField(StandardField.AUTHOR, "Joe van Smith and Bob Jones, Jr."); + entry.setField(StandardField.TITLE, "Test"); + entry.setField(StandardField.URL, "www.google.com"); + entry.setField(StandardField.REPOSITORY, "www.github.com"); + entry.setField(StandardField.DOI, "10.0000/TEST"); + entry.setField(StandardField.DATE, "2000-07-02"); + entry.setField(StandardField.COMMENT, "Test entry."); + entry.setField(StandardField.ABSTRACT, "Test abstract."); + entry.setField(StandardField.LICENSE, "MIT"); + entry.setField(StandardField.VERSION, "1.0"); + + return entry; + } +} diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDataset.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDataset.cff new file mode 100644 index 00000000000..8900971cb80 --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDataset.cff @@ -0,0 +1,26 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van + - + family-names: Jones + given-names: Bob + name-suffix: Jr. +cff-version: "1.1.0" +date-released: 2000-07-02 +identifiers: + - + type: doi + value: "10.0000/TEST" +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +type: dataset +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDoiSelect.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDoiSelect.cff new file mode 100644 index 00000000000..28993253709 --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestDoiSelect.cff @@ -0,0 +1,25 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van + - + family-names: Jones + given-names: Bob + name-suffix: Jr. +cff-version: "1.1.0" +date-released: 2000-07-02 +identifiers: + - + type: doi + value: "10.0000/TEST" +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid1.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid1.cff new file mode 100644 index 00000000000..be4a0e39ec4 --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid1.cff @@ -0,0 +1,4 @@ +# YAML 1.2 +--- +test: 123 +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid2.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid2.cff new file mode 100644 index 00000000000..c75d438d6aa --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestInvalid2.cff @@ -0,0 +1 @@ +aosdoioifjosdfikbasjc diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestUnknownFields.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestUnknownFields.cff new file mode 100644 index 00000000000..43008aab9dc --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestUnknownFields.cff @@ -0,0 +1,24 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van + - + family-names: Jones + given-names: Bob + name-suffix: Jr. +cff-version: "1.1.0" +date-released: 2000-07-02 +doi: "10.0000/TEST" +identifiers: +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +commit: 10ad +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValid.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValid.cff new file mode 100644 index 00000000000..472ba55169d --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValid.cff @@ -0,0 +1,19 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van +cff-version: "1.1.0" +date-released: 2000-07-02 +doi: "10.0000/TEST" +identifiers: +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidMultAuthors.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidMultAuthors.cff new file mode 100644 index 00000000000..f69962c1760 --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidMultAuthors.cff @@ -0,0 +1,23 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van + - + family-names: Jones + given-names: Bob + name-suffix: Jr. +cff-version: "1.1.0" +date-released: 2000-07-02 +doi: "10.0000/TEST" +identifiers: +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect1.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect1.cff new file mode 100644 index 00000000000..2944a7a7ef2 --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect1.cff @@ -0,0 +1,29 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van + - + family-names: Jones + given-names: Bob + name-suffix: Jr. +cff-version: "1.1.0" +date-released: 2000-07-02 +doi: "10.0000/TEST" +identifiers: + - + type: swh + value: "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2" + - + type: swh + value: "swh:1:rel:22ece559cc7cc2364edc5e5593d63ae8bd229f9f" +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +... diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect2.cff b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect2.cff new file mode 100644 index 00000000000..eaa2e655c2a --- /dev/null +++ b/src/test/resources/org/jabref/logic/importer/fileformat/CffImporterTestValidSwhIdSelect2.cff @@ -0,0 +1,26 @@ +# YAML 1.2 +--- +abstract: "Test abstract." +authors: + - + family-names: Smith + given-names: Joe + name-particle: van + - + family-names: Jones + given-names: Bob + name-suffix: Jr. +cff-version: "1.1.0" +date-released: 2000-07-02 +doi: "10.0000/TEST" +identifiers: + - + type: swh + value: "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2" +license: MIT +message: "Test entry." +title: Test +version: "1.0" +url: "www.google.com" +repository: "www.github.com" +... From a41e375dc201257af4c99a72702883a82fc2b9b0 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 1 Sep 2021 13:59:07 +0200 Subject: [PATCH 05/15] Decision on handling of localized preferences. --- docs/adr/0023-localized-preferences.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 docs/adr/0023-localized-preferences.md diff --git a/docs/adr/0023-localized-preferences.md b/docs/adr/0023-localized-preferences.md new file mode 100644 index 00000000000..c8ffe8c3803 --- /dev/null +++ b/docs/adr/0023-localized-preferences.md @@ -0,0 +1,19 @@ +# Localized Preferences + +* Status: proposed +* Date: 2021-09-01 + +## Context and Problem Statement + +Currently, JabRef uses some localized preferences. We want to remove the Localization-dependency from the JabRefPreferences and move the Localization to where the String is used. +The problem is how to store the default values. + +## Considered Options + +* _Localize Defaults_ (current implementation) +* _Store the Preference only when it was changed by the user_. Otherwise, leave it empty. When a consumer gets such an empty preference, it knows that it needs to read the default and localize it. This won't work if users actually want something to be empty. +* _Store the unlocalized String._ Consumers then check the String they got as a preference against the defaults. If it matches, localize it. Otherwise, use it. + +## Decision Outcome + +Chosen option: "_Store the unlocalized String._ Consumers then check the String they got as a preference against the defaults. If it matches, localize it. Otherwise, use it.", because Achieves goals without requiring too much refactoring and without (known) downsides. From 23e967c5c05f8edd6b6cf1cd70bf02eebcd825e6 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 1 Sep 2021 15:19:39 +0200 Subject: [PATCH 06/15] Refine howto (#8049) --- ...elines-for-setting-up-a-local-workspace.md | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index 309324f8af2..a3c4c022b57 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -18,7 +18,7 @@ This section list the prerequisites you need to get started to develop JabRef. A ### Java Development Kit 16 -A working Java \(Develoment Kit\) 16 installation with Java FX support is required. In the command line \(terminal in Linux, cmd in Windows\) run `javac -version` and make sure that the reported version is Java 16 \(e.g., `javac 16`\). If `javac` is not found or a wrong version is reported, check your `PATH` environment variable, your `JAVA_HOME` environment variable or install the most recent JDK. +A working Java \(Development Kit\) 16 installation with Java FX support is required. In the command line \(terminal in Linux, cmd in Windows\) run `javac -version` and make sure that the reported version is Java 16 \(e.g., `javac 16`\). If `javac` is not found or a wrong version is reported, check your `PATH` environment variable, your `JAVA_HOME` environment variable or install the most recent JDK. [JavaFX is not part of the default JDK any more](https://www.reddit.com/r/java/comments/82qm9x/javafx_will_be_removed_from_the_java_jdk_in_jdk_11/), it needs to be installed separately if not using a special JDK. @@ -119,6 +119,8 @@ To prepare IntelliJ's build system two additional steps are required: --add-exports=org.controlsfx.controls/impl.org.controlsfx.skin=org.jabref ``` + Note that you need to focus another UI element before pressing OK. Otherwise, the setting will be empty. + * Enable annotation processors by navigating to **File \| Settings \| Build, Execution, Deployment \| Compiler \| Annotation processors** and check "Enable annotation processing" ![Enable annotation processing](../.gitbook/assets/intellij-enable-annotation-processing.png) @@ -144,7 +146,7 @@ After that a new entry called "jabref \[run\]" will appear in the run configurat #### Using IntelliJ's internal build system -You should use IntelliJ IDEA's internal build system for compiling and running JabRef during development, because it is usually more responsive. Thereby, **it's important** that you understand that JabRef relies on generated sources which are only build through Gradle. Therefore, to build or update these dependencies you need to run the `assemble` Gradle task at least once. +You should use IntelliJ IDEA's internal build system for compiling and running JabRef during development, because it is usually more responsive. Thereby, **it is important** that you understand that JabRef relies on generated sources which are only build through Gradle. Therefore, to build or update these dependencies you need to run the `assemble` Gradle task at least once. To use IntelliJ IDEA's internal build system when you build JabRef through **Build \| Build Project** or use the provided "JabRef Main" run configuration, ensure that @@ -154,15 +156,15 @@ To use IntelliJ IDEA's internal build system when you build JabRef through **Bui ![Ignore the Gradle project "buildSrc"](../.gitbook/assets/intellij-gradle-config-ignore-buildSrc%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%286%29%20%284%29.png) * Add `src-gen` as root: - 1. Right click on the project "jabref". - 2. Select "Open Module Settings" - 3. Expand "JabRef" - 4. Select "main" - 5. Select tab "Sources" - 6. Click "+ Add Content Root" - 7. Select the `src-gen` directory - 8. Click "OK". When expanding "main", "java" should have been selected as source - 9. Click "OK" to save the changes + 1. Right click on the project "jabref". + 2. Select "Open Module Settings" + 3. Expand "JabRef" + 4. Select "main" + 5. Select tab "Sources" + 6. Click "+ Add Content Root" + 7. Select the `src-gen` directory + 8. Click "OK". When expanding "main", "java" should have been selected as source + 9. Click "OK" to save the changes * In case the above step does not work, run with gradle, import gradle project again, and try again. * Delete `org.jabref.gui.logging.plugins.Log4jPlugins` \(location: `src-gen/main/java/org/jabref/gui/logging/plugins/Log4jPlugins.java`\). Otherwise, you will see following error: @@ -302,3 +304,16 @@ There might be problems with building if you have openjfx libraries in local mav As a workaround, you can remove all local openjfx artifacts by deleting the whole openjfx folder from specified location. +### Issues with `JournalAbbreviationLoader` + +In case of a NPE at `Files.copy` at `org.jabref.logic.journals.JournalAbbreviationLoader.loadRepository(JournalAbbreviationLoader.java:30) ~[classes/:?]`, +invalidate caches and restart IntelliJ. +Then, Build -> Rebuild Project. + +If that does not help: + +1. Save/Commit all your work +2. Close IntelliJ +3. Delete all non-versioned items: `git clean -xdf`. This really destroys data +4. Execute `./gradlew run` +5. Start IntelliJ and try again. From 705d4b1198056722d9abb48d1feeb88cd0121ded Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Wed, 1 Sep 2021 15:27:24 +0200 Subject: [PATCH 07/15] Observable preferences B (ProtectedTerms, EntryEditor and MrDlib) (#8046) * Proposal using obserables * Added some flesh to poc * Refactored ImporterPreferences to new preferences logic and fixed some ide suggestions * Update EntryEditor.java * Only use Grobid when enabled (#8042) * Refactored ProtectedTermsPreferences to observable prefs * Fixed ProtectedTermsTab * Reworked context menu and improved visuals of ProtectedTermsTab * Fixed merge error * Refactored MrDlibPreferences to prefrences observables * Refactored EntryEditorpreferences to observable preferences * Fixed error and remark, made some small visual improvements on ProtectedTermsTab Co-authored-by: Tobias Diez Co-authored-by: Benedikt Tutzer --- src/main/java/org/jabref/gui/LibraryTab.java | 3 +- .../jabref/gui/actions/StandardActions.java | 7 +- .../entryeditor/EntryEditorPreferences.java | 124 ++++++++++++++---- .../gui/entryeditor/RelatedArticlesTab.java | 13 +- .../java/org/jabref/gui/icon/IconTheme.java | 1 + .../PreferencesDialogViewModel.java | 1 - .../entryeditor/EntryEditorTab.java | 2 +- .../entryeditor/EntryEditorTabViewModel.java | 44 +++---- .../CustomEditorFieldsTabViewModel.java | 7 +- .../NewProtectedTermsFileDialog.java | 8 +- .../ProtectedTermsListItemModel.java | 42 ++++++ .../protectedterms/ProtectedTermsTab.fxml | 15 ++- .../protectedterms/ProtectedTermsTab.java | 111 +++++++++------- .../ProtectedTermsTabViewModel.java | 69 ++++++---- .../logic/importer/fetcher/MrDLibFetcher.java | 9 +- .../ProtectedTermsPreferences.java | 61 ++++++--- .../jabref/preferences/JabRefPreferences.java | 100 ++++++++------ .../jabref/preferences/MrDlibPreferences.java | 57 ++++++-- .../preferences/PreferencesService.java | 12 -- .../importer/fetcher/MrDLibFetcherTest.java | 8 +- 20 files changed, 462 insertions(+), 232 deletions(-) create mode 100644 src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsListItemModel.java diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index d5443bf343b..a58245a07c8 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -677,8 +677,7 @@ private boolean showDeleteConfirmationDialog(int numberOfEntries) { */ private void saveDividerLocation(Number position) { if (mode == BasePanelMode.SHOWING_EDITOR) { - preferencesService.storeEntryEditorPreferences( - preferencesService.getEntryEditorPreferences().withDividerPosition(position.doubleValue())); + preferencesService.getEntryEditorPreferences().setDividerPosition(position.doubleValue()); } } diff --git a/src/main/java/org/jabref/gui/actions/StandardActions.java b/src/main/java/org/jabref/gui/actions/StandardActions.java index d8748ea19c2..cbe51b9db9e 100644 --- a/src/main/java/org/jabref/gui/actions/StandardActions.java +++ b/src/main/java/org/jabref/gui/actions/StandardActions.java @@ -173,7 +173,12 @@ public enum StandardActions implements Action { OPEN_FORUM(Localization.lang("Online help forum"), Localization.lang("Online help forum"), IconTheme.JabRefIcons.FORUM), ERROR_CONSOLE(Localization.lang("View event log"), Localization.lang("Display all error messages")), SEARCH_FOR_UPDATES(Localization.lang("Check for updates")), - ABOUT(Localization.lang("About JabRef"), Localization.lang("About JabRef")); + ABOUT(Localization.lang("About JabRef"), Localization.lang("About JabRef")), + + EDIT_LIST(Localization.lang("Edit"), IconTheme.JabRefIcons.EDIT), + VIEW_LIST(Localization.lang("View"), IconTheme.JabRefIcons.FILE), + REMOVE_LIST(Localization.lang("Remove"), IconTheme.JabRefIcons.REMOVE), + RELOAD_LIST(Localization.lang("Reload"), IconTheme.JabRefIcons.REFRESH); private final String text; private final String description; diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditorPreferences.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditorPreferences.java index 19260ded844..8e8a5b0a76d 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditorPreferences.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditorPreferences.java @@ -3,19 +3,28 @@ import java.util.Map; import java.util.Set; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.MapProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleMapProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableMap; + import org.jabref.model.entry.field.Field; public class EntryEditorPreferences { - private final Map> entryEditorTabList; - private final boolean shouldOpenOnNewEntry; - private final boolean shouldShowRecommendationsTab; - private final boolean isMrdlibAccepted; - private final boolean shouldShowLatexCitationsTab; - private final boolean showSourceTabByDefault; - private final boolean enableValidation; - private final boolean allowIntegerEditionBibtex; - private double dividerPosition; + private final MapProperty> entryEditorTabList; + private final BooleanProperty shouldOpenOnNewEntry; + private final BooleanProperty shouldShowRecommendationsTab; + private final BooleanProperty isMrdlibAccepted; + private final BooleanProperty shouldShowLatexCitationsTab; + private final BooleanProperty showSourceTabByDefault; + private final BooleanProperty enableValidation; + private final BooleanProperty allowIntegerEditionBibtex; + private final DoubleProperty dividerPosition; public EntryEditorPreferences(Map> entryEditorTabList, boolean shouldOpenOnNewEntry, @@ -27,55 +36,122 @@ public EntryEditorPreferences(Map> entryEditorTabList, boolean allowIntegerEditionBibtex, double dividerPosition) { - this.entryEditorTabList = entryEditorTabList; - this.shouldOpenOnNewEntry = shouldOpenOnNewEntry; - this.shouldShowRecommendationsTab = shouldShowRecommendationsTab; - this.isMrdlibAccepted = isMrdlibAccepted; - this.shouldShowLatexCitationsTab = shouldShowLatexCitationsTab; - this.showSourceTabByDefault = showSourceTabByDefault; - this.enableValidation = enableValidation; - this.allowIntegerEditionBibtex = allowIntegerEditionBibtex; - this.dividerPosition = dividerPosition; + this.entryEditorTabList = new SimpleMapProperty<>(FXCollections.observableMap(entryEditorTabList)); + this.shouldOpenOnNewEntry = new SimpleBooleanProperty(shouldOpenOnNewEntry); + this.shouldShowRecommendationsTab = new SimpleBooleanProperty(shouldShowRecommendationsTab); + this.isMrdlibAccepted = new SimpleBooleanProperty(isMrdlibAccepted); + this.shouldShowLatexCitationsTab = new SimpleBooleanProperty(shouldShowLatexCitationsTab); + this.showSourceTabByDefault = new SimpleBooleanProperty(showSourceTabByDefault); + this.enableValidation = new SimpleBooleanProperty(enableValidation); + this.allowIntegerEditionBibtex = new SimpleBooleanProperty(allowIntegerEditionBibtex); + this.dividerPosition = new SimpleDoubleProperty(dividerPosition); + } + + public ObservableMap> getEntryEditorTabList() { + return entryEditorTabList.get(); } - public Map> getEntryEditorTabList() { + public MapProperty> entryEditorTabListProperty() { return entryEditorTabList; } + public void setEntryEditorTabList(Map> entryEditorTabList) { + this.entryEditorTabList.set(FXCollections.observableMap(entryEditorTabList)); + } + public boolean shouldOpenOnNewEntry() { + return shouldOpenOnNewEntry.get(); + } + + public BooleanProperty shouldOpenOnNewEntryProperty() { return shouldOpenOnNewEntry; } + public void setShouldOpenOnNewEntry(boolean shouldOpenOnNewEntry) { + this.shouldOpenOnNewEntry.set(shouldOpenOnNewEntry); + } + public boolean shouldShowRecommendationsTab() { + return shouldShowRecommendationsTab.get(); + } + + public BooleanProperty shouldShowRecommendationsTabProperty() { return shouldShowRecommendationsTab; } + public void setShouldShowRecommendationsTab(boolean shouldShowRecommendationsTab) { + this.shouldShowRecommendationsTab.set(shouldShowRecommendationsTab); + } + public boolean isMrdlibAccepted() { + return isMrdlibAccepted.get(); + } + + public BooleanProperty isMrdlibAcceptedProperty() { return isMrdlibAccepted; } - public boolean showSourceTabByDefault() { - return showSourceTabByDefault; + public void setIsMrdlibAccepted(boolean isMrdlibAccepted) { + this.isMrdlibAccepted.set(isMrdlibAccepted); } public boolean shouldShowLatexCitationsTab() { + return shouldShowLatexCitationsTab.get(); + } + + public BooleanProperty shouldShowLatexCitationsTabProperty() { return shouldShowLatexCitationsTab; } + public void setShouldShowLatexCitationsTab(boolean shouldShowLatexCitationsTab) { + this.shouldShowLatexCitationsTab.set(shouldShowLatexCitationsTab); + } + + public boolean showSourceTabByDefault() { + return showSourceTabByDefault.get(); + } + + public BooleanProperty showSourceTabByDefaultProperty() { + return showSourceTabByDefault; + } + + public void setShowSourceTabByDefault(boolean showSourceTabByDefault) { + this.showSourceTabByDefault.set(showSourceTabByDefault); + } + public boolean shouldEnableValidation() { + return enableValidation.get(); + } + + public BooleanProperty enableValidationProperty() { return enableValidation; } + public void setEnableValidation(boolean enableValidation) { + this.enableValidation.set(enableValidation); + } + public boolean shouldAllowIntegerEditionBibtex() { + return allowIntegerEditionBibtex.get(); + } + + public BooleanProperty allowIntegerEditionBibtexProperty() { return allowIntegerEditionBibtex; } + public void setAllowIntegerEditionBibtex(boolean allowIntegerEditionBibtex) { + this.allowIntegerEditionBibtex.set(allowIntegerEditionBibtex); + } + public double getDividerPosition() { + return dividerPosition.get(); + } + + public DoubleProperty dividerPositionProperty() { return dividerPosition; } - public EntryEditorPreferences withDividerPosition(double dividerPosition) { - this.dividerPosition = dividerPosition; - return this; + public void setDividerPosition(double dividerPosition) { + this.dividerPosition.set(dividerPosition); } } diff --git a/src/main/java/org/jabref/gui/entryeditor/RelatedArticlesTab.java b/src/main/java/org/jabref/gui/entryeditor/RelatedArticlesTab.java index 9647ef443a9..c5384437c51 100644 --- a/src/main/java/org/jabref/gui/entryeditor/RelatedArticlesTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/RelatedArticlesTab.java @@ -66,7 +66,7 @@ private StackPane getRelatedArticlesPane(BibEntry entry) { progress.setMaxSize(100, 100); MrDLibFetcher fetcher = new MrDLibFetcher(preferencesService.getLanguage().name(), - Globals.BUILD_INFO.version, preferencesService); + Globals.BUILD_INFO.version, preferencesService.getMrDlibPreferences()); BackgroundTask .wrap(() -> fetcher.performSearch(entry)) .onRunning(() -> progress.setVisible(true)) @@ -211,11 +211,12 @@ private ScrollPane getPrivacyDialog(BibEntry entry) { vb.setSpacing(10); button.setOnAction(event -> { - preferencesService.storeMrDlibPreferences(new MrDlibPreferences( - true, - cbLanguage.isSelected(), - cbOS.isSelected(), - cbTimezone.isSelected())); + preferences.setIsMrdlibAccepted(true); + + MrDlibPreferences mrDlibPreferences = preferencesService.getMrDlibPreferences(); + mrDlibPreferences.setSendLanguage(cbLanguage.isSelected()); + mrDlibPreferences.setSendOs(cbOS.isSelected()); + mrDlibPreferences.setSendTimezone(cbTimezone.isSelected()); dialogService.showWarningDialogAndWait(Localization.lang("Restart"), Localization.lang("Please restart JabRef for preferences to take effect.")); setContent(getRelatedArticlesPane(entry)); diff --git a/src/main/java/org/jabref/gui/icon/IconTheme.java b/src/main/java/org/jabref/gui/icon/IconTheme.java index da489a20c47..b00e81d1b27 100644 --- a/src/main/java/org/jabref/gui/icon/IconTheme.java +++ b/src/main/java/org/jabref/gui/icon/IconTheme.java @@ -235,6 +235,7 @@ public enum JabRefIcons implements JabRefIcon { QUALITY_ASSURED(MaterialDesignC.CERTIFICATE), QUALITY(MaterialDesignC.CERTIFICATE), OPEN(MaterialDesignF.FOLDER_OUTLINE), + OPEN_LIST(MaterialDesignF.FOLDER_OPEN_OUTLINE), ADD_ROW(MaterialDesignS.SERVER_PLUS), REMOVE_ROW(MaterialDesignS.SERVER_MINUS), PICTURE(MaterialDesignF.FILE_IMAGE), diff --git a/src/main/java/org/jabref/gui/preferences/PreferencesDialogViewModel.java b/src/main/java/org/jabref/gui/preferences/PreferencesDialogViewModel.java index 4c116e7fd15..30d8d75fa6d 100644 --- a/src/main/java/org/jabref/gui/preferences/PreferencesDialogViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/PreferencesDialogViewModel.java @@ -163,7 +163,6 @@ public void resetPreferences() { */ private void updateAfterPreferenceChanges() { // Reload internal preferences cache - preferences.updateEntryEditorTabList(); preferences.updateGlobalCitationKeyPattern(); preferences.updateMainTableColumns(); diff --git a/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTab.java b/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTab.java index 6c72b12e924..600f437419e 100644 --- a/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTab.java +++ b/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTab.java @@ -41,7 +41,7 @@ public String getTabName() { } public void initialize() { - this.viewModel = new EntryEditorTabViewModel(dialogService, preferencesService); + this.viewModel = new EntryEditorTabViewModel(preferencesService); openOnNewEntry.selectedProperty().bindBidirectional(viewModel.openOnNewEntryProperty()); defaultSource.selectedProperty().bindBidirectional(viewModel.defaultSourceProperty()); diff --git a/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java b/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java index bcf449ac688..3e7fe564619 100644 --- a/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java @@ -8,7 +8,6 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; -import org.jabref.gui.DialogService; import org.jabref.gui.autocompleter.AutoCompleteFirstNameMode; import org.jabref.gui.autocompleter.AutoCompletePreferences; import org.jabref.gui.entryeditor.EntryEditorPreferences; @@ -35,32 +34,30 @@ public class EntryEditorTabViewModel implements PreferenceTabViewModel { private final BooleanProperty firstNameModeFullProperty = new SimpleBooleanProperty(); private final BooleanProperty firstNameModeBothProperty = new SimpleBooleanProperty(); - private final DialogService dialogService; private final PreferencesService preferencesService; - private final EntryEditorPreferences initialEntryEditorPreferences; + private final EntryEditorPreferences entryEditorPreferences; private final AutoCompletePreferences initialAutoCompletePreferences; private final List restartWarnings = new ArrayList<>(); - public EntryEditorTabViewModel(DialogService dialogService, PreferencesService preferencesService) { - this.dialogService = dialogService; + public EntryEditorTabViewModel(PreferencesService preferencesService) { this.preferencesService = preferencesService; - this.initialEntryEditorPreferences = preferencesService.getEntryEditorPreferences(); + this.entryEditorPreferences = preferencesService.getEntryEditorPreferences(); this.initialAutoCompletePreferences = preferencesService.getAutoCompletePreferences(); } @Override public void setValues() { // ToDo: Include CustomizeGeneralFieldsDialog in PreferencesDialog - // therefore yet unused: initialEntryEditorPreferences.getEntryEditorTabList(); + // therefore yet unused: entryEditorPreferences.getEntryEditorTabList(); - openOnNewEntryProperty.setValue(initialEntryEditorPreferences.shouldOpenOnNewEntry()); - defaultSourceProperty.setValue(initialEntryEditorPreferences.showSourceTabByDefault()); - enableRelatedArticlesTabProperty.setValue(initialEntryEditorPreferences.shouldShowRecommendationsTab()); - acceptRecommendationsProperty.setValue(initialEntryEditorPreferences.isMrdlibAccepted()); - enableLatexCitationsTabProperty.setValue(initialEntryEditorPreferences.shouldShowLatexCitationsTab()); - enableValidationProperty.setValue(initialEntryEditorPreferences.shouldEnableValidation()); - allowIntegerEditionProperty.setValue(initialEntryEditorPreferences.shouldAllowIntegerEditionBibtex()); + openOnNewEntryProperty.setValue(entryEditorPreferences.shouldOpenOnNewEntry()); + defaultSourceProperty.setValue(entryEditorPreferences.showSourceTabByDefault()); + enableRelatedArticlesTabProperty.setValue(entryEditorPreferences.shouldShowRecommendationsTab()); + acceptRecommendationsProperty.setValue(entryEditorPreferences.isMrdlibAccepted()); + enableLatexCitationsTabProperty.setValue(entryEditorPreferences.shouldShowLatexCitationsTab()); + enableValidationProperty.setValue(entryEditorPreferences.shouldEnableValidation()); + allowIntegerEditionProperty.setValue(entryEditorPreferences.shouldAllowIntegerEditionBibtex()); enableAutoCompleteProperty.setValue(initialAutoCompletePreferences.shouldAutoComplete()); autoCompleteFieldsProperty.setValue(initialAutoCompletePreferences.getCompleteNamesAsString()); @@ -82,16 +79,15 @@ public void setValues() { @Override public void storeSettings() { - preferencesService.storeEntryEditorPreferences(new EntryEditorPreferences( - initialEntryEditorPreferences.getEntryEditorTabList(), - openOnNewEntryProperty.getValue(), - enableRelatedArticlesTabProperty.getValue(), - acceptRecommendationsProperty.getValue(), - enableLatexCitationsTabProperty.getValue(), - defaultSourceProperty.getValue(), - enableValidationProperty.getValue(), - allowIntegerEditionProperty.getValue(), - initialEntryEditorPreferences.getDividerPosition())); + // entryEditorPreferences.setEntryEditorTabList(); + entryEditorPreferences.setShouldOpenOnNewEntry(openOnNewEntryProperty.getValue()); + entryEditorPreferences.setShouldShowRecommendationsTab(enableRelatedArticlesTabProperty.getValue()); + entryEditorPreferences.setIsMrdlibAccepted(acceptRecommendationsProperty.getValue()); + entryEditorPreferences.setShouldShowLatexCitationsTab(enableLatexCitationsTabProperty.getValue()); + entryEditorPreferences.setShowSourceTabByDefault(defaultSourceProperty.getValue()); + entryEditorPreferences.setEnableValidation(enableValidationProperty.getValue()); + entryEditorPreferences.setAllowIntegerEditionBibtex(allowIntegerEditionProperty.getValue()); + // entryEditorPreferences.setDividerPosition(); // default AutoCompletePreferences.NameFormat nameFormat = AutoCompletePreferences.NameFormat.BOTH; diff --git a/src/main/java/org/jabref/gui/preferences/entryeditortabs/CustomEditorFieldsTabViewModel.java b/src/main/java/org/jabref/gui/preferences/entryeditortabs/CustomEditorFieldsTabViewModel.java index e1748e6c493..ef51d2486e5 100644 --- a/src/main/java/org/jabref/gui/preferences/entryeditortabs/CustomEditorFieldsTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/entryeditortabs/CustomEditorFieldsTabViewModel.java @@ -8,6 +8,7 @@ import javafx.beans.property.StringProperty; import org.jabref.gui.DialogService; +import org.jabref.gui.entryeditor.EntryEditorPreferences; import org.jabref.gui.preferences.PreferenceTabViewModel; import org.jabref.logic.citationkeypattern.CitationKeyGenerator; import org.jabref.logic.l10n.Localization; @@ -21,15 +22,17 @@ public class CustomEditorFieldsTabViewModel implements PreferenceTabViewModel { private final DialogService dialogService; private final PreferencesService preferences; + private final EntryEditorPreferences entryEditorPreferences; public CustomEditorFieldsTabViewModel(DialogService dialogService, PreferencesService preferences) { this.dialogService = dialogService; this.preferences = preferences; + this.entryEditorPreferences = preferences.getEntryEditorPreferences(); } @Override public void setValues() { - setFields(preferences.getEntryEditorTabList()); + setFields(entryEditorPreferences.getEntryEditorTabList()); } public void resetToDefaults() { @@ -79,7 +82,7 @@ public void storeSettings() { customTabsMap.put(parts[0], FieldFactory.parseFieldList(parts[1])); } - preferences.storeEntryEditorTabList(customTabsMap); + entryEditorPreferences.setEntryEditorTabList(customTabsMap); } public StringProperty fieldsProperty() { diff --git a/src/main/java/org/jabref/gui/preferences/protectedterms/NewProtectedTermsFileDialog.java b/src/main/java/org/jabref/gui/preferences/protectedterms/NewProtectedTermsFileDialog.java index 739c0248319..679fc56f17a 100644 --- a/src/main/java/org/jabref/gui/preferences/protectedterms/NewProtectedTermsFileDialog.java +++ b/src/main/java/org/jabref/gui/preferences/protectedterms/NewProtectedTermsFileDialog.java @@ -11,19 +11,19 @@ import javafx.scene.layout.VBox; import org.jabref.gui.DialogService; -import org.jabref.gui.Globals; import org.jabref.gui.util.BaseDialog; import org.jabref.gui.util.FileDialogConfiguration; import org.jabref.logic.l10n.Localization; import org.jabref.logic.protectedterms.ProtectedTermsList; import org.jabref.logic.util.StandardFileType; +import org.jabref.preferences.PreferencesService; public class NewProtectedTermsFileDialog extends BaseDialog { private final TextField newFile = new TextField(); private final DialogService dialogService; - public NewProtectedTermsFileDialog(List termsLists, DialogService dialogService) { + public NewProtectedTermsFileDialog(List termsLists, DialogService dialogService, PreferencesService preferencesService) { this.dialogService = dialogService; this.setTitle(Localization.lang("New protected terms file")); @@ -31,7 +31,7 @@ public NewProtectedTermsFileDialog(List termsLists, DialogSe FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder() .addExtensionFilter(Localization.lang("Protected terms file"), StandardFileType.TERMS) .withDefaultExtension(Localization.lang("Protected terms file"), StandardFileType.TERMS) - .withInitialDirectory(Globals.prefs.getWorkingDir()) + .withInitialDirectory(preferencesService.getWorkingDir()) .build(); Button browse = new Button(Localization.lang("Browse")); @@ -55,7 +55,7 @@ public NewProtectedTermsFileDialog(List termsLists, DialogSe ProtectedTermsList newList = new ProtectedTermsList(newDescription.getText(), new ArrayList<>(), newFile.getText(), false); newList.setEnabled(true); newList.createAndWriteHeading(newDescription.getText()); - termsLists.add(newList); + termsLists.add(new ProtectedTermsListItemModel(newList)); } return null; }); diff --git a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsListItemModel.java b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsListItemModel.java new file mode 100644 index 00000000000..ad06b94b55c --- /dev/null +++ b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsListItemModel.java @@ -0,0 +1,42 @@ +package org.jabref.gui.preferences.protectedterms; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ReadOnlyBooleanProperty; +import javafx.beans.property.ReadOnlyBooleanWrapper; +import javafx.beans.property.ReadOnlyStringProperty; +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.beans.property.SimpleBooleanProperty; + +import org.jabref.logic.protectedterms.ProtectedTermsList; + +public class ProtectedTermsListItemModel { + + private final ProtectedTermsList termsList; + private final BooleanProperty enabledProperty = new SimpleBooleanProperty(); + + public ProtectedTermsListItemModel(ProtectedTermsList termsList) { + this.termsList = termsList; + this.enabledProperty.setValue(termsList.isEnabled()); + } + + public ProtectedTermsList getTermsList() { + termsList.setEnabled(enabledProperty.getValue()); + return termsList; + } + + public ReadOnlyStringProperty descriptionProperty() { + return new ReadOnlyStringWrapper(termsList.getDescription()); + } + + public ReadOnlyStringProperty locationProperty() { + return new ReadOnlyStringWrapper(termsList.getLocation()); + } + + public ReadOnlyBooleanProperty internalProperty() { + return new ReadOnlyBooleanWrapper(termsList.isInternalList()); + } + + public BooleanProperty enabledProperty() { + return enabledProperty; + } +} diff --git a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.fxml b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.fxml index 0a098fc02c7..29df0104da2 100644 --- a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.fxml +++ b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.fxml @@ -6,6 +6,7 @@ + @@ -24,8 +25,16 @@ - - + diff --git a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.java b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.java index 3ab8e036e71..b5285f5e07c 100644 --- a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.java +++ b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTab.java @@ -2,13 +2,17 @@ import javax.inject.Inject; +import javafx.beans.property.ReadOnlyBooleanWrapper; import javafx.fxml.FXML; import javafx.scene.control.ContextMenu; -import javafx.scene.control.MenuItem; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.CheckBoxTableCell; +import org.jabref.gui.Globals; +import org.jabref.gui.actions.ActionFactory; +import org.jabref.gui.actions.SimpleCommand; +import org.jabref.gui.actions.StandardActions; import org.jabref.gui.icon.IconTheme; import org.jabref.gui.preferences.AbstractPreferenceTabView; import org.jabref.gui.preferences.PreferencesTab; @@ -25,12 +29,12 @@ * Dialog for managing term list files. */ public class ProtectedTermsTab extends AbstractPreferenceTabView implements PreferencesTab { - @FXML private TableView filesTable; - @FXML private TableColumn filesTableEnabledColumn; - @FXML private TableColumn filesTableDescriptionColumn; - @FXML private TableColumn filesTableFileColumn; - @FXML private TableColumn filesTableEditColumn; - @FXML private TableColumn filesTableDeleteColumn; + @FXML private TableView filesTable; + @FXML private TableColumn filesTableEnabledColumn; + @FXML private TableColumn filesTableDescriptionColumn; + @FXML private TableColumn filesTableFileColumn; + @FXML private TableColumn filesTableEditColumn; + @FXML private TableColumn filesTableDeleteColumn; @Inject private ProtectedTermsLoader termsLoader; @@ -49,60 +53,52 @@ public String getTabName() { public void initialize() { viewModel = new ProtectedTermsTabViewModel(termsLoader, dialogService, preferencesService); - filesTable.itemsProperty().bind(viewModel.termsFilesProperty()); - new ViewModelTableRowFactory() + new ViewModelTableRowFactory() .withContextMenu(this::createContextMenu) .install(filesTable); - filesTableEnabledColumn.setCellValueFactory(data -> BindingsHelper.constantOf(data.getValue().isEnabled())); filesTableEnabledColumn.setCellFactory(CheckBoxTableCell.forTableColumn(filesTableEnabledColumn)); - filesTableDescriptionColumn.setCellValueFactory(data -> BindingsHelper.constantOf(data.getValue().getDescription())); + filesTableEnabledColumn.setCellValueFactory(data -> data.getValue().enabledProperty()); + filesTableDescriptionColumn.setCellValueFactory(data -> BindingsHelper.constantOf(data.getValue().getTermsList().getDescription())); + filesTableFileColumn.setCellValueFactory(data -> { - ProtectedTermsList list = data.getValue(); + ProtectedTermsList list = data.getValue().getTermsList(); if (list.isInternalList()) { return BindingsHelper.constantOf(Localization.lang("Internal list")); } else { - return BindingsHelper.constantOf(data.getValue().getLocation()); + return BindingsHelper.constantOf(list.getLocation()); } }); - filesTableEditColumn.setCellValueFactory(data -> BindingsHelper.constantOf(true)); - filesTableDeleteColumn.setCellValueFactory(data -> BindingsHelper.constantOf(true)); - new ValueTableCellFactory() + filesTableEditColumn.setCellValueFactory(data -> data.getValue().internalProperty().not()); + new ValueTableCellFactory() .withGraphic(none -> IconTheme.JabRefIcons.EDIT.getGraphicNode()) - .withOnMouseClickedEvent((file, none) -> event -> viewModel.edit(file)) + .withVisibleExpression(ReadOnlyBooleanWrapper::new) + .withOnMouseClickedEvent((item, none) -> event -> viewModel.edit(item)) .install(filesTableEditColumn); - new ValueTableCellFactory() - .withGraphic(none -> IconTheme.JabRefIcons.REMOVE.getGraphicNode()) + + filesTableDeleteColumn.setCellValueFactory(data -> data.getValue().internalProperty().not()); + new ValueTableCellFactory() + .withGraphic(none -> IconTheme.JabRefIcons.DELETE_ENTRY.getGraphicNode()) + .withVisibleExpression(ReadOnlyBooleanWrapper::new) .withTooltip(none -> Localization.lang("Remove protected terms file")) - .withOnMouseClickedEvent((file, none) -> event -> viewModel.removeFile(file)) + .withOnMouseClickedEvent((item, none) -> event -> viewModel.removeList(item)) .install(filesTableDeleteColumn); + + filesTable.itemsProperty().set(viewModel.termsFilesProperty()); } - private ContextMenu createContextMenu(ProtectedTermsList file) { - MenuItem edit = new MenuItem(Localization.lang("Edit")); - edit.setOnAction(event -> viewModel.edit(file)); - MenuItem show = new MenuItem(Localization.lang("View")); - show.setOnAction(event -> viewModel.displayContent(file)); - MenuItem remove = new MenuItem(Localization.lang("Remove")); - remove.setOnAction(event -> viewModel.removeFile(file)); - MenuItem reload = new MenuItem(Localization.lang("Reload")); - reload.setOnAction(event -> viewModel.reloadFile(file)); - - // Enable/disable context menu items - if (file.isInternalList()) { - edit.setDisable(true); - show.setDisable(false); - remove.setDisable(true); - reload.setDisable(true); - } else { - edit.setDisable(false); - show.setDisable(false); - remove.setDisable(false); - reload.setDisable(false); - } + private ContextMenu createContextMenu(ProtectedTermsListItemModel file) { + ActionFactory factory = new ActionFactory(Globals.getKeyPrefs()); + ContextMenu contextMenu = new ContextMenu(); + contextMenu.getItems().addAll( + factory.createMenuItem(StandardActions.EDIT_LIST, new ProtectedTermsTab.ContextAction(StandardActions.EDIT_LIST, file)), + factory.createMenuItem(StandardActions.VIEW_LIST, new ProtectedTermsTab.ContextAction(StandardActions.VIEW_LIST, file)), + factory.createMenuItem(StandardActions.REMOVE_LIST, new ProtectedTermsTab.ContextAction(StandardActions.REMOVE_LIST, file)), + factory.createMenuItem(StandardActions.RELOAD_LIST, new ProtectedTermsTab.ContextAction(StandardActions.RELOAD_LIST, file)) + ); + contextMenu.getItems().forEach(item -> item.setGraphic(null)); + contextMenu.getStyleClass().add("context-menu"); - final ContextMenu contextMenu = new ContextMenu(); - contextMenu.getItems().addAll(edit, show, remove, reload); return contextMenu; } @@ -115,4 +111,31 @@ private void addFile() { private void createNewFile() { viewModel.createNewFile(); } + + private class ContextAction extends SimpleCommand { + + private final StandardActions command; + private final ProtectedTermsListItemModel itemModel; + + public ContextAction(StandardActions command, ProtectedTermsListItemModel itemModel) { + this.command = command; + this.itemModel = itemModel; + + this.executable.bind(BindingsHelper.constantOf( + switch (command) { + case EDIT_LIST, REMOVE_LIST, RELOAD_LIST -> !itemModel.getTermsList().isInternalList(); + default -> true; + })); + } + + @Override + public void execute() { + switch (command) { + case EDIT_LIST -> viewModel.edit(itemModel); + case VIEW_LIST -> viewModel.displayContent(itemModel); + case REMOVE_LIST -> viewModel.removeList(itemModel); + case RELOAD_LIST -> viewModel.reloadList(itemModel); + } + } + } } diff --git a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTabViewModel.java b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTabViewModel.java index dc370f12455..c3cc950660c 100644 --- a/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/protectedterms/ProtectedTermsTabViewModel.java @@ -10,6 +10,10 @@ import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleListProperty; import javafx.collections.FXCollections; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextArea; import org.jabref.gui.DialogService; import org.jabref.gui.desktop.JabRefDesktop; @@ -33,9 +37,10 @@ public class ProtectedTermsTabViewModel implements PreferenceTabViewModel { private static final Logger LOGGER = LoggerFactory.getLogger(ProtectedTermsTabViewModel.class); private final ProtectedTermsLoader termsLoader; - private final ListProperty termsFilesProperty = new SimpleListProperty<>(FXCollections.observableArrayList()); + private final ListProperty termsFilesProperty = new SimpleListProperty<>(FXCollections.observableArrayList()); private final PreferencesService preferences; private final DialogService dialogService; + private final ProtectedTermsPreferences protectedTermsPreferences; public ProtectedTermsTabViewModel(ProtectedTermsLoader termsLoader, DialogService dialogService, @@ -43,11 +48,13 @@ public ProtectedTermsTabViewModel(ProtectedTermsLoader termsLoader, this.termsLoader = termsLoader; this.dialogService = dialogService; this.preferences = preferences; + this.protectedTermsPreferences = preferences.getProtectedTermsPreferences(); } @Override public void setValues() { - termsFilesProperty.setValue(FXCollections.observableArrayList(termsLoader.getProtectedTermsLists())); + termsFilesProperty.clear(); + termsFilesProperty.addAll(termsLoader.getProtectedTermsLists().stream().map(ProtectedTermsListItemModel::new).toList()); } public void storeSettings() { @@ -56,7 +63,8 @@ public void storeSettings() { List enabledInternalList = new ArrayList<>(); List disabledInternalList = new ArrayList<>(); - for (ProtectedTermsList list : termsFilesProperty.getValue()) { + for (ProtectedTermsList list : termsFilesProperty.getValue().stream() + .map(ProtectedTermsListItemModel::getTermsList).toList()) { if (list.isInternalList()) { if (list.isEnabled()) { enabledInternalList.add(list.getLocation()); @@ -72,14 +80,12 @@ public void storeSettings() { } } - ProtectedTermsPreferences newPreferences = new ProtectedTermsPreferences( - enabledInternalList, - enabledExternalList, - disabledInternalList, - disabledExternalList); + protectedTermsPreferences.setEnabledInternalTermLists(enabledInternalList); + protectedTermsPreferences.setEnabledExternalTermLists(enabledExternalList); + protectedTermsPreferences.setDisabledInternalTermLists(disabledInternalList); + protectedTermsPreferences.setDisabledExternalTermLists(disabledExternalList); - preferences.storeProtectedTermsPreferences(newPreferences); - termsLoader.update(newPreferences); + termsLoader.update(protectedTermsPreferences); } public void addFile() { @@ -93,37 +99,38 @@ public void addFile() { .ifPresent(file -> { String fileName = file.toAbsolutePath().toString(); try { - termsFilesProperty.add(ProtectedTermsLoader.readProtectedTermsListFromFile(new File(fileName), true)); + termsFilesProperty.add(new ProtectedTermsListItemModel(ProtectedTermsLoader.readProtectedTermsListFromFile(new File(fileName), true))); } catch (FileNotFoundException e) { LOGGER.warn("Cannot find protected terms file " + fileName, e); } }); } - public void removeFile(ProtectedTermsList list) { + public void removeList(ProtectedTermsListItemModel itemModel) { + ProtectedTermsList list = itemModel.getTermsList(); if (!list.isInternalList() && dialogService.showConfirmationDialogAndWait(Localization.lang("Remove protected terms file"), Localization.lang("Are you sure you want to remove the protected terms file?"), Localization.lang("Remove protected terms file"), Localization.lang("Cancel"))) { - list.setEnabled(false); - if (!termsFilesProperty.remove(list)) { + itemModel.enabledProperty().setValue(false); + if (!termsFilesProperty.remove(itemModel)) { LOGGER.info("Problem removing protected terms file"); } } } public void createNewFile() { - dialogService.showCustomDialogAndWait(new NewProtectedTermsFileDialog(termsFilesProperty, dialogService)); + dialogService.showCustomDialogAndWait(new NewProtectedTermsFileDialog(termsFilesProperty, dialogService, preferences)); } - public void edit(ProtectedTermsList file) { + public void edit(ProtectedTermsListItemModel file) { Optional termsFileType = OptionalUtil.orElse( ExternalFileTypes.getInstance().getExternalFileTypeByExt("terms"), ExternalFileTypes.getInstance().getExternalFileTypeByExt("txt") ); - String fileName = file.getLocation(); + String fileName = file.getTermsList().getLocation(); try { JabRefDesktop.openExternalFileAnyFormat(new BibDatabaseContext(), preferences, fileName, termsFileType); } catch (IOException e) { @@ -131,19 +138,29 @@ public void edit(ProtectedTermsList file) { } } - public void displayContent(ProtectedTermsList list) { - dialogService.showInformationDialogAndWait( - list.getDescription() + " - " + list.getLocation(), - list.getTermListing() - ); + public void displayContent(ProtectedTermsListItemModel itemModel) { + ProtectedTermsList list = itemModel.getTermsList(); + TextArea listingView = new TextArea(list.getTermListing()); + listingView.setEditable(false); + + ScrollPane scrollPane = new ScrollPane(); + scrollPane.setFitToHeight(true); + scrollPane.setFitToWidth(true); + scrollPane.setContent(listingView); + + DialogPane dialogPane = new DialogPane(); + dialogPane.setContent(scrollPane); + + dialogService.showCustomDialogAndWait(list.getDescription() + " - " + list.getLocation(), dialogPane, ButtonType.OK); } - public void reloadFile(ProtectedTermsList oldList) { + public void reloadList(ProtectedTermsListItemModel oldItemModel) { + ProtectedTermsList oldList = oldItemModel.getTermsList(); try { ProtectedTermsList newList = ProtectedTermsLoader.readProtectedTermsListFromFile(new File(oldList.getLocation()), oldList.isEnabled()); - int index = termsFilesProperty.indexOf(oldList); + int index = termsFilesProperty.indexOf(oldItemModel); if (index >= 0) { - termsFilesProperty.set(index, newList); + termsFilesProperty.set(index, new ProtectedTermsListItemModel(newList)); } else { LOGGER.warn("Problem reloading protected terms file {}.", oldList.getLocation()); } @@ -152,7 +169,7 @@ public void reloadFile(ProtectedTermsList oldList) { } } - public ListProperty termsFilesProperty() { + public ListProperty termsFilesProperty() { return termsFilesProperty; } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/MrDLibFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/MrDLibFetcher.java index e505d2da78e..bbe4ad1c27c 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/MrDLibFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/MrDLibFetcher.java @@ -19,7 +19,6 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.MrDlibPreferences; -import org.jabref.preferences.PreferencesService; import org.apache.http.client.utils.URIBuilder; import org.slf4j.Logger; @@ -39,12 +38,12 @@ public class MrDLibFetcher implements EntryBasedFetcher { private String heading; private String description; private String recommendationSetId; - private final PreferencesService preferencesService; + private final MrDlibPreferences preferences; - public MrDLibFetcher(String language, Version version, PreferencesService preferencesService) { + public MrDLibFetcher(String language, Version version, MrDlibPreferences preferences) { LANGUAGE = language; VERSION = version; - this.preferencesService = preferencesService; + this.preferences = preferences; } @Override @@ -118,8 +117,6 @@ private String makeServerRequest(String queryByTitle) throws FetcherException { * @return the string used to make the query at mdl server */ private String constructQuery(String queryWithTitle) { - MrDlibPreferences preferences = preferencesService.getMrDlibPreferences(); - // The encoding does not work for / so we convert them by our own queryWithTitle = queryWithTitle.replaceAll("/", " "); URIBuilder builder = new URIBuilder(); diff --git a/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsPreferences.java b/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsPreferences.java index 6fe9f735fc2..b15fee9b9ed 100644 --- a/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsPreferences.java +++ b/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsPreferences.java @@ -2,34 +2,59 @@ import java.util.List; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + public class ProtectedTermsPreferences { - private final List enabledInternalTermLists; - private final List enabledExternalTermLists; - private final List disabledInternalTermLists; - private final List disabledExternalTermLists; + private final ObservableList enabledInternalTermLists; + private final ObservableList enabledExternalTermLists; + private final ObservableList disabledInternalTermLists; + private final ObservableList disabledExternalTermLists; + + public ProtectedTermsPreferences(List enabledInternalTermLists, + List enabledExternalTermLists, + List disabledInternalTermLists, + List disabledExternalTermLists) { + this.enabledInternalTermLists = FXCollections.observableArrayList(enabledInternalTermLists); + this.disabledInternalTermLists = FXCollections.observableArrayList(disabledInternalTermLists); + this.enabledExternalTermLists = FXCollections.observableArrayList(enabledExternalTermLists); + this.disabledExternalTermLists = FXCollections.observableArrayList(disabledExternalTermLists); + } + + public ObservableList getEnabledInternalTermLists() { + return FXCollections.unmodifiableObservableList(enabledInternalTermLists); + } + + public ObservableList getEnabledExternalTermLists() { + return FXCollections.unmodifiableObservableList(enabledExternalTermLists); + } + + public ObservableList getDisabledInternalTermLists() { + return FXCollections.unmodifiableObservableList(disabledInternalTermLists); + } - public ProtectedTermsPreferences(List enabledInternalTermLists, List enabledExternalTermLists, - List disabledInternalTermLists, List disabledExternalTermLists) { - this.enabledInternalTermLists = enabledInternalTermLists; - this.disabledInternalTermLists = disabledInternalTermLists; - this.enabledExternalTermLists = enabledExternalTermLists; - this.disabledExternalTermLists = disabledExternalTermLists; + public ObservableList getDisabledExternalTermLists() { + return FXCollections.unmodifiableObservableList(disabledExternalTermLists); } - public List getEnabledInternalTermLists() { - return enabledInternalTermLists; + public void setEnabledInternalTermLists(List list) { + enabledInternalTermLists.clear(); + enabledInternalTermLists.addAll(list); } - public List getEnabledExternalTermLists() { - return enabledExternalTermLists; + public void setEnabledExternalTermLists(List list) { + enabledExternalTermLists.clear(); + enabledExternalTermLists.addAll(list); } - public List getDisabledInternalTermLists() { - return disabledInternalTermLists; + public void setDisabledInternalTermLists(List list) { + disabledInternalTermLists.clear(); + disabledInternalTermLists.addAll(list); } - public List getDisabledExternalTermLists() { - return disabledExternalTermLists; + public void setDisabledExternalTermLists(List list) { + disabledExternalTermLists.clear(); + disabledExternalTermLists.addAll(list); } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 602f237630d..dadcb69d43a 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -33,6 +33,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import javafx.beans.InvalidationListener; import javafx.scene.control.TableColumn.SortType; import org.jabref.gui.Globals; @@ -410,13 +411,17 @@ public class JabRefPreferences implements PreferencesService { private Map> entryEditorTabList; private List mainTableColumns; private List mainTableColumnSortOrder; - private PreviewPreferences previewPreferences; - private SidePanePreferences sidePanePreferences; private Theme globalTheme; private Set customImporters; private String userName; + + private PreviewPreferences previewPreferences; + private SidePanePreferences sidePanePreferences; private AppearancePreferences appearancePreferences; private ImporterPreferences importerPreferences; + private ProtectedTermsPreferences protectedTermsPreferences; + private MrDlibPreferences mrDlibPreferences; + private EntryEditorPreferences entryEditorPreferences; // The constructor is made private to enforce this as a singleton class: private JabRefPreferences() { @@ -1450,8 +1455,7 @@ public boolean getDisplayGroupCount() { * * @return a list of defined tabs */ - @Override - public Map> getEntryEditorTabList() { + private Map> getEntryEditorTabList() { if (entryEditorTabList == null) { updateEntryEditorTabList(); } @@ -1461,8 +1465,7 @@ public Map> getEntryEditorTabList() { /** * Reloads the list of the currently defined tabs in the entry editor from scratch to cache */ - @Override - public void updateEntryEditorTabList() { + private void updateEntryEditorTabList() { Map> tabs = new LinkedHashMap<>(); int i = 0; String name; @@ -1491,8 +1494,7 @@ public void updateEntryEditorTabList() { * * @param customTabs a map of tab names and the corresponding set of fields to be displayed in */ - @Override - public void storeEntryEditorTabList(Map> customTabs) { + private void storeEntryEditorTabList(Map> customTabs) { String[] names = customTabs.keySet().toArray(String[]::new); String[] fields = customTabs.values().stream() .map(set -> set.stream() @@ -1562,7 +1564,11 @@ public List getAllDefaultTabFieldNames() { @Override public EntryEditorPreferences getEntryEditorPreferences() { - return new EntryEditorPreferences(getEntryEditorTabList(), + if (Objects.nonNull(entryEditorPreferences)) { + return entryEditorPreferences; + } + + entryEditorPreferences = new EntryEditorPreferences(getEntryEditorTabList(), getBoolean(AUTO_OPEN_FORM), getBoolean(SHOW_RECOMMENDATIONS), getBoolean(ACCEPT_RECOMMENDATIONS), @@ -1571,19 +1577,18 @@ public EntryEditorPreferences getEntryEditorPreferences() { getBoolean(VALIDATE_IN_ENTRY_EDITOR), getBoolean(ALLOW_INTEGER_EDITION_BIBTEX), getDouble(ENTRY_EDITOR_HEIGHT)); - } - @Override - public void storeEntryEditorPreferences(EntryEditorPreferences preferences) { - storeEntryEditorTabList(preferences.getEntryEditorTabList()); - putBoolean(AUTO_OPEN_FORM, preferences.shouldOpenOnNewEntry()); - putBoolean(SHOW_RECOMMENDATIONS, preferences.shouldShowRecommendationsTab()); - putBoolean(ACCEPT_RECOMMENDATIONS, preferences.isMrdlibAccepted()); - putBoolean(SHOW_LATEX_CITATIONS, preferences.shouldShowLatexCitationsTab()); - putBoolean(DEFAULT_SHOW_SOURCE, preferences.showSourceTabByDefault()); - putBoolean(VALIDATE_IN_ENTRY_EDITOR, preferences.shouldEnableValidation()); - putBoolean(ALLOW_INTEGER_EDITION_BIBTEX, preferences.shouldAllowIntegerEditionBibtex()); - putDouble(ENTRY_EDITOR_HEIGHT, preferences.getDividerPosition()); + EasyBind.subscribe(entryEditorPreferences.entryEditorTabListProperty(), this::storeEntryEditorTabList); + EasyBind.subscribe(entryEditorPreferences.shouldOpenOnNewEntryProperty(), newValue -> putBoolean(AUTO_OPEN_FORM, newValue)); + EasyBind.subscribe(entryEditorPreferences.shouldShowRecommendationsTabProperty(), newValue -> putBoolean(SHOW_RECOMMENDATIONS, newValue)); + EasyBind.subscribe(entryEditorPreferences.isMrdlibAcceptedProperty(), newValue -> putBoolean(ACCEPT_RECOMMENDATIONS, newValue)); + EasyBind.subscribe(entryEditorPreferences.shouldShowLatexCitationsTabProperty(), newValue -> putBoolean(SHOW_LATEX_CITATIONS, newValue)); + EasyBind.subscribe(entryEditorPreferences.showSourceTabByDefaultProperty(), newValue -> putBoolean(DEFAULT_SHOW_SOURCE, newValue)); + EasyBind.subscribe(entryEditorPreferences.enableValidationProperty(), newValue -> putBoolean(VALIDATE_IN_ENTRY_EDITOR, newValue)); + EasyBind.subscribe(entryEditorPreferences.allowIntegerEditionBibtexProperty(), newValue -> putBoolean(ALLOW_INTEGER_EDITION_BIBTEX, newValue)); + EasyBind.subscribe(entryEditorPreferences.dividerPositionProperty(), newValue -> putDouble(ENTRY_EDITOR_HEIGHT, newValue.doubleValue())); + + return entryEditorPreferences; } //************************************************************************************************************* @@ -2680,19 +2685,22 @@ public void storeMergeDiffMode(String diffMode) { @Override public MrDlibPreferences getMrDlibPreferences() { - return new MrDlibPreferences( + if (Objects.nonNull(mrDlibPreferences)) { + return mrDlibPreferences; + } + + mrDlibPreferences = new MrDlibPreferences( getBoolean(ACCEPT_RECOMMENDATIONS), getBoolean(SEND_LANGUAGE_DATA), getBoolean(SEND_OS_DATA), getBoolean(SEND_TIMEZONE_DATA)); - } - @Override - public void storeMrDlibPreferences(MrDlibPreferences preferences) { - putBoolean(ACCEPT_RECOMMENDATIONS, preferences.shouldAcceptRecommendations()); - putBoolean(SEND_LANGUAGE_DATA, preferences.shouldSendLanguage()); - putBoolean(SEND_OS_DATA, preferences.shouldSendOs()); - putBoolean(SEND_TIMEZONE_DATA, preferences.shouldSendTimezone()); + EasyBind.subscribe(mrDlibPreferences.acceptRecommendationsProperty(), newValue -> putBoolean(ACCEPT_RECOMMENDATIONS, newValue)); + EasyBind.subscribe(mrDlibPreferences.sendLanguageProperty(), newValue -> putBoolean(SEND_LANGUAGE_DATA, newValue)); + EasyBind.subscribe(mrDlibPreferences.sendOsProperty(), newValue -> putBoolean(SEND_OS_DATA, newValue)); + EasyBind.subscribe(mrDlibPreferences.sendTimezoneProperty(), newValue -> putBoolean(SEND_TIMEZONE_DATA, newValue)); + + return mrDlibPreferences; } @Override @@ -2707,19 +2715,27 @@ public void storeIdBasedFetcherForEntryGenerator(String fetcherName) { @Override public ProtectedTermsPreferences getProtectedTermsPreferences() { - return new ProtectedTermsPreferences( + if (Objects.nonNull(protectedTermsPreferences)) { + return protectedTermsPreferences; + } + + protectedTermsPreferences = new ProtectedTermsPreferences( getStringList(PROTECTED_TERMS_ENABLED_INTERNAL), getStringList(PROTECTED_TERMS_ENABLED_EXTERNAL), getStringList(PROTECTED_TERMS_DISABLED_INTERNAL), - getStringList(PROTECTED_TERMS_DISABLED_EXTERNAL)); - } + getStringList(PROTECTED_TERMS_DISABLED_EXTERNAL) + ); - @Override - public void storeProtectedTermsPreferences(ProtectedTermsPreferences preferences) { - putStringList(PROTECTED_TERMS_ENABLED_EXTERNAL, preferences.getEnabledExternalTermLists()); - putStringList(PROTECTED_TERMS_DISABLED_EXTERNAL, preferences.getDisabledExternalTermLists()); - putStringList(PROTECTED_TERMS_ENABLED_INTERNAL, preferences.getEnabledInternalTermLists()); - putStringList(PROTECTED_TERMS_DISABLED_INTERNAL, preferences.getDisabledInternalTermLists()); + protectedTermsPreferences.getEnabledExternalTermLists().addListener((InvalidationListener) change -> + putStringList(PROTECTED_TERMS_ENABLED_EXTERNAL, protectedTermsPreferences.getEnabledExternalTermLists())); + protectedTermsPreferences.getDisabledExternalTermLists().addListener((InvalidationListener) change -> + putStringList(PROTECTED_TERMS_DISABLED_EXTERNAL, protectedTermsPreferences.getDisabledExternalTermLists())); + protectedTermsPreferences.getEnabledInternalTermLists().addListener((InvalidationListener) change -> + putStringList(PROTECTED_TERMS_ENABLED_INTERNAL, protectedTermsPreferences.getEnabledInternalTermLists())); + protectedTermsPreferences.getDisabledInternalTermLists().addListener((InvalidationListener) change -> + putStringList(PROTECTED_TERMS_DISABLED_INTERNAL, protectedTermsPreferences.getDisabledInternalTermLists())); + + return protectedTermsPreferences; } //************************************************************************************************************* @@ -2728,12 +2744,16 @@ public void storeProtectedTermsPreferences(ProtectedTermsPreferences preferences @Override public ImporterPreferences getImporterPreferences() { - importerPreferences = Objects.requireNonNullElseGet(importerPreferences, () -> new ImporterPreferences( + if (Objects.nonNull(importerPreferences)) { + return importerPreferences; + } + + importerPreferences = new ImporterPreferences( getBoolean(GENERATE_KEY_ON_IMPORT), getBoolean(GROBID_ENABLED), getBoolean(GROBID_OPT_OUT), get(GROBID_URL) - )); + ); EasyBind.subscribe(importerPreferences.generateNewKeyOnImportProperty(), newValue -> putBoolean(GENERATE_KEY_ON_IMPORT, newValue)); EasyBind.subscribe(importerPreferences.grobidEnabledProperty(), newValue -> putBoolean(GROBID_ENABLED, newValue)); diff --git a/src/main/java/org/jabref/preferences/MrDlibPreferences.java b/src/main/java/org/jabref/preferences/MrDlibPreferences.java index cb1a1b5f1b3..fd6a0b4cc4a 100644 --- a/src/main/java/org/jabref/preferences/MrDlibPreferences.java +++ b/src/main/java/org/jabref/preferences/MrDlibPreferences.java @@ -1,32 +1,67 @@ package org.jabref.preferences; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; + public class MrDlibPreferences { - private final boolean acceptRecommendations; - private final boolean shouldSendLanguage; - private final boolean shouldSendOs; - private final boolean shouldSendTimezone; + private final BooleanProperty acceptRecommendations; + private final BooleanProperty sendLanguage; + private final BooleanProperty sendOs; + private final BooleanProperty sendTimezone; public MrDlibPreferences(boolean acceptRecommendations, boolean shouldSendLanguage, boolean shouldSendOs, boolean shouldSendTimezone) { - this.acceptRecommendations = acceptRecommendations; - this.shouldSendLanguage = shouldSendLanguage; - this.shouldSendOs = shouldSendOs; - this.shouldSendTimezone = shouldSendTimezone; + this.acceptRecommendations = new SimpleBooleanProperty(acceptRecommendations); + this.sendLanguage = new SimpleBooleanProperty(shouldSendLanguage); + this.sendOs = new SimpleBooleanProperty(shouldSendOs); + this.sendTimezone = new SimpleBooleanProperty(shouldSendTimezone); } public boolean shouldAcceptRecommendations() { + return acceptRecommendations.get(); + } + + public BooleanProperty acceptRecommendationsProperty() { return acceptRecommendations; } + public void setAcceptRecommendations(boolean acceptRecommendations) { + this.acceptRecommendations.set(acceptRecommendations); + } + public boolean shouldSendLanguage() { - return shouldSendLanguage; + return sendLanguage.get(); + } + + public BooleanProperty sendLanguageProperty() { + return sendLanguage; + } + + public void setSendLanguage(boolean sendLanguage) { + this.sendLanguage.set(sendLanguage); } public boolean shouldSendOs() { - return shouldSendOs; + return sendOs.get(); + } + + public BooleanProperty sendOsProperty() { + return sendOs; + } + + public void setSendOs(boolean sendOs) { + this.sendOs.set(sendOs); } public boolean shouldSendTimezone() { - return shouldSendTimezone; + return sendTimezone.get(); + } + + public BooleanProperty sendTimezoneProperty() { + return sendTimezone; + } + + public void setSendTimezone(boolean sendTimezone) { + this.sendTimezone.set(sendTimezone); } } diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index e5ce77b258f..d180b256629 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -181,20 +181,12 @@ public interface PreferencesService { // EntryEditorPreferences //************************************************************************************************************* - Map> getEntryEditorTabList(); - - void updateEntryEditorTabList(); - Map> getDefaultTabNamesAndFields(); List getAllDefaultTabFieldNames(); - void storeEntryEditorTabList(Map> customTabsMap); - EntryEditorPreferences getEntryEditorPreferences(); - void storeEntryEditorPreferences(EntryEditorPreferences preferences); - //************************************************************************************************************* // Network preferences //************************************************************************************************************* @@ -371,13 +363,9 @@ public interface PreferencesService { MrDlibPreferences getMrDlibPreferences(); - void storeMrDlibPreferences(MrDlibPreferences preferences); - String getIdBasedFetcherForEntryGenerator(); void storeIdBasedFetcherForEntryGenerator(String fetcherName); ProtectedTermsPreferences getProtectedTermsPreferences(); - - void storeProtectedTermsPreferences(ProtectedTermsPreferences preferences); } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/MrDLibFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/MrDLibFetcherTest.java index 0a8c21cb756..830cc5f67b1 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/MrDLibFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/MrDLibFetcherTest.java @@ -7,7 +7,6 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.MrDlibPreferences; -import org.jabref.preferences.PreferencesService; import org.jabref.testutils.category.FetcherTest; import org.junit.jupiter.api.BeforeEach; @@ -15,8 +14,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; @FetcherTest public class MrDLibFetcherTest { @@ -25,15 +22,12 @@ public class MrDLibFetcherTest { @BeforeEach public void setUp() { - PreferencesService preferencesService = mock(PreferencesService.class); MrDlibPreferences mrDlibPreferences = new MrDlibPreferences( true, false, false, false); - when(preferencesService.getMrDlibPreferences()).thenReturn(mrDlibPreferences); - - fetcher = new MrDLibFetcher("", Version.parse(""), preferencesService); + fetcher = new MrDLibFetcher("", Version.parse(""), mrDlibPreferences); } @Test From 18f083b90ef13992eba542480c15120701517e4c Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 1 Sep 2021 17:03:04 +0200 Subject: [PATCH 08/15] =?UTF-8?q?Welcome=20btut=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 1c8bdbad56b..baec36a6925 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7,3 +7,4 @@ Linus Dietz (since 2017) Carl Christian Snethlage (since 2020) Dominik Voigt (since 2020) Jonatan Askertop (since 2021) +Benedikt Tutzer (since 2021) From ac84e5d5f371b4b3b734ab7f6a94bc39e1900bb3 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 1 Sep 2021 17:47:09 +0200 Subject: [PATCH 09/15] Observable Preferences C (General) (#8047) --- src/main/java/org/jabref/gui/JabRefFrame.java | 4 +- src/main/java/org/jabref/gui/LibraryTab.java | 3 +- .../gui/preferences/general/GeneralTab.java | 2 +- .../general/GeneralTabViewModel.java | 81 ++++++++---------- .../importexport/ImportExportTab.java | 2 +- .../ImportExportTabViewModel.java | 16 ++-- .../logic/preferences/DOIPreferences.java | 29 ++++++- .../logic/preferences/OwnerPreferences.java | 41 +++++++-- .../preferences/TimestampPreferences.java | 27 +++++- .../preferences/GeneralPreferences.java | 80 +++++++++++++---- .../jabref/preferences/JabRefPreferences.java | 85 ++++++++++--------- .../preferences/PreferencesService.java | 10 --- .../preferences/TelemetryPreferences.java | 29 ++++--- 13 files changed, 261 insertions(+), 148 deletions(-) diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index 59f4e10bb35..7c5f9e26e58 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -312,8 +312,8 @@ private void showTrackingNotification() { Localization.lang("Don't share")); } - prefs.storeTelemetryPreferences(telemetryPreferences.withCollectTelemetry(shouldCollect) - .withAskToCollectTelemetry(false)); + telemetryPreferences.setCollectTelemetry(shouldCollect); + telemetryPreferences.setAskToCollectTelemetry(false); } /** diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index a58245a07c8..c098d12e30b 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -665,8 +665,7 @@ private boolean showDeleteConfirmationDialog(int numberOfEntries) { okButton, cancelButton, Localization.lang("Do not ask again"), - optOut -> preferencesService.storeGeneralPreferences( - preferencesService.getGeneralPreferences().withConfirmDelete(!optOut))); + optOut -> preferencesService.getGeneralPreferences().setConfirmDelete(!optOut)); } else { return true; } diff --git a/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java b/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java index 68b61566c13..fc164a5ec4b 100644 --- a/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java +++ b/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java @@ -54,7 +54,7 @@ public String getTabName() { } public void initialize() { - this.viewModel = new GeneralTabViewModel(dialogService, preferencesService); + this.viewModel = new GeneralTabViewModel(dialogService, preferencesService, preferencesService.getGeneralPreferences(), preferencesService.getTelemetryPreferences(), preferencesService.getOwnerPreferences(), preferencesService.getTimestampPreferences()); new ViewModelListCellFactory() .withText(Language::getDisplayName) diff --git a/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java b/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java index e3199bafd75..4f4c8d9469e 100644 --- a/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java @@ -48,22 +48,22 @@ public class GeneralTabViewModel implements PreferenceTabViewModel { private final BooleanProperty addModificationDateProperty = new SimpleBooleanProperty(); private final DialogService dialogService; + private final GeneralPreferences generalPreferences; private final PreferencesService preferencesService; - private final GeneralPreferences initialGeneralPreferences; - private final TelemetryPreferences initialTelemetryPreferences; - private final OwnerPreferences initialOwnerPreferences; - private final TimestampPreferences initialTimestampPreferences; + private final TelemetryPreferences telemetryPreferences; + private final OwnerPreferences ownerPreferences; + private final TimestampPreferences timestampPreferences; private List restartWarning = new ArrayList<>(); @SuppressWarnings("ReturnValueIgnored") - public GeneralTabViewModel(DialogService dialogService, PreferencesService preferencesService) { + public GeneralTabViewModel(DialogService dialogService, PreferencesService preferencesService, GeneralPreferences generalPreferences, TelemetryPreferences telemetryPreferences, OwnerPreferences ownerPreferences, TimestampPreferences timestampPreferences) { this.dialogService = dialogService; + this.generalPreferences = generalPreferences; this.preferencesService = preferencesService; - this.initialGeneralPreferences = preferencesService.getGeneralPreferences(); - this.initialTelemetryPreferences = preferencesService.getTelemetryPreferences(); - this.initialOwnerPreferences = preferencesService.getOwnerPreferences(); - this.initialTimestampPreferences = preferencesService.getTimestampPreferences(); + this.telemetryPreferences = telemetryPreferences; + this.ownerPreferences = ownerPreferences; + this.timestampPreferences = timestampPreferences; } public void setValues() { @@ -71,23 +71,23 @@ public void setValues() { selectedLanguageProperty.setValue(preferencesService.getLanguage()); encodingsListProperty.setValue(FXCollections.observableArrayList(Encodings.getCharsets())); - selectedEncodingProperty.setValue(initialGeneralPreferences.getDefaultEncoding()); + selectedEncodingProperty.setValue(generalPreferences.getDefaultEncoding()); bibliographyModeListProperty.setValue(FXCollections.observableArrayList(BibDatabaseMode.values())); - selectedBiblatexModeProperty.setValue(initialGeneralPreferences.getDefaultBibDatabaseMode()); + selectedBiblatexModeProperty.setValue(generalPreferences.getDefaultBibDatabaseMode()); - inspectionWarningDuplicateProperty.setValue(initialGeneralPreferences.isWarnAboutDuplicatesInInspection()); - confirmDeleteProperty.setValue(initialGeneralPreferences.shouldConfirmDelete()); - memoryStickModeProperty.setValue(initialGeneralPreferences.isMemoryStickMode()); - collectTelemetryProperty.setValue(initialTelemetryPreferences.shouldCollectTelemetry()); - showAdvancedHintsProperty.setValue(initialGeneralPreferences.shouldShowAdvancedHints()); + inspectionWarningDuplicateProperty.setValue(generalPreferences.warnAboutDuplicatesInInspection()); + confirmDeleteProperty.setValue(generalPreferences.shouldConfirmDelete()); + memoryStickModeProperty.setValue(generalPreferences.isMemoryStickMode()); + collectTelemetryProperty.setValue(telemetryPreferences.shouldCollectTelemetry()); + showAdvancedHintsProperty.setValue(generalPreferences.shouldShowAdvancedHints()); - markOwnerProperty.setValue(initialOwnerPreferences.isUseOwner()); - markOwnerNameProperty.setValue(initialOwnerPreferences.getDefaultOwner()); - markOwnerOverwriteProperty.setValue(initialOwnerPreferences.isOverwriteOwner()); + markOwnerProperty.setValue(ownerPreferences.isUseOwner()); + markOwnerNameProperty.setValue(ownerPreferences.getDefaultOwner()); + markOwnerOverwriteProperty.setValue(ownerPreferences.isOverwriteOwner()); - addCreationDateProperty.setValue(initialTimestampPreferences.shouldAddCreationDate()); - addModificationDateProperty.setValue(initialTimestampPreferences.shouldAddModificationDate()); + addCreationDateProperty.setValue(timestampPreferences.shouldAddCreationDate()); + addModificationDateProperty.setValue(timestampPreferences.shouldAddModificationDate()); } public void storeSettings() { @@ -98,34 +98,27 @@ public void storeSettings() { restartWarning.add(Localization.lang("Changed language") + ": " + newLanguage.getDisplayName()); } - if (initialGeneralPreferences.isMemoryStickMode() && !memoryStickModeProperty.getValue()) { + if (generalPreferences.isMemoryStickMode() && !memoryStickModeProperty.getValue()) { dialogService.showInformationDialogAndWait(Localization.lang("Memory stick mode"), Localization.lang("To disable the memory stick mode" + " rename or remove the jabref.xml file in the same folder as JabRef.")); } - preferencesService.storeGeneralPreferences(new GeneralPreferences( - selectedEncodingProperty.getValue(), - selectedBiblatexModeProperty.getValue(), - inspectionWarningDuplicateProperty.getValue(), - confirmDeleteProperty.getValue(), - memoryStickModeProperty.getValue(), - showAdvancedHintsProperty.getValue())); - - preferencesService.storeTelemetryPreferences( - initialTelemetryPreferences.withCollectTelemetry(collectTelemetryProperty.getValue())); - - preferencesService.storeOwnerPreferences(new OwnerPreferences( - markOwnerProperty.getValue(), - markOwnerNameProperty.getValue().trim(), - markOwnerOverwriteProperty.getValue())); - - preferencesService.storeTimestampPreferences(new TimestampPreferences( - addCreationDateProperty.getValue(), - addModificationDateProperty.getValue(), - initialTimestampPreferences.shouldUpdateTimestamp(), - initialTimestampPreferences.getTimestampField(), - initialTimestampPreferences.getTimestampFormat())); + generalPreferences.setDefaultEncoding(selectedEncodingProperty.getValue()); + generalPreferences.setDefaultBibDatabaseMode(selectedBiblatexModeProperty.getValue()); + generalPreferences.setWarnAboutDuplicatesInInspection(inspectionWarningDuplicateProperty.getValue()); + generalPreferences.setConfirmDelete(confirmDeleteProperty.getValue()); + generalPreferences.setMemoryStickMode(memoryStickModeProperty.getValue()); + generalPreferences.setShowAdvancedHints(showAdvancedHintsProperty.getValue()); + + telemetryPreferences.setCollectTelemetry(collectTelemetryProperty.getValue()); + + ownerPreferences.setUseOwner(markOwnerProperty.getValue()); + ownerPreferences.setDefaultOwner(markOwnerNameProperty.getValue()); + ownerPreferences.setOverwriteOwner(markOwnerOverwriteProperty.getValue()); + + timestampPreferences.setAddCreationDate(addCreationDateProperty.getValue()); + timestampPreferences.setAddModificationDate(addModificationDateProperty.getValue()); } @Override diff --git a/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTab.java b/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTab.java index 01c3db09038..42cffc479b7 100644 --- a/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTab.java +++ b/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTab.java @@ -34,7 +34,7 @@ public String getTabName() { } public void initialize() { - this.viewModel = new ImportExportTabViewModel(preferencesService); + this.viewModel = new ImportExportTabViewModel(preferencesService, preferencesService.getDOIPreferences()); useCustomDOI.selectedProperty().bindBidirectional(viewModel.useCustomDOIProperty()); useCustomDOIName.textProperty().bindBidirectional(viewModel.useCustomDOINameProperty()); diff --git a/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java b/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java index 94d3a082c37..6182fb9e342 100644 --- a/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/importexport/ImportExportTabViewModel.java @@ -40,22 +40,22 @@ public class ImportExportTabViewModel implements PreferenceTabViewModel { private final StringProperty grobidURLProperty = new SimpleStringProperty(""); private final PreferencesService preferencesService; - private final DOIPreferences initialDOIPreferences; + private final DOIPreferences doiPreferences; private final ImporterPreferences importerPreferences; private final SaveOrderConfig initialExportOrder; - public ImportExportTabViewModel(PreferencesService preferencesService) { + public ImportExportTabViewModel(PreferencesService preferencesService, DOIPreferences doiPreferences) { this.preferencesService = preferencesService; this.importerPreferences = preferencesService.getImporterPreferences(); - this.initialDOIPreferences = preferencesService.getDOIPreferences(); + this.doiPreferences = doiPreferences; this.initialExportOrder = preferencesService.getExportSaveOrder(); } @Override public void setValues() { generateKeyOnImportProperty.setValue(importerPreferences.isGenerateNewKeyOnImport()); - useCustomDOIProperty.setValue(initialDOIPreferences.isUseCustom()); - useCustomDOINameProperty.setValue(initialDOIPreferences.getDefaultBaseURI()); + useCustomDOIProperty.setValue(doiPreferences.isUseCustom()); + useCustomDOINameProperty.setValue(doiPreferences.getDefaultBaseURI()); switch (initialExportOrder.getOrderType()) { case SPECIFIED -> exportInSpecifiedOrderProperty.setValue(true); @@ -82,15 +82,13 @@ public void storeSettings() { importerPreferences.setGrobidOptOut(importerPreferences.isGrobidOptOut()); importerPreferences.setGrobidURL(grobidURLProperty.getValue()); - preferencesService.storeDOIPreferences(new DOIPreferences( - useCustomDOIProperty.getValue(), - useCustomDOINameProperty.getValue().trim())); + doiPreferences.setUseCustom(useCustomDOIProperty.get()); + doiPreferences.setDefaultBaseURI(useCustomDOINameProperty.getValue().trim()); SaveOrderConfig newSaveOrderConfig = new SaveOrderConfig( SaveOrderConfig.OrderType.fromBooleans(exportInSpecifiedOrderProperty.getValue(), exportInTableOrderProperty.getValue()), sortCriteriaProperty.stream().map(SortCriterionViewModel::getCriterion).toList()); preferencesService.storeExportSaveOrder(newSaveOrderConfig); - } public BooleanProperty generateKeyOnImportProperty() { diff --git a/src/main/java/org/jabref/logic/preferences/DOIPreferences.java b/src/main/java/org/jabref/logic/preferences/DOIPreferences.java index 93c0f11fa4b..fe5a0af238a 100644 --- a/src/main/java/org/jabref/logic/preferences/DOIPreferences.java +++ b/src/main/java/org/jabref/logic/preferences/DOIPreferences.java @@ -1,19 +1,40 @@ package org.jabref.logic.preferences; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + public class DOIPreferences { - private final boolean useCustom; - private final String defaultBaseURI; + private BooleanProperty useCustom; + private final StringProperty defaultBaseURI; public DOIPreferences(boolean useCustom, String defaultBaseURI) { - this.useCustom = useCustom; - this.defaultBaseURI = defaultBaseURI; + this.useCustom = new SimpleBooleanProperty(useCustom); + this.defaultBaseURI = new SimpleStringProperty(defaultBaseURI); } public boolean isUseCustom() { + return useCustom.get(); + } + + public BooleanProperty useCustomProperty() { return useCustom; } + public void setUseCustom(boolean useCustom) { + this.useCustom.set(useCustom); + } + public String getDefaultBaseURI() { + return defaultBaseURI.get(); + } + + public StringProperty defaultBaseURIProperty() { return defaultBaseURI; } + + public void setDefaultBaseURI(String defaultBaseURI) { + this.defaultBaseURI.set(defaultBaseURI); + } } diff --git a/src/main/java/org/jabref/logic/preferences/OwnerPreferences.java b/src/main/java/org/jabref/logic/preferences/OwnerPreferences.java index 8c18d099124..d411dbddfb1 100644 --- a/src/main/java/org/jabref/logic/preferences/OwnerPreferences.java +++ b/src/main/java/org/jabref/logic/preferences/OwnerPreferences.java @@ -1,27 +1,56 @@ package org.jabref.logic.preferences; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + public class OwnerPreferences { - private final boolean useOwner; - private final String defaultOwner; - private final boolean overwriteOwner; + private final BooleanProperty useOwner; + private final StringProperty defaultOwner; + private final BooleanProperty overwriteOwner; public OwnerPreferences(boolean useOwner, String defaultOwner, boolean overwriteOwner) { - this.useOwner = useOwner; - this.defaultOwner = defaultOwner; - this.overwriteOwner = overwriteOwner; + this.useOwner = new SimpleBooleanProperty(useOwner); + this.defaultOwner = new SimpleStringProperty(defaultOwner); + this.overwriteOwner = new SimpleBooleanProperty(overwriteOwner); } public boolean isUseOwner() { + return useOwner.getValue(); + } + + public BooleanProperty useOwnerProperty() { return useOwner; } + public void setUseOwner(boolean useOwner) { + this.useOwner.set(useOwner); + } + public String getDefaultOwner() { + return defaultOwner.getValue(); + } + + public StringProperty defaultOwnerProperty() { return defaultOwner; } + public void setDefaultOwner(String defaultOwner) { + this.defaultOwner.set(defaultOwner); + } + public boolean isOverwriteOwner() { + return overwriteOwner.getValue(); + } + + public BooleanProperty overwriteOwnerProperty() { return overwriteOwner; } + + public void setOverwriteOwner(boolean overwriteOwner) { + this.overwriteOwner.set(overwriteOwner); + } } diff --git a/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java b/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java index 388a8477aec..a8d676cbc0f 100644 --- a/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java +++ b/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java @@ -4,11 +4,14 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; + import org.jabref.model.entry.field.Field; public class TimestampPreferences { - private final boolean addCreationDate; - private final boolean addModificationDate; + private final BooleanProperty addCreationDate; + private final BooleanProperty addModificationDate; // These are old preferences. They are used for migration only. private final boolean updateTimestamp; @@ -16,8 +19,8 @@ public class TimestampPreferences { private final String timestampFormat; public TimestampPreferences(boolean addCreationDate, boolean modifyTimestamp, boolean updateTimestamp, Field timestampField, String timestampFormat) { - this.addCreationDate = addCreationDate; - this.addModificationDate = modifyTimestamp; + this.addCreationDate = new SimpleBooleanProperty(addCreationDate); + this.addModificationDate = new SimpleBooleanProperty(modifyTimestamp); this.updateTimestamp = updateTimestamp; this.timestampField = timestampField; this.timestampFormat = timestampFormat; @@ -29,13 +32,29 @@ public String now() { } public boolean shouldAddCreationDate() { + return addCreationDate.get(); + } + + public BooleanProperty addCreationDateProperty() { return addCreationDate; } + public void setAddCreationDate(boolean addCreationDate) { + this.addCreationDate.set(addCreationDate); + } + public boolean shouldAddModificationDate() { + return addModificationDate.get(); + } + + public BooleanProperty addModificationDateProperty() { return addModificationDate; } + public void setAddModificationDate(boolean addModificationDate) { + this.addModificationDate.set(addModificationDate); + } + /** * Required for migration only. */ diff --git a/src/main/java/org/jabref/preferences/GeneralPreferences.java b/src/main/java/org/jabref/preferences/GeneralPreferences.java index c74ae46cc02..4598c00e392 100644 --- a/src/main/java/org/jabref/preferences/GeneralPreferences.java +++ b/src/main/java/org/jabref/preferences/GeneralPreferences.java @@ -2,16 +2,21 @@ import java.nio.charset.Charset; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleObjectProperty; + import org.jabref.model.database.BibDatabaseMode; public class GeneralPreferences { - private final Charset defaultEncoding; - private final BibDatabaseMode defaultBibDatabaseMode; - private final boolean warnAboutDuplicatesInInspection; - private boolean confirmDelete; + private final ObjectProperty defaultEncoding; + private final ObjectProperty defaultBibDatabaseMode; + private final BooleanProperty warnAboutDuplicatesInInspection; + private final BooleanProperty confirmDelete; - private final boolean memoryStickMode; - private final boolean showAdvancedHints; + private final BooleanProperty memoryStickMode; + private final BooleanProperty showAdvancedHints; public GeneralPreferences(Charset defaultEncoding, BibDatabaseMode defaultBibDatabaseMode, @@ -19,41 +24,84 @@ public GeneralPreferences(Charset defaultEncoding, boolean confirmDelete, boolean memoryStickMode, boolean showAdvancedHints) { - this.defaultEncoding = defaultEncoding; - this.defaultBibDatabaseMode = defaultBibDatabaseMode; - this.warnAboutDuplicatesInInspection = warnAboutDuplicatesInInspection; - this.confirmDelete = confirmDelete; + this.defaultEncoding = new SimpleObjectProperty<>(defaultEncoding); + this.defaultBibDatabaseMode = new SimpleObjectProperty<>(defaultBibDatabaseMode); + this.warnAboutDuplicatesInInspection = new SimpleBooleanProperty(warnAboutDuplicatesInInspection); + this.confirmDelete = new SimpleBooleanProperty(confirmDelete); - this.memoryStickMode = memoryStickMode; - this.showAdvancedHints = showAdvancedHints; + this.memoryStickMode = new SimpleBooleanProperty(memoryStickMode); + this.showAdvancedHints = new SimpleBooleanProperty(showAdvancedHints); } public Charset getDefaultEncoding() { + return defaultEncoding.get(); + } + + public ObjectProperty defaultEncodingProperty() { return defaultEncoding; } + public void setDefaultEncoding(Charset defaultEncoding) { + this.defaultEncoding.set(defaultEncoding); + } + public BibDatabaseMode getDefaultBibDatabaseMode() { + return defaultBibDatabaseMode.get(); + } + + public ObjectProperty defaultBibDatabaseModeProperty() { return defaultBibDatabaseMode; } - public boolean isWarnAboutDuplicatesInInspection() { + public void setDefaultBibDatabaseMode(BibDatabaseMode defaultBibDatabaseMode) { + this.defaultBibDatabaseMode.set(defaultBibDatabaseMode); + } + + public boolean warnAboutDuplicatesInInspection() { + return warnAboutDuplicatesInInspection.get(); + } + + public BooleanProperty isWarnAboutDuplicatesInInspectionProperty() { return warnAboutDuplicatesInInspection; } + public void setWarnAboutDuplicatesInInspection(boolean warnAboutDuplicatesInInspection) { + this.warnAboutDuplicatesInInspection.set(warnAboutDuplicatesInInspection); + } + public boolean shouldConfirmDelete() { + return confirmDelete.get(); + } + + public BooleanProperty confirmDeleteProperty() { return confirmDelete; } - public GeneralPreferences withConfirmDelete(boolean confirmDelete) { - this.confirmDelete = confirmDelete; - return this; + public void setConfirmDelete(boolean confirmDelete) { + this.confirmDelete.set(confirmDelete); } public boolean isMemoryStickMode() { + return memoryStickMode.get(); + } + + public BooleanProperty memoryStickModeProperty() { return memoryStickMode; } + public void setMemoryStickMode(boolean memoryStickMode) { + this.memoryStickMode.set(memoryStickMode); + } + public boolean shouldShowAdvancedHints() { + return showAdvancedHints.get(); + } + + public BooleanProperty showAdvancedHintsProperty() { return showAdvancedHints; } + + public void setShowAdvancedHints(boolean showAdvancedHints) { + this.showAdvancedHints.set(showAdvancedHints); + } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index dadcb69d43a..64cffc8c800 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -407,6 +407,12 @@ public class JabRefPreferences implements PreferencesService { * Cache variables */ private Language language; + private GeneralPreferences generalPreferences; + private TelemetryPreferences telemetryPreferences; + private DOIPreferences doiPreferences; + private OwnerPreferences ownerPreferences; + private TimestampPreferences timestampPreferences; + private GlobalCitationKeyPattern globalCitationKeyPattern; private Map> entryEditorTabList; private List mainTableColumns; @@ -1328,81 +1334,82 @@ public BibDatabaseMode getDefaultBibDatabaseMode() { @Override public GeneralPreferences getGeneralPreferences() { - return new GeneralPreferences( + if (Objects.nonNull(generalPreferences)) { + return generalPreferences; + } + generalPreferences = new GeneralPreferences( getDefaultEncoding(), getBoolean(BIBLATEX_DEFAULT_MODE) ? BibDatabaseMode.BIBLATEX : BibDatabaseMode.BIBTEX, getBoolean(WARN_ABOUT_DUPLICATES_IN_INSPECTION), getBoolean(CONFIRM_DELETE), getBoolean(MEMORY_STICK_MODE), getBoolean(SHOW_ADVANCED_HINTS)); - } - - @Override - public void storeGeneralPreferences(GeneralPreferences preferences) { - put(DEFAULT_ENCODING, preferences.getDefaultEncoding().name()); - putBoolean(BIBLATEX_DEFAULT_MODE, (preferences.getDefaultBibDatabaseMode() == BibDatabaseMode.BIBLATEX)); - putBoolean(WARN_ABOUT_DUPLICATES_IN_INSPECTION, preferences.isWarnAboutDuplicatesInInspection()); - putBoolean(CONFIRM_DELETE, preferences.shouldConfirmDelete()); - putBoolean(MEMORY_STICK_MODE, preferences.isMemoryStickMode()); - putBoolean(SHOW_ADVANCED_HINTS, preferences.shouldShowAdvancedHints()); + EasyBind.subscribe(generalPreferences.defaultEncodingProperty(), newValue -> put(DEFAULT_ENCODING, newValue.name())); + EasyBind.subscribe(generalPreferences.defaultBibDatabaseModeProperty(), newValue -> putBoolean(BIBLATEX_DEFAULT_MODE, (newValue == BibDatabaseMode.BIBLATEX))); + EasyBind.subscribe(generalPreferences.isWarnAboutDuplicatesInInspectionProperty(), newValue -> putBoolean(WARN_ABOUT_DUPLICATES_IN_INSPECTION, newValue)); + EasyBind.subscribe(generalPreferences.confirmDeleteProperty(), newValue -> putBoolean(CONFIRM_DELETE, newValue)); + EasyBind.subscribe(generalPreferences.memoryStickModeProperty(), newValue -> putBoolean(MEMORY_STICK_MODE, newValue)); + EasyBind.subscribe(generalPreferences.showAdvancedHintsProperty(), newValue -> putBoolean(SHOW_ADVANCED_HINTS, newValue)); + return generalPreferences; } @Override public TelemetryPreferences getTelemetryPreferences() { - return new TelemetryPreferences( + if (Objects.nonNull(telemetryPreferences)) { + return telemetryPreferences; + } + telemetryPreferences = new TelemetryPreferences( getBoolean(COLLECT_TELEMETRY), !getBoolean(ALREADY_ASKED_TO_COLLECT_TELEMETRY) // mind the ! ); - } - - @Override - public void storeTelemetryPreferences(TelemetryPreferences preferences) { - putBoolean(COLLECT_TELEMETRY, preferences.shouldCollectTelemetry()); - putBoolean(ALREADY_ASKED_TO_COLLECT_TELEMETRY, !preferences.shouldAskToCollectTelemetry()); // mind the ! + EasyBind.subscribe(telemetryPreferences.collectTelemetryProperty(), newValue -> putBoolean(COLLECT_TELEMETRY, newValue)); + EasyBind.subscribe(telemetryPreferences.askToCollectTelemetryProperty(), newValue -> putBoolean(ALREADY_ASKED_TO_COLLECT_TELEMETRY, !newValue)); + return telemetryPreferences; } @Override public DOIPreferences getDOIPreferences() { - return new DOIPreferences( + if (Objects.nonNull(doiPreferences)) { + return doiPreferences; + } + doiPreferences = new DOIPreferences( getBoolean(USE_CUSTOM_DOI_URI), get(BASE_DOI_URI)); - } - - @Override - public void storeDOIPreferences(DOIPreferences preferences) { - putBoolean(USE_CUSTOM_DOI_URI, preferences.isUseCustom()); - put(BASE_DOI_URI, preferences.getDefaultBaseURI()); + EasyBind.subscribe(doiPreferences.useCustomProperty(), newValue -> putBoolean(USE_CUSTOM_DOI_URI, newValue)); + EasyBind.subscribe(doiPreferences.defaultBaseURIProperty(), newValue -> put(BASE_DOI_URI, newValue)); + return doiPreferences; } @Override public OwnerPreferences getOwnerPreferences() { - return new OwnerPreferences( + if (Objects.nonNull(ownerPreferences)) { + return ownerPreferences; + } + ownerPreferences = new OwnerPreferences( getBoolean(USE_OWNER), get(DEFAULT_OWNER), getBoolean(OVERWRITE_OWNER)); - } - - @Override - public void storeOwnerPreferences(OwnerPreferences preferences) { - putBoolean(USE_OWNER, preferences.isUseOwner()); - put(DEFAULT_OWNER, preferences.getDefaultOwner()); - putBoolean(OVERWRITE_OWNER, preferences.isOverwriteOwner()); + EasyBind.subscribe(ownerPreferences.useOwnerProperty(), newValue -> putBoolean(USE_OWNER, newValue)); + EasyBind.subscribe(ownerPreferences.defaultOwnerProperty(), newValue -> put(DEFAULT_OWNER, newValue)); + EasyBind.subscribe(ownerPreferences.overwriteOwnerProperty(), newValue -> putBoolean(OVERWRITE_OWNER, newValue)); + return ownerPreferences; } @Override public TimestampPreferences getTimestampPreferences() { - return new TimestampPreferences( + if (Objects.nonNull(timestampPreferences)) { + return timestampPreferences; + } + timestampPreferences = new TimestampPreferences( getBoolean(ADD_CREATION_DATE), getBoolean(ADD_MODIFICATION_DATE), getBoolean(UPDATE_TIMESTAMP), FieldFactory.parseField(get(TIME_STAMP_FIELD)), get(TIME_STAMP_FORMAT)); - } - @Override - public void storeTimestampPreferences(TimestampPreferences preferences) { - putBoolean(ADD_CREATION_DATE, preferences.shouldAddCreationDate()); - putBoolean(ADD_MODIFICATION_DATE, preferences.shouldAddModificationDate()); + EasyBind.subscribe(timestampPreferences.addCreationDateProperty(), newValue -> putBoolean(ADD_CREATION_DATE, newValue)); + EasyBind.subscribe(timestampPreferences.addModificationDateProperty(), newValue -> putBoolean(ADD_MODIFICATION_DATE, newValue)); + return timestampPreferences; } //************************************************************************************************************* diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index d180b256629..869e87515b6 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -143,24 +143,14 @@ public interface PreferencesService { GeneralPreferences getGeneralPreferences(); - void storeGeneralPreferences(GeneralPreferences preferences); - TelemetryPreferences getTelemetryPreferences(); - void storeTelemetryPreferences(TelemetryPreferences preferences); - DOIPreferences getDOIPreferences(); - void storeDOIPreferences(DOIPreferences preferences); - OwnerPreferences getOwnerPreferences(); - void storeOwnerPreferences(OwnerPreferences preferences); - TimestampPreferences getTimestampPreferences(); - void storeTimestampPreferences(TimestampPreferences preferences); - //************************************************************************************************************* // GroupsPreferences //************************************************************************************************************* diff --git a/src/main/java/org/jabref/preferences/TelemetryPreferences.java b/src/main/java/org/jabref/preferences/TelemetryPreferences.java index f90133f5516..aab946b0605 100644 --- a/src/main/java/org/jabref/preferences/TelemetryPreferences.java +++ b/src/main/java/org/jabref/preferences/TelemetryPreferences.java @@ -1,30 +1,39 @@ package org.jabref.preferences; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; + public class TelemetryPreferences { - private boolean collectTelemetry; - private boolean askToCollectTelemetry; + private BooleanProperty collectTelemetry; + private BooleanProperty askToCollectTelemetry; public TelemetryPreferences(boolean shouldCollectTelemetry, boolean shouldAskToCollectTelemetry) { - this.collectTelemetry = shouldCollectTelemetry; - this.askToCollectTelemetry = shouldAskToCollectTelemetry; + this.collectTelemetry = new SimpleBooleanProperty(shouldCollectTelemetry); + this.askToCollectTelemetry = new SimpleBooleanProperty(shouldAskToCollectTelemetry); } public boolean shouldCollectTelemetry() { + return collectTelemetry.get(); + } + + public BooleanProperty collectTelemetryProperty() { return collectTelemetry; } - public TelemetryPreferences withCollectTelemetry(boolean shouldCollectTelemetry) { - this.collectTelemetry = shouldCollectTelemetry; - return this; + public void setCollectTelemetry(boolean collectTelemetry) { + this.collectTelemetry.set(collectTelemetry); } public boolean shouldAskToCollectTelemetry() { + return askToCollectTelemetry.get(); + } + + public BooleanProperty askToCollectTelemetryProperty() { return askToCollectTelemetry; } - public TelemetryPreferences withAskToCollectTelemetry(boolean shouldAskToCollectTelemetry) { - this.askToCollectTelemetry = shouldAskToCollectTelemetry; - return this; + public void setAskToCollectTelemetry(boolean askToCollectTelemetry) { + this.askToCollectTelemetry.set(askToCollectTelemetry); } } From 69550d39410a06b896ab2c490d3cbac9ae576d55 Mon Sep 17 00:00:00 2001 From: antalk2 Date: Wed, 1 Sep 2021 19:54:58 +0200 Subject: [PATCH 10/15] Oobranch f : add frontend (#7791) --- .../openoffice/ConnectionLostException.java | 4 +- .../org/jabref/logic/openoffice/OOUtil.java | 15 +- .../logic/openoffice/backend/Backend52.java | 22 +- .../logic/openoffice/backend/Codec52.java | 26 +- .../backend/NamedRangeReferenceMark.java | 27 +- .../logic/openoffice/frontend/OOFrontend.java | 555 ++++++++++++++++++ .../frontend/RangeForOverlapCheck.java | 49 ++ .../frontend/UpdateBibliography.java | 144 +++++ .../frontend/UpdateCitationMarkers.java | 162 +++++ .../logic/openoffice/style/OOBibStyle.java | 140 +++-- .../style/OOBibStyleGetCitationMarker.java | 90 +-- .../style/OOBibStyleGetNumCitationMarker.java | 62 +- .../style/OOFormatBibliography.java | 58 +- .../style/OOProcessAuthorYearMarkers.java | 4 +- .../model/openoffice/CitationEntry.java | 8 +- .../openoffice/style/CitationGroupId.java | 8 +- .../openoffice/style/CitationGroups.java | 5 +- .../model/openoffice/style/CitedKeys.java | 6 +- .../model/openoffice/style/PageInfo.java | 2 +- .../model/openoffice/uno/UnoCursor.java | 4 +- .../jabref/model/openoffice/uno/UnoStyle.java | 4 +- .../jabref/model/openoffice/uno/UnoUndo.java | 12 +- .../uno/UnoUserDefinedProperty.java | 4 +- .../model/openoffice/util/OOListUtil.java | 16 +- src/main/resources/l10n/JabRef_en.properties | 4 + 25 files changed, 1168 insertions(+), 263 deletions(-) create mode 100644 src/main/java/org/jabref/logic/openoffice/frontend/OOFrontend.java create mode 100644 src/main/java/org/jabref/logic/openoffice/frontend/RangeForOverlapCheck.java create mode 100644 src/main/java/org/jabref/logic/openoffice/frontend/UpdateBibliography.java create mode 100644 src/main/java/org/jabref/logic/openoffice/frontend/UpdateCitationMarkers.java diff --git a/src/main/java/org/jabref/gui/openoffice/ConnectionLostException.java b/src/main/java/org/jabref/gui/openoffice/ConnectionLostException.java index 36fc16e5e3f..df0264be0de 100644 --- a/src/main/java/org/jabref/gui/openoffice/ConnectionLostException.java +++ b/src/main/java/org/jabref/gui/openoffice/ConnectionLostException.java @@ -5,7 +5,7 @@ */ class ConnectionLostException extends RuntimeException { - public ConnectionLostException(String s) { - super(s); + public ConnectionLostException(String msg) { + super(msg); } } diff --git a/src/main/java/org/jabref/logic/openoffice/OOUtil.java b/src/main/java/org/jabref/logic/openoffice/OOUtil.java index 9efab82773c..a5976cb3342 100644 --- a/src/main/java/org/jabref/logic/openoffice/OOUtil.java +++ b/src/main/java/org/jabref/logic/openoffice/OOUtil.java @@ -127,13 +127,13 @@ public static void insertOOFormattedTextAtCurrentLocation(XText text, XTextCurso List formatting = new ArrayList<>(); // We need to extract formatting. Use a simple regexp search iteration: int piv = 0; - Matcher m = OOUtil.HTML_TAG.matcher(lText); - while (m.find()) { - String currentSubstring = lText.substring(piv, m.start()); + Matcher matcher = OOUtil.HTML_TAG.matcher(lText); + while (matcher.find()) { + String currentSubstring = lText.substring(piv, matcher.start()); if (!currentSubstring.isEmpty()) { OOUtil.insertTextAtCurrentLocation(text, cursor, currentSubstring, formatting); } - String tag = m.group(); + String tag = matcher.group(); // Handle tags: if ("".equals(tag)) { formatting.add(Formatting.BOLD); @@ -169,7 +169,7 @@ public static void insertOOFormattedTextAtCurrentLocation(XText text, XTextCurso formatting.remove(Formatting.STRIKEOUT); } - piv = m.end(); + piv = matcher.end(); } if (piv < lText.length()) { @@ -276,10 +276,9 @@ public static void insertTextAtCurrentLocation(XText text, XTextCursor cursor, S cursor.collapseToEnd(); } - public static Object getProperty(Object o, String property) + public static Object getProperty(Object object, String property) throws UnknownPropertyException, WrappedTargetException { - XPropertySet props = UnoRuntime.queryInterface( - XPropertySet.class, o); + XPropertySet props = UnoRuntime.queryInterface(XPropertySet.class, object); return props.getPropertyValue(property); } } diff --git a/src/main/java/org/jabref/logic/openoffice/backend/Backend52.java b/src/main/java/org/jabref/logic/openoffice/backend/Backend52.java index 0016e5e4510..4a0d8d05e0e 100644 --- a/src/main/java/org/jabref/logic/openoffice/backend/Backend52.java +++ b/src/main/java/org/jabref/logic/openoffice/backend/Backend52.java @@ -196,17 +196,6 @@ public CitationGroup createCitationGroup(XTextDocument doc, throw new IllegalArgumentException(); } - /* - * Backend52 uses reference marks to (1) mark the location of the citation in the text and (2) to encode - * the citation keys and citation type in the name of the reference mark. The name of the reference mark - * has to be unique in the document. - */ - String markName = Codec52.getUniqueMarkName(new HashSet<>(citationStorageManager.getUsedNames(doc)), - citationKeys, - citationType); - - CitationGroupId groupId = new CitationGroupId(markName); - final int numberOfCitations = citationKeys.size(); final int last = numberOfCitations - 1; @@ -236,6 +225,17 @@ public CitationGroup createCitationGroup(XTextDocument doc, } } + /* + * Backend52 uses reference marks to (1) mark the location of the citation in the text and (2) to encode + * the citation keys and citation type in the name of the reference mark. The name of the reference mark + * has to be unique in the document. + */ + final String markName = Codec52.getUniqueMarkName(new HashSet<>(citationStorageManager.getUsedNames(doc)), + citationKeys, + citationType); + + final CitationGroupId groupId = new CitationGroupId(markName); + /* * Apply to document */ diff --git a/src/main/java/org/jabref/logic/openoffice/backend/Codec52.java b/src/main/java/org/jabref/logic/openoffice/backend/Codec52.java index f567a3e459e..45f3bd3ca04 100644 --- a/src/main/java/org/jabref/logic/openoffice/backend/Codec52.java +++ b/src/main/java/org/jabref/logic/openoffice/backend/Codec52.java @@ -32,16 +32,16 @@ private Codec52() { */ public static class ParsedMarkName { /** "", "0", "1" ... */ - public final String i; + public final String index; /** in-text-citation type */ public final CitationType citationType; /** Citation keys embedded in the reference mark. */ public final List citationKeys; - ParsedMarkName(String i, CitationType citationType, List citationKeys) { - Objects.requireNonNull(i); + ParsedMarkName(String index, CitationType citationType, List citationKeys) { + Objects.requireNonNull(index); Objects.requireNonNull(citationKeys); - this.i = i; + this.index = index; this.citationType = citationType; this.citationKeys = citationKeys; } @@ -50,8 +50,8 @@ public static class ParsedMarkName { /** * Integer representation was written into the document in JabRef52, keep it for compatibility. */ - private static CitationType citationTypeFromInt(int i) { - return switch (i) { + private static CitationType citationTypeFromInt(int code) { + return switch (code) { case 1 -> CitationType.AUTHORYEAR_PAR; case 2 -> CitationType.AUTHORYEAR_INTEXT; case 3 -> CitationType.INVISIBLE_CIT; @@ -59,8 +59,8 @@ private static CitationType citationTypeFromInt(int i) { }; } - private static int citationTypeToInt(CitationType i) { - return switch (i) { + private static int citationTypeToInt(CitationType type) { + return switch (type) { case AUTHORYEAR_PAR -> 1; case AUTHORYEAR_INTEXT -> 2; case INVISIBLE_CIT -> 3; @@ -86,12 +86,12 @@ public static String getUniqueMarkName(Set usedNames, String citationKeysPart = String.join(",", citationKeys); - int i = 0; + int index = 0; int citTypeCode = citationTypeToInt(citationType); String name = BIB_CITATION + '_' + citTypeCode + '_' + citationKeysPart; while (usedNames.contains(name)) { - name = BIB_CITATION + i + '_' + citTypeCode + '_' + citationKeysPart; - i++; + name = BIB_CITATION + index + '_' + citTypeCode + '_' + citationKeysPart; + index++; } return name; } @@ -110,10 +110,10 @@ public static Optional parseMarkName(String refMarkName) { } List keys = Arrays.asList(citeMatcher.group(3).split(",")); - String i = citeMatcher.group(1); + String index = citeMatcher.group(1); int citTypeCode = Integer.parseInt(citeMatcher.group(2)); CitationType citationType = citationTypeFromInt(citTypeCode); - return (Optional.of(new Codec52.ParsedMarkName(i, citationType, keys))); + return (Optional.of(new Codec52.ParsedMarkName(index, citationType, keys))); } /** diff --git a/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java index cfabb1e2de0..324b984377c 100644 --- a/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java @@ -35,14 +35,14 @@ class NamedRangeReferenceMark implements NamedRange { private static final Logger LOGGER = LoggerFactory.getLogger(NamedRangeReferenceMark.class); - private String id; /* reference mark name */ + private String rangeId; /* reference mark name */ - private NamedRangeReferenceMark(String id) { - this.id = id; + private NamedRangeReferenceMark(String rangeId) { + this.rangeId = rangeId; } String getId() { - return id; + return rangeId; } /** @@ -156,7 +156,7 @@ public void removeFromDocument(XTextDocument doc) @Override public String getRangeName() { - return id; + return rangeId; } /** @@ -217,8 +217,6 @@ public XTextCursor getFillCursor(XTextDocument doc) String name = this.getRangeName(); - final String left = NamedRangeReferenceMark.REFERENCE_MARK_LEFT_BRACKET; - final String right = NamedRangeReferenceMark.REFERENCE_MARK_RIGHT_BRACKET; final boolean debugThisFun = false; XTextCursor full = null; @@ -279,6 +277,8 @@ public XTextCursor getFillCursor(XTextDocument doc) beta.goRight((short) (fullText.length() - 2), true); LOGGER.debug("getFillCursor: beta(1) covers '{}'", beta.getString()); + final String left = NamedRangeReferenceMark.REFERENCE_MARK_LEFT_BRACKET; + final String right = NamedRangeReferenceMark.REFERENCE_MARK_RIGHT_BRACKET; final short rightLength = (short) right.length(); if (fullText.startsWith(left) && fullText.endsWith(right)) { beta.setString(""); @@ -345,7 +345,6 @@ public XTextCursor getFillCursor(XTextDocument doc) */ public static void checkFillCursor(XTextCursor cursor) { final String left = REFERENCE_MARK_LEFT_BRACKET; - final String right = REFERENCE_MARK_RIGHT_BRACKET; XTextCursor alpha = cursor.getText().createTextCursorByRange(cursor); alpha.collapseToStart(); @@ -364,6 +363,7 @@ public static void checkFillCursor(XTextCursor cursor) { } } + final String right = REFERENCE_MARK_RIGHT_BRACKET; final short rightLength = (short) right.length(); if (rightLength > 0) { omega.goRight(rightLength, true); @@ -395,27 +395,26 @@ public void cleanFillCursor(XTextDocument doc) // removeBracketsFromEmpty is intended to force removal if we are working on an "Empty citation" (INVISIBLE_CIT). final boolean removeBracketsFromEmpty = false; - final String left = REFERENCE_MARK_LEFT_BRACKET; - final String right = REFERENCE_MARK_RIGHT_BRACKET; - final short leftLength = (short) left.length(); - final short rightLength = (short) right.length(); - String name = this.getRangeName(); XTextCursor full = this.getRawCursor(doc).orElseThrow(IllegalStateException::new); final String fullText = full.getString(); - final int fullTextLength = fullText.length(); + final String left = REFERENCE_MARK_LEFT_BRACKET; if (!fullText.startsWith(left)) { String msg = String.format("cleanFillCursor: (%s) does not start with REFERENCE_MARK_LEFT_BRACKET", name); throw new IllegalStateException(msg); } + final String right = REFERENCE_MARK_RIGHT_BRACKET; if (!fullText.endsWith(right)) { String msg = String.format("cleanFillCursor: (%s) does not end with REFERENCE_MARK_RIGHT_BRACKET", name); throw new IllegalStateException(msg); } + final int fullTextLength = fullText.length(); + final short leftLength = (short) left.length(); + final short rightLength = (short) right.length(); final int contentLength = (fullTextLength - (leftLength + rightLength)); if (contentLength < 0) { String msg = String.format("cleanFillCursor: length(%s) < 0", name); diff --git a/src/main/java/org/jabref/logic/openoffice/frontend/OOFrontend.java b/src/main/java/org/jabref/logic/openoffice/frontend/OOFrontend.java new file mode 100644 index 00000000000..58057c382e7 --- /dev/null +++ b/src/main/java/org/jabref/logic/openoffice/frontend/OOFrontend.java @@ -0,0 +1,555 @@ +package org.jabref.logic.openoffice.frontend; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.jabref.logic.JabRefException; +import org.jabref.logic.l10n.Localization; +import org.jabref.logic.openoffice.backend.Backend52; +import org.jabref.model.openoffice.CitationEntry; +import org.jabref.model.openoffice.ootext.OOText; +import org.jabref.model.openoffice.rangesort.FunctionalTextViewCursor; +import org.jabref.model.openoffice.rangesort.RangeOverlap; +import org.jabref.model.openoffice.rangesort.RangeOverlapBetween; +import org.jabref.model.openoffice.rangesort.RangeOverlapWithin; +import org.jabref.model.openoffice.rangesort.RangeSort; +import org.jabref.model.openoffice.rangesort.RangeSortEntry; +import org.jabref.model.openoffice.rangesort.RangeSortVisual; +import org.jabref.model.openoffice.rangesort.RangeSortable; +import org.jabref.model.openoffice.style.CitationGroup; +import org.jabref.model.openoffice.style.CitationGroupId; +import org.jabref.model.openoffice.style.CitationGroups; +import org.jabref.model.openoffice.style.CitationType; +import org.jabref.model.openoffice.style.OODataModel; +import org.jabref.model.openoffice.uno.CreationException; +import org.jabref.model.openoffice.uno.NoDocumentException; +import org.jabref.model.openoffice.uno.UnoCursor; +import org.jabref.model.openoffice.uno.UnoTextRange; +import org.jabref.model.openoffice.util.OOListUtil; +import org.jabref.model.openoffice.util.OOVoidResult; + +import com.sun.star.beans.IllegalTypeException; +import com.sun.star.beans.NotRemoveableException; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextRange; + +public class OOFrontend { + + public final Backend52 backend; + public final CitationGroups citationGroups; + + public OOFrontend(XTextDocument doc) + throws + NoDocumentException, + WrappedTargetException { + + // TODO: dataModel should come from looking at the document and preferences. + this.backend = new Backend52(); + + // Get the citationGroupNames + List citationGroupNames = this.backend.getJabRefReferenceMarkNames(doc); + + Map citationGroups = + readCitationGroupsFromDocument(this.backend, doc, citationGroupNames); + this.citationGroups = new CitationGroups(citationGroups); + } + + public OODataModel getDataModel() { + return backend.dataModel; + } + + public Optional healthReport(XTextDocument doc) + throws + NoDocumentException { + return backend.healthReport(doc); + } + + private static Map + readCitationGroupsFromDocument(Backend52 backend, + XTextDocument doc, + List citationGroupNames) + throws + WrappedTargetException, + NoDocumentException { + + Map citationGroups = new HashMap<>(); + for (String name : citationGroupNames) { + CitationGroup group = backend.readCitationGroupFromDocumentOrThrow(doc, name); + citationGroups.put(group.groupId, group); + } + return citationGroups; + } + + /** + * Creates a list of {@code RangeSortable} values for our {@code CitationGroup} + * values. Originally designed to be passed to {@code visualSort}. + * + * The elements of the returned list are actually of type {@code RangeSortEntry}. + * + * The result is sorted within {@code XTextRange.getText()} partitions of the citation groups + * according to their {@code XTextRange} (before mapping to footnote marks). + * + * In the result, RangeSortable.getIndexInPosition() contains unique indexes within the original + * partition (not after mapFootnotesToFootnoteMarks). + * + * @param mapFootnotesToFootnoteMarks If true, replace ranges in footnotes with the range of the + * corresponding footnote mark. This is used for numbering the citations. + * + */ + private List> + createVisualSortInput(XTextDocument doc, boolean mapFootnotesToFootnoteMarks) + throws + NoDocumentException, + WrappedTargetException { + + List> sortables = new ArrayList<>(); + for (CitationGroup group : citationGroups.getCitationGroupsUnordered()) { + XTextRange range = (this + .getMarkRange(doc, group) + .orElseThrow(IllegalStateException::new)); + sortables.add(new RangeSortEntry<>(range, 0, group)); + } + + /* + * At this point we are almost ready to return sortables. + * + * But we may want to number citations in a footnote as if it appeared where the footnote + * mark is. + * + * The following code replaces ranges within footnotes with the range for the corresponding + * footnote mark. + * + * This brings further ambiguity if we have multiple citation groups within the same + * footnote: for the comparison they become indistinguishable. Numbering between them is + * not controlled. Also combineCiteMarkers will see them in the wrong order (if we use this + * comparison), and will not be able to merge. To avoid these, we sort textually within + * each .getText() partition and add indexInPosition accordingly. + * + */ + + // Sort within partitions + RangeSort.RangePartitions> partitions = + RangeSort.partitionAndSortRanges(sortables); + + // build final list + List> result = new ArrayList<>(); + for (List> partition : partitions.getPartitions()) { + + int indexInPartition = 0; + for (RangeSortEntry sortable : partition) { + sortable.setIndexInPosition(indexInPartition++); + if (mapFootnotesToFootnoteMarks) { + Optional footnoteMarkRange = + UnoTextRange.getFootnoteMarkRange(sortable.getRange()); + // Adjust range if we are inside a footnote: + if (footnoteMarkRange.isPresent()) { + sortable.setRange(footnoteMarkRange.get()); + } + } + result.add(sortable); + } + } + return result.stream().map(e -> e).collect(Collectors.toList()); + } + + /** + * @param mapFootnotesToFootnoteMarks If true, sort reference marks in footnotes as if they + * appeared at the corresponding footnote mark. + * + * @return citation groups sorted by their visual positions. + * + * Limitation: for two column layout visual (top-down, left-right) order does not match the + * expected (textual) order. + * + */ + private List getVisuallySortedCitationGroups(XTextDocument doc, + boolean mapFootnotesToFootnoteMarks, + FunctionalTextViewCursor fcursor) + throws + WrappedTargetException, + NoDocumentException { + + List> sortables = createVisualSortInput(doc, mapFootnotesToFootnoteMarks); + + List> sorted = RangeSortVisual.visualSort(sortables, doc, fcursor); + + return (sorted.stream() + .map(RangeSortable::getContent) + .collect(Collectors.toList())); + } + + /** + * Return citation groups in visual order within (but not across) XText partitions. + * + * This is (1) sufficient for combineCiteMarkers which looks for consecutive XTextRanges within + * each XText, (2) not confused by multicolumn layout or multipage display. + */ + public List + getCitationGroupsSortedWithinPartitions(XTextDocument doc, boolean mapFootnotesToFootnoteMarks) + throws + NoDocumentException, + WrappedTargetException { + // This is like getVisuallySortedCitationGroups, + // but we skip the visualSort part. + List> sortables = + createVisualSortInput(doc, mapFootnotesToFootnoteMarks); + + return (sortables.stream().map(e -> e.getContent()).collect(Collectors.toList())); + } + + /** + * Create a citation group for the given citation keys, at the end of position. + * + * On return {@code position} is collapsed, and is after the inserted space, or at the end of + * the reference mark. + * + * @param citationKeys In storage order + * @param pageInfos In storage order + * @param citationType + * @param position Collapsed to its end. + * @param insertSpaceAfter If true, we insert a space after the mark, that carries on format of + * characters from the original position. + */ + public CitationGroup createCitationGroup(XTextDocument doc, + List citationKeys, + List> pageInfos, + CitationType citationType, + XTextCursor position, + boolean insertSpaceAfter) + throws + CreationException, + NoDocumentException, + WrappedTargetException, + NotRemoveableException, + PropertyVetoException, + IllegalTypeException { + + Objects.requireNonNull(pageInfos); + if (pageInfos.size() != citationKeys.size()) { + throw new IllegalArgumentException("pageInfos.size != citationKeys.size"); + } + CitationGroup group = backend.createCitationGroup(doc, + citationKeys, + pageInfos, + citationType, + position, + insertSpaceAfter); + + this.citationGroups.afterCreateCitationGroup(group); + return group; + } + + /** + * Remove {@code group} both from the document and notify {@code citationGroups} + */ + public void removeCitationGroup(CitationGroup group, XTextDocument doc) + throws + WrappedTargetException, + NoDocumentException, + NotRemoveableException { + + backend.removeCitationGroup(group, doc); + this.citationGroups.afterRemoveCitationGroup(group); + } + + public void removeCitationGroups(List cgs, XTextDocument doc) + throws + WrappedTargetException, + NoDocumentException, + NotRemoveableException { + + for (CitationGroup group : cgs) { + removeCitationGroup(group, doc); + } + } + + /** + * ranges controlled by citation groups should not overlap with each other. + * + * @return Optional.empty() if the reference mark is missing. + * + */ + public Optional getMarkRange(XTextDocument doc, CitationGroup group) + throws + NoDocumentException, + WrappedTargetException { + return backend.getMarkRange(group, doc); + } + + public XTextCursor getFillCursorForCitationGroup(XTextDocument doc, CitationGroup group) + throws + NoDocumentException, + WrappedTargetException, + CreationException { + return backend.getFillCursorForCitationGroup(group, doc); + } + + /** + * Remove brackets added by getFillCursorForCitationGroup. + */ + public void cleanFillCursorForCitationGroup(XTextDocument doc, CitationGroup group) + throws + NoDocumentException, + WrappedTargetException { + + backend.cleanFillCursorForCitationGroup(group, doc); + } + + /** + * @return A RangeForOverlapCheck for each citation group. + * + * result.size() == nRefMarks + */ + public List> citationRanges(XTextDocument doc) + throws + NoDocumentException, + WrappedTargetException { + + List> result = + new ArrayList<>(citationGroups.numberOfCitationGroups()); + + for (CitationGroup group : citationGroups.getCitationGroupsUnordered()) { + XTextRange range = this.getMarkRange(doc, group).orElseThrow(IllegalStateException::new); + String description = group.groupId.citationGroupIdAsString(); + result.add(new RangeForOverlapCheck<>(range, + group.groupId, + RangeForOverlapCheck.REFERENCE_MARK_KIND, + description)); + } + return result; + } + + public List> bibliographyRanges(XTextDocument doc) + throws + NoDocumentException, + WrappedTargetException { + + List> result = new ArrayList<>(); + + Optional range = UpdateBibliography.getBibliographyRange(doc); + if (range.isPresent()) { + String description = "bibliography"; + result.add(new RangeForOverlapCheck<>(range.get(), + new CitationGroupId("bibliography"), + RangeForOverlapCheck.BIBLIOGRAPHY_MARK_KIND, + description)); + } + return result; + } + + public List> viewCursorRanges(XTextDocument doc) { + + List> result = new ArrayList<>(); + + Optional range = UnoCursor.getViewCursor(doc).map(e -> e); + if (range.isPresent()) { + String description = "cursor"; + result.add(new RangeForOverlapCheck<>(range.get(), + new CitationGroupId("cursor"), + RangeForOverlapCheck.CURSOR_MARK_KIND, + description)); + } + return result; + } + + /** + * @return A range for each footnote mark where the footnote contains at least one citation group. + * + * Purpose: We do not want markers of footnotes containing reference marks to overlap with + * reference marks. Overwriting these footnote marks might kill our reference marks in the + * footnote. + * + * Note: Here we directly communicate to the document, not through the backend. This is because + * mapping ranges to footnote marks does not depend on how do we mark or structure those + * ranges. + */ + public List> + footnoteMarkRanges(XTextDocument doc, List> citationRanges) { + + // We partition by XText and use a single range from + // each partition to get at the corresponding footnotemark range. + + List> result = new ArrayList<>(); + RangeSort.RangePartitions> partitions = + RangeSort.partitionRanges(citationRanges); + + // Each partition corresponds to an XText, and each footnote has a single XText. + // (This latter ignores the possibility of XTextContents inserted into footnotes.) + // Also: different footnotes cannot share a footnotemark range, we are not creating duplicates. + for (List> partition : partitions.getPartitions()) { + if (partition.isEmpty()) { + continue; + } + RangeForOverlapCheck citationRange = partition.get(0); + + Optional footnoteMarkRange = UnoTextRange.getFootnoteMarkRange(citationRange.range); + + if (footnoteMarkRange.isEmpty()) { + // not in footnote + continue; + } + + result.add(new RangeForOverlapCheck<>(footnoteMarkRange.get(), + citationRange.idWithinKind, + RangeForOverlapCheck.FOOTNOTE_MARK_KIND, + "FootnoteMark for " + citationRange.format())); + } + return result; + } + + static String rangeOverlapsToMessage(List>> overlaps) { + + if (overlaps.isEmpty()) { + return "(*no overlaps*)"; + } + + StringBuilder msg = new StringBuilder(); + for (RangeOverlap> overlap : overlaps) { + String listOfRanges = (overlap.valuesForOverlappingRanges.stream() + .map(v -> String.format("'%s'", v.format())) + .collect(Collectors.joining(", "))); + msg.append( + switch (overlap.kind) { + case EQUAL_RANGE -> Localization.lang("Found identical ranges"); + case OVERLAP -> Localization.lang("Found overlapping ranges"); + case TOUCH -> Localization.lang("Found touching ranges"); + }); + msg.append(": "); + msg.append(listOfRanges); + msg.append("\n"); + } + return msg.toString(); + } + + /** + * Check for any overlap between userRanges and protected ranges. + * + * Assume userRanges is small (usually 1 elements for checking the cursor) + * + * Returns on first problem found. + */ + public OOVoidResult + checkRangeOverlapsWithCursor(XTextDocument doc, + List> userRanges, + boolean requireSeparation) + throws + NoDocumentException, + WrappedTargetException { + + List> citationRanges = citationRanges(doc); + List> ranges = new ArrayList<>(); + + // ranges.addAll(userRanges); + ranges.addAll(bibliographyRanges(doc)); + ranges.addAll(citationRanges); + ranges.addAll(footnoteMarkRanges(doc, citationRanges)); + + List>> overlaps = + RangeOverlapBetween.findFirst(doc, + userRanges, + ranges, + requireSeparation); + + if (overlaps.isEmpty()) { + return OOVoidResult.ok(); + } + return OOVoidResult.error(new JabRefException("Found overlapping or touching ranges", + rangeOverlapsToMessage(overlaps))); + } + + /** + * @param requireSeparation Report range pairs that only share a boundary. + * @param reportAtMost Limit number of overlaps reported (0 for no limit) + * + */ + public OOVoidResult checkRangeOverlaps(XTextDocument doc, + List> userRanges, + boolean requireSeparation, + int reportAtMost) + throws + NoDocumentException, + WrappedTargetException { + + List> citationRanges = citationRanges(doc); + List> ranges = new ArrayList<>(); + ranges.addAll(userRanges); + ranges.addAll(bibliographyRanges(doc)); + ranges.addAll(citationRanges); + ranges.addAll(footnoteMarkRanges(doc, citationRanges)); + + List>> overlaps = + RangeOverlapWithin.findOverlappingRanges(doc, ranges, requireSeparation, reportAtMost); + + if (overlaps.isEmpty()) { + return OOVoidResult.ok(); + } + return OOVoidResult.error(new JabRefException("Found overlapping or touching ranges", + rangeOverlapsToMessage(overlaps))); + } + + /** + * GUI: Get a list of CitationEntry objects corresponding to citations + * in the document. + * + * Called from: ManageCitationsDialogViewModel constructor. + * + * @return A list with entries corresponding to citations in the text, in arbitrary order (same + * order as from getJabRefReferenceMarkNames). + * + * Note: visual or alphabetic order could be more manageable for the user. We + * could provide these here, but switching between them needs change on GUI + * (adding a toggle or selector). + * + * Note: CitationEntry implements Comparable, where compareTo() and equals() are + * based on refMarkName. The order used in the "Manage citations" dialog + * does not seem to use that. + * + * The 1st is labeled "Citation" (show citation in bold, and some context + * around it). + * + * The columns can be sorted by clicking on the column title. For the + * "Citation" column, the sorting is based on the content, (the context + * before the citation), not on the citation itself. + * + * In the "Extra information ..." column some visual indication of the + * editable part could be helpful. + * + * Wish: selecting an entry (or a button in the line) in the GUI could move the cursor + * in the document to the entry. + */ + public List getCitationEntries(XTextDocument doc) + throws + WrappedTargetException, + NoDocumentException { + return this.backend.getCitationEntries(doc, citationGroups); + } + + public void applyCitationEntries(XTextDocument doc, List citationEntries) + throws + PropertyVetoException, + IllegalTypeException, + IllegalArgumentException, + WrappedTargetException { + this.backend.applyCitationEntries(doc, citationEntries); + } + + public void imposeGlobalOrder(XTextDocument doc, FunctionalTextViewCursor fcursor) + throws + WrappedTargetException, + NoDocumentException { + + boolean mapFootnotesToFootnoteMarks = true; + List sortedCitationGroups = + getVisuallySortedCitationGroups(doc, mapFootnotesToFootnoteMarks, fcursor); + List sortedCitationGroupIds = OOListUtil.map(sortedCitationGroups, group -> group.groupId); + citationGroups.setGlobalOrder(sortedCitationGroupIds); + } +} diff --git a/src/main/java/org/jabref/logic/openoffice/frontend/RangeForOverlapCheck.java b/src/main/java/org/jabref/logic/openoffice/frontend/RangeForOverlapCheck.java new file mode 100644 index 00000000000..6cbf560ec62 --- /dev/null +++ b/src/main/java/org/jabref/logic/openoffice/frontend/RangeForOverlapCheck.java @@ -0,0 +1,49 @@ +package org.jabref.logic.openoffice.frontend; + +import org.jabref.model.openoffice.rangesort.RangeHolder; + +import com.sun.star.text.XTextRange; + +/** + * Describe a protected range for overlap checking and reporting. + * + * To check that our protected ranges do not overlap, we collect + * these ranges. To check for overlaps between these, we need the + * {@code range} itself. To report the results of overlap + * checking, we need a {@code description} that can be understood + * by the user. + * + * To be able to refer back to more extended data, we might need to + * identify its {@code kind}, and its index in the corresponding + * tables or other identifier within its kind ({@code idWithinKind}) + * + */ +public class RangeForOverlapCheck implements RangeHolder { + + public final static int REFERENCE_MARK_KIND = 0; + public final static int FOOTNOTE_MARK_KIND = 1; + public final static int CURSOR_MARK_KIND = 2; + public final static int BIBLIOGRAPHY_MARK_KIND = 3; + + public final XTextRange range; + + public final int kind; + public final T idWithinKind; + private final String description; + + public RangeForOverlapCheck(XTextRange range, T idWithinKind, int kind, String description) { + this.range = range; + this.kind = kind; + this.idWithinKind = idWithinKind; + this.description = description; + } + + public String format() { + return description; + } + + @Override + public XTextRange getRange() { + return range; + } +} diff --git a/src/main/java/org/jabref/logic/openoffice/frontend/UpdateBibliography.java b/src/main/java/org/jabref/logic/openoffice/frontend/UpdateBibliography.java new file mode 100644 index 00000000000..ebda8359ba5 --- /dev/null +++ b/src/main/java/org/jabref/logic/openoffice/frontend/UpdateBibliography.java @@ -0,0 +1,144 @@ +package org.jabref.logic.openoffice.frontend; + +import java.util.Optional; + +import org.jabref.logic.openoffice.style.OOBibStyle; +import org.jabref.logic.openoffice.style.OOFormatBibliography; +import org.jabref.model.openoffice.ootext.OOText; +import org.jabref.model.openoffice.ootext.OOTextIntoOO; +import org.jabref.model.openoffice.style.CitedKeys; +import org.jabref.model.openoffice.uno.CreationException; +import org.jabref.model.openoffice.uno.NoDocumentException; +import org.jabref.model.openoffice.uno.UnoBookmark; +import org.jabref.model.openoffice.uno.UnoTextSection; + +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextRange; + +/* + * Update document: citation marks and bibliography + */ +public class UpdateBibliography { + + private static final String BIB_SECTION_NAME = "JR_bib"; + private static final String BIB_SECTION_END_NAME = "JR_bib_end"; + + private UpdateBibliography() { + /**/ + } + + public static Optional getBibliographyRange(XTextDocument doc) + throws + NoDocumentException, + WrappedTargetException { + return UnoTextSection.getAnchor(doc, BIB_SECTION_NAME); + } + + /** + * Rebuilds the bibliography. + */ + public static void rebuildBibTextSection(XTextDocument doc, + OOFrontend frontend, + CitedKeys bibliography, + OOBibStyle style, + boolean alwaysAddCitedOnPages) + throws + WrappedTargetException, + CreationException, + NoDocumentException { + + clearBibTextSectionContent2(doc); + + populateBibTextSection(doc, + frontend, + bibliography, + style, + alwaysAddCitedOnPages); + } + + /** + * Insert a paragraph break and create a text section for the bibliography. + * + * Only called from `clearBibTextSectionContent2` + */ + private static void createBibTextSection2(XTextDocument doc) + throws + CreationException { + + // Always creating at the end of the document. + // Alternatively, we could receive a cursor. + XTextCursor textCursor = doc.getText().createTextCursor(); + textCursor.gotoEnd(false); + UnoTextSection.create(doc, BIB_SECTION_NAME, textCursor, false); + } + + /** + * Find and clear the text section BIB_SECTION_NAME to "", + * or create it. + * + * Only called from: `rebuildBibTextSection` + * + */ + private static void clearBibTextSectionContent2(XTextDocument doc) + throws + CreationException, + NoDocumentException, + WrappedTargetException { + + // Optional sectionRange = UnoTextSection.getAnchor(doc, BIB_SECTION_NAME); + Optional sectionRange = getBibliographyRange(doc); + if (sectionRange.isEmpty()) { + createBibTextSection2(doc); + return; + } else { + // Clear it + XTextCursor cursor = doc.getText().createTextCursorByRange(sectionRange.get()); + cursor.setString(""); + } + } + + /** + * Only called from: `rebuildBibTextSection` + * + * Assumes the section named BIB_SECTION_NAME exists. + */ + private static void populateBibTextSection(XTextDocument doc, + OOFrontend frontend, + CitedKeys bibliography, + OOBibStyle style, + boolean alwaysAddCitedOnPages) + throws + CreationException, + IllegalArgumentException, + NoDocumentException, + WrappedTargetException { + + XTextRange sectionRange = getBibliographyRange(doc).orElseThrow(IllegalStateException::new); + + XTextCursor cursor = doc.getText().createTextCursorByRange(sectionRange); + + // emit the title of the bibliography + OOTextIntoOO.removeDirectFormatting(cursor); + OOText bibliographyText = OOFormatBibliography.formatBibliography(frontend.citationGroups, + bibliography, + style, + alwaysAddCitedOnPages); + OOTextIntoOO.write(doc, cursor, bibliographyText); + cursor.collapseToEnd(); + + // remove the initial empty paragraph from the section. + sectionRange = getBibliographyRange(doc).orElseThrow(IllegalStateException::new); + XTextCursor initialParagraph = doc.getText().createTextCursorByRange(sectionRange); + initialParagraph.collapseToStart(); + initialParagraph.goRight((short) 1, true); + initialParagraph.setString(""); + + UnoBookmark.removeIfExists(doc, BIB_SECTION_END_NAME); + UnoBookmark.create(doc, BIB_SECTION_END_NAME, cursor, true); + + cursor.collapseToEnd(); + } + +} diff --git a/src/main/java/org/jabref/logic/openoffice/frontend/UpdateCitationMarkers.java b/src/main/java/org/jabref/logic/openoffice/frontend/UpdateCitationMarkers.java new file mode 100644 index 00000000000..834fce1d0ce --- /dev/null +++ b/src/main/java/org/jabref/logic/openoffice/frontend/UpdateCitationMarkers.java @@ -0,0 +1,162 @@ +package org.jabref.logic.openoffice.frontend; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import org.jabref.logic.openoffice.style.OOBibStyle; +import org.jabref.model.openoffice.ootext.OOText; +import org.jabref.model.openoffice.ootext.OOTextIntoOO; +import org.jabref.model.openoffice.style.CitationGroup; +import org.jabref.model.openoffice.style.CitationGroups; +import org.jabref.model.openoffice.style.CitationType; +import org.jabref.model.openoffice.uno.CreationException; +import org.jabref.model.openoffice.uno.NoDocumentException; + +import com.sun.star.beans.IllegalTypeException; +import com.sun.star.beans.NotRemoveableException; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/* + * Update document: citation marks and bibliography + */ +public class UpdateCitationMarkers { + + private static final Logger LOGGER = LoggerFactory.getLogger(UpdateCitationMarkers.class); + + private UpdateCitationMarkers() { + /**/ + } + + /** + * Visit each reference mark in referenceMarkNames, overwrite its + * text content. + * + * After each fillCitationMarkInCursor call check if we lost the + * BIB_SECTION_NAME bookmark and recreate it if we did. + * + * @param frontend + * + * @param style Bibliography style to use. + * + */ + public static void applyNewCitationMarkers(XTextDocument doc, OOFrontend frontend, OOBibStyle style) + throws + NoDocumentException, + CreationException, + WrappedTargetException { + + CitationGroups citationGroups = frontend.citationGroups; + + for (CitationGroup group : citationGroups.getCitationGroupsUnordered()) { + + boolean withText = (group.citationType != CitationType.INVISIBLE_CIT); + Optional marker = group.getCitationMarker(); + + if (!marker.isPresent()) { + LOGGER.warn("applyNewCitationMarkers: no marker for {}", + group.groupId.citationGroupIdAsString()); + continue; + } + + if (withText && marker.isPresent()) { + + XTextCursor cursor = frontend.getFillCursorForCitationGroup(doc, group); + + fillCitationMarkInCursor(doc, cursor, marker.get(), withText, style); + + frontend.cleanFillCursorForCitationGroup(doc, group); + } + + } + } + + public static void fillCitationMarkInCursor(XTextDocument doc, + XTextCursor cursor, + OOText citationText, + boolean withText, + OOBibStyle style) + throws + WrappedTargetException, + CreationException, + IllegalArgumentException { + + Objects.requireNonNull(cursor); + Objects.requireNonNull(citationText); + Objects.requireNonNull(style); + + if (withText) { + OOText citationText2 = style.decorateCitationMarker(citationText); + // inject a ZERO_WIDTH_SPACE to hold the initial character format + final String ZERO_WIDTH_SPACE = "\u200b"; + citationText2 = OOText.fromString(ZERO_WIDTH_SPACE + citationText2.toString()); + OOTextIntoOO.write(doc, cursor, citationText2); + } else { + cursor.setString(""); + } + } + + /** + * Inserts a citation group in the document: creates and fills it. + * + * @param citationKeys BibTeX keys of + * @param pageInfos + * @param citationType + * + * @param citationText Text for the citation. A citation mark or + * placeholder if not yet available. + * + * @param position Location to insert at. + * @param style + * @param insertSpaceAfter A space inserted after the reference + * mark makes it easier to separate from the text + * coming after. But is not wanted when we recreate a + * reference mark. + */ + public static void createAndFillCitationGroup(OOFrontend frontend, + XTextDocument doc, + List citationKeys, + List> pageInfos, + CitationType citationType, + OOText citationText, + XTextCursor position, + OOBibStyle style, + boolean insertSpaceAfter) + throws + NotRemoveableException, + WrappedTargetException, + PropertyVetoException, + IllegalArgumentException, + CreationException, + NoDocumentException, + IllegalTypeException { + + Objects.requireNonNull(pageInfos); + if (pageInfos.size() != citationKeys.size()) { + throw new IllegalArgumentException("pageInfos.size != citationKeys.size"); + } + CitationGroup group = frontend.createCitationGroup(doc, + citationKeys, + pageInfos, + citationType, + position, + insertSpaceAfter); + + final boolean withText = citationType.withText(); + + if (withText) { + XTextCursor fillCursor = frontend.getFillCursorForCitationGroup(doc, group); + + UpdateCitationMarkers.fillCitationMarkInCursor(doc, fillCursor, citationText, withText, style); + + frontend.cleanFillCursorForCitationGroup(doc, group); + } + position.collapseToEnd(); + } + +} diff --git a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyle.java b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyle.java index 082d94a7fdf..5108c94c8b3 100644 --- a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyle.java +++ b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyle.java @@ -291,20 +291,20 @@ private boolean isUpToDate() { } } - private void readFormatFile(Reader in) throws IOException { + private void readFormatFile(Reader input) throws IOException { // First read all the contents of the file: - StringBuilder sb = new StringBuilder(); - int c; - while ((c = in.read()) != -1) { - sb.append((char) c); + StringBuilder stringBuilder = new StringBuilder(); + int chr; + while ((chr = input.read()) != -1) { + stringBuilder.append((char) chr); } // Store a local copy for viewing - localCopy = sb.toString(); + localCopy = stringBuilder.toString(); // Break into separate lines: - String[] lines = sb.toString().split("\n"); + String[] lines = stringBuilder.toString().split("\n"); BibStyleMode mode = BibStyleMode.NONE; for (String line1 : lines) { @@ -386,11 +386,12 @@ private void handleStructureLine(String line) { if ((index > 0) && (index < (line.length() - 1))) { try { - String formatString = line.substring(index + 1); + final String typeName = line.substring(0, index); + final String formatString = line.substring(index + 1); Layout layout = new LayoutHelper(new StringReader(formatString), this.prefs).getLayoutFromText(); - EntryType type = EntryTypeFactory.parse(line.substring(0, index)); + EntryType type = EntryTypeFactory.parse(typeName); - if (!isDefaultLayoutPresent && line.substring(0, index).equals(OOBibStyle.DEFAULT_MARK)) { + if (!isDefaultLayoutPresent && OOBibStyle.DEFAULT_MARK.equals(typeName)) { isDefaultLayoutPresent = true; defaultBibLayout = layout; } else { @@ -437,11 +438,11 @@ private void handleJournalsLine(String line) { } public Layout getReferenceFormat(EntryType type) { - Layout l = bibLayout.get(type); - if (l == null) { + Layout layout = bibLayout.get(type); + if (layout == null) { return defaultBibLayout; } else { - return l; + return layout; } } @@ -464,7 +465,7 @@ public String getNumCitationMarker(List number, int minGroupingCount, b // Sort the numbers: List lNum = new ArrayList<>(number); Collections.sort(lNum); - StringBuilder sb = new StringBuilder(bracketBefore); + StringBuilder stringBuilder = new StringBuilder(bracketBefore); int combineFrom = -1; int written = 0; for (int i = 0; i < lNum.size(); i++) { @@ -476,9 +477,9 @@ public String getNumCitationMarker(List number, int minGroupingCount, b } else { // Add single entry: if (i > 0) { - sb.append(getStringCitProperty(CITATION_SEPARATOR)); + stringBuilder.append(getStringCitProperty(CITATION_SEPARATOR)); } - sb.append(lNum.get(i) > 0 ? String.valueOf(lNum.get(i)) : OOBibStyle.UNDEFINED_CITATION_MARKER); + stringBuilder.append(lNum.get(i) > 0 ? String.valueOf(lNum.get(i)) : OOBibStyle.UNDEFINED_CITATION_MARKER); written++; } } else { @@ -486,20 +487,20 @@ public String getNumCitationMarker(List number, int minGroupingCount, b // Check if it ends here: if ((i == (lNum.size() - 1)) || (lNum.get(i + 1) != (i1 + 1))) { if (written > 0) { - sb.append(getStringCitProperty(CITATION_SEPARATOR)); + stringBuilder.append(getStringCitProperty(CITATION_SEPARATOR)); } if ((minGroupingCount > 0) && (((i1 + 1) - combineFrom) >= minGroupingCount)) { - sb.append(combineFrom); - sb.append(getStringCitProperty(GROUPED_NUMBERS_SEPARATOR)); - sb.append(i1); + stringBuilder.append(combineFrom); + stringBuilder.append(getStringCitProperty(GROUPED_NUMBERS_SEPARATOR)); + stringBuilder.append(i1); written++; } else { // Either we should never group, or there aren't enough // entries in this case to group. Output all: for (int jj = combineFrom; jj <= i1; jj++) { - sb.append(jj); + stringBuilder.append(jj); if (jj < i1) { - sb.append(getStringCitProperty(CITATION_SEPARATOR)); + stringBuilder.append(getStringCitProperty(CITATION_SEPARATOR)); } written++; } @@ -509,8 +510,8 @@ public String getNumCitationMarker(List number, int minGroupingCount, b // If it doesn't end here, just keep iterating. } } - sb.append(bracketAfter); - return sb.toString(); + stringBuilder.append(bracketAfter); + return stringBuilder.toString(); } /* end_old */ @@ -591,13 +592,13 @@ public String getCitationMarker(List entries, Map entries, String[] uniquefiers, int from, int to) { String separator = getStringCitProperty(UNIQUEFIER_SEPARATOR); - StringBuilder sb = new StringBuilder(uniquefiers[from]); + StringBuilder stringBuilder = new StringBuilder(uniquefiers[from]); for (int i = from + 1; i <= to; i++) { - sb.append(separator); - sb.append(uniquefiers[i]); + stringBuilder.append(separator); + stringBuilder.append(uniquefiers[i]); entries.set(i, null); } - uniquefiers[from] = sb.toString(); + uniquefiers[from] = stringBuilder.toString(); } /* end_old */ @@ -622,7 +623,7 @@ private String getAuthorYearParenthesisMarker(List entries, Map entries, Map 0) { - sb.append(citationSeparator); + stringBuilder.append(citationSeparator); } BibDatabase currentDatabase = database.get(currentEntry); @@ -641,17 +642,17 @@ private String getAuthorYearParenthesisMarker(List entries, Map entries, Map entries, Map 0 ? unlimA : maxA; if (i > 0) { - sb.append(citationSeparator); + stringBuilder.append(citationSeparator); } String author = getCitationMarkerField(currentEntry, currentDatabase, authorField); String authorString = createAuthorList(author, maxAuthors, andString, yearSep); - sb.append(authorString); - sb.append(startBrace); + stringBuilder.append(authorString); + stringBuilder.append(startBrace); String year = getCitationMarkerField(currentEntry, currentDatabase, yearField); if (year != null) { - sb.append(year); + stringBuilder.append(year); } if ((uniquefiers != null) && (uniquefiers[i] != null)) { - sb.append(uniquefiers[i]); + stringBuilder.append(uniquefiers[i]); } - sb.append(endBrace); + stringBuilder.append(endBrace); } - return sb.toString(); + return stringBuilder.toString(); } /* end_old */ @@ -757,15 +758,15 @@ private String getCitationMarkerField(BibEntry entry, BibDatabase database, Stri * @return The author name, or an empty String if inapplicable. */ private String getAuthorLastName(AuthorList al, int number) { - StringBuilder sb = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); if (al.getNumberOfAuthors() > number) { Author a = al.getAuthor(number); - a.getVon().filter(von -> !von.isEmpty()).ifPresent(von -> sb.append(von).append(' ')); - sb.append(a.getLast().orElse("")); + a.getVon().filter(von -> !von.isEmpty()).ifPresent(von -> stringBuilder.append(von).append(' ')); + stringBuilder.append(a.getLast().orElse("")); } - return sb.toString(); + return stringBuilder.toString(); } /* end_old */ @@ -896,12 +897,12 @@ public int compareTo(OOBibStyle other) { } @Override - public boolean equals(Object o) { - if (this == o) { + public boolean equals(Object object) { + if (this == object) { return true; } - if (o instanceof OOBibStyle) { - OOBibStyle otherStyle = (OOBibStyle) o; + if (object instanceof OOBibStyle) { + OOBibStyle otherStyle = (OOBibStyle) object; return Objects.equals(path, otherStyle.path) && Objects.equals(name, otherStyle.name) && Objects.equals(citProperties, otherStyle.citProperties) @@ -923,28 +924,28 @@ private String createAuthorList(String author, int maxAuthors, String andString, String etAlString = getStringCitProperty(ET_AL_STRING); // The String to represent authors that are not mentioned, e.g. " et al." String authorSep = getStringCitProperty(AUTHOR_SEPARATOR); // The String to add between author names except the last two, e.g. ", ". String oxfordComma = getStringCitProperty(OXFORD_COMMA); // The String to put after the second to last author in case of three or more authors - StringBuilder sb = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); AuthorList al = AuthorList.parse(author); if (!al.isEmpty()) { - sb.append(getAuthorLastName(al, 0)); + stringBuilder.append(getAuthorLastName(al, 0)); } if ((al.getNumberOfAuthors() > 1) && ((al.getNumberOfAuthors() <= maxAuthors) || (maxAuthors < 0))) { int j = 1; while (j < (al.getNumberOfAuthors() - 1)) { - sb.append(authorSep); - sb.append(getAuthorLastName(al, j)); + stringBuilder.append(authorSep); + stringBuilder.append(getAuthorLastName(al, j)); j++; } if (al.getNumberOfAuthors() > 2) { - sb.append(oxfordComma); + stringBuilder.append(oxfordComma); } - sb.append(andString); - sb.append(getAuthorLastName(al, al.getNumberOfAuthors() - 1)); + stringBuilder.append(andString); + stringBuilder.append(getAuthorLastName(al, al.getNumberOfAuthors() - 1)); } else if (al.getNumberOfAuthors() > maxAuthors) { - sb.append(etAlString); + stringBuilder.append(etAlString); } - sb.append(yearSep); - return sb.toString(); + stringBuilder.append(yearSep); + return stringBuilder.toString(); } /* end_old */ @@ -1078,8 +1079,8 @@ public OOText getNumCitationMarkerForBibliography(CitationMarkerNumericBibEntry return OOBibStyleGetNumCitationMarker.getNumCitationMarkerForBibliography(this, entry); } - public OOText getNormalizedCitationMarker(CitationMarkerNormEntry ce) { - return OOBibStyleGetCitationMarker.getNormalizedCitationMarker(this, ce, Optional.empty()); + public OOText getNormalizedCitationMarker(CitationMarkerNormEntry entry) { + return OOBibStyleGetCitationMarker.getNormalizedCitationMarker(this, entry, Optional.empty()); } /** @@ -1158,10 +1159,6 @@ public String getGroupedNumbersSeparator() { return getStringCitProperty(OOBibStyle.GROUPED_NUMBERS_SEPARATOR); } - private boolean getBooleanProperty(String propName) { - return (Boolean) properties.get(propName); - } - private String getStringProperty(String propName) { return (String) properties.get(propName); } @@ -1308,12 +1305,9 @@ public OOText getFormattedBibliographyTitle() { OOBibStyle style = this; OOText title = style.getReferenceHeaderText(); String parStyle = style.getReferenceHeaderParagraphFormat(); - if (parStyle != null) { - title = OOFormat.paragraph(title, parStyle); - } else { - title = OOFormat.paragraph(title); - } - return title; + return (parStyle == null + ? OOFormat.paragraph(title) + : OOFormat.paragraph(title, parStyle)); } } diff --git a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java index deb1a306913..2e5227d080e 100644 --- a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java +++ b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java @@ -38,21 +38,21 @@ private OOBibStyleGetCitationMarker() { * @return The author name, or an empty String if inapplicable. */ private static String getAuthorLastName(AuthorList authorList, int number) { - StringBuilder sb = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); if (authorList.getNumberOfAuthors() > number) { Author author = authorList.getAuthor(number); // "von " if von exists Optional von = author.getVon(); if (von.isPresent() && !von.get().isEmpty()) { - sb.append(von.get()); - sb.append(' '); + stringBuilder.append(von.get()); + stringBuilder.append(' '); } // last name if it exists - sb.append(author.getLast().orElse("")); + stringBuilder.append(author.getLast().orElse("")); } - return sb.toString(); + return stringBuilder.toString(); } private static String markupAuthorName(OOBibStyle style, String name) { @@ -127,7 +127,7 @@ private static String formatAuthorList(OOBibStyle style, // of three or more authors: (A, B[,] and C) String oxfordComma = style.getOxfordComma(); - StringBuilder sb = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); final int nAuthors = authorList.getNumberOfAuthors(); @@ -149,11 +149,11 @@ private static String formatAuthorList(OOBibStyle style, : Math.min(maxAuthorsBeforeEtAl, nAuthors)); if (nAuthorsToEmit >= 1) { - sb.append(style.getAuthorsPartMarkupBefore()); - sb.append(style.getAuthorNamesListMarkupBefore()); + stringBuilder.append(style.getAuthorsPartMarkupBefore()); + stringBuilder.append(style.getAuthorNamesListMarkupBefore()); // The first author String name = getAuthorLastName(authorList, 0); - sb.append(markupAuthorName(style, name)); + stringBuilder.append(markupAuthorName(style, name)); } if (nAuthors >= 2) { @@ -162,19 +162,19 @@ private static String formatAuthorList(OOBibStyle style, // Emit last names, except for the last author int j = 1; while (j < (nAuthors - 1)) { - sb.append(authorSep); + stringBuilder.append(authorSep); String name = getAuthorLastName(authorList, j); - sb.append(markupAuthorName(style, name)); + stringBuilder.append(markupAuthorName(style, name)); j++; } // oxfordComma if at least 3 authors if (nAuthors >= 3) { - sb.append(oxfordComma); + stringBuilder.append(oxfordComma); } // Emit " and "+"LastAuthor" - sb.append(andString); + stringBuilder.append(andString); String name = getAuthorLastName(authorList, nAuthors - 1); - sb.append(markupAuthorName(style, name)); + stringBuilder.append(markupAuthorName(style, name)); } else { // Emit last names up to nAuthorsToEmit. @@ -185,9 +185,9 @@ private static String formatAuthorList(OOBibStyle style, if (maxAuthorsBeforeEtAl > 1) { int j = 1; while (j < nAuthorsToEmit) { - sb.append(authorSep); + stringBuilder.append(authorSep); String name = getAuthorLastName(authorList, j); - sb.append(markupAuthorName(style, name)); + stringBuilder.append(markupAuthorName(style, name)); j++; } } @@ -195,15 +195,15 @@ private static String formatAuthorList(OOBibStyle style, } if (nAuthorsToEmit >= 1) { - sb.append(style.getAuthorNamesListMarkupAfter()); + stringBuilder.append(style.getAuthorNamesListMarkupAfter()); } if (nAuthors >= 2 && !emitAllAuthors) { - sb.append(etAlString); + stringBuilder.append(etAlString); } - sb.append(style.getAuthorsPartMarkupAfter()); - return sb.toString(); + stringBuilder.append(style.getAuthorsPartMarkupAfter()); + return stringBuilder.toString(); } /** @@ -279,15 +279,15 @@ private static String getCitationMarkerField(OOBibStyle style, return ""; } - FieldAndContent fc = optionalFieldAndContent.get(); - String result = style.getFieldFormatter().format(fc.content); + FieldAndContent fieldAndContent = optionalFieldAndContent.get(); + String result = style.getFieldFormatter().format(fieldAndContent.content); // If the field we found is mentioned in authorFieldNames and // content has a pair of braces around it, we add a pair of // braces around the result, so that AuthorList.parse does not split // the content. final OrFields fieldsToRebrace = style.getAuthorFieldNames(); - if (fieldsToRebrace.contains(fc.field) && StringUtil.isInCurlyBrackets(fc.content)) { + if (fieldsToRebrace.contains(fieldAndContent.field) && StringUtil.isInCurlyBrackets(fieldAndContent.content)) { result = "{" + result + "}"; } return result; @@ -406,11 +406,11 @@ private static OOText getAuthorYearParenthesisMarker2(OOBibStyle style, String pageInfoSeparator = style.getPageInfoSeparator(); String uniquefierSeparator = style.getUniquefierSeparator(); - StringBuilder sb = new StringBuilder(); - sb.append(style.getCitationGroupMarkupBefore()); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(style.getCitationGroupMarkupBefore()); if (inParenthesis) { - sb.append(startBrace); // shared parenthesis + stringBuilder.append(startBrace); // shared parenthesis } for (int j = 0; j < entries.size(); j++) { @@ -422,19 +422,19 @@ private static OOText getAuthorYearParenthesisMarker2(OOBibStyle style, // Just add our uniqueLetter String uniqueLetter = entry.getUniqueLetter().orElse(null); if (uniqueLetter != null) { - sb.append(uniquefierSeparator); - sb.append(uniqueLetter); + stringBuilder.append(uniquefierSeparator); + stringBuilder.append(uniqueLetter); } // And close the brace, if we are the last in the group. if (!inParenthesis && endingAGroup) { - sb.append(endBrace); + stringBuilder.append(endBrace); } continue; } if (j > 0) { - sb.append(citationSeparator); + stringBuilder.append(citationSeparator); } StringBuilder pageInfoPart = new StringBuilder(""); @@ -449,9 +449,9 @@ private static OOText getAuthorYearParenthesisMarker2(OOBibStyle style, final boolean isUnresolved = entry.getLookupResult().isEmpty(); if (isUnresolved) { - sb.append(String.format("Unresolved(%s)", entry.getCitationKey())); + stringBuilder.append(String.format("Unresolved(%s)", entry.getCitationKey())); if (purpose != AuthorYearMarkerPurpose.NORMALIZED) { - sb.append(pageInfoPart); + stringBuilder.append(pageInfoPart); } } else { @@ -467,40 +467,40 @@ private static OOText getAuthorYearParenthesisMarker2(OOBibStyle style, AuthorList authorList = getAuthorList(style, db); String authorString = formatAuthorList(style, authorList, maxAuthors, andString); - sb.append(authorString); - sb.append(yearSep); + stringBuilder.append(authorString); + stringBuilder.append(yearSep); if (!inParenthesis) { - sb.append(startBrace); // parenthesis before year + stringBuilder.append(startBrace); // parenthesis before year } String year = getCitationMarkerField(style, db, yearFieldNames); if (year != null) { - sb.append(year); + stringBuilder.append(year); } if (purpose != AuthorYearMarkerPurpose.NORMALIZED) { String uniqueLetter = entry.getUniqueLetter().orElse(null); if (uniqueLetter != null) { - sb.append(uniqueLetter); + stringBuilder.append(uniqueLetter); } } if (purpose != AuthorYearMarkerPurpose.NORMALIZED) { - sb.append(pageInfoPart); + stringBuilder.append(pageInfoPart); } if (!inParenthesis && endingAGroup) { - sb.append(endBrace); // parenthesis after year + stringBuilder.append(endBrace); // parenthesis after year } } } // for j if (inParenthesis) { - sb.append(endBrace); // shared parenthesis + stringBuilder.append(endBrace); // shared parenthesis } - sb.append(style.getCitationGroupMarkupAfter()); - return OOText.fromString(sb.toString()); + stringBuilder.append(style.getCitationGroupMarkupAfter()); + return OOText.fromString(stringBuilder.toString()); } /** @@ -638,9 +638,9 @@ static OOText getNormalizedCitationMarker(OOBibStyle style, int[] nAuthorsToEmitRevised = new int[nEntries]; for (int i = 0; i < nEntries; i++) { CitationMarkerEntry entry = citationMarkerEntries.get(i); - int n = calculateNAuthorsToEmit(style, entry); - nAuthorsToEmit[i] = n; - nAuthorsToEmitRevised[i] = n; + int nAuthors = calculateNAuthorsToEmit(style, entry); + nAuthorsToEmit[i] = nAuthors; + nAuthorsToEmitRevised[i] = nAuthors; } boolean[] startsNewGroup = new boolean[nEntries]; diff --git a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetNumCitationMarker.java b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetNumCitationMarker.java index 5dce4e8caa1..60b5222cf5b 100644 --- a/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetNumCitationMarker.java +++ b/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetNumCitationMarker.java @@ -53,23 +53,23 @@ public static OOText getNumCitationMarkerForBibliography(OOBibStyle style, // prefer BRACKET_BEFORE_IN_LIST and BRACKET_AFTER_IN_LIST String bracketBefore = style.getBracketBeforeInListWithFallBack(); String bracketAfter = style.getBracketAfterInListWithFallBack(); - StringBuilder sb = new StringBuilder(); - sb.append(style.getCitationGroupMarkupBefore()); - sb.append(bracketBefore); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(style.getCitationGroupMarkupBefore()); + stringBuilder.append(bracketBefore); final Optional current = entry.getNumber(); - sb.append(current.isPresent() + stringBuilder.append(current.isPresent() ? String.valueOf(current.get()) : (OOBibStyle.UNDEFINED_CITATION_MARKER + entry.getCitationKey())); - sb.append(bracketAfter); - sb.append(style.getCitationGroupMarkupAfter()); - return OOText.fromString(sb.toString()); + stringBuilder.append(bracketAfter); + stringBuilder.append(style.getCitationGroupMarkupAfter()); + return OOText.fromString(stringBuilder.toString()); } /* * emitBlock : a helper for getNumCitationMarker2 * * Given a block containing either a single entry or two or more - * entries that are joinable into an "i-j" form, append to {@code sb} the + * entries that are joinable into an "i-j" form, append to {@code stringBuilder} the * formatted text. * * Assumes: @@ -91,7 +91,7 @@ public static OOText getNumCitationMarkerForBibliography(OOBibStyle style, private static void emitBlock(List block, OOBibStyle style, int minGroupingCount, - StringBuilder sb) { + StringBuilder stringBuilder) { final int blockSize = block.size(); if (blockSize == 0) { @@ -102,14 +102,14 @@ private static void emitBlock(List block, // Add single entry: CitationMarkerNumericEntry entry = block.get(0); final Optional num = entry.getNumber(); - sb.append(num.isEmpty() - ? (OOBibStyle.UNDEFINED_CITATION_MARKER + entry.getCitationKey()) - : String.valueOf(num.get())); + stringBuilder.append(num.isEmpty() + ? (OOBibStyle.UNDEFINED_CITATION_MARKER + entry.getCitationKey()) + : String.valueOf(num.get())); // Emit pageInfo Optional pageInfo = entry.getPageInfo(); if (pageInfo.isPresent()) { - sb.append(style.getPageInfoSeparator()); - sb.append(OOText.toString(pageInfo.get())); + stringBuilder.append(style.getPageInfoSeparator()); + stringBuilder.append(OOText.toString(pageInfo.get())); } return; } @@ -146,17 +146,17 @@ private static void emitBlock(List block, } // Emit: "first-last" - sb.append(first); - sb.append(style.getGroupedNumbersSeparator()); - sb.append(last); + stringBuilder.append(first); + stringBuilder.append(style.getGroupedNumbersSeparator()); + stringBuilder.append(last); } else { // Emit: first, first+1,..., last for (int j = 0; j < blockSize; j++) { if (j > 0) { - sb.append(style.getCitationSeparator()); + stringBuilder.append(style.getCitationSeparator()); } - sb.append(block.get(j).getNumber().get()); + stringBuilder.append(block.get(j).getNumber().get()); } } return; @@ -194,15 +194,15 @@ public static OOText getNumCitationMarker2(OOBibStyle style, final boolean joinIsDisabled = (minGroupingCount <= 0); final int nCitations = entries.size(); - String bracketBefore = style.getBracketBefore(); - String bracketAfter = style.getBracketAfter(); + final String bracketBefore = style.getBracketBefore(); + final String bracketAfter = style.getBracketAfter(); // Sort a copy of entries List sorted = OOListUtil.map(entries, e -> e); sorted.sort(OOBibStyleGetNumCitationMarker::compareCitationMarkerNumericEntry); // "[" - StringBuilder sb = new StringBuilder(bracketBefore); + StringBuilder stringBuilder = new StringBuilder(bracketBefore); /* * Original: @@ -248,12 +248,12 @@ public static OOText getNumCitationMarker2(OOBibStyle style, } } - if (nextBlock.size() > 0) { + if (!nextBlock.isEmpty()) { // emit current block if (blocksEmitted) { - sb.append(style.getCitationSeparator()); + stringBuilder.append(style.getCitationSeparator()); } - emitBlock(currentBlock, style, minGroupingCount, sb); + emitBlock(currentBlock, style, minGroupingCount, stringBuilder); blocksEmitted = true; currentBlock = nextBlock; nextBlock = new ArrayList<>(); @@ -261,21 +261,21 @@ public static OOText getNumCitationMarker2(OOBibStyle style, } - if (nextBlock.size() != 0) { + if (!nextBlock.isEmpty()) { throw new IllegalStateException("impossible: (nextBlock.size() != 0) after loop"); } - if (currentBlock.size() > 0) { + if (!currentBlock.isEmpty()) { // We are emitting a block if (blocksEmitted) { - sb.append(style.getCitationSeparator()); + stringBuilder.append(style.getCitationSeparator()); } - emitBlock(currentBlock, style, minGroupingCount, sb); + emitBlock(currentBlock, style, minGroupingCount, stringBuilder); } // Emit: "]" - sb.append(bracketAfter); - return OOText.fromString(sb.toString()); + stringBuilder.append(bracketAfter); + return OOText.fromString(stringBuilder.toString()); } } diff --git a/src/main/java/org/jabref/logic/openoffice/style/OOFormatBibliography.java b/src/main/java/org/jabref/logic/openoffice/style/OOFormatBibliography.java index 4bc3fac6191..ea311193068 100644 --- a/src/main/java/org/jabref/logic/openoffice/style/OOFormatBibliography.java +++ b/src/main/java/org/jabref/logic/openoffice/style/OOFormatBibliography.java @@ -49,8 +49,8 @@ public static OOText formatBibliographyBody(CitationGroups cgs, StringBuilder stringBuilder = new StringBuilder(); - for (CitedKey ck : bibliography.values()) { - OOText entryText = formatBibliographyEntry(cgs, ck, style, alwaysAddCitedOnPages); + for (CitedKey citedKey : bibliography.values()) { + OOText entryText = formatBibliographyEntry(cgs, citedKey, style, alwaysAddCitedOnPages); stringBuilder.append(entryText.toString()); } @@ -61,29 +61,29 @@ public static OOText formatBibliographyBody(CitationGroups cgs, * @return A paragraph. Includes label and "Cited on pages". */ public static OOText formatBibliographyEntry(CitationGroups cgs, - CitedKey ck, + CitedKey citedKey, OOBibStyle style, boolean alwaysAddCitedOnPages) { - StringBuilder sb = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); // insert marker "[1]" if (style.isNumberEntries()) { - sb.append(style.getNumCitationMarkerForBibliography(ck).toString()); + stringBuilder.append(style.getNumCitationMarkerForBibliography(citedKey).toString()); } else { // !style.isNumberEntries() : emit no prefix // Note: We might want [citationKey] prefix for style.isCitationKeyCiteMarkers(); } // Add entry body - sb.append(formatBibliographyEntryBody(ck, style).toString()); + stringBuilder.append(formatBibliographyEntryBody(citedKey, style).toString()); // Add "Cited on pages" - if (ck.getLookupResult().isEmpty() || alwaysAddCitedOnPages) { - sb.append(formatCitedOnPages(cgs, ck).toString()); + if (citedKey.getLookupResult().isEmpty() || alwaysAddCitedOnPages) { + stringBuilder.append(formatCitedOnPages(cgs, citedKey).toString()); } // Add paragraph - OOText entryText = OOText.fromString(sb.toString()); + OOText entryText = OOText.fromString(stringBuilder.toString()); String parStyle = style.getReferenceParagraphFormat(); return OOFormat.paragraph(entryText, parStyle); } @@ -91,20 +91,20 @@ public static OOText formatBibliographyEntry(CitationGroups cgs, /** * @return just the body of a bibliography entry. No label, "Cited on pages" or paragraph. */ - public static OOText formatBibliographyEntryBody(CitedKey ck, OOBibStyle style) { - if (ck.getLookupResult().isEmpty()) { + public static OOText formatBibliographyEntryBody(CitedKey citedKey, OOBibStyle style) { + if (citedKey.getLookupResult().isEmpty()) { // Unresolved entry - return OOText.fromString(String.format("Unresolved(%s)", ck.citationKey)); + return OOText.fromString(String.format("Unresolved(%s)", citedKey.citationKey)); } else { // Resolved entry, use the layout engine - BibEntry bibentry = ck.getLookupResult().get().entry; + BibEntry bibentry = citedKey.getLookupResult().get().entry; Layout layout = style.getReferenceFormat(bibentry.getType()); layout.setPostFormatter(POSTFORMATTER); return formatFullReferenceOfBibEntry(layout, bibentry, - ck.getLookupResult().get().database, - ck.getUniqueLetter().orElse(null)); + citedKey.getLookupResult().get().database, + citedKey.getUniqueLetter().orElse(null)); } } @@ -147,27 +147,27 @@ private static OOText formatFullReferenceOfBibEntry(Layout layout, } /** - * Format links to citations of the source (ck). + * Format links to citations of the source (citedKey). * * Requires reference marks for the citation groups. * * - The links are created as references that show page numbers of the reference marks. * - We do not control the text shown, that is provided by OpenOffice. */ - private static OOText formatCitedOnPages(CitationGroups cgs, CitedKey ck) { + private static OOText formatCitedOnPages(CitationGroups cgs, CitedKey citedKey) { if (!cgs.citationGroupsProvideReferenceMarkNameForLinking()) { return OOText.fromString(""); } - StringBuilder sb = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); - String prefix = String.format(" (%s: ", Localization.lang("Cited on pages")); - String suffix = ")"; - sb.append(prefix); + final String prefix = String.format(" (%s: ", Localization.lang("Cited on pages")); + final String suffix = ")"; + stringBuilder.append(prefix); List citationGroups = new ArrayList<>(); - for (CitationPath p : ck.getCitationPaths()) { + for (CitationPath p : citedKey.getCitationPaths()) { CitationGroupId groupId = p.group; Optional group = cgs.getCitationGroup(groupId); if (group.isEmpty()) { @@ -183,18 +183,18 @@ private static OOText formatCitedOnPages(CitationGroups cgs, CitedKey ck) { return (aa.compareTo(bb)); }); - int i = 0; + int index = 0; for (CitationGroup group : citationGroups) { - if (i > 0) { - sb.append(", "); + if (index > 0) { + stringBuilder.append(", "); } String markName = group.getReferenceMarkNameForLinking().orElseThrow(IllegalStateException::new); OOText xref = OOFormat.formatReferenceToPageNumberOfReferenceMark(markName); - sb.append(xref.toString()); - i++; + stringBuilder.append(xref.toString()); + index++; } - sb.append(suffix); - return OOText.fromString(sb.toString()); + stringBuilder.append(suffix); + return OOText.fromString(stringBuilder.toString()); } } diff --git a/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java b/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java index 1aaeb538930..affbc7584ae 100644 --- a/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java +++ b/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java @@ -88,8 +88,8 @@ private static void createUniqueLetters(CitedKeys sortedCitedKeys, CitationGroup // according to their order in clashingKeys. int nextUniqueLetter = 'a'; for (String citationKey : clashingKeys) { - String ul = String.valueOf((char) nextUniqueLetter); - sortedCitedKeys.get(citationKey).setUniqueLetter(Optional.of(ul)); + String uniqueLetter = String.valueOf((char) nextUniqueLetter); + sortedCitedKeys.get(citationKey).setUniqueLetter(Optional.of(uniqueLetter)); nextUniqueLetter++; } } diff --git a/src/main/java/org/jabref/model/openoffice/CitationEntry.java b/src/main/java/org/jabref/model/openoffice/CitationEntry.java index 219e71eb0d1..0d702c860ab 100644 --- a/src/main/java/org/jabref/model/openoffice/CitationEntry.java +++ b/src/main/java/org/jabref/model/openoffice/CitationEntry.java @@ -37,12 +37,12 @@ public int compareTo(CitationEntry other) { } @Override - public boolean equals(Object o) { - if (this == o) { + public boolean equals(Object object) { + if (this == object) { return true; } - if (o instanceof CitationEntry) { - CitationEntry other = (CitationEntry) o; + if (object instanceof CitationEntry) { + CitationEntry other = (CitationEntry) object; return Objects.equals(this.refMarkName, other.refMarkName); } return false; diff --git a/src/main/java/org/jabref/model/openoffice/style/CitationGroupId.java b/src/main/java/org/jabref/model/openoffice/style/CitationGroupId.java index 6ba6b760cb6..baaa931214c 100644 --- a/src/main/java/org/jabref/model/openoffice/style/CitationGroupId.java +++ b/src/main/java/org/jabref/model/openoffice/style/CitationGroupId.java @@ -4,15 +4,15 @@ * Identifies a citation group in a document. */ public class CitationGroupId { - String id; - public CitationGroupId(String id) { - this.id = id; + String groupId; + public CitationGroupId(String groupId) { + this.groupId = groupId; } /** * CitationEntry needs some string identifying the group that it can pass back later. */ public String citationGroupIdAsString() { - return id; + return groupId; } } diff --git a/src/main/java/org/jabref/model/openoffice/style/CitationGroups.java b/src/main/java/org/jabref/model/openoffice/style/CitationGroups.java index b03028b76ef..e5e642fa652 100644 --- a/src/main/java/org/jabref/model/openoffice/style/CitationGroups.java +++ b/src/main/java/org/jabref/model/openoffice/style/CitationGroups.java @@ -131,10 +131,9 @@ public void setGlobalOrder(List globalOrder) { this.globalOrder = Optional.of(globalOrder); // Propagate to each CitationGroup - int i = 0; - for (CitationGroupId groupId : globalOrder) { + for (int i = 0; i < globalOrder.size(); i++) { + CitationGroupId groupId = globalOrder.get(i); citationGroupsUnordered.get(groupId).setIndexInGlobalOrder(Optional.of(i)); - i++; } } diff --git a/src/main/java/org/jabref/model/openoffice/style/CitedKeys.java b/src/main/java/org/jabref/model/openoffice/style/CitedKeys.java index 898fadbebe9..059c1b6123a 100644 --- a/src/main/java/org/jabref/model/openoffice/style/CitedKeys.java +++ b/src/main/java/org/jabref/model/openoffice/style/CitedKeys.java @@ -45,11 +45,11 @@ void sortByComparator(Comparator entryComparator) { } void numberCitedKeysInCurrentOrder() { - int i = 1; + int index = 1; for (CitedKey ck : data.values()) { if (ck.getLookupResult().isPresent()) { - ck.setNumber(Optional.of(i)); - i++; + ck.setNumber(Optional.of(index)); + index++; } else { // Unresolved citations do not get a number. ck.setNumber(Optional.empty()); diff --git a/src/main/java/org/jabref/model/openoffice/style/PageInfo.java b/src/main/java/org/jabref/model/openoffice/style/PageInfo.java index ec3a8436dcf..1ff87569a3b 100644 --- a/src/main/java/org/jabref/model/openoffice/style/PageInfo.java +++ b/src/main/java/org/jabref/model/openoffice/style/PageInfo.java @@ -19,7 +19,7 @@ public static Optional normalizePageInfo(Optional optionalText) } String str = OOText.toString(optionalText.get()); String trimmed = str.trim(); - if (trimmed.equals("")) { + if ("".equals(trimmed)) { return Optional.empty(); } return Optional.of(OOText.fromString(trimmed)); diff --git a/src/main/java/org/jabref/model/openoffice/uno/UnoCursor.java b/src/main/java/org/jabref/model/openoffice/uno/UnoCursor.java index 1770b6957c5..e761a56e12f 100644 --- a/src/main/java/org/jabref/model/openoffice/uno/UnoCursor.java +++ b/src/main/java/org/jabref/model/openoffice/uno/UnoCursor.java @@ -39,7 +39,7 @@ public static Optional getTextCursorOfTextContentAnchor(XTextConten return Optional.of(markAnchor.getText().createTextCursorByRange(markAnchor)); } - public static XTextCursor createTextCursorByRange(XTextRange r) { - return r.getText().createTextCursorByRange(r); + public static XTextCursor createTextCursorByRange(XTextRange range) { + return range.getText().createTextCursorByRange(range); } } diff --git a/src/main/java/org/jabref/model/openoffice/uno/UnoStyle.java b/src/main/java/org/jabref/model/openoffice/uno/UnoStyle.java index dece8978713..cd4065ba8b3 100644 --- a/src/main/java/org/jabref/model/openoffice/uno/UnoStyle.java +++ b/src/main/java/org/jabref/model/openoffice/uno/UnoStyle.java @@ -25,10 +25,10 @@ private static Optional getStyleFromFamily(XTextDocument doc, String fam WrappedTargetException { XStyleFamiliesSupplier fss = UnoCast.cast(XStyleFamiliesSupplier.class, doc).get(); - XNameAccess fs = UnoCast.cast(XNameAccess.class, fss.getStyleFamilies()).get(); + XNameAccess families = UnoCast.cast(XNameAccess.class, fss.getStyleFamilies()).get(); XNameContainer xFamily; try { - xFamily = UnoCast.cast(XNameContainer.class, fs.getByName(familyName)).get(); + xFamily = UnoCast.cast(XNameContainer.class, families.getByName(familyName)).get(); } catch (NoSuchElementException ex) { String msg = String.format("Style family name '%s' is not recognized", familyName); throw new java.lang.IllegalArgumentException(msg, ex); diff --git a/src/main/java/org/jabref/model/openoffice/uno/UnoUndo.java b/src/main/java/org/jabref/model/openoffice/uno/UnoUndo.java index b75bee17f3e..4f08bb0ed5c 100644 --- a/src/main/java/org/jabref/model/openoffice/uno/UnoUndo.java +++ b/src/main/java/org/jabref/model/openoffice/uno/UnoUndo.java @@ -25,17 +25,17 @@ public static Optional getXUndoManager(XTextDocument doc) { * document's undo stack is left in an inconsistent state. */ public static void enterUndoContext(XTextDocument doc, String title) { - Optional um = getXUndoManager(doc); - if (um.isPresent()) { - um.get().enterUndoContext(title); + Optional undoManager = getXUndoManager(doc); + if (undoManager.isPresent()) { + undoManager.get().enterUndoContext(title); } } public static void leaveUndoContext(XTextDocument doc) { - Optional um = getXUndoManager(doc); - if (um.isPresent()) { + Optional undoManager = getXUndoManager(doc); + if (undoManager.isPresent()) { try { - um.get().leaveUndoContext(); + undoManager.get().leaveUndoContext(); } catch (InvalidStateException ex) { throw new IllegalStateException("leaveUndoContext reported InvalidStateException"); } diff --git a/src/main/java/org/jabref/model/openoffice/uno/UnoUserDefinedProperty.java b/src/main/java/org/jabref/model/openoffice/uno/UnoUserDefinedProperty.java index 634edb0c57b..f5ec43f3211 100644 --- a/src/main/java/org/jabref/model/openoffice/uno/UnoUserDefinedProperty.java +++ b/src/main/java/org/jabref/model/openoffice/uno/UnoUserDefinedProperty.java @@ -61,8 +61,8 @@ public static Optional getStringValue(XTextDocument doc, String property throw new java.lang.IllegalArgumentException("getting UserDefinedProperties as XPropertySet failed"); } try { - String v = propertySet.get().getPropertyValue(property).toString(); - return Optional.ofNullable(v); + String value = propertySet.get().getPropertyValue(property).toString(); + return Optional.ofNullable(value); } catch (UnknownPropertyException ex) { return Optional.empty(); } diff --git a/src/main/java/org/jabref/model/openoffice/util/OOListUtil.java b/src/main/java/org/jabref/model/openoffice/util/OOListUtil.java index 1fe617ed99a..59295c798fe 100644 --- a/src/main/java/org/jabref/model/openoffice/util/OOListUtil.java +++ b/src/main/java/org/jabref/model/openoffice/util/OOListUtil.java @@ -13,19 +13,19 @@ public static List map(List list, Function fun) { return list.stream().map(e -> fun.apply(e)).collect(Collectors.toList()); } - /** Integers 0..(n-1) */ - public static List makeIndices(int n) { - return Stream.iterate(0, i -> i + 1).limit(n).collect(Collectors.toList()); + /** Integers 0..(len-1) */ + public static List makeIndices(int len) { + return Stream.iterate(0, i -> i + 1).limit(len).collect(Collectors.toList()); } /** Return indices so that list.get(indices.get(i)) is sorted. */ public static List order(List list, Comparator comparator) { - List ii = makeIndices(list.size()); - Collections.sort(ii, new Comparator() { - @Override public int compare(final Integer o1, final Integer o2) { - return comparator.compare((U) list.get(o1), (U) list.get(o2)); + List indices = makeIndices(list.size()); + Collections.sort(indices, new Comparator() { + @Override public int compare(final Integer a, final Integer b) { + return comparator.compare((U) list.get(a), (U) list.get(b)); } }); - return ii; + return indices; } } diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index e0ece90e800..f05e23b1e4b 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -1549,6 +1549,10 @@ Custom=Custom Export\ cited=Export cited Unable\ to\ generate\ new\ library=Unable to generate new library +Found\ identical\ ranges=Found identical ranges +Found\ overlapping\ ranges=Found overlapping ranges +Found\ touching\ ranges=Found touching ranges + Note\:\ Use\ the\ placeholder\ %DIR%\ for\ the\ location\ of\ the\ opened\ library\ file.=Note: Use the placeholder %DIR% for the location of the opened library file. Error\ occured\ while\ executing\ the\ command\ \"%0\".=Error occured while executing the command \"%0\". Reformat\ ISSN=Reformat ISSN From dc323462a976040a5ba34ea1eb64182d2bebfa5a Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 1 Sep 2021 18:10:13 +0200 Subject: [PATCH 11/15] Refine documentation --- ...delines-for-setting-up-a-local-workspace.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index a3c4c022b57..9010ef9cf11 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -292,6 +292,24 @@ In rare cases you might encounter problems due to out-dated automatically genera 2. Select "Load/Unload modules". 3. Unload `jabRef.buildSrc`. +### Issue with "Module org.jsoup" not found, required by org.jabref + +Following error message appears: + +```text +Error occurred during initialization of boot layer +java.lang.module.FindException: Module org.jsoup not found, required by org.jabref +``` + +This can include different modules. + +1. Go to File -> Invalidate caches... +2. Check "Clear file system cache and Local History". +3. Check "Clear VCS Log caches and indexes". +4. Uncheck the others. +5. Click on "Invalidate and Restart". +6. After IntelliJ restarted, you have to do the "buildSrc", "Log4JAppender", and "src-gen" steps again. + ### Issues with openjfx libraries in local maven repository There might be problems with building if you have openjfx libraries in local maven repository, resulting in errors like this: From 01fe2b367e44a06f3d81c21787ce09c80448706d Mon Sep 17 00:00:00 2001 From: Christoph Date: Wed, 1 Sep 2021 21:59:47 +0000 Subject: [PATCH 12/15] GitBook: [main] 19 pages and 6 assets modified --- ...run-config (1) (3) (3) (4) (4) (3) (6).png | Bin 0 -> 102768 bytes ...run-config (1) (3) (3) (4) (4) (3) (7).png | Bin 0 -> 102768 bytes ...run-config (1) (3) (3) (4) (4) (3) (8).png | Bin 0 -> 102768 bytes ...run-config (1) (3) (3) (4) (4) (3) (9).png | Bin 0 -> 102768 bytes docs/.gitbook/assets/github-flow.png | Bin 0 -> 19577 bytes ...configuration-command-line (2) (2) (4).png | Bin 0 -> 44930 bytes ...elines-for-setting-up-a-local-workspace.md | 34 ++++++++++-------- docs/teaching.md | 2 +- 8 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (6).png create mode 100644 docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (7).png create mode 100644 docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (8).png create mode 100644 docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (9).png create mode 100644 docs/.gitbook/assets/github-flow.png create mode 100644 docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (4).png diff --git a/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (6).png b/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (6).png new file mode 100644 index 0000000000000000000000000000000000000000..1412291a55af3fab85dd1830d9fe23e88d636372 GIT binary patch literal 102768 zcmbrl2UL?w*9NLb0Re@BD2S9CMY@Q9fRqpg5d{J1y@@m_p?4Am5d{U6CS97L7wIj4 zG^K^!A#?~NgqlF=4SK%+|886Bu64s=_~sSA%E zJ=Q)hY3{YCrB&$nw|X>X^!_0&~Pl@9QrXdlix-q*T+>QqH6Gs%{Y_LQ?QT$f*$ zp9{@M+a5t_3pw0=S21(m!RyiJjg$v>=oP!1vLCWtPWzkZv?R;jmtXI`Ji~G~eCgEn zs573YE^+Z(;r-kG?+|KmS@p!cVX%$9;XT7uJaB8!rL1{;nyy+em^!OAgb|^Q?c{ZI z^K9^+t5bkCHmrXx7ux?upZ;?hawQD-=jtV^YB|H7%N^TuxIb5?l>3az!J!u3a?)Pw zKL9PqM_Wk{(7`d11w$P;idbaycQ@YW`?u}jeJVQ?eVG(2+}&>>2fsc{ z0=ye5A6FlXeFg>9!Mwlti%Niq_V#MxfDvWqS93uRE-QzcT^S2EY{=OA*z_0hilNO_ zuJ7qrzWwM^r3z7n}CI*)}KC2zk#N7nYfH z;2X93#{O6Khma>k;jGcSupVRje~W;{98z!;fgCE3qJ(l&1jnl;U6Sr~g>K zDZ`j9`1+5g{2ks~6$E;|GSYMw8B&f|I43g8?;c zyEawt`B)vE($X)(7hcqm=}V-WDymG<8TF(~Ch&FLKGez1WmsWIU^D;kY& zPPv;nB|R>m=xC|BS1%}_+WkP7;3TGTuX|Fz&vN530{5v%Mc-}>^Nd{gEr&`sAZ z)F1}PNpcJMt~DPb{|0DZCM#EH7Ajnjz6OZ4WBu{W%&jv$Gi##|#m@#}4}=WZ()QcQ zOGruK%R;(BMrVb>zOB=$pLRKTc65CkbzxW$gB_i3Fm*F=;`F_Jw4)?K|KjPXOKndD zvUA|qvo1KlR7#kBp;S5fQSoPUUPnsTrbgVTe(3oSNMyLiA>Z`QO`TGA1s@LSpE3gr z_bvwVCHTP_dOhDRSKJ^tk0}$PUd!g5)<#BjhU-4O+s_{>`Q?wFwi0!>7iD;(EqR4% zN9LoDY0W!&?++FO5tPlii45}MA?S&ZXqhtc3?`dJGFom|QYGtF*rxgD+x)V>BTo<0 zYksBQznjH(hp~}e>#+6Ccq`7SYq)LY0_J|fEur9U{zuCJ6q%scn^irZcvx=?)mCW* z-%M`1ksS+H;h}%T?M6NCe0OFwz{mHko#Jl`y`0!Dw8`AMvX(AuX>)j?9ORGx#XY<} z55h~d&j;K(LLhWFBV-Fc`8AUwZ4DFrkFQ+r1i?r`YO38FY;4t+^I}Kmu7&7@H)(<@ zr3+wdT1T&5EzPYBn)l(d*LsMCA3iuT2T*Gw-y z`kN|UnYKT&V`F!o`QyJKFY#xI7CBeIlTOy$$ksTQU>75N&}!|ORU$64nbe34qDa2& z5o;mF$mVrfvku&S?&Zq#>45!NfN=cYwdE^sc}4fuC*LVI-0!e)P}gG+2zjyffLH8l z=TNn8J-{$M*8SjIXYMc`#()R=jcudTy7oPc4;}irxyXKhaw)&BcyYm zZqDhl#s2-Ac&&VXfJ{#lv1loY>`&>qP&SxY(VsRb3Usi z{s%lE_Z1Gs8D#&FZDeixgMka29W(#I(^FMv{&V^N04;UW?uEwJnKL;a!mm@ynxYM77jHvp_-H5``IL3@>aj3OW$k)fW3Z20K8SA) z(WQnt?z)iA`c|C5Tw$3ZKh%bgXp0)My%VQMxjhB<3#p80SA0$Rn}Y%Ky8F+Fd4FD? z^mjU6p7Ee%qB>k7$11Q>>2u(hNWrA**?S+E`T2qDMsp#qn>#F;Tctpie&Iqtiz?W! z&e`GEd!fZuV*}loY5(b41XUBBDt5j<0m|neDl6`j^Yp^%CkAkrYMlR1J0EX7%nl2I zt3lRHNa=R6AY5PO_Ge1wDhanvU`Z z!z%1ul5k3RfuXOSvo>mSbC%#qAKULt?;EYNGR~^bW0IBHzq?Vqn9zD}(>@@;x$FSU z;}yNX;uaUVe?NOW;KAX`9{%ANsUv5n)O?rn8mTy>$d!IoD<1~7TjjT>kt`_|A& z7I&}ua_<=tWT_vcGlYI%#91)Dv7ThN$m8g(EI1=zY+-%l_ks_~xRPU`=s+Y%VoJ6q`bg$I{=|bt`UZI4*ZP+ztQUTLOqt z$#`(}#a(l5b$^9ihceYU!9$xAaM!`xD%JU?3L5|@ckG}t=GuF{FJ^MCuB=xdsM}bt zo*BM`F8V%0x|afB`H%wmE7JreQldgJzrhlY8B(Ty82t1C>SK0gyD%l-_n=z0>bcOC z@V$wC?B7;C-NX1=HN_~PMV?yd&gLsqt^Ip<(h~$DAFgxViPXn8MCjyXmdvS7pndaa zp5N{GcPJ)6NLz%u+Nkal!{Xh9d~VsA$dFS#(_VOb7{|FyrD+{ss< zi&FJP`FE+M4e?pxC(k(fMjMYjWYV+#QSuRkt@$(esLmI0LuXuAeIdy{e;*D-$!oFPI86K!5|H6wg|SUz zaZbWX-cI2-{EFUAQ!FR5_n z*Y0xn{@&ivsi}JJ_56ri{o?c&lc1M4TnCO#U9Xh+GDX4JoQo(;N4?Mt91cW>he(Dj z9PsK!tagUfuA`MxcQ>|V_@Hr#}9hf@dq)@2O} zi7d6~;Yk4Q!$$p4W!jJZrbwZ>8Uv<1Kex2~R2NRx9XI14sLvh5VdltjO%XbTGZ_Vn zeDZ{g+}Th+;%7yve_b2&Zn(1Ae7?DUf6MM2yQb87(s~0008RxlMIBs_3ex@NiZE9^ zPe)8kOS?k{_IvJy7TYIRUkoG>RuE)S8VNkoAnng879zY(O=c~;uc1l(lbbRX$Bac-oes-Y7PHzt9 zPEpYXt~&41;p1atx-5Q4omQ7S4dbYye9%uXWe0Stq|Y zp$ZpMbz9%}1F)_61xK~xlo*r zKGMSbPK5v7Yccx?E3=)U_sjg84qA8h;I{~U8|CPGqLr0!2>%NY_1RhpxZ$+-kWi&I zqvWhmFg@SU((IIcbZnJh)7JqL} zx6yeF7nc6Ev2n5R5}&1tZ=sW76)#%6N!~fy*0k=r;I#t)Yw^a^Q)^$RvCL&v$`Jn) zWn(DkW@M(k_Zzr3)3Dj73Z}T7wvNYF($6rkJY|U5B@l5d=&4G#`C7RLs?R2hf$_Ii zg;S`n!ZwS;Q|B44nwnawCa@nn65o(puPXkPM?ek)fj5WPxJw_RMPn?}hH_|7>0axSKJsyDa0@A9UntzJdl!_WD*rzsLW>0^-hyJvn?uHkNF&M)? z-C3X5M%LEu9Ku|nW?w3T&6UNZ1uLgW(QeQ5jj znVIuAI@BlQ5&ipVsr%4aTlQL3TAJRojPdAonHR z?|QBLv^3S$W}@9kV%tN`VZ+^>#r zdBgm@e$A#6t&-Wtq@OA^4DwJ^mOjWZ(`J#Ug${lT?P8I+q?*|-BxePTqi-sBkxEj zVEx}asw?@rboae)(d!jrJcEorPQhIsOU*#oQdge7X3JgW7Ay=aPQK=`e59Lda_su#0sbv341LZlSSe^W5nyFH z3ToUr53sx8(xzElY~GU6)0fv+(D$)L&-O!;OXH=?rWU(bjY%x_`8(XN|?z?zw*03O>JFVq(v8dl$XbT^8BjPY2C+wx}#nyPq&9Qwqx?UV3 zBV))+j`D}e{q}M0xSFIVGlsI#7>A=*=DLmF&#UadhYE}It=Zj~K7SI$_1;f#?h?GG6D{Rl?z?x;VshZx|F;>7m(@{KD{T2oY{k1c;TM_IJSN3X61%-TqjN91P-SkoK z;~pZzXUKF30;b-k2SC#lNq3!7F1f@0{oU5Z=^YGp>-F+vq#5CKg6%u&O1n>6_`NlU zn6D3~dx?Pq``!%Y{E*7kU`P{8XI~T-izExkzv} z98G>4y{ZZf>3wTCRF*a)^SyqrW2_y7Ha}i#^CgKB9HjOtsl@n}Cv!3(tM3XfvuaG? zy}Y_v8||!`eKsPyR~brqD7M(|8IczwcTZy+ah5#E_{HVTABo+D?S$@_D^;Q%Kh2D+ zQl*``GEhVb!ScQ3n#ZT#Ez^*GMVH#@g5NHAZ$2?NSu8O+5Im{xS#;2qJlfNb)h&b? zG&R9DcMu@JR|D!%&}=w*!Q7mF4}zIkgAywCQ2=HaOJmamFxS^DLd^8 zD{ax*p%;_)O%1l!hw806(s*m`fW1i_qxne)P2;0(6cZF1W#wZJsWl4XtYJ^}M2(6gB`v3`?q*K4@3 zQn}s)f?7A{g!D|}){iv>!6uo3xY6Jd$~1I7wyB7P`buGm_`XRA8;3VOq=qcph}uRv zmKQ(T!&+QPCJDGuX_!h2laZ{0i`^a_c$5+V=ZVP2Bi{y5_s{a7qg^z*+yM9_0lj5! zZ~7fb;*liJZm7b+h2cH}N<$!z;!;9SkzGwp7C-KNF8_2;>?zP2ez=b9Zq;@&F7SSk z0SaZPmMmFsu9EmZr1qe1jaWP2a3iF~e!E3UL}!kR{3GjimK)?XG08ILnl-QC@d)J(csO*>Bp*1$hlh{pmn0>J=Q_Mc5HU`(T|GqBzH%x#$a1_jlM9p zGf6r}4($i;M3&)JRN_u;m-~@BsS9h$m9V3Q5MBnLh6a%`v!?e~=M(Z3*RLlQYZO9f zPrROC(qq4Cl~*#yPlD=B{H)9Mj-78_J9zIO{l|y;SXW+)(7C&2``~#tB&<9@MMPNd zhNhO*s)VYHOrswrn*&#b4eR7yZUKNETOTR2$A1t3kBD7f)gx#`+EM@hMd5w*bZ#l< zVOmTl6LMWxKwy=|ye^?pyZY$dB&o!x!;ORy0w-2v3_IVPYGrnOivLm#9*aaUY}^If z7#%6|A3QJt#0<-%v)%mOJW^q@NW4>wogA6|sy|GljT>B9faPRq$6FS4_Ygx3zFS7c zCiksr%%RB-GhOM3SSmT9?S}1~18w2mT{ksfUzwTCTFYmCT6GFd$X_!bipvRk(`&;G zLJayaaAN6>zpM2D`c)mGue6Uw3qbZ6N6Q;>l-v8^I*AbAaU+6RDw`?xL8VR0(!$u_ z2YKvS@K+lU1fwh2@z13BWMh+rz;UEb#?|;Wp}@!=H3+I@SJ%ttUgecD?{~JG=)f{6 zoDUDqvo$DX_sR(Qc>19yCCA%PpUt8zH=VIFmB_v%>iv5^%tXb+P+p0#6_KSb0ASF; z-imMZ#TvaDWZnAhUL2IC<;}FX`*f}I*6y-Ie~f~8im?aL>oKM}T22SsRDO8)R$xXu zeGS;R3n&V!O*w*wQ)V62ka#he0!Z-aG?za3RQF&2+DmQ_49)UW{wiLp!R#*%X!M_X)6T$>c{hl(Q&TOXi<}jk7t{+K zGb}<}T>$+>2d<8^dgA5fwQ*TB+Ddg2BoXz+jofu4o0G%Q+%dFug*V>n;EO&?TbH?d zpYJ=rddyA=TdI04Hm|8EEiBa3)YQ#QJl*T2>s&(u>qyq(!8vEq`LVRl8y#!y4o;%V z1@$x%OmqAhlse3Q{VhiuLz?(fkLR<3nz&W2N(;C;QHy60ai%nG>f3Q|d2k6+3Mi#B4K7$x{8Di|FH#bv?mbCJe+tA|5Ec9KM?xZshn7ntpq` zHVc4OE_WMN2Sf4OTUGv$&A_OGW+9;%Q_rK;)y8KA#4vKq7m7n0#nXEv?#+xqpbK~E zWY`t=`ve*QT&%g*7-PKCh;n&-r&q-by^(LkKW#l9(UKiZzH zk4sI}ysU5*V8_aggW?UJ=xOgxW1O$gP$z7Mw$Boq!Zg9uyQJ8xPcZOvP6Mmy^jiMP zox!YL#Wl1kVNJyxfa`+R$u2R`1@|-;zn_yzzL;a=)1^_fWjr!}eEje+L~#W-5O_NZ~lLdWtc8 z32vjF+wHM+jFfBHeW+PxWst&9OU?*^H2J-`he8+}5JuA4nwPpDm$-JcH(pMJ6A!b? z3}pL{DYNjEP?s*ioZFTTE2+ODL)D1YsvH!Sk&^1)8(GR%EDn0uy!$Ka6&1K4(NxPw z0amRy-mO`{yotI4(=&!g!Ug#lu@xI+t04f+bej4hpVivp=>GI^d&rlZGx{0Mb(N~| zJ9*|sSeZ?lH=Rx_O#@c>?v^+IaxpDL^ecoaEt|X`>6qvI1$eIYX?x7tg(zoq#G0M1 zBWx>~YISF_<@RS9;%!zwO9j8LjfpXHc6N?mIc~dzR^4+hJA$1JGK_Cb{T}!Lr|aF> z+3D-{__3sAgPi;9*UXE}rF*4oHwA57m0eZzcOUmBBqp9LB;;kt`%kj5PHbptX=&43 zA^%kn*H1lio@UZFolNcCHwuG#wp7vnH#DbwsaWIJiJerBV5xgL*AZ1?DX1U3z4o%x<;FcNuQR`Ptf{o@!CQkt0FhHouglDW@Ll%7NZW z<&&LLJj_+V4COFwb}@XZ^ag5iCXpxx<{M0(V~3_H>=-OzdJGMp?eG{>n2eB6dy=zwjsPF2|Rl3T2*8Gr6 zsfg9U;iFtnhiRp83SkLP#dXUao${8At=n=XRC*Jd>kpP+d1kf%h-?W~n#v?1Hkg!2 z-EZ;p?x4*iu*0{z1_;3EA`?^zW#o9?U4$l~`I7R+k1}e#0w_~swJkgeN;IFJ`P|9Y zpE15=T-NbnGqureJnu|2B5wfrJ?PobmlHbRbYEq+w))YXoQh@kmO$!5-D_AkR7ClG z?88GqtuEnGYvcu15XE^XQj`9?8O3y^O&}Vlu17{ND+dT3gwD@c1h+)L4{YY{i8Boh z09M!_@Gzr8AO|_gPFGL9YU9J)zSW!zb_}?0typ!`zd6$dCA$mJ5xIA>2fwK;+C4Ft z6G1jU{~5DkTLAhnpV=geUnyAT>SlrQPRD%@cH0;X>v-j-2VDNa-t+W^rndG#Z*R`T zhy8T~7zs}&4=eUgzTV^jzvo21HvI00;8Wmfe)|}E;bTRjK{snM==pN&uPLRa!>tKa zs;HH;<8-A@wXVk?VV&#qobn>u{PzZ-jP)B;Zo-;7`;DRD|BhkIW9|~IzBORQzBX%a_M#H zB%gA~mz2?qjSK~%tc5_oE|CW42UATJ21=A+NU7%;`1Wz<21l7t_ z5C;L;Gh%xBdXHUoZ*Q%A!^*v(dTuMCOHj+TkFmRgGKbZ6pM}0Z6qV@P+K2QBE4Q+j z##<6y4_|Yxv5=tMheuEcI4P48NNnLF_|JVuQAeK%P0rx=KZM;E>!P@KF-Y{0H^z=L ztKk&F$b>aGU{{Txk#|@<@gSYm2^0ZVPpAZo-AE zyvqv}-A|OAogea0tX{+oyishtx{Y?PtAu4e)4?S8GOWRk0{0aFYr@BkQ1`lvolyoY z6+emxt(3bS_)^AGXOQ4}P+94-x%uk2T8YdcC&X!uLv!}e69ZQ$`)mkOj%zA4eYlsd zbDEZ+f7*IWMDl3;{FYo-qYdq;pX5()c~J$n=A_2k>>7hC?-gXg?*}E@OZrx_0N=>Ljb|sT=W&$2N3op11|z(vJw{gD=OUObWt^3hC!uzY%0j&l1}sSu5Lh(+B=~ z9R^Gn*@*m@nW=-haN)uww6v7eMpOH5R81Y=BJ&1o93IGAzn(q$L1$B@Q7}#B*iP4h zA=D@9AW_)3blqCGzCK`kLSPLXSi^#ANyfE_v0+j5jy;e7apU_mOr3JU2iPXEva;~1q}&(UIZUFG#*Ds%(GQhD=%|#51gE}K$4DhReeXo zrFFLX-12+Nz(G$MX_i^YsH&=Z*16W7I(1pv)|b$Ozs$*PwZ`N_&TR(kbb#2)q5pj4 zn0DD+?Bkg9EIrd zm*!?lx^t=P&ZS#<`N*eLPedmYjo05`llRxTIZG&#E{B6H&UZO)L$)MI-Up97lLT(;O*$&9J>So!%$7KwLXr@4xX#Iu{%FBW3w8k3s& zq^ceV7$Zb(-hA@-ah7X~=kmk(Q3wr}>=U(XX}M1+1>rn`+f2<+a+q9w|Mf}0U5{3j z*3m(TuA_qDQ|2*|G4{%dDoy1xw0*9zUi&DMK!ad8RhWaKJT4;~iv;u|OFcvO8~OhI=B zdkl-fTa?@I(C&eC93#u~!-=?bD^p4Ls2Lc11q0J=~oWEvdg1OQ*vE#>5Bf}Tc#csQwP!2m95e< zz3u&=KU{rGF2=yf*w`Tcdl#2J)y(Wg(D9H%IqY*_$t@~wIjr!FbKC?Ay7FiQpHwMT zjv(1)O89I(>7?aCLS7gIJi3S8o7zg$QI1n?S((+LgJm;&C$8|AmCJZer{sYsRRKSS z)%3DX)^}qmp;Uw`3aNHd6(2NyVcR%~`A4}ctq!bX9DoMU36JSF!DvhD3!^}i4jG(G zrHSW-h~7Bn%vRCn7Ak4SdA+3qYieqYz*)<#fuSMG#v{l;KR+b&JY*k}|H(Pfy&2W& zVi-Z6PQg>HtZC8Vgq&1=Cv{=AlGKhV?JZ7nMeemkB#XWmu7y{A4=jkwUElJTCbC#a zZttiSwG=yKF8Y5;SCa7T1Iy_g+3m$joLw zmBS8cjDjxMtq>*@;~2!1?*6-?t-!E)9Kp<~S3{-MPy^!J941~1>F_XS?DZcMAoY?- zWY~es^G&Ck#}R&*8An3VQipaqr+}Al*8;rqA&V(x&iI{mXoKqlgY>w2ulJ_vzbj;l z@)ecqWfJWfFo<6@ieH}-Z49VHYnVE-%?L077Wg#KA|fKcq@s`p6WJU!y_DdaQ=!2> z9PHW)w8d#<+i@zvJ{9nF^)I5gRikN-X!5!a6dqtU#mh={cx$ERyNZxw8nABhDH_f! zyX!KLDJRyXPMm_8xk2dRynHQcNH*sA$}~Ola_Tn_;BZ(XS(pAo$;CMMiR3;McR*mkC(lM*V`LF;~V_TBD7B>Nd+6L0m`` z1ZP;NP*$ciYy1Ll`Cc;vkduTKZP!1^@$;TF=9OI(S~lM}Rw>8cIPhM3b+PG;5gh+@ zJuK7GKHvqd&DZdS!gfK@^AKjB^*LPnYsi4o(=h+m9z5TH#ZG0>d7TTiMm~RA_)fmg zd=JiAXKsVX4I+{mG)!?B^+GjT%GIHJsL@}6jY647VAjTi^GJsDzr>KigWhe3QYj@F z+P4SqdyLt#L!{sl84^V{AopP&t24DjCw)w1X@Ta8npIbo6B_+B_V5;y@@soprX?lf zO$^?V|%ovd-OX<@;f>RgL zpZwQIDN)v3G?ntdH#W)?0zUda7$VO%!yM?^_|kSd9mD)zFk{`q{H5+AlIConH&@2? z&0*c=NtZ+O6u`dU9bM&Y(R}kx?Fda|h&Kum(ym{{`VCm=|1*4uj%djk2cA%RKO2&v zK}g=4SyfwS>1*+Dq9muY_e!`gr}sU7vV!DH{?f)h<7MZY=}uFvFPPsN;;RMf4`t0M zeV2hxwj93!_Xfn-<#1S)oQ=-Bh@nkmY2e2HuGPzyy&pv^e9w8S6(_Od4_F=0?(p6R zkSExA$>WfA#{RXtX$t<*m^pev^6e1wu2dfGY7gM}t%JA~&8LxmyV`D^ju(UA)8}y6 zedv8q;st`%gBELv4Qi@=Cg}~{L&enW*S)>+mr^}#PHTku*ysACQ>NQ3N&6hm&FEm~g@6eu-iZ@C%CYJE>coQoZ8hOJL^n497lXwq750j&d#FGsNzAaoh zP32rk{8pbRe;AjMzH?J|Ftur0@fB^XsbfIrS?WUHST}B2!|0g z+MacWhc+IwlxbRr-kD@a!O(TT6j2L7#g>z-64P-hk|adyQp<&B6?ESl!CPrqfxy6!_?FB7;`C8nKbjKC>mb~34){^v5XNfG);HNwo zzpHllsV_QR1b1Gnn!3X;?*1o`m~6Z*Vu{-3l$e)kvV%%eGn#G67@56N(;ke5T=(_W zzQ<(wk!@c=>)B-xk34x0P5K&eK_NPodB(lmpI{I|bNt$~Q(tjN`UM3T6 zAC?$s*gH1KB$LU9fV2)Jvec0qygig zHoes$Y@^s^7fmYG=^4GBlzw5q>X#?*D!Q8Y2EEq9^Hk~bBXIb_SWo3_h``c+qHg&h zqcQKLIdAVGFT|tOC#4qoKQug6;Xyo^~YMnpBe!#R?xJ@d;U zf@#7o9nl{#_mIZ8PU4gSUY;a>(G9o7$;O z-@=W>5Z{k42ysQ!K9+`pbR`Z2v%|B+KO;v|Ddbc9r+m+wIi@Za^bNWZ>7q-+1rENBiy>n;0 z=v>kh6w6z5Q*o$^v%cYCrnHLWi|{@Wo&3nckhVsFU3Bg1qjEBgRYo_?l0K1E(@ zW!&IcTi{`lxOON{41cHleF$^Qu;p2=W8po=IkqiTZnQuO%ijB#;1BPp^fyI=0;>0J z5_HY~&!oWSm9-U(6#N0Lj0~%k46AQqdO06#%GS;b4CJ@HI(*tF%J^vY((}=Qfw;FE z-T$n-gb1QHjY%E{;z4zMTOkKNCMR9)+sjSP5DZ8I*%ZeGKAnC$26EaI6ciK*=4Abe1T8hJr#x=$`a=dN|!<&JBXt`fP)}`hR0o{U^K8yw)o3^Jg!a z2*VmH%PJ4Hgc1?sP_fBI`U$%~lnrY*icinSDtVst&2FAFz`X}%h95Phpi8=}GMDKi8;+U;-05TMxhdH~-vWF*%+O&tQhId|E7^QR|m1 z*)5w3G9ItDB>x{tG0*jXN$~^dSewhjxj&OTOVp_(UsP zY4-^;)+>)3Xgebiz(6T}>A$f4ck+lJjgh{Dop5Iq;e1HcC3N86=~Ej_2cjK_Yf>;R z+TBw+yK6-;`DpcRPGwHgk3o%x4M4p2VYszXM=sFYafeoweht^ju~_EL=$S+ zB@z2>$Q9t9UcuYezC0!riKaC^#Wskl#b09D7#ek*pZRC<%)OcIL$T6cf7n z2nF(!KOxA~-K=4uxD=>%>JheJ7(=}(=Wfs8azkvwE&UFE6xb&h2T2w4vmi`(c2`H3 z9Vu&8eP%ag9vqI4Ycm^o&>~~T1_n{RM>@K{B_ z7>h3M0rdsqv$bwHtjr*Q)!3AQST}h{6MG4Kf=4M6mM)=1e(C475c88S7uJf+%rNF1 zA0N{)ODDPTGK2LJSreV@_;yQguVW;#Nm7h|354aMLWjS7@kXVH8#6JlOIXT5rd8_g zxMg$sDsMGqvMGYvf!>riOoqyqUx;>nzr>SkdtamuON{CX`1GSB9C>s7#z+1td44wd z<*j=|sLDOk1;s6hBK}(rq!w%qt7g8PpaD>Kgb(C_$lK zsV|3P9w9K^1{vCW4>T1Btlf5Iu727`E52&CL4Jf?>e&|;FS&$5iCuoNNOX0Qj@SDP zdj!>ect{gA%+`5^V_h^;;~FzDvFcP1oe(J7re$%N%Iae4{jl3zDJ5OAjS{UJXWA$e zwGEm8%82nX;)Yu|`j1ngym87X*v-&#sDlj;_C?IeZn($!bwm3!r0x6jtslW#xmwhj zLa|hHK!%Lix*QZ@Pj#ggD5pv`4Yyb=n{{okp#81tfMQ-Fd0~3!8k+bfBtH5BKQ-te-2e0E-Tbcx zP+CD;(SLhobrnN9RzXvO9wclw6~&}?Y(Z*Z2AQN)YM0z|*MUIEtv9iZi&}2BZSyEm zOX~oz`Z!Xs(HId1?8Sw4ebfHXKNV6JFjb?;zy7U7(JvS;5huK}e|pVHfPeCg&uKQa z`1Z_*)x0_EpHSVdB~HL4Sk90H~0uC39i1-mB%iArX9-&C1PrG9)2*ZesLKrWxM}pn+T>F^E$L;^z^)=Ci_e6 zzGs8$jJy+7$^a7NHl1Zx2)#Cx`paukysh8w1s%s@*Z8DpPw^O};PPiefCg_RN z4$DhsU3&H$JmJ{M!7Q&{Ghr+rLp_NKJf z+A}zkYs11vbZ&;CYz-ADTQmui8F@sEHAAm_y~O=!F%n?1N>f$QGMUBhKi5P!XnUen zOSVkG&-Ftobk>!2E*<;)onug(fsO?;&cId;JZ%QQol`cll_#ZV-Iqm1wt$X6vrUrGzvJM*IjRmL zV8;gJyR8G_yrf%hU2PjV5`4PPiS}f7xl#Dm**=j--k4#6|&_5sxJ)k|?(y;9{=Chc+%Ysd)bD zGwr~a1pFw>$~~Zn?Z20{DR7FWdTUoXNt&4C1`W^KNc4O@6xtAzsX11}nGv}1hx(Bf zLh&mi!?15F6)L_j>Vpnn(A0q2bBz7tJ-*_TET^ODFyfwRQ-#qWI6N;ej?+Qv9+U- z_?nI|vM+)z*o$z0;#KsUZ4OQXryrV5}#!r_(=U7hoYpd9FO=F=LgKC;5@n*lZG=Uy4EKK-~RU5`}{fAwSKKB?>pWxp67n< zCx>PX=N{AvDoGAOu0;r%bf$uSJW#>?itF`{9}s5s)uM;}B4K|m-}|~k9jGSa6l@3a zxZUXreL|&17Rnr{zJ2Xj58U#D{%Li4cua2#lCN%;qHx`~&vf5uXa~32?OtnHyLz!w z7JPs9*>dKSsfPr@{W|boJ&nOL$k0*JoYSU4PfF_5`^Xk!Y4^#%u$QH?3hB&Qe8kJpNvERW_Qho#Apj#{LFBU3oSd9|e32X% z-~Mn4)EU7NjHG9=LEv(5TrJm-YoN*64IBalyPtJ(2dDowlS?f1PIZj`>xHH14ReE? z&NjK+7T-OwWkDB%wZx_Nl}N_(Me7tRWYD*F4p${56W|9-%1757cln|m#=jD<81u*I z+9_NXy*s%ohmfW5dH)=O=&7A#rRjDvmR?ec=(Sk2^rB(jLL)fBa6x0ZMSXzMbFaFL z6tEJw`+-2lLjwZ~P?p(+)5nh@V})xFhKLJ7n zZ*(v%n!rzo`%Xz*?U1*cqMN)D&IfE8PB2xtCYVAVl%gA9v9!iUI*kH)7@ zNx$mYslhAXajT6qvn-M5AsTLxEv=BU&)Ii~y<;r7#H#Lo+5^SeJSzKm_k|YD?8QPD z`Zr=ZPwxPqVtP+wu)Vz@a?pNjWfIuPT&@ZAf8=^Y!w#6XEWcuaehuMhnTz@3I6TnUI*#1c{KnFOW0$7J3WW4)F9~N_0%RlRJPXIvaLfC zz7H}WBjJY@;wDke;bV9)vw5pn+P-;XPY*evEv|;0hxQv3o}!W0Xsek$NU%iVhDY@Ch_BprSCeAWarHd2getyJ52YBX9>A>B=I^Fd{d zNSz*55Oe%p?NAbVDrHAyNL>F%O~;RJg$VQ-e0&Sj1~v-yH>E_%B(8-qPdW}8@I(Nv@Ds6nJJVWo-G=)X^&#vJFD^D!Ui9F zT9Es$Q$JA#$$A)cdIyvd+<&^*l@b0Kd95p-u)ne72BvTJ%!g(-CH#`Z z?LF=ZVO7zBlRe$ChBcgCEn4{X8wq_2e6`2k-n3Ly8fA`FGp+GGIoi|TcWkkji-W_5 z>R_hrs%+12jp4#>l$Nq%9P*ya11Z^#a>*Xt-B+B&8}$UPX^1ml?ev_q8A_+uc*`wR zEI#}tDEb`w*3>$ehJbIFXuADm0AFNRT07o243^5ANBXXD(+8ja8SCEMyR|+$` zsHR<(#_pujkx*LPa))bB+WcL4{wOjVl;usnO^K(>LP~rXbt>N^7PBrfyrmkFgySi| zVa%4FoUf}Hee3Lnp|f=nU!d0^IXq@xx6wA)_uDCLBvzy&&yscxfAi@~`|Y}JIk|PF z$^t*s-^XWE3QfyL>8-byKwAYm{CZbNIwDM@v`&U>1+m_F!(r8dz3U-IC>3XDCX{aI za(Lp?w*eePZoJnIvgXF}UHk)spB6f)H#Fely}o!UxI&k^r&A=7H^hi_4$4_s&2O!_ z&5ow;p-X|L{YhKx;Wly5VSZRMLsOY7K`f}k{XkGN@kvJtwfYzc^6|

eIQV=84hobUZsiJ*?tLmph%?o`n50cNGTjo3ntTA%`a?~P6Fy2(!Rjg)+*{JN zhVrNOAB7F3Y89R)aiKulWZiGqBPH$nJ6-@}>xT2%3}7^Eg$)g1j1V&3kKcBZ8JMAw zoL@Gh4!~$#wjwJV8$Le%x1IRGvix{DdJi5Lw!}n7MDW_qv;r@5SqW`X7!}?_<9}LN z(EI6MAb`}eo0ymYQJhK88t6h=#dv7I(1J#fd@05^Yqw*W3)%S^UWS1-{OIs8qlZuu zjsE>-xm+Pm_d8Q%c&`y(%kbbxH?7jw1OgEotJh{1dtdM2@rCc33E+Hy*P;vAB@4`O zJp0+YCF!_xn|<6ezY^Z@f!PAmLa3{&J4wYu@sKUVO2PQ*cGPLt9PG5LEyp%* z0VhTx(okudMoN%-6?-^m74QVBeDYnwAOy12^c?AvBer`mtXhzn*nnX4!MVWw1GdO?0?$wLM<)$yM5Sz=e6v*h_T4HgBO~a5iy$&XZ zT>fC3?F=44685mkh46(UHWxxCmcTjg&jn&e57FRATzEzrlV0BzuI z3VFAUy(*VLairKS<=t~s*ZwG{PZv8|)td)oJpe82g z#rNA1#NK3=d$V*Bkf#dZ!&T&MmzM%R>n=XVbrg7~&9coqo)Gimglo6kMjKao4BLK` z3%&KKh76rbBWZ+(6j^6x7GxNAG-?Q{99$}F*nj=i>y2>nQnIILn_vYoh}o;0e^aS#>x3>=BhDv zb5gTZ5D6LAoL7V|pNq%K6wh+rAmX_BYxaE2nLGvegoHc}Mt;Am+`ahod`md;0%;9e zpp$&J^Gb`B44Dm=yV!idgZHFfw=vf)P{f22aOu_*Q>+X((@8Qet4a0udt})^N3Pnp z-Aa3gkrvWhYf8xGhx6K=#iMfc_b(Fc#cx;z#oMMPCSwDE5noNQyOE4MJoyJ~Lvzeb zboYpREf18Gb{~KC5FD#nWqnXbeX61kbEe)&GdW-|!h`9wWsy1~Ztmn7L;?1G?mPKA?BIb$LT9y`9H3bp%?`@^^h@J|vlF8Y3SRF+Bwwh1BW=&mmewE3H^ya*|dL zx9Zc@3Rzw6?e{-|WHi)mz(Oi~+f@!cAVyr%#f>&)Bzfdj%-=<*;hVmCU~9aayP4~q zt*D~4)6qP*&sN0Grbj}M-b%xmmHeZZWe`tw`!pJE?D&@{cp z>|rQ4vi=5WBPWTndCwu@vF8P&n1Xk`O15_(b0W=f8@fn`l`vqGD?ESy2N?+7P_l9Z zKI*NP-6=upo$dYGp%;yNET{)MP<{b`)$hlpaR^vw@2Z|;;3nwA;;;IcvC zoA)Hid3$>*aUGGhsc`42oldkdDyZvG_cuQNu;1R|xeh#0JHojK^HBGJQU_>-F6QZ} z#lV1F>B!fbXOJ=6*;;($9#_LL`&T-eH5gi#?V5>y0dx{6?*pD~4W{t?y{5yN9?=N->{? z$y`!yk@ONM)r5Dh6ue(I{!r~F-<_DhF)Gi8jqH>rQ~CCy;uctT-mH&&{m}Vb)8&jV zeWx;fG)LU;h&}nuNvb-{49dx{k#9t@5hKtpWj^u6E<>h*mT9j&sM{(jR&UKyoSo%5 z3a5~;$kjdpo7sIQEpn(WbuVn}-Q#}w{Tj41|1WU~t0lXEu1K9k+^cMki!hS9eJ_3u zXXQ#^nRyx*sgNm8ks|ptjl^OXWR6rlMlRm5MQ)F1HBo(I4aBiK`BM$S-tXAt%HSS! zjDMn)PNKUyu{Px~@28c;+JtPU$S1nD-y6O86}c?|o5keiM{9z^SJ`J5w+c6IkP52x zR9I1dDzZ7ROwMDA@f!)heg>KT>QXnQrvNlKqnU$eWXC1fed@KLmg{;Ky?nCSa2XFZ z^^@WVS)0P(0_yBjs13%N59C@ZgxpM%f2Hik7Q0e*afSM6kcNB)Lg{igb^*OAbT8s`o+b3rM3eF)_IeXpA9<$oWkO zClBW=(SY1?RNtA`+jr)y*}EXNP7Hj5QG@wGO8)b$P!e9qZ-nY{?^oB|SpsiS#`N7ehtIYwA_^x@wcGc#e1xq` zM*bI4t~O`bR|YmdHn#bcW0I(oV63M{grR$Cj?;1M9TNORmmwLOn)A`_Mttb#dQjAy zL5G?`W^Sc{nD*CL{v^tUUioM_0ayJ)eXVe)i&-gaGOOfWtBok3kyXhhiYy4zbQ5NO2W1uTRMH zt#w|~mhZsBXT|Nf*j#1O9^V-wO_0XWlejMt5;yya9*j6Nv-f65pg2wb={Fx2^B3}3 zzvS+C%_BO~TEs0vdQ+Mf=kxJ~^VSVP^dugRS`u>-g;&1NyEG=D8~8b_rxXJg@lmyz=8R z1-nY0urXin(76NF8(IaeTA;W^b~k}DaQ?jO8o?R!rMt82_aosv#ySx1(1q&+v@HpN zoh?^W9)=Zk=#uw8$21}hD;YOa5+J)sB89EU;|h`ub#k=l$k<_9XIY0F;#=9}!tmwu z7M~o{pk=HuW5_?E{f$NSmd)L8@2)22#Sz&6W^lKFEj)NP8n&*GdONa{4$S-rLxfbv zuyb%EB_`f4YH4Yimg1F6Dc7*d@d=Cal)ysn-RANIL5Llm4r+0Z4POO@?HR^9Bykj} zMSsc7ga()QXTs3#%q7jfiLG-q7!tNNQkV;Tkk(a@B78L=_OZ!!bA-j*sS;x{3ZHv? zK5>gV&5b6w10{m3w|)Z&=+)#UFYm4ZMW&oyMcL_nmpVa)&9H&OfE{VL%B!e7izR0) zqzzY09HEjCP?US&R3cs%@KmMPjTsxRzo5dwNar}cNVRS9^i1b%{I@y&qx@4$V^?_Y zG0(}#2-*z@h+Iu5cqT9>%oh2G;^y4UpnN~$r_Wz#UNFA7wX+&mvZlV((9)0#u|4}6 zxV@Q+xhTfi7wcZLSfw@X&v zeS=W!Z}kjB?<~7+;cbNbxF3vQ8&U5}EPe~&C6SD47lX0`_)6VoBU~v+WijdJQ~vIi z36daARPp^SuSY#Ll*4=Dx84YlSw0B=8Z3lnla)hE; zl7h883rX$!mfy?&lFi%8amJ%X7yFgcTOrJyi6tQc3zsnktRSZMj?6)Fd)0?kwKm!=t!wi>%kTuX{z53WkTG5EIUEv%(;Iz3cqg5FFzfWVR<%=gK5 z0(4u1Tz2n-R&;Pl2Mq13Zmr6tYgg(HMQu0=3Dns}6B57rv|o%5V&*I;=fLVb2j5}1 z!trIFB4#Pgi6tJh6CD!Bavk^44^Kb{lF4ItU7!OoUkRG!|uGdh)AeSy9A@Me3e%!#mawGS3Si>Cei#Zm}5>X};`s=;? zTKHOHRn#>pql_z{*bgC{b!m~7MmEKg|CRHFy1YP$R>$X_=d?~4XYrLFxN_C zIv0^TnC4t1i0&@Do4gyFlZP4t#S?#OJ__Df^lVTrVv0v?E}nBGy`Rpgu7O}%dz_Bh z84E+$Heo#htpx3uW0TnrEC++^{)u?b4}lNaks1`cT<9|I2wwxDViPE)lw;@LsW<3HtLF0GW56i5z-&V!LmP9dNEGZCBi(=Yd z0qTxNE1UlJZ_FwRR+Zk*RrccZfTCQo zKPm|y5~XsD%U&$e;c|OZn;*xW&1`HrtY}}K$aNBo(gzCPyw7jJqIuZ zsJZzh$5q1wxX#903nHRl?vm|iQcCpdQzK3sA|YkhHyZth(NC3?!oeC0om=^s}A z?|w&4>r~q8Q>^Q2-)q5C+;rsiz^w*EY>djp{xCJObnQpDMzmDB?UYSljEvz98)Q0B zN?56;`Ld4hgvT^6aL2&*Z~UpZ4M;+FsbNbZj`Wiqju|JqWh1JP=eWe(MOwOq;-{Nc zHbss-6dmZE1LDaKc#81_?zZQ6N7wmo^OOhEs`HW?1}GJhNVw43WL;t(TYF`&Cq4xI z)o~B~J*=*by;5P&3jtICG7R1@-N9=r9VSC^-_z~9ykYOiKlf;Y zIbyamuffa=dVwO|^(L!bCT|+MT*Teix8^5%G2MKQks{Z{K!HgoFpt%4#*f2J>TkEj z@Fq?HRvTrCvXWxWyNkv+E7=-hrv1ho!kfe<@mMh%OibqzH3lS zYK%HE`jWlpYAW%lIUf?05r}I~6y85Nf6X*>h0*+T7Nw`(eMVWYELJs2yDs~L5?|Nd zXx_Wg_vVx9C$RLThsI@}@{lQzWw;V=msGs*S8&IbNZ?MiqS(|wZXH18vt??7UagrJ zD|)G-UJdP_u?b43?;62vr8&mB!Al=N4;Fh{UT^jXG+^Z42J8ji{i3=;_@E7K7w;G& z1xq3$Q5g41Cvo{n>h};4vrl51;)LYW*F7```KCi<0zPR9kvOOl8KU7ct;8rZGhba~Eu`wQjz*|UiTpimJaGUlSuRw)Kq->=~2KA?ELfJf?r?awRW ze9FI51?EIH`1hqZjBj84_m{IzG=_O*@LuGluseX_gToUC|fA zNXRI14amtW!q82hW&~*%ze!Jy)gahoq9BizXhn>L66$MpCn}Ka(JfIPvk*a0*#`)^ z@AL5V1+F|fjpgTZd)hRg{7~@(lGa4AbnDF8D=G|m^2VW_S;4|iDoS^o`txvCEjyF< z!cXj-?cd_5;o%4f6gKiMiziEZ4xybl-+7ULMnp~-IY$vwt>9@O4W1$5{+BDolIU>@ zAwh`C%gakhfa>AhU6Ux_)D?8ch{_A9;Kp3lb%Gc-7O1PzfapnJ~Z=!4jwdlm3GCV zt?wac1>BZFR@OOH=wXtqz++vCCEnwX>X!h9SN5%HEu4iBies<|P?GY!$_GM*W2RgT zq+d{b87FB3UG=Iw4h8?F;*xBiDlIe}g=QWeBE8#jCrIlBVi2^)m>$r!zeN1M_`5qU zl5hGzRvTHn=5qfD#2kI*+%ek;5;K3!m;A|7`yo`}%X(WHirZT;)5VZs23_Xr#&M8M zV7MMod{Kw2_S7zOT&q;yYH-z z<2{+Z!V`&J^yO>y4vD2ij~WW-6*vNrfjgH%oYXE4jI&qvCi-?&5~DeyAG5V^Y$Oo~ z?0)`iWNbV-Fm>Lra%n_1pN=KaCy5djSU0Sq*EA(rXy@#|#8~T`khs9EVI~Kf?#sxI zVFaKgtGioCVqIKZ-2ScW;FpCBa!$Vwp5?uXD8%5zuv>fc*pP3 zb5%uGmhy-Q9Lhp~-4TQrGtwHa)+#jM`he{*&Q+#kil`{j-IfIvhQ}y=NaX`4?Lg1p ziF^h4QsSJOyj88R#Jc-yVi`LnrN?C-OE0!2YNuOM>SR=__%ul*APwFJ_wb~tvMCM7 zQ`+-?70Is2}o?E0{U;lb9c2>#3_?GU6syFR?|M2SEvg8+GPi}p3UyydI zDS1|5z5Vhc9aX+4J!Qw!K?dvhpPNABjxm8+PTAYyyvcndd!wgmS)E-}y`=nilVqJ- zXk5|wj|&#md6q}Z)K-R(C>Als?aO^eo_4*M{e@1NL@hd8L#=B>fs&@Y0dtc9Z~a8s z>0@+ZaVQVEy7-4w|E{RMm;7tCWe&kAF&|PSnwHlwhLG01uA;Cotj9kpz-?R$nfP+- z^Gb;Ptf~I?s|0MVXh6PQN6}qy-PHy31RTkZ(fQc3$nNx?bNSU9CvJ)z=bG1m#J%Q| zKdJ_Hj#J~7YC)b|nIO_w?yxuh&pQBqvN#tuFbt^g1~}GecBW$88_&W}5i|A-+-F;} z_`d6HEwj5#~6aIfq2M(2iCwT-QC_NRB5b4I*;IL0;_H z2?>_5J8zdDTBknCns0Hj86u9#AU#NBZHg^ zft17rCAKV1a#PHVEY=zethP9ENdXT7)*A878(1|KbJwu)Ev!KRBqilA!zXl(82Lz> z;TTYH2Z7!vw*(qYFG6CNlI|YZ-`BGoeDP)gl6LrBo?y5V^U3s3rAZ9mx0$k7Z&$#0 z7TZ~+H#8dh1$XAs=SA(p2GfOJCM)a2v347u_c}8vrr(|w;Qev#jo#XGm4ub($hAk> zbjPfK0vkCG+W4P|=e$(nc!m1dM{HO~6HCn8pg*Hh->*qLNR-jy7)X{C&f16r+`TGwyCeKvtjMGkVx8o8<9Xvbkf$7gTyKe?Nbqu#j=wl z7mpWTa2Xo7`71d1Y<{^sZ@`c7>YlX9>2_D$W#7KD?3GhJr$Xz} z_KyVmO`)&I3qTfWmQ(-g#~sh#Gb`Hcbo7lSxL zs7{-FD67$G=;Al)Fxz!l6ru2r2_%@jiLtoL6?@BB49(qf&MJEQbL8>D3H(d0MkHnO zu(_k!KM6$FnvnDzsagUEeb<4$9)FjrD&9))Ob%m2C?mC@=wlNOG`Qv=QsL~rxZCSmt>}T*0B7!=Hp;c|u@CQO5zq|pS z1Xhdv7jnd~_aw4j2l{gEjNc><#kZkMMIN8v8A0IYA5PshdSoLso${4)CpJ9ODzB~QH9Zx|VWrGVTXS13m znX^nR89)Vu{@&0vP)slk%1Xe}u3hf+iq*yL-S8AJ{`VXfuXzY{J>#$!7&pkmQfV_S z4es?aH=hTM=3DNPsDlAt>Tvj_GHRf{ya`XHUluyp7}E)od2ZGWu37geY;3DDKx84C zg)*vC9*q1e!`$1r%dAjerR$D8xX|GMdIq(OYVuuBnXpfS;Cm0|Z#Y7>7p>}psYB<}&iY0H+QdF5%_cP+`olnUWWqN!{U@BX=k6?(vj>W#lcbr z;}R`Nkl_m@-3fHPG+YlEAw?L%4ksbzqL%ZNNe5WQx~ZVgQCyTEuF+g$1H&z*T={Rr zR^4J0iMtZigHmr-Owuvsss}YgkS{@TSXb&JeaC*P6~Tse30gD?HocF}@*dQ!;MjoU zMMKj$0XFcgde!iGMAJTVc}R`!)n+L6`zS(tE0~cIV&>VE@)l^Mo5(PKo}R6<3ff|i zQwc+FqoUgbEely_Poq)z`LU!|E%5Rn4M>Ga<4Y#cd&mz%UW0Rf+mFBHmEcGb;^00> zjfAxx>iVh4>}E+^=}SVX6P*&qt6$~@6YDVz-Kux&VzRN3)}fHQZ5Xf=uD*QY77Mt% zz~$5L$z4MB6lA_lkUZ%rut`$nQ7ZUj$;HOKowCbU)7RG0-y}#{cOMY5tq4@SCJ7-E za$8)xQWmSFs{nChDOK0GXd2Aw1X|h}aU{ISWo0`THb24AXieiU))~%z&|z6<2i<2$ zL$ohE%fLO~Cr(&@!d#*cot{r|{x+-f`=<@ASI69s0Yz`}wC*pXi9<`NsbG7dHEr50 z7dsgxhxrS28{%uV=VMmrLA_SPIKPkNiI^nYG+FT_6HK0wNDSB$qZb(Vs=3o`TE?S1 z+Mg_jC7JrmKd+C3%y9Vjm>tCxUmY35!<{n}ZcTS$O93mES5Y{{u8FLX4jY7Do2w3~~gaquH<@#Mei>1sHfhv~ryGzN(I z=~J*JHnS5j$)Bn)64KSV#zohghB$ZHAJrN?YW~?HCZ)KUH@0X*V{UNmRhw0U zU~1aC8kngQLvP0FvlA%Lc(M<>b13O--&OCW4s>;B^Q+hfWBm&uCKd;~g->yWb=tn3HB%9z&{a2!=L>_T788;mabWnr;xHq?VN@N2 zBo4%cLMhCTwE`a5-}Gr4vrM~Gym*!%B678?kF^^l&K&WNd_D9GGW*8<*vey61PlH`l6&y|VmFGtTzj=ECkmOL z{QBB!y%do`ls3c9?jh}lpFv?lIYVE3$(weZlz^^vR65e`1)xCe=*A(K4%1#jmpI3E zi=Hk<`v8`K5{61VT{7R@S8G~qLfrg)!Ta*M_UvzSVc%Bskbd{!~)I=iUebVhOg z_Zh3fUifto2A)E>e*S!3F5{Kz*V?~*h=Xe`s6zp zg%Qmo=K+8T^t^E9yUtCtyv6sjE`IzlC)S#K`>U##vwnSK3g{H{ok;Jb$vP)2@Wxf28{WyS1M0wX1k1pY z92cXUdRkHzy^34wLdqI9J)4!^oWjH%&dViWU^|!!F=1F(I-wSWg`DHpLj#P+A^w0I z43+|OKF)qa>2m7cVyC(a2AF=^!m_+KKTN>x%g`=aAy?p}#aS$}R(TgkEv3Q7IB>Vm zFusJ%EGigBlqq^y|E>O<_oR#W@o?m5^D;W%zOm=4;Owng>KjY^!!u_he0YkdQ|P0o z?yIeQD1~i~vTa}WEVfcH>Njk>>UZ)8^(H0GZCDDh$_E$sk=DWm;$B4uMAAK~ zH!_${9zYBp>?x3umGL>dS;qF++?gletfTr-T}QGZNP9toga5Sm=)&;Ukn8CrhZI80 zXktVX6~*%pTvR0(GD|v~-7;Nm)u;yZ4H6--f|uwYYD!D@5Qo=m|BdB9v}wOrYf(&K z2$ZnX8klWNy?M676M_}|l;vPIOVtaWnDZu+WS^5_1Y@?jd`h(9&R{NAn^X1h%LqI}7i_Mx7A`hTQ4|C~xTY8ikkIAkk4WfXo$C-NKv~$Z6+R!Xt9DxKl59q2%X^jETq6*F_96J9kE2W2w&`7|ehXY-_B(vBqUlS4 zxWbzjUI~9~3megfGn(_?b@H>hboZ>=<^H@k(gZ2cQzg%lJi*UIGSlAU9+62d&+_oE zWjZ;KwN+a8}j(M+V$%@UAX1`SKAwfOp3%3Wqz!ha!=$llV}`5 z`J3VGf?|(3$?PE0FpVQxjKX^$Gpc``msRS&e?B-l`;(?Q=2NvhUPakS#^G-)Z+cwx zHYXQprMO*S#3&ujo^VHzH>%^Nx6%{)oaBYwfSW|%(SeC6^+PFt{kYgeo59hG?<<1U zG-N`5t)7B@x|f++`$?xsFpP}5KvGOTCI9<^`}Ef@hq;-_zwSn_Pzqueto{ zVfyV%jmfWM#QtSvZ|@6Z5F-XV|yAl@li=roS{)OI{Z=;x7+>tw6ON6*In<$Lmdf0FDy|%)wr2uu|p@d8h18)hH;a<>$2X)Y zKJ3gAh^{{u;*LI*oJT_+@~{3{k@-MqS-A6C!gMPaLX-_TA|wAJtd$bwaQz5&I)Isd zlm-K0`0vALD)N$N#zx8hJM>gw0X!M+$dduB3#IPM7}X#h>B4PyYZ`L&_BDFW z>!az&DCj|S>xjhq>c9=sq1ic1Dg!wa6JPdQY%@v=;;!rJ)aJ4Vh!)2cD7@mR?O4^Hv%Pd;;rR!?%F>*;wS~?x;5S#nj%dz*+hhP`{)vYE-$1;~ zndcN#XYP&;4ArboXp-N|&oi!`7H6y-tv8#N%gb*EM&3`f8$OJenlly8(~Nl6a{35) z1&(Z%;^ZO^Mmt_!!n?6jbN?Ss1K*IxPtaC9t$B@dZCaBI4nU~-dtPe|QiTZ82cE^blm z{5NLw-G9YH2*j;=mS1=s#Ts(yja(uu26xdb*@de3+{;&~vDG+=^a{paWi!+pXQrW_ zIPa>BbcH%1&V}@?N^29$$uE}SPBcrml=2TcCGoVRF<;cCNslH zyAGk+_V&EI_BEUSh*;iwse(&M6=Uw#y8EBuT?Mmd8o9vqyC0m%tG%$B(-^SVQJ~SI z9h1R0=VFkf(i_niadIk}#&SLy`s_@bf6cF^t74Bib@IozTVT$W=uY5TCyWMPkLZ}% z?eyd9Ri3<&pJP@T0&Y!NL-eg8`tn@{E`b&pG_=3tc2LZn+)B54Q_Xa2&+?1C{wKrU z23h$_Bbw>D(B;m`g|_!tsx9HHx$syyORvkMmXSLSy?z^UHvI8u6mlv&T-&$zirpEm z#&x8;z){W3({VT3fA+=cDr;Yl)76Uky)t_?MrZcLY1JpP0{0HaqSv?<_*i;V9y8{N zNvK<6u==S3?^TZ^!vy}A;#}46UZx1Ts$q?BH4(RvrrzmiWZSd~YPe=EEaz2>w|UIJ zu)Hwn-lY@@IDddK>akMxb3g-7WmFz=)Ux;4>cDO0lqZ^lPGfrjAMx&-U*A*Qna-dZ{DVOAX-t!#rEJW zxQ8fO@bN|mqyO9$_#LW8#+l*`6OSHsUgM%8bG{=YTRKj}9vEC5OC1d`|+Gtt1G{vO>@ZJ?}nK3yJLwZdUh4a9v zz}-x)*1DpW_~^Hud0xo;S1d?pj1M%EzQoZ{Y$Dg;Hf9<5U=ERM^s;OV7*Swaxib@~ z)k5MfU2&m1Y-i1yFr16sDw;R7eu(l@{^gcuIzhmP);h`#)Pc|cV+N5uhQCDpt+A2o za&r5GZWE536W=tM?-u97n=KvchS4(Wmdth*&R=HU$x?JG4344~@Dm`qoIawV%=zsD z0bqYY_=e=4@C|e|&{YxH@MdT{1=k7bJol<}i_Zjlsd0$-0&iT(=2BVayECK}d(SuQ zMVHmZktW7M{Bk?2zY4va;*r=bD1ESEse(pEsEU5o(R~0Ro z=<15&Rgad|Or46StCU(3ku~y;wBbj#9EHj$7%+N#A8wY~D-U5y90kv!Uz$r`HLkY% z+H>`TVAH?ifjjo!CfsxmXXsb2q2kF=3DF51)Ax6VP*1@&pu!Jy;cc*i8DO zzM`3Q*?e)jFjBQG!AYov!GBH{+$x?}X$Al8RyN-K?pAVscPp#mSOKMbtps1Z$}z14 zzJWV{V$^esPr<%cK47_oOKRn&{&}(>*Ka^LUr$Wz?5wNXz#8Mqln+5dN6ksc%I1#Q z>S3O9KAAEv?uyUJk!Bd5S7@+&Pvd}30^hrEy47NZQX!Z6^TCM*{I7UF67ByETi3F$ zi_v#<5}vE;2)=F7Zf`?;vQ_m95&66oOzN9Heh;St@%|5^OZ-D%7Tp6WIT{EkgnoZ( zw)HB5Z$BB_k!AfMlfwAswP;erdcBr;>r?6^#U3(Hw&&6HA;DEzvZ(xs#{N$PovNhI zBCQu>y@Cqjsi>reuFUg^(3#-j^z+_KX=CD_6kZm1OLK(60Lq8Y*H@9fbaVdo=BJ1^ ze%=muaACBzRbQ+3oZEUxDAxVY&g3IYgDPg%qn4*9By~04%di+)ISJ$Uqi-$AjUqll74M*g zvX@j?0`qyRd(byr!T2XVGVo8sV484Dc?|EA#eQHvX`M9}#uMBbdJs2awD|B8Dl}0Z zExW4}Tz;{+@C1nB&G!rjIHVp<$mx0yt>ps2)5}Mx#((T2kYG>T`Dpt(w6)IygumZ- z3CD%=oyHgo6!1_!;xI34>p-XFm!ZEMLq?&ora0Iel#lP#OywQZf3A#$UuRy~bra3u z?r1c8Ncq0AgNfA$5Hd8X|IYyyq}_gUZvb8Y)qVOGTB1Bm(2f2BP5rMRBuEne^qT*G z1ZMw*q(89&9|*UFw2TMD+{DLBTq-F`dL1+0h`nfGd9N-8O%vX&c!Uk3{(n*rQB)@7wWOTBp0Uj1h@`k@{Azm%H``8T<_2_2Rs^Cl@f zFN|WNF+N4~53>h-gC!bZA<=Zdrdfd+$k4S6d_ks#2sKKdZ5TQqT<+E|I+J6FGZ#h; zjp@HW**cbEFS8X2npr2UVm>CJwaArprcwcFbZJS-tNeDsU39?pNk2N`y`Qv=rW`V$ zHEDkN^txHxAX8N3Yi**sTC>dC(Y16nyW)G%>=f5k9_xaj+ zOKO4eM$Bm^Fk4r;>;a2)u>{tF_0-FnqPvr2pRC_?2Blj|EzsQN%}GlQX!!(V^l}ut z5uch{Vr`T*$4~1a=1+V>57C?FQghUQ0w%V-voka}_;#NlxQ3RCC%wdu%|Zb_Xr9kP zrs85>H~8l%V`atPr;N3ttS_fuW{y;U`_oRDxtuE;Jg2Sg{;CsQS$46vI@@$E->JY3 zEvWCUzGO>`0Qj%5xT)<|fHkimbqCi}Q}e8(OoFWNFQnDx52RI@wt_%A7SV-a{zgg7 zZfF2^)cToB+rD-AS_X3aioq&z)0q+SowS%EemhJg7tmVq-5v^5=Fm6x97(Gf$Uhh$ z-aW2D4G-YSX;isPOPSo5__*2L57L59cIjmKApP}R$%S5gtY#CXaL!QTtTetv*OaI% zoZ*vx)H1x9MXl zW((L5l^sQj;TAGE$7zQRg3#e;wM(`pU~sW%BYW|9(jBsMRdDB=qWq}lyIJPmmd1~h zRe2+Lqj~R`6bsOL@crt?p#&cRhUSOGR=(d|Exz-bqgU4k3?Xw8;=1dwz`?abJ@&NR zrx_Rd>3QmjqbRS1hY&xUcx2*uek#kAklusr6M3#k-HBID6|n z_wu%`vQ7tleyBYiuvxUR+TWBp(^eL12x6w!_xv2%;qSnLe)1te1PPTo`7gwOQAm&d zadWkIZER6jgpl^+6;T%GSlz(?gg!uWW5?a9~){rKxuR)%D!b{jAK* zGhkxmM^FUuDNyn+mmo-M$ZE+H)7t+dcK53;0nZ_X^B{0 zlGCTfYruWW-I>+Uc4b*``F144(#v*Q%jT*!rA2S#^|MIz@noo9WC@!^!@@gp*ck1C zABDTl&^xa)aK&MUDFK8o8@h+o5i0pN$dK^-GHG_p6jLyhfdalLwap;$U=Lj|ZYXhJ z4XdfiY1oY9tCZ(n$*bk?1_>;Smo#8-yPf$`VBxLOF}HgGdj`AhV zi&MLbH=MyjrkT<%Xsz~mk@>KjNuct#5A=x={hOBUf5820l~Nk&q{r-spPD`SmNX2afXx45YKaBAjZF4xLJX| zOjBApaNKFGy`8>b7=e}Rx<@NgB|K6GF zy586OI?v-g&f_@We-gwkz;eCR`mkX+IRopykW|Bg@E60%P!$buqQ}z8G}P^@GE(eh zw*@6X9*&6$T`j#&<7}yMy8LEJw_rg$N38@y+Q;3f?CU=DCaRG~MJEd1D1F|eZh*77 z{)#NGc8zaL&V739GQvmpcHww_s+Y~vM(BKhX!zCe;VFp~V6+M`q=>jLE!-{K`2fPS z;2?0y*Euq0IxC@s#h>8xUoQ$6dmc%N*$sBV210hE+lbZXN$~i#^s6c{BZ{!M2zAu&k1z+_InKf%1q%m zNAa}&hW0t*L#{JZu}!c~%Lt8LRjUC1i9-r`Q4DuDbeN?>hd#ebpXs<9YBn7f_ReAD z_($F(s!NUb#X0Zwb+v^}KfKccO6MPVdQZ3ouye|8Uk3!sUkUsVOE)Lo|Ee!yxO{qmHqafCm&iK*t_<2Y*P3|0z1V z=Mmq%JZfk3P3qies!{``8PMcw`8gRG-j`Z5zh4_NAt3 zZp5KYL12$trELA13GzZCRpC@p%=~YI0W$p)!j|MYdgXwNoo;0Qb){Phk#Zz)OJ|wl z*+s7%b}3bP^ma)MYi;mz-cueRhKRxZ+_?lYEH$nZl3y*6ZV5h&x*yB`UX%|vk(fKx z0F8~KabOc!>-C=au0SOI@INRJ*8l)6Le0P_hFQ zj1#Go-tHG)moo2z^O>OOoi%GQQ*)%p1M>SK5_io`h;E6=3vhrJ9a= z;i|r-3_~k!2$*Ez!fT~G7vI?;#_AeyN~loUZ*1vPb205FMa89-j)tg;IFb>gkTXk$ zK=GjR^RsDtz}JD3D9C*RuT}BP*l8i^ml8DdlUTghB&)2psKA&yzpi=x0~LD6D`Z&G z$XtJ45Y>xWSKLvkOXrk?Y86yG@v_84zNN;s-g}Y_$6}%io7PuHoo>%3%;=ZiZ?6Up z8t%SgwJ@h%W>%iz2Y<%|j<>!0p)9}9Zy65ft*kpxlH-xGdE^kIjr+KMtZ_-JE&fa1P z$olqjVCbi^p?L&{ktoy*K_WZ zN_|+n+{+vQeQR=5sa!tlx=Q#W>R5FC_U8$WZ@XJMrn)k5E=NTl1|i6QA*H|yTaVBH zM}RcFW|_YmB8&?Ha?Ky+B0vl-(Id&%^paBop7Hr}NbI^)Lx5|rjY)%1WAM0`+c9*i z22J11vYT8a|EaT(QVqSkxv+SZY|0r$%`5*hNZy#WA^%qHgVshGeF1y#$(U=!Dt6(* zf+YP3_nS+U64X&$W-JI5z&>dZS(%vLI;bN}o;>T}+06>i>j8*#e7v-o)iW-~HbPKe7rj89BVjE#+*ZVc|x$iS$V+|S5O zOM4q2OC9RK+N|w%3y7N1;4zb8P~5hrlfk{^h*zj}6>?d335$EV++a+vH;2zz_aaD3 zDj+212*zCGJ@Pc7JNY(ibtc2iGaEV-;76r1qd_%xJb+^RlR^j3ahJ*&#n}E=gyspY^%;l(A^kpn8WF)?h;EnFE z7+6jRPHJ@Ye>G#JU$|XA^Tm|1R=UZsWqU$F+ibZUGfo25+I3qs&uZP6Pd*z-u3Ds~n5RC36jYBTO5WeYk|l{$;9hVOLfRl0)byOT9?9!@5WF*B)gP&>X-aqWJ}R`^n_CZ2|t z*7n-DcS}0F)J)3Yr)c$o>g1bo#JOkr+%JnGo{AGJofMRxK3SSiWyCq!7!rH=!z6LV0LKBcI?VPKKY@Bt!@5O?a!j zq2!>Kp-KMH&co|uuU{H9n$`8ZKZeh(+Sz)K0=!Q%S3^VCU0s=62X0kvnpr^ci`>zsMtzr&e6;=Y@-^BL{pQf|@T|&NQK2WZuA|R4XTCgI znFFhVEl3S@=L(DNKwFJ->qc?R)XpzkW%S_=9qaUfY z{orO+1#x;wKH1xM-b(;_ZQXTlibn()qAU{qy?TM|4*rV-iO9@-E@u5*v_bGYcfxf` zP?nfn%?@aM-3-_l$D3WOVndl(*CZ6=5R}}cxau_uJOUBV9yJ^#5NyvpJKKH&1H7<>u?ak?6+^Ycu@!&C-AR~Y1E*qG}`PAxEYV~-& z`(?q-2>O0U+a4~^Cpyb^v+ETMLohbqXwaT|1Yvxc#0MF2ruAJeYY1hVD^0Cvt|m9349os!G~} zKHeEL-;;fdzX`P1p zO0Q&Mg^KVdy z7LTTD4yeC37$`sr^F_-u))zb1lWu#+y>(tz6JF)8tsQ%2jj)(m#(lotWnI9)-J(By z0L+rQc@cdt-qEkpXP5H{E~XmXRDM7gr>&&fOh> zkYJ?*b0%yZ0zot0)AMS5#0pu~)&42opT222aJ4UIxR*txBTsTn22YF2K3R*u+L&x?=q=j<|Ws*vkbJYqPuN3vYjXT%QJjBROj z)q_~$&kXMhH%u;dhJ_>ri+ZaR>Da0)KCK;t_}@evdO-Xmca+Z^+s$=t?xFu2 zTt1!JDBGi*qV(hnBYoxwoV}WtjJ6USFNCURJzZEw?R&|i)4s09fdo&$Zy-xqShhzl z-jbCaFLw@hed&ZA(@|G%kWD>_%f3?0PJ11JC#qrmD0=d%V##16Z#U+u?9kROXE8ga zIYL8+sn2rzVCEFhXI)QMvn?MtD=RA}C!t;5Z5G)kN!m#y+vKS8xUrjtrsjO86vvyp z#~@7Cf4cKsNop)YVI_&t)tXC$6c%Wny z$O$JOq})eHu@w~+)z{Y# z$=1ll^gJimmvU1q%#*5;NaUAD43S8Yt@{MN?e-v?stt)#FLx`R1XUzSO+!cW&}gP> zjwuUf^CAUty!IhCp*5uYKAkr{gcCk_u*$5{*g2_2-AnR;9~>^GCkw8xcFknOezuaI zdnj6vuO?dY#oPg$5!ewUs{6tXhx7JiMOJ22C=?%RY*$lvs|7uMzHgU%!AZObYsS8L zz@bkWX=yYJ46}_5l?s|;YN0&?TD>|YsrlFP&s*zjtXsQ0s7lQ-BSb0Md;zO8a-*~} ztHiB>he}vEp%y#n4Gk2hsBAIHZFWT)bG+mhbY0FewY52w&XBA19M>jA$$4m5_Uqt- z3Z)HJQnRp^({5}bAgw~$p`MwiFFeswr@i(B1aGb*Vy+`VdOH;O{QN7*>oPJjWA6#+ z6cI&gh}?c?zpb@t+s;OzM*Fl+_+b0?haURKFW~s0r9$wFPkx-nH{UlWB{t;=o(H|L zDhajSu&GED7(6yOy~$~!uUE#h`dIP)RR2hmBdoHJS=MsqvItA=QZS@N3IYRNZBUQk zICZPMW%xZ)Y8DaOZ9kXfO8OG3B>Zid$+X*6X=DYyD+$=C- zPOiS;m%7$-HX6UY?JOPN?+$aNTU>Q>Nv}^nq?Qv(aKQj`ovyG503Dd?)UC0vv2qtVt(vA$>wL)ljNhS`MbPTo^mEnEogwtPm? ziFRpAr6tTf%=Z`_(2%^(I^)tdn?cq5u%n3m*td`4B=+PhVDHv7HNC8zJa2`zE8Tq6 zQVS_5Bj;sU5Pw?q6z4fv-7r0GT4)$j<7q)*Q>hxgqS)NOiuznpqPI{54b*!(mzk&0 ze~S8zx7%Dxb$gFNYuip_yS8%~`ozxVYrVn_=q9w)5>>u%F0{>*{t;Je*zLqC@8A@i zu)hA+Wm&5DAgZAwL=7^Mm^CRIL6}KKhk$YHmlF_UIey3PKbG|vxw6a{0Qe-P1e($z)U%y|}`M8PvL1HCv!D^^oC9%V8H?N8vFm z*%O^|Q(-G5Q=xh2YZr<~#e`qwsJPXrL z4>nuN)V`~x-px@z!*$$*Zj0j`9-Kt}6z&7 zd&?u7wK$cc5&z~YBDSm2rus|VSjKiyRPj9kT!xESU}f5-sh@_p=+t<`o{Zv6c+sxp zFWf;%IpU!keTHhbj{)CQEk*6OG@aFU5haGV*~Mu|k>Iu6X)C+jmpU8oyA~fPE>IYi z=VyICQufj~%t4wGn+AS!BB>)`r6!&w5~9oFwjk=-z5Xq2dFJ^%o7v6VnA2H-a4n6p zTi$GwlNFHm(N+;_YHv;X7wzayN48V<+f+*QkJUx%mWq8 zczGg)!-R`=<>SjMIh(ifUe*YCScT-)r(55@SYXX|eI%|dcjVhN>p7J0?&xA7P>8q0 z48zO4Sr%Mc`4)qi80tN2FkC)$1X_KuQ*0xH9vAjO-{#|Gl=H0-tE~r?!zd?!|EXG! zoLm&PnK1^fX|G5O`&>Pho=C-YtI59N?Iw{}NUDnHiz5?9)=gh;bEIzxs<8FrHvUO*ff#nc8assf~Ggyghms z`REK*vihfA;8Tf=dBJIYnsFny#-1PxX^`D)l3Lb_PEB{eee-Aha2~~k`8WTlM+~K+ z0dL;eKK=uZT^Y>dQ<|1C*IGMAV6$paR|uXLj0p^o^BF4icra+@Eyx_W8%_jI?a8_G z%HrB=tc%-hh2V4eQPCSwlFN%1#6it08C7{7&vuI^Eia}Dga^|wz3#eV&Ji43!SCDg z+SmBfsKxx-G4yM@tSn}p&hxtz$ryh%z8c;>M$#72S@w6~67EUtX3;MQxTRC!^QXd5 zS0pZ&v2sMT z8M<@~X9SFfGF9zo2U>ii7UU226>W8-Y28;iZ@3!TR6gS#ZZRka*W(^dhGbBk_`uV| z&Se35qgFGvjYNyvJqAMBwFq{%@)f_7?D^z^fhgvd_7gV$YRv`vfn&;b= zy;7RDfruPZx{;)CRS}srQS9+RqyF=Jm|9a>@xkVksRDY5C0PX_=T_KqM=)n-Psx{M zrw?9nA!LvoUw>OIIXH`G`moq}Xi0#s@}khC9o3taw>GFV@mIQbt-^Vy5Mb~rsM2nt zEs!x|qN6!EId99#;_~zPR3e=FX4Z<%Iu0zEb1QMb)JCYmV;K9<>0DawCO!17W4$*3 z;7R(uhVjnRD7cpxono*4ME=@Y?`4%ncTxTYCtte=6nJG-6^}ZI;~yn8j!zA1J(iz> z48m&JNsHc7yq8A2jtx()>j^Fo`f&Sd+HS~ZqJen{l4>!XSk3>K!voB4#-}r+>3Rt+ z?graTSVKd@cMJZ0eii0;6((+r%sjnpLe}(1do%%Unj70l!BrTCvrQG|oy3S24V%il zb4uR|FJK;;xqsj20o^P1PsPK{AMnCsJyDikC|g%50PYrjhr7YG@ylk)3IdAu>i0lN zBOb52vud&P9^z*t43$46roM;pj~Wm53|mT3k#@7&Ro(j{E+cy@+hydXx`hAZl!f(7 z_G8hR;@J8(tMY^CU6fd8imGo88Aajuvz7csp*x&eb{gl=f8MxFH zps4g%tBADHD}d$~p08ZK7h>-&t=X>~L+!09=hOFs#MJp#yu#DCj-Et`cKO(&;+YPj zm#8cFZya~6&5QIs<&q$WpxEvlcHA->cV60l;DlKS&(vdJ58g)5Xwwo^czp#$l$GR= zc;|Cuk{d!j@l-SBGwvcKJ-Xs?3!2w(=XjLYi_Sp~LbKe`yNebgA8od*D>Z|rfJ~VY zYMIi$s8My|#RBL0;rv{Tza!*AP<)&71Oe)hvf(&&kL3~9Y9NxA#^55Wa4h=A6?s%CeTw&;*v%#f>Xr>pO|-Me2(3M!Z=;P>q7Eh(*N5aEv4IRA{Xy!1}1oX7dDqqdNL8;CLe8 zr;!WKG}t;Z8RaY1Vg}EYPN$xzqN?Ip26QN|oyYa$i(@Pd7W5#cEH=)gQ{xZ)HS3S& z=IZu+aAp1q2~bBsG;NBocUPdMS32a}#wCwL}2FCNLu@sH63 z8}vW2zm2avQtRxJxjJAnB)xY-b6JDbSA+E?9}_qadVLQ;yJ{4QKK=ZgN82 zo$s-V90LmSd4Q$I{UpdERXCeJ44$s25ZH62X6S_1J}8vrV4~c+>w>_`sThD zzIyKl?O1N&j)dNr1~lrCuU!TLK3q8tnIcBk4@JiBLUHtmY^oHCchW8u+w;_@Z>*Az z>V>U>8xSr0ilpg&e#`up*RS?0ouQ4)_Z=cV&|o~@ar2Kl>*n=UcLe41&N+OTUl`;Re6L&6}ao+>ZM{hm+l0$!a=xwZrN)PFzEHDLQVYUbbQFtX7rPkzweAviHmNrK8EInXmX2Vn-Z<7+6{cpy$n-T$YRNN6k!4I_k-0R&L`SYb<*(;a#R`=0ariN14i6`QBW1 ziP23d6Y20#EClN0swW91?XkLd_*w;YweVb6?W$@*eZ zNYi!gBeVnV6x$r8r?FD51jjbM_{FXD)&V`8JH-~=EQ4k4n7d1S9_7KX2}}TR+2tED z_IDni&riBX9A3>KjpY9LVc+GLQGGTYLMme!WLYLIUhsO_7X%7w-u`VAwZ@$H&KG5x z!JNv?#WGmCI#d4+hR;PQ2t$Sg7E&~=sq!UrSuQ7!^d~`)dhFG`wIrM==tVMrOGbMD zjTzbt=(H)?SovXHo;!QGfW#1+xC^Sade zBpk_+6qTI8w!{IZQa5A-e%SEO?E%!`JvOOG%X-VE!pY{O0HxEEBhKBM+^k#S^|M6> z*baP!c;oK{3)bCtD%hVY0Y{-{?%>~M1{oTC@sUzj-<^R~5|F0N*T7k1E3OtwO+{f%14%)2>i4A2tAw4lsWcYSCLJPzFmpW zk5}$X-W{r}DA?L{NtrjT%7RY8%7Ozh1E|3kq6yY-oBE3o%KQ`8Mz`EcdE$)o8rU}C z_4bTP>SxOF#1p3!(Rm=9b+&N~S5h9kb+P+!Dc6PzL3sN?|3+#Ay1)q%1Tpx5V{7>J zgQJP{qD}POp^#g~F1J`A3c)XD#`#4d||?cXHEAHA#(Y%&bYkS{Fx_CwK-Ugc;PoSB`P(poXAJukx`f|Ega zQ?N|DuK}sZurF5+=;!WugVpSME=D3OFVy2`c%Y7Ddkv28`m59j#gEH-xdA5~$jH=x z{(MPF2y5K3niCyc*`K&vCJ|Wgd&HKsJj1!Cc1yxhX0gN4#S@@~0HkFBz!`wZ@Fnq* z__#K?o5w^?&!VQMsyd@M4BL97sr`cRc*&Fj>C}&Mmx9cSLmxyfeF_$X+mgVL>7$Y{ zyU!6>Y05&kV#GQ9PRJix^%`^%qjlbGfQW_$zLE&a^~fX6JNt8>d545s;zQQ`f!OBg z6B3K3Y$+HUs<`~_u4opo!nJaiRim0k*Z8wbwz^Y-6Pn3AH%fs{i1GxzH(Vj0lk^mp zsQ>x51phsD)Wj4sS?)f5E4d4GZ=5YKjB3?WAa@tK!tEuV@` z3D?#kjwE+vtkA01uKx09dS$I}@QU1Ib&-#-9%tKTijf7_$zg1mZ(Xmdf$tth4Z*ee zk`$ zrtWab+ekJUnMpt*&HBBY@(*ODJ&63BRo;tAI4P8`t$UE0{7z!I4;gNz)y)ujCyKKd}A1F|x-hai97f(tk||uHa}NPZ486Q1yY2bPJBQb?eT# zAuy+AI}SUf@%8G^er%+pqtk^f6#*R+s5s+~om_Ai5wmC?modhuTC~nl+&6gh=n!Yq zhaJcSNMzRwUZRsN)@I+?8V-*=Iw9}t>pNB=@#C$1t)q9nBnD@NQI3Yg_CBNjsUF?k zs*#t={5vIrBqQxEG9678sf)I5J+K+EVfBsX`?@!Q%Jt1q9(CQuBo{-@(7@>Az@6v0 z9Ja=%;5PLe4+EE4TQ6B066Za2>QsJy{`N3MeKZKI9C?$;qwF%qAKeey-woNFeE`y3qbJrM%muH9zCWHD_c;kL~86*8s@GEOLP#|E35~F%(IRA<(@Qbu}@E>T{^UR zdLE3w_VSHLM;b+DK_X6k{BcQ#(6+Dhn&}A03PGCj z>TIo0%sE8jd$ndB5IwpLb9f#^^!bQTjB7b8_r|W*bvNJTS)$4tJGAv170-V9rvF;R zjpHDP5Yg=0y??7h{J#Ag8yfEPQBzTYd$6gJ5Bk;htF-W%jiqr{@#7u3BEd}RCSsUr zC7XveNHFlc5tT1uU;ZZ!`$yacR{krUb;D(>wU|${3ZZ#Y&-qewsZ;{@Vs;zp&5U=o z3pHMaVi!Pc741m#E=DA)(xG@YQHC&5-Kg_ND)kYqb;sZ*e-IphFj7FNS&hv-x`07% zI6veSizxkV9mEGiibu@fYWc4}8lJ}v9Kv*toY))^*;?(Y$fX$0<74hM{@W)yM9m)8O26oQYS(kq;5Y7Ojd>(x7c7ERnaInVq*j>m5$?!e< z?yi8&$^I~<#_pKFdQ(ZiPyTLwz}wS{eW>$hQzn{6m_JPKGOgg=Ff`h9=eC#hKe|+3 zZ*sRbo@N7yD4F3a)24RM1S>fd$4&)XXRkkqtl<`Abo+Z zcY!%)z(TSdTCACnbxZl!F zrw+8*t7~|Tzpo7}X&Jr8^KyLy4_`N7rWd?aav*(S>4us%%s@L%!su&$Hwx?+jyQ%3ZYZ7!wRM(C!nh3X9U=rOh}cTi!a&3Zw++f>IAC%Ov+rV zld^No%*>uH6%DvRAh?yMKZiIKYOL;a5ovty5XQPBHRUN%JQt_mNMVorCj0ab5sVBqTvK2FZnlqHZ`URHJu zvYlRXOMr6&a~yyps=rYb?v-0?OT| zCE}WIH!(J9L=ELRziWPe3nQDss;p>7%pv#AkHuxIu&8d&eD8~w(E?6>WzzRLzXVtGMD66!owU@ z{c8nNwfnl!xpv;}oNovzTri$h!Sx!0aeJRBYLKOy@C@v}YsW7gioc%^c5v#hM4c~w zO3DAH!tCf4n|k7Bw*N0B{O?T(dll5aV(-_k%~!r-4-kBp%Iv`mL3pjCV_%GGNA53w z+{2CPunA662u?E!o54*Do{^dZ@Ud89O>>tLAmLmwOB%r4r}>(E(&mBVFncd>7RX8|>`- zGGvjvj>WD{ul%$%E7Q}{6B7*_9Kx9B@%+YM4MinAi~G)_@eNaT9v@!l^p(%+6XMGf z*G+}s)c~om`vR`X2Zkwsx`nJ2yjc#_W`WGyY_Tb$uEL9|e9BdZtsA(tKQS>dNc^ex z_-!o)P8iqzAH^6@xFO$#mt*&g)vtXf35wGQ3Xj=bAPvK~df0U@r7ZeU89mTEm_kwd zd9)?o?I3u2S;Z)RPB>agg*W+KE5o*mjAXJ7CUv+NTq0S^izKG|DTxAQCrLL(x7e+D zs~%9^mEDwUCy*Fx+F0q*D6=xCQ?td6o&xhvI!c24vDf%)>Aqxj&%b>LH19dSkk#t4 z-TwSSg&xbF9H1&P^MHA2{%8ozyUAs!mIO@lh@N)T9byR$ulXDEU}MmFOwP`zsY7iH zR47dn{W;ZZq0p0TF=u{u%L}O>{BKGzAl2>3G?uohlXf=*(sN(T)VFs$+%d4*EcDf9 zp1EQSeUic>xG{=Ddx>Z7O5z0jXYp&w{s5QtkexEjPPqB$Szuxe#C;?`^)+kiDGFX% z1}BP(c6H!~t?6^+Fjn?=hc=GrYcW?PPYHw8hq<7jt5tYwLD(frkH%E5y`fyE{D4 z2wbxUJ3)3sW0r^5^i?%imh98zHv#QMtVQud_kgM<(spdRA>QqM*cTq_Z&|W~W zrw6;%UOkRRB;QCG4Kfx2p$7WtOB-v=U|$_~k*fgf{;FgJ$G_8!%sc;Y*cBW;NP?M8ekiodKp7O;QA&6( z!2g_bGUwc-%ycAI2WihsB>Eg-$#M6hEq-*MG4-Bnw2OW|y7cCXe_OxlNRBegZom{o z_eZr12p9-nV^r=PetIH++Q>gNla#W<^-L5sKI7W7(c>#l9Ho1tS1j zK7#^HF*=K33m8j@Ot)^w==WsF0!0tWK2*nwVha4qiu{cD0r(8@2cBp@PXsU&zeIBY z+wT+S?Ug-ymBKGK_V4=iUsFL_&CWLVWy{*jyVy63rv#9+>-uWyf-t1^5_ZsAY9(kV z0P^!qg#eA}R+yn)1fA{t9c6j*h1sNLHIc62h)<;sMuwRVPbYgmud33+gdO*8VIN}{ zaSWf5lH%v**VT0&YKdwMo7K50;+8El>Ik9przD*^>!gNG@mYr~`1QjE*N*<{5Bzp$ zHMPB;Z23|Mta^qv;^+)X;gS>o@=oA}0~me|?05c_JWUCV5KcL= zBBlF=Dy+YWn5S7^rAm4uNp>#D`26*K#35@<{Fjs^;^8W~w2rFraobYVgSl1e&{~+{ z2~y@@4veRORYEDc-JN~LoUqZHn$J6)8maYA^xmv!)Z4IfxrRbuIy(Zi!~o$~up)=v zBJZi&F-*|zqP%0lA6})k+Jch_<+k^dc=J=?DRG6Lf9lD#JHzDf*+b9a&jHEDZ6FZf%X>9MEN3D0BN2y%njJ2y6eAd`>Z&M{i&8OVRmgFlrtkqaIwv^ zCe#X38#7lzapO<_^ieUv`JBCK|^HZ48eY6Y->%0&#$T&EOspG}zf$#eOQjx-N z<~Tofitc7cP&8r{$? z52(%}Rl!KpU5-WWboT_m$M<&A)ixili`TZYE|`XGghyu59q#n}QMvpP3V*v}dAC+K zLkkzv&GFsxlb)r~bU4r`hUZS!ja)|xV^315Xp(pkPnzGzmlt3Rs->{gSWtr~ZC?%o zLexXpqUt*KZALaIKf9fgzf=82!}|Ck_ZCHS1f}wjUE-7Q8y%eeD0!8>139{{f->3V z<=PsltUX0RZC&OWr1c5avzA`5y^z6eI=cYjjza=J$P__|nz5-AQPhE7nB)Kbarw6e zL|;kA->)B2#NJy_2rJ+fZpI2!%op%b?~&cAuGgU$QJtHv-~byRWZh%>T^ za`pWVex~O^B)UhQhnFGEE>7WI%jm^v%_e~hC?+%m{w&cKay9uk z6dqLo!Wp+myWPiZ9s!V>h8w8_Grx{BX@a0D*M!Fe1Q#l!vGO|@6w0a~oF z3NENkG92$^l_oN8cKh=ai@T|Y^KA`N0!%V<^_2_UFLU{na(ETK<1oHAC+PN$&o501Q)_N=c!pMPJewz@_8l z{+YMxQO##7m#Bp~aVDWQ7XbZ)|FzJv&)TrJ4k@w-?Q=gr%r~v)E;4ffH+JzC>FFMf z8_lcg9^U95%e5GC*<4970L%cznnJ|m#6vHn$4UdtA)WF&{TP7zj4zv~k+F0TmgIbUu*6zON{|g%G}aRZUej zASh_n&`>Xh8=cWSZ^5&WGu-na_QA=Lyi6BiiL7xIjrTjBQiK717PvSQQ&!oCZJZ@+ zJHapTRk6D%8rQSVfJRBmlQ&F_m0d~>GM$mSOeMhvU>CL=G>lTn{S0Pqa~ zAGN~w2Fl+o=;QTaZg~sJ_@ei4EYed*|;4d zC317_Rn#_uNL%xEx68q+ykn<>8^v!x;=ACnjQ7?KmL!ij6J?S9#60~Ieu~dNgoqB# zyY24uMYu1rFbz5@i|*i15hJ#$1|n_n)XB-qH(%$9aFlO%5bH4o+GX;P^KaXV<#lrCsU~ z!=7R~_YgnHVN?8uha4Jspm?>88Kv*N4_oj0z=hF%p^=Xo85tnmyu$zRf{$B1_ z2I_Na1sb>_pUP+~vNlB%&=TbRX|ekH0{=%H!_UQW_b-0Iy)W{AeZ`I^dEo}xDAGx# zcZ$m(Y-fr}8u|UQGC(I1*O5=%qRhg}AorL<5$-Bj%E|6B93m1KWN8^r&gV*}6aRP` zlhW>08-GcBBXu3$Zp@TB*_Z+ZLm$Ph`}jS*$${(p>Wkl(R#B4Uy|HLYKi;!?W;jB+ z%ie8rv*Vo3q_`abI(e|aR!Cfe} z1-zZdKODv6>@s~?vO}fZO{l6vf-578tcxw!??P?&GjaXmQKg2_s+IV5BNn6J=}ZM~ z6p&}fn(<{ti*$oF=#=1TAmaj8oZk0TfDPvF=>|Gm^VrpPft((b`?L>p5HN)`qZ{6z z$2|~XSrTcYy&I*7v|HWy((^TsPT=wS(LgKst8ESdl>dlSdZ5&>$_ia7Xf9@#;u~m| zv4aT_6?*>3h-ELag-jikf5I>AgkWK5)4!4HCB-l!FhV@L%8qYgI!L6T_oM6qYWsge zoN!$VB_;X5v2 zWaRvL*rZSzJr?LU5`SFy=_B}C{`sfgZVgCe$5khrA;$=&MY)}s6H%dSkU|mQ25ukJ zt{%G(d_*|gF@8+2re1r>cO=r}@`bKZyEr~YzLV4OVnpgbKMMT++V^gXu)$?j%xss~ zSUFjCWL_RJC<%WhvZ9%ayLuGSLizld4=ve`r2XH@)!@1acEZjlWU6+>AT-9-V=vQ) zpE?G4)3t9o0hF54;h5n9x!2d9icmMDpf$@pKfQ&1E;TD&D>>!qX(1&(+g8jCmHL|7 zFPy|)PWl1)zD9e@2?*0ZDeNDXE?@(Fw-$ZPL|$+TposXx`Mg&i0EVnzR3<-UVL$)z zU(tO5nv4BE{?}d4z@@&+Tfb+_-_^$g#i};ZM=?|@Advc_#rNBGoQ|o)yMrgKR?{x= zbCWeunhY-)jS%S3^9n-J*lU%?_e4V9?L_|!#{GGL|CunmcU~sxKhL@Dy&&d)m}8yP zUOB+MuO$n7W4~wi=qu^`H!G-3O`0N>=x-(XvfQn|6Vr zC!>R9xk_P9wpo3SafgkrARxlBLi%S}6;%VsVry(wM1@Yxe4~2)K2JLMRfh+D;4uzLbG*-rc$Sa+>Z@J;K4B*&( zT^uGpR2*w2zAV<$*(R-|L8U5Nq8v9DXf4^i-(vN>Irks@5<2TIGdEb=8pXbt{`I*~i1BZghp94*;5g zT5f@t$bMA9(Tw^wwzu`i`<`yL3@`=kBqx`1&Vm{*h{csk?aVR{SBg~?!BL)Np%z>q zHq0OpcKOww_FUt?d%n;<1qgCS93pW8-RP>WMP%IzD-T!&U&D2X{#XI&uf7OME9zBV*X_csLtK#Zs_d zaw%J9+*E;Y5tugewQu&Pgu+H5Z3Z56{sRB#i|zAnNAm z^|@MSPzl1)|l z+m8Hv>t|Z)uaU=%mr?ZOgIm$g>d2}Y(NmZwX~~slU45AvP?`_9gFE+LweVdAw(PvO z@L-oi$g*H@Zd7x#yTT&}=4TYN?vJ~qjG|Gd3_tja-&eFPUJgy0 z%pBiX8y~Qgf!Rz`(*R=(M*Qyho_FeqODGWw#6J`Wjh#X0C{L3faBaY-$m4yl(f)Xi zK-2H{sOuP?+W+X~FrdK_gk2W>)E{ouX2OwUbU2K+6ay4K8`F~MRvVpt-bSqIBhfws z%wBl-+YEPtH9|nxrAjPxMd9YyLydJ`E@5wpk_tG}>fRRr)A4hCkBk7MtiX_vM|h1x z>$nZP7;hv)>+h>72x8b8Bva1F?tBB`1;n950%p7l{+CPrsga=M6%QjKdaWvV>xSw# zy#yx(dUQebgF_l-qHk)J!kd^rI2G0wBzK%5N1_6!Y~CQus@+^B@5I0f7dDi=HJR|rDc~_ z`~|hGjV@I^;y0_nl;io8(b1=be}OUo?Z}2-8dv}Ium!-yqrR`<4_Ji$r>qC$g8lmH zujwlI>c0ZXJ&+6-kN#H*-1f8?`<)G}s5bW?_`UxpcldQ04`9;WUvdB#(o5J%3bE67 z-ED`k6Vz(l$RAnt=G=~@!GmL9g(#+2bJ8|9=N&O-&|(!xGSCqx3Gbcie$F}2d^mYT zkw5;0I7r z1EoKwjg|hVR@dUQ%{HZ|@M{{x75vZRHAVxShff`H2)TAO95D49hm^RHg{lzsfPU2r z0;(9>%$@4a>)O^22I>`a#jjZ8i6ps=drXSK)o>Po6a)xcoc8@F|L8`(FBjL#ypD+c zYY(mkXu`=<0O}LDT=_B(Na@LT#jvJ_u6g0>EA#izmRfXrH`f~v4S^XCF;Wt_HsXtc zUH%8h^f%dDfg*iAl?Bc4P4bxcsdQaZnRMM^nSzy^L$lz3#ur9JHzT#nj-NXdCMG7ly^lgI{{hPz zT(3r#)4~{}GCJho-di~B1)r1lBX4!a9dND3XRz-pb^Zg9uzebv;Z~3oa96O0%|2qO z=h4QS6xzuq)lu7LvNv7Ee)=8rJ-0KC1Ep5fW*sK5=2SZTUM{u|WxwrRF()02A*z)A z)w8wdb*styNr(M!~f8_0j6fq z@6?HH2`vBOF9p8Izh)cTXVm>(c>S&@7r58&Q#roddw#R!wxiN-D)ZOIetf?`{CNqq z@o;389tvn$i-paM!0tt?_s_jxR_oSx)UO$2c+F0!i^RM)3&xyIJ3-w4L#W*Rm0+ z4^jf12Oqd}PTT}lJYA0mTh+0T)88khe8=hk)uhjlz25N8k2zMY$eku$$dW_!wta~{ zCO!W5Hmf~(No<1Bn}wKiRVEL6712fKts4k?bkH(AFvp*Bu^t!V$}H7f`xaOMKfa~vRg%nK1wlo zw1ZQ2HDUW;*zBw^Vo(tJ0x1rr`{)H8$NngwzG|VkPhvA{_oQ&Cy($tptaZl*yW;Jo zxRlCtYHsR)IYpaf>%j${Z;AE(jhAXq5&dA{e9UFNKG(vncw4- z)qp9jbmDtq>?t{sefb+^S>~r3b1$+UEXg;1bo%I=O78(SEssPzl-SZ zZIunpv`Z}EiL#$>YEYm5Qj^*>n=T}2v#>{@0Xo+|cv%3W0Ryb5sHl>XlC}|uNRHO> z$97v<{$-0;!L#gV>v&KZV~P}u8@*K7Qibzm|M~;JP3&T-=KpgO?w30RE^v4r%r{(V zL@)s6-i;<)MDBPMWR(c%P+;FzK8;9c1UdGHL|Db^A7iTpBj6d+4R=u zqhwi={yCiiHr0PXYD|Mz=e|DhQ|d)e&OKdcn^lD+xUoQD68wl|N5djH$UwW?Gq zl_FF~QWROTO;RMwBqZzDWzW7FQB<;p?4x7}$(G%iO7<%4Rrym!I7);WJbps){rw8kx-q7YG7qwB0h7EYg0*aDD7@!gUzco= zXSRqOuh}c))ZK%nmjCmOfkO_{)upMfeo0cYDLm9SzOX9iOlDs3+e&+|siTS9z~}cf zgDd%dV1tfzk;I{4d`6fbDz6XW*!b{0-`76BYN)0vBis|Sgq%7@$ao212 zG%Khb`&&x>IWMb`)52?DJuKeS&`3Za?X7lp`K1f3);m-UjU!r*nl*x){H@-;emzp$ zYdAYUKT$vSQ~Bukfd?XUDMPp>JQw16$;1wa0;VU6_Tu)r&rb%9pHIQ=C@Fky0k2(r zjC>EaF$?$EW#n{-g$3>abbA1&1;A+ZZ>0*8rHJim)oivjf-?~!)L&myU4*b{?GQx_ zC^4oC9crV`SxdZ&j7+VP$Uvr~?M5Oo#%hj^^r~pS6&_?5%woaEA8EF!Y0$)6Va)^*ZQcsy5Z}Y z;uiu3RxVooXmTTYeZveNq!Ux*0Nk|hbL6B-DYZJgd$@6T-W-SWuzmVhAnqq+uSnmc zcTo-XeU6JI*97<1MV-vR);^7w3-fq^=q_uOcYR zq(LU9Sa=x#*@x%P##nYvg4QcXkySm)W~+|nZ*G8_DHpoS17Mn3l5$}ZR=2w+n^cl- z9G($~X5}?V^y5?>#?Bx=SGl1= z2)2b!uc0lLHVH@5R%sZ-icW z8$OzYC9PdY4F_#fSfba?_GBe@m!F3V$Z|{s&Mak^+ZXM4I_;A1VkSCicE+G$Yrn?J zm_q&IE|BXPx+pD)Z;N4Y}0Knhvtsm0g~z2IP9d1cz4oZxDA zL%{8Vw;w*0UWlYOp$Wxp_re;wa;F>;pWAorG5jjtKntI3@C+>c@va;94KcoJI>$9j zi!Ntd*~o^5=IH6mW>Sq^Ka8edqKLOU>*@CsY){9Z6dI-8VW_(CpE-qp+`2JSGbH5k zX4}1=>pMXHlu)jw<-nZXw|=;PX71EByCY`$G?}H$ByD4d=kymQN_im-oTdIp@pv;6 z63R}D`gE7b61Z5-n1At4%LE*pSBHZDGOnNcO}?c#)((=kZuj3kLJQc!5EuC!XK|Iv z{dC7p+N<@$K;h;26QQdNOFMy3z(NApe`(Vk#H^g5ac@7M>wbwFVEB3jxTHow@_+&S zJA7tSdn)m;_R@DV2&0;yRkJ%K>jw|DPAg=+}3VjDxt-fw~IFA~O++D%jb z@(escMCFq_ff}aDF4Bur35ki7m6b|#CJ>_xIs}$Zp7;w~4fCTyE#ElJR;nB~*>@r~ zSPzl&cvYi{?DPOVj&^67Vjqqcu{Mf1(?TI*F6?b@9m3TwiXxwjsn!59p<47*=qeQ~ zngT#`wjaXr;)6jOBQ5bFY4gyvk>H09w@|0|Gh7teEF1kReDG)vGRhQ7TL^@-VoE*m zwQmQ)Fn)c7XQnrrY8j74eGZrK&=k>eM_%45W{bLT!{L{0RLDfYn}EIH@gpedJnB?{<>vbSl#`C$WPFL z^+a(dW-GzvfdTf(xHYC7Uu-MayWZI5e70=e1Ijr5CCJXpZj>p4rlESMWWHrKy|-?# z;j-UDfajb&*skY%Vj$PsNR~|k8rx8y717^1q<4qPI0jqfNhE*gL7w1&eQ=UHm5Sk={@sb(O7x_RC9VCxukUUnzgLNq(T84N=dWQ@?r$NW@p*Gh& zfXX^ksN1YUJ13qSBCJQyAdySS|!4tFv*29a04y!JMgn3-qcxI~-e;BGU4G-&ov6$GQ!LL{Lwdyfmz+{EUWsd0}9= zH9OHqiq6n{selc8AY$b`m@h;z<5XJZ;-YHVhJ`?>(=#UsyU^d)z0@1roo69)jxMM9 z#kzOk&aYl!a~dy?dFzrM=!axD#mvs!X;2{lHTF|Jp9^$LQ>4#X$Xk6r!z>rEP{=9R z$Is6}u+RjEg#08w;~~jbiuO5!_q0gu9!*)5M`!?K;wm@Oe#Bsof9=zoA1495H~AlV z22+4)mktdf52Cc@Ie%_A3N_i5a&Ef1o5OMVg4+zpcWJiuh;}!twHUAo$^|v3_EqYr zW@i_K6=d48e5p}3{wcyKyfwSOs+Sw0vkbF{um$2so>}doM>6r7Yu`<==~gLRIz*XM z-C)GA0IM}a)r>tG&(F$pe9~JXFo9ztiLt#gL5{S;1{NKf-KH0dQ`aO8KtoL;P9deC z>MOlMeuEoIJK+}^xB6<`XF?Fq!OK9Gz4#uo zD~*iiz@v_O-(1?C%mG6Q zhI!!04)F&EdZ#t=HlFODn_Z6Lz9AA%{fkVQ}xBI|N;D5!F* zm$nXpX+S2*%f+9+n93H0KFa6gW^20O+eccv>tlPjPbC`$Ok+wSF;(0coUu&zvIje; zo#U|Uf`aKBjhqe_OR#QpmlPFxI*dfRZ}7br=UVYm5>94)Wq6BrO?YNGZN}H;bl&Yi z%Cj#5s~fx#kP>pR@(pUll-~iD-W7Xa*=7p&`x@us-GD#v&6U|q6T8&Nu0*Y5mQ+jd zk4wgh(Z33U%)84H#DQ}NOy$(Gi zehi(t*dz#fD;3-klz3Lg>6+}Du9S|G>>_?_$s#5<;b6CMNN(GDg0FIC_0{F(+cY*& z#CG9eTIv+Di_eM3LCEiS&m5T6V|uQ&IM0@eATy>J+N#)mFtjU5`NjiaE)gU z64rq*#h@_+g-?3p5q8cXYAc4PjWYlA`?r88bNTvbQ=n8x zlpked5%N^BtYZDv{02M(O0bgXzXsX|H9_W0`c>&TKgDKP9kWH{TZs+kgH_|+0L)f{ zq2D%-USJ8Hry}sct_Fu(G?%E#)*t>dkTpB@SO#s_I!IaUp$SXO#z3&=eWr`F(ZqL@ z30eXUmlQ5O|CX(*Wp&{4zQBF#Vy(bRXk4UqesiU4_w6DdpICO4q2Cce1ODXRn;#;Y zDX)#1hYKPE*UbE^$m7H}9yqfNMc>Rw9h!W7C00krd* zOvx&@b-B5E@eHMo-cCkW_r;GxPgCIkcgABE{y%ZG~ zRXPX4*D@{Uoy~!N1bYMnJYM&!2La3R|Lj5>%!edJRh*m+gj}z}wd>7csT=jR#8tm!(sI(gl=fU> z`xV~}bj*k|l&s(x2q*~w`fcS{$!WWq!c}wBj}-78-ZN(sJ^;p(T}()v7z1GW{Eq`| zra)N&fTc_a$vBT$(2DeAy+oY{^TZHt<(VWfTosWgfkTuo>O;y9g|EGa7;_AjpnyUg z00OphGSDKr#2RnwRAJl^K$K7{X)dX@UY{ypt(}|A%p; zs}%v_XCr`$EEa=ie=k--`PwPEG(WLu6E4o-=holG-CgVx#19B-oSoAe1E5EW3gfRb zi%>9o6f*vNTlzg#7PDLJ0^Td9x67#H0(EB;>Ym@Lfc*NP*5;oFl@1eELW!4%B9^Gn zXpu=e-nD4AHzc#Mf+k{-rCylb6~giWGiW4gQ!7E3Z@ly6Gkv+Je!GmMkr_Eph}JCU zti}v}#j}OFmtolP%AZ-&yK*Sgn#qZ}>N`J{Grj11b`C-|LpqdDOWqMb+f?o;Njm>- zR+3f^g2wA7<*yF34KT&iuJ~bvPJi|*x0o(>uwL5%=(!57E*(wI1(?WT{A!?UsHlVc zCZ48M^vYiHZ;#gmO4I-OU4QlxDHsclCzHma0NE-ZgWEIfHA8rvW?93CJB15~Gjlwd z=h$tILZcfprh(qa%jSZq2@931<<{35{kpjr&SGO+({8WctFyaW9PsEwC4^zvG!3ho z4Fe!Ypp1=`z3WKfu1rp2=f|{d5bGY0E#|F^)R0B^Fe@hzKo|M3`Jqe$z$Nt+5+(c? zl=hxK4z9n0a1UoEBA)EhE6rQudLiq#`Y|k=R_2ReCeS`iQ+O+x3yWlWp+-^_z|gRb z2(P|+nVR%wLN#Q-V$Af`vydIOV!Y@Hxpwh(q#OLK_r&A3B3#1-C+QSnUKwI@6HVy` z90g7DbJxY#TCzcG5>+xjCQy~Dv?s=$&_bgRS$^@Ttu{X|$iIJD8$PB8nZ{~D?4@;R znGnl)8uP3hwY4JIVS;OV4qgXNG!XzFoTqsBTYUr>gR<7sS7-QQC&G*22Z>uM3-S)r zvp)~$*`HtM%c|N##>dWFV|jz30?P*#7K>`q2pkHk7w@TY8B578Rcye3^7P1^ZQh;k z&Fu*U_r-F}ko6{Z|{P)#-(;_pMkz)J_`W2WF$=n;@P#wGupenrqO zP==wtY?q+gF@%`#+l?cE^+cH+C{D+p2kKX=Yqii^g}(x1<$Z?jQr2sBo2)8*_l~%= ze|4uG$+6Rq1@v)67(gDr=@8iI+N=W`BdLw^S1&V`8z`Pu8swpcnzjWeew(dxYGMe(B}7<+K1k+w5h7{~U2{ zI=|xL$Xr-M)b2dIr|yS(&!(8pvthB9X z9PIT%kCXveZzD4RAF@YRw8P8kJw(t;#S(|NVyN!)cXLxt{Uo z%e+GfF-asIyf0tJBg8s7M>EDeB(7?2Pi2LZ5Ai^Eh5`jG7QixePB z^)xc_U~r9G-_V59@~N2MReM(seaSA*CF^AzV@+UaJ@WtNK}1|_)i%z1$1Mo7Td&2h zZSA^T4i;M#?3}-+m5$WI*nZ9TAe|ZH(XNO^2*}3sGoL$^TN&MP5}{AXT^oZ-3pY?D z{AJ(N>%eR4z3qIWXmj%L01L)`O^3}_9}WWwnOBG7IsZvyXQA$N^Q(DS_6G9 zulsDVP8i@z^kywT!XIk+^2?|mx`unDultp$6=(C8WHTtmq;I@CeC-0qsPiFO6^V;F>d_923@OOt| zT=~p}3wD@l-|p^i43tL6)hk73pH_h~p^+2atpDHg(!+}MaH(qG+sVana!G}* z?FgWDxPClaw_j^<6j68EJX6lgKsq*OMo2I%Ec~IVA z*8jNU$vIymz(&}s7tY%CdDqRqiT|jf_9)MgbEG_4oSRM7N9N*@FRUjSJT^6xMFv`D z4Sahzf=Y|jGMt7gKS4{ulszTsGreHN2he-O3fz^EL2l%MvM8vD07;f>Pq#I!Ps zT5lm55DI=}5USo23G10UR4R%*;ghuY89!&o`PQ!I)8}vAhs5I&)_B^}RTRF2dFhxd zRcCw>Qe7`*+_B@S96U3CU#^;Ai_x_b`@vhEho)VKD=T|}s?;(IaNK?T;I=ZQerO!x zvwQ;z1#t=AzI{6a1Op_q@#t`tto2k31^X~jJ7nwo`Ai*D3WifXo>RS%6Ul8dDg8$F zUDLBkyid-cZ2uD9P)CX*7%2AnUiJ(j9|n5rBa@@go#ha#P}~_^^r%8&dd~)r>RmB4 z#u(nqIs6}H-wJj>kj~mN+6qBm3ZE|oG{G1P0;qR52l%3BzT?cXGrIG_!+bF@F+d$H zG$ce>MP=ZFm4>yoHQT+w`Ce#|%$R)Z%VU(!3Fb5rTnw$mYD`jAXc#b>5fMFWV1zz} z8ANLZQRmFx%yap15+T?xOX%tnXKb5%@c!=J-XbYtRZ%7ogEJVdS2&K zeg6a?RlcL%*$^%8Vj(BO*y{R+ET1WACGiTgA`i7m^qZ^XJs2e1j~Jd2&L<+Yg!;ZY7CF zhzoP4_y`L}aW%LwX4Zv)W%Y_0WudAwO<(pFwkw9NEj>Qdf~N+Gy~hYr+sPr+t0faQ zNUGH*2lsijA`wcfOh-2|-7$qO3pLYV?fC14K~0bR9A!yH5jV~d-!0s{ftQJ)2@6eI zIvch(NZtQH$-~A*T=6N9niyLSkCa+NeTm2hc@u4wm79xgdZlZIVq`4UN-EPM)NTwTPZBqn;}#v20yw)%Z$n014Rd!e?=dUt;AY_Br( zQZ0hJuFbYbQ3ok{7fdS2lwPt1^(92aY8>M(eLyBc!>7~ZOwkkG&%X+32R(*ICpEz= zmvQ=pT^)|f-A1BMt@|GJTpqBLR&Zfm@iA`Ng*FxNC@2#ib$cdA+{GnGDz6n_KsZY# z^Yin&Rl>{4;x+=)XI7OhFHq8SagCiiAk6L0#MT(wwQ{V=;HUceaIBCZItgK`{BW!p zADfWSrrqn%3@Tqna&LSP=tZAZV`C(Ff)Vx-2HOMNhzflZ-LD|N* zpAP!4=cCmbO9ezr9hMp|;+v0|w{$HXzi^NYU4>Y4gm4b5^$}{D0%4S&9wx+DDyN^f&^NemR`_oE0#Vh)9aqX9Im6P+WPW>9&rvWPmS#C>+>QoJGAR+ zZOCX;-9n3NQH*ak1h4qkcDXQel|s@F_lIj0?WypKq8Ut$vFhz5?rQVHU7TlI3X>ebxTo{~kM0TCA#+|DU=zn?fm5o-GdcUJ7IxlYp zQ98ZUw90g}-e(<$Yk>$3eD(`@TC1K&pSH;skA?ER>#SpZPph&4I~SRaaGgC$V%-P5 zg*N*PGomejVg@2u1|)i0%|!`&ALMtaMbxDbss3-y74nlY=n`mom zV+y*9hGb+vo`A;AiU!3Esjiy1{F~c99II}Y3B1hB&3OF;tp;qirN+k zk%k*`p5o#m^}Z5O7k$envZB)oqL8eiE_bKjvk-hsX@}rrIXfB^VfU6Vq50UaG-Ewq zK;E6)DGl+rxK1));TtdSAoI^Xr#n-=L@(+|Qcf zu^PmTEi>ocl#SRo{ZOZcuT995jUdRY;NGg|;j$Lt2Z$T)YU`!hywouGztTY%cqH^0vOp6kR;W0G<-=dXq7k_r2hDqP5e7ty0ByG2}*;MrhWjEA;^6RcUI5b*g zC7&dpscd5Nakw^VFG*ZxjTM5-(?EupWT&^pPc9VVbEIYI| znCD)?z2{X0uBa32Fv*d`MMm0yFV+dm@O{Q` z9>sv#XbaQ|CiFDrc9hVYDAA(b1#f3=6)3A^r`##tFC|nrFf};~>LV)V4tAhuC+&K< zqTGB6>}Ly5X`rg&1-yB|m7Gz0gTr$6>b%+hl-4Z2+J!1VW3&4CF=Ln4YlLi|0pqPQ zK81Vo8$tW|u#H|#OH0ejJyv99&_)E0ud%VQy}clb?@D})CA;Zh8(x7q@uMaC0j>7% zP>yE5+Ou=P3Jc)_q>LQN`Jo4(&5~~-^(o)l@|Yzj5wNv6{|@0PP_)TA2!#*nHuSy` zn=?;U)(lN;Ji;lw@FqbHhwzaLNAfh9Q!(Ar)Hl1>CpR-7uGjLA#6@5xiUHBcd&cl z;b9g#-z4TiX$tl#K1X+xANH@VJM1Iu+wgb;UGl;V+KAgj5T3ys{S$*Q{Oz$*zmV#l?ezgR7c1J5wZGXM(x>$^b(H04|T8a^Boa zoKGXn<{9XEc&F zMi?AVk&5RNDt3opqokLyyfkiFXRUy-R1*_EN#2kLq&V#-z4n%@A~dJ6fo9&eDpk$p z64ZNALnP zB#x#{2jhJl&CbaYH3sk0)74#j_^8D=O4Wx-!k!;gJ$(4^5<046vF653W02%!AKx_E z2E@;ngYEbk~86G`OJ#GIN{ z#kIXMIOmAi#*~ofPfkc5m*RVAyD>4_q8^lXi73!bIqT_nqGkRG%@a)XEzE7@r>S(JOSIC@8xl5)_~r{rpi7C~A1cr%fY`gzTt z^mwLdvWs@=8c{UZ=LO@YV`ot1q0T~7QB-8aRJw<^j1+~I>jP<>Gkchr5EP;w;8V-? zm)zr<<9a?+3B^+9gMxiC7Y1i}gXy(x;V#V{xMqq>ZHN4x4`@$pRIhWlA_49 zU_A{<4rK?iqba1b!a_tXphL*l(aF_#l+~(apy9UPC$p~}Soc-)v>{P$d%$Vwxzv$w zd8MZDP3I%qL!z94Cb7xfQ!@*h((W-N+!Y73tZXyYO@>zA3ZeD+;_GEB_Z@xBF-Z(a z$0ps-FqAIv&Y5mC&iQ(2{nD^=3?yKt_hJF0m*`rQN8DGGI~M#JISr~D9dOOWO83`M zaoEUyj0B!FnLIx6u$pU4^ts24==Chkyl05p^U9~|O@hOl5qBJKt-d?PJ)3Ru>}eBI z$2)G~jzJ$8eK!);VS<+TR@$mL`GSL4%0BAo{Dw1u!>5G3J6Im;-nsFZAE{Zi_GIXB zc2PDTo`))beZw*s``wfFr4V{6jKLdAHO#ibz<8?~ApDZ`uPw2!2#cY5d+V{J&-Gc# zH&D#7$0*C60$(#i%f)@1$L%RKde|UF19@)fsZ2V$$vgsTl`tH&7x2UWnHVXM4w?NL zL}8#EbVT+#TK3P#V23d7rw9+`k1Dn*^16;>swoxG` z7HF-Xf;XMho^ogG^UsDS>6Ww9eo&ZZ@8i@HOlu{MWQbd#Kpqbkskw-aiD1OQYz4H` zah&)#c$?({#%g0(){1%wfCjK3PM*B?I~>v54N;8GF}0M_&d3~-X0T7jSt5kXV-b@- zFJzZx3EJ?qT0b#Azdj8XhmaZVA6G-i`9eTqeSQRLM>SQ?$IYKkuzFAb#*G`Uu7n*L zz=3Xe+)Ak=$pAt2>0MvP%^P4gs&gfC;1-sx=;z#I@de5n1+#dMysYTL4cMwJpZ=l; zoxT?y=9j)(c<)B&A>`)FCxQy?9KHauaBCPugRV<6UI+z-jzbDJxTc1IiXVfKqwmm2 z(SBtFjIaC_HmHm{Z%KJ;l2MVV?P=PH5LIB=_6}-~vEiiadQE(t^?7 zkUs?4C9%t!o1PkDfXMymaWWG92fvK}A(cvBS|=glyLa!Fa$f+#P)&Jxd1YlLlHv(} z=rZ(GpcJ)Z3;ls{YR3OB5o${GV|u@@v}_DLNw=SYXD*C_O@S`BNCK#3GMP;3Jp|l| z;i^Bqg%{PbNOc`hVZ}mimi%4K)B_<@CJ9kb&QIS+oAf)lqy?cD6_^4~| zyw!QN^H20pTJS{9p2aKyU8n_;-Dju^NUut}{iKP@V8Qk+um$pAe=Dv9^jkJ6d;hxI z9UAOws(Sz`Cl-A9l}}~0@PX*bVPr#G*;c3+1Mo-2b%)&NlzvMaWnE}a>+xcK zd2oeS*okF;$U7wy^zp+1pe2T#y_xy>CZ{5UQAWYP!cIgREYP;^Rlb+0Ob|RM+O9X` z!S!)wKZoSu6DJ0~e*G98s;Y%z?YE#@&V9%wt%hR}O{2JMZI_r30^3~^ay3B+(r5px z@xQ}&`f<^C(XZFw_$hCosCNM9BbKY?%w;2nAMMxhjNuz}?Fyv&dTuT^)x_Up8kxX2 z)Vk+6I|d!Cj^oZaHoxs2>vsiVWgo4!irKe}6f%zfB!7U0AY6~Y9JI5~sis2E-fQBi zPGIZtdGgV{nCaXmNTL0A`b|^#)gJO_v}KwQBd%8cyziBc#r4UxT>>qasjTB5;@SRBJGv<9&=|JQ>ubThT5Cl~>XFKq zG6>HOdV4=yz;KvVc77&6H84HcDh?`s6Rn`o=wndKBt_uvr&+*$GAO%wO%sHmG7zCps#0rBJ*RcmVIEh zua)TI{@}gzw^JzkCG5+8NZl^Wp_K34=)5w?T9I-jy7@>pfzTTrS=7XIP&-S|T@NB7 z*b~DT!*}PXxpz~+D-ra(lKBkqCZ#!3*=M-+P;yp?F|qVXWw8J2!i*7z^jtmdu1|^0 z;izc+(n;3NB0v>rym?2fv*&yMvzF6J6Hf^7`o4gm0?28Lp3M|p;PrcZHM}BM(rR%!TPs&rl6s#IHEWJoV>zYW$7A10Iq<8NzAA(-> zy{{;39>6ad;(GqL#Bg=vJ=pzA)gqwseYSvV(q?T@vTnbAfspsNV3ba%hoK`Aawew0c}2^+T7Na3A?jNzCH+MGH$-SMiDB@=gj?5u&JzAB^V&0ov4&|=u1@1a z3o~(ws2T}2Ha0`=`Qo7=LqBPHThZo7{#z7U5_49Ua_pb$Jw1nMe19Qy1LXah(;z%Q zc=s(8m6huG#_!a83>MK=&h^#p<&|S*13|oCKkdTxm$RskF?d(T(Wsh0AWYVp$i48~ zGrqm&H0eSt{1A4=U;E5ge0Jrsy_AW++M&#hCB0?U3K(p3{P-OasWpk?hc(7uxFx<) zvkMcto{6?Kd+G8{I&w1RiNB@P_&G5-cuk$T%RROgk9`b3)Gh)4Ng3$0)uI{Qe|16p z-Rx+FHY`pQmDEw~@M$S|D0`zgzT`H**Bx`khIpfOjMd|Xm%-^Ke~Z{H^a8wN>F|F#JIlYx{-?o4teBpa70mpQks`C&9XNW;~vZdiC0vEusry~N& zvi5tY$la7@*p$d%_^1NF0sd5E1WezbF%W$?E+Xkg|GprZt3NIf`5$Kd8_|q^yv5%% z*_&zwz++8g^2KRah}U$izoc_3T}aQ04L_qjaos^r7~2^cn%g<@82qML!|q#f@tse5 zb6fl>`H+u~pUM%eKuN8z_s`1`txV?U^1=;6x$56oNs$Ibf& z3KpFg79@_B8aGB^V%}9xNQym}@ELr#Hojy8*eESe8zxi3$)e($e$D22U&uGtKt+YS z>N0ucggJcx-O|QFnnZ7@`=(tE%-wI2f2-J`nmtwA_+AoaZ`s^k+-v7yuI@BW-9BTv z(os~?g8W}P&-73I!a;U~hWRQ}Q!8DUR})Ij>UYXaq1-Yp4D>pl0V1xLs{4YThx><) z2rV(4c{o(AJ=l=>WuNyp>TdGx%);)3l7rTA7N=U>(`BsK*x&fJ5jBw#mr_+;c)rg%iB02U1=rCO{gg&^yHC47 z{FGd@JqZkk&j2)ZXy^oE9X)YIH%FVOCJ>;L%qv)WX;Axh%}iy?*_Wi=7Un036p%y9as%PeS^DGplY~ z2|?ms2}2BPoOdLPYNgHoaXfe^EYHov8h>EED7%;g`@?wAZ6@Lo+#6(bO-D49r$QQ{ zuL!nUHG|n?caXC2E`>8C)gD_5ObeMW?*EC7%Rhc6oj`1lw`yGTeF)M@jGZegP)}c= zJwv0bpp}1hgydgeI+~NBdrj!>#5uuA>`9pblb`it(dX=^?sJ(8fmRRt=elblg&$LM(Ep6}v@UIbIaD9|QjX$s^wbUzJ@| z{P>a(9<9rRm?+d9)#m_|(Y*{^#fR)R!J|LXAJX6PS9`kudshw}=E?gGG|(Ub*wC{~xZ32tB@Usi}4t&l6uj=7PPJbzCV^YgFsJ%I=+t-o@0^<1_zW{ji(fCV-le6V9AUzRa}J?uFV zw*Ok7q8#t`P__f$;G@?fw%-rbS72$8R+N)WE5F`%U2u=b$cszQc^(>V7k;?^N*zO} z$;mC(rXnIdda{eNt>?4*q;4F1!GZUaA*0{v+W2aB523rp>h~1)dqZdPHQ*jc6H7Vf zTFo4=Udx%2```N5Z+F$WBVd&LJ1oo? z$pNu2WUg_{NmK|AtsP0te|KLGo15|lFOQrI(S%ZZz@w+UPH*>?LQ8Fd)VkdutOZnD z>WxCVCYOG#(svk1kWttlK#xup5)U4oW6o`Rs~e-94%0SoIZpF0*MW;Ex3lY8KC7#v z)Jc&zR<{`z&?XRViIwAnj8uYFN44W@CcE$YL0(i&oT0I$Yy8LLkY$(;>>`Tq+-1dw z2ZO%7=oy^=-_gYa_Y-FuB&uZ=yM_Xyq;NUCmbpo?)HNb+W^QZVP_yK{i1*li$qxf5 zt+JlER785~!S>X_K|b#;?mPLV*Glo^6}4lraF~z1m=EGv%G=w;gZqrOpZYeEO3#d- zqhFpjH8oXN%fdM@SY^u+P92O}#hm_N&^m6Q6^+!j>1}K^WuIv}x}ZmV2NQSMxt|E9 z;4Zm0R%V~#l$lx9_+sR6-4T9DM#AQ9l>jk2%c5Mo9nacV^qj`{%5j;KoADF<#Cp@Z z#7L%6{UT?Yo0>kGk!A8gNKG9V;uN_RQtfQkY*X6~?n>0E6-`H{2*$t1l9Kt^a^$UV zO&WIdig;RNOqEE^?KTa0b{#q=G}IiQt@zTkr3hoq}@2F03t@F4M^GVt7 z6O&eEB82m4utnI6AVm|MXJlJ)(1lYU`&eIsm2*qPY)S?DXvDd}5LhR^%8avDNq?tD zOs9Ef^6=p9yC1{Z=j_zN&#N4mWAvHITF#2u^5{BUSmfjVsKcKOcSX%hwfl7Vy<3@_ zn2cg{JKE-R8H$rHkGfNf@8lobgGAmkjK?|6P(H0T#u^V+t2vlE+SELmH3>)@VEN*4 zWc&ypsvd3vI@{I6aP9Q>sd#B5w6e0Isj2zI7W4J%tIEBl_AVdn6Fa&K=WR(XLkn%| z;o9>;uqbiQfsXK(T$swqL<52SM=kAqmJ6C$piH9gyKuvJoVd&hnD-*i1rfV+p47G z!q~OPOxe_elg9VfQnWVYUfEnATI%3@hVHFLG>+SJkM@ zGkhzU42gqH4oK%&Q*si8`DV6)1oGGs*MuZ44W4GHU~{vFVO5^&Ug=3|QF)Krru6jt zmRt+;jjJ4mygetms^q0@Ius^qHJBM&qS;cW38`MpMYCfm?=76$3UC{Jx#cPFctc?+ zRn~#s$A<{rzKJ&%VX$M{y-#``m;*9*7yEc>kC3+@>ZzL3QN1%x_Lr;Gr5#ip@J%_2 zM=!^;dacG|1ffm=9&Vh_1i}-+vTe8~xZ^2^lOU>IE}!wm_vH$FruS~O;H)-s8_N|rjW0GSAtU34$! znB5Cr6kktIex@5CZsy2pmZE{WwYNt46mvBrHG&(ptugQqleC@81%LE|EZ( zo?nxNNEQ(q)=QA)*cq{|Sgd^;tVg#}&7QOWwsy$_Orhofy!;>7g~U|z1uX;NC`*fH z_Bl1MizRPwuGCXU;YnFu*Oieu2j(7*U;AUXYR}z(F~`rlU+}50a8?@(_7v4S%5jhU z8E2K%-D5G|bAyb5!M!^)ykM~{W0Fss8S?H_%za>~lKQk~%`p((Ivx4==MlP*&k7i? zHWA1NE&;e_IcfZ1@?#OM)|8Fg3u&6mRW40spI1J-(9Wnz@`5h;;>_=r<{|ZT2Kp|J zR>TdTS>1lgaEE8@Zlb(rZMDhEp~|JBitapqH`-jJd&Sj1Fc|- zIbr#*A4dWFD-x-pu70Y}S6)7FL3p5|qocx3LA$vG(Bt#2l$r$@79%{=hQ=KgLAriE ziwO>Hxf1u1ikEBa1tA-9tZ_R9P?fV1JLI|MTze{-9myrvI22@;J-r_Eykl(Ts=y!L zg*V4v+g-Ha z1lndSyZ036qWp6CANKE=5y&Weao*bDTzr?82byIy%|-0}l_D$a)o!NlbUYIhnFJ(W zbD^#plh+M~Ehk(<_KXLxATJ2N&N0SLdbT}^yXv6Y)N*1$fCw89wdo057k@R8?$b&Q zy>Dajc){H{MoL4~rRP$^LDS5kLyKYxXQVp%p}Jk|2GaclDFty@(nEHxL#;D9Svk3v zFn5N+!_TXyn3W$n^5^k&(Y+RNTgzo3YUO=h6^Bh{1sFg|#5rbF`(X5n#M{UQt&>Tn z6Qp82XOOoD+{_KI3oOD_vpHn3$RQb-OF_J-W|g!=VIlPETP3dJPL}r`-V!yH96X&f zp;K>PVF!6SwKOjE{Q9WIYiPc`z#8`bQ!A>`;)6RCXct{7!5nGb=n0d#0qpv32a)z1 z;|3>LBOPp*(_G%Mrm$Rf3EnD@$EovGQ*3t7(ywx(arY?NbHl2KyJC2MgTQJX&>&ZC z#8v-wr+0AFyXXEq&XtK}U;K-WRUSxAs07XlXYMGb@ZJrtysU6$+0@1FNgZDUY40(v zo$Zz%DTfodj`2=$M;q}k@?Dht}BK`Eq(8k03+ z^v!dxcI-7WI{<<(1OG{O+hnlZK@fgB7iaCX0XrBUgnLU=~* zdh`BlF+A(e3L|D4w1HPWKh{p_Lir~px0&M)lM^gCp#6~4r&`;{m$t@%tQ$#B;y~{0 z;o2?7FGeNGJXC&Kl39nidHDOCxw%n%IS3u?J92 z0#587W{HVsnqzH=j}A;4c_)cTv=~T}l*Do*&Lc%9{5a z2jd>$Fo$-j;?m*qu#FjljzDHOsM@#D$_AgaTDbpc+N`I1FmPNj5qcxO+Zp}<%2O7; za{>b7_4O4upA?~Fw3nH0|8$|VEBj2dv$!SLCf9&ZJlyWBfL@scy2xwjE8t5uUi67ZhZj-7#xMwVL z6GyxmzR#;VuTH@4TI;sGck zS3^elt`Y3iwL*?w=4I;p850qLi5* zL8&dm{)zymtiV~J2}DW3%?wt$Yipi|MZCa;7d>k>C}$bipLv0epT)^sd-)yogMgWa ztL|7^%NF+KzEtDY3Y%s%cx+sohjKal%a8FR%Hx7#;R#G<;(~Z^*#5Na>xX+c-~UjS zAJ8xv8X5|8M#*eiYmm3n!8t}10^DF;l{ZS4S;%`77Ts1SYAL2VU+wj}!o|nX*Qed%{Fco%yO4B`gvuKuG6FM`?&rD)d-B|+XA8~0W2+qbBuOuErFv@@jRsA{v2lhZ~rKQaTItfmy8P*q~9 zl9<7)$Qd%qX>3$J5TPmeHkL(WLEx#u*P%mmpI+76`~cyJOaQ(JXt#M&dI8qjucfWc zcZUK%1pE5>Bqb$R(EEW2S&L_*8gWg&Ut`UF*5>qDHxs!-)x2oPce1oOCFvwAxjw~0CY5Qyzsku$zach>i8!*N_oexu z{b2Q=P+Ho?`aIIh=E2kA#hy-oCz4oJwnnDfv|WfL-tDP$-f5Yv&8SfhaKq(zj0gAN z2z|kMUFWB4_@$v91s>Gp;entRS-t&jmf!^Xvs&NVR1BAtBeE7ZOnsExF>3F^&$eyZ zTiCw=Is9=RnfdaoW{dZ`1uCKLe_RJaJrD;tbaQ%egd1A`MF#r3X33E7*D6GJ5L-*?(sPNACbL07A@ zhb;4}EB*3&KD8(P{9VAN0VheQ>*%0+doxSN$Uf68J>0YXYO%>V{kI{o$}8TwHuI9@ zp0@G^=+C~*ux@;i+6N<0^zL}0@KfnOeLwmaWBo=5fA3t*gm9L{50Abf)@V>gKsUj# zmaT8LE4y$wCRf#ci^Hw`5)AGLh5k8Bli=&chKepvITIy^;{pr5p!0k;tR0<`PpccT zGIH!!5cjp-t*Uj99uoRD1c6XYr`v;Dh?PfW4T`R0F4R;dTnO3!&es^|4Yal?a+^)1 zIJ6JJr}$;sl_&2c-!Knz9nFbS0&)RugzH*R4_7a<*YGa`=+4;o#*Grzc`IzGA{JR#tZd@#|%{s_~1UaeU1;G z1pA$Jzmx4@C~2;5?4{c%pkb&62d&AHgo`Sck!`68caE^kS*Rc^R-R;Jc$u65{Erxd zPsoWd{*D0Vk4eW-S&v|gptvXGBX$J88JY}(#7Y+LWvv@@2a(~l@^5Dp&K$q5bs%O= z)0(Gy*k?B1d%!hmt8<~qiORwPn-D0)gVCsM@0{kf_Ej#GE=qPqob|`lpB8~mA&@A@ z``huu*;-6Jrngh==yE8jt4jzc=M3+srWMmC$3u(r-38{dc z?P1!*)Na*y7T1R}ODYwsg38elKaX$`0d1pj}fU3omz+yB;0Nm3zOvSdj` zQI^4kt1K0vYYW-8$dYxkj;Lg>?1UowGM12;vBgl0@)Xg z1`a#>4eCbou$8l*f$dY=74}v8La3)wBQLITjFoa#ue(~S2XS)6tMCR^q2^tdWpmcn zvcF5mgvAO`t*)CSy)o=n7oo6pt`W&hCiO(Q3X zeZ@RFHD49haz$=Bx#XV!^sst5aX;#R=GukI>u;!j`xop4WLtCbIUV(T`GB+m3~Xi9 z5<2n3J%#*1oEd&~`%DeGj}L5LE0D<7x6#eR=yAF?E1Em&!#a9a4kqjbR6Rr!*yg~5 zX@h1p(gztzgPlQVxr6dz+ke4qkNB_rp*I zzgdu{MA1EaAJ+T#U^)e@K?ar5;|GxEWG89HNGF}jbuRgQMYh+g-~`^up%gC6=yv#J zxrxuL(eO~OI*iZ~cIAI6tZ3xPJ!!o&|JYc#1nqDDIxIjAa_lAba<8R={+?Iu-cM-0}l{_FDjU6`Sj~zMJ z7g?D0EB2rvaJ%-Ov|Q-U@NmgP)p1Why2;{uqE_)6TtvSr$t8Z*5zX{MV#0MxL0hhp zAI5M%y)JsRe?s?i-r8cBFyY3W<6U>#-abMBd%ik`Jv&Dh)Ky?ana^$yh1Y8x)J5IM zEWM%UIA=kr!CG1tOP!PGeIMmC{zS89bGW<=abK$Ol+;LueQ33B`gqdIBzuUQ5LtDy zO#^uy>9r^l$7m;onf_%@#{(P+<{KWu^p-MdWhvQriXhIqBU-r>c)rs7`UAR+?9(VMrfqC7t0yNctvzSy&j5dY5txqi2J_d}7zZ>?N$*Mr)rB$pkh% zB`yXwQNxk?Pon8Ib~%~A6Et=TL&MAkZ`}WZnmGbv&fn6B(bvHsI?vQK-KUQ=s}iIa zMxOMY+|QvvJtZS|f$}Z&Ncr!`31}4@8hZ-CnVT*4xWfBOwGha|Ajaa%7&u@k(hBWl&O1&>*quY#Z4|;vVX~3c1}cEseCL{Ps*xTWvaDk6;^eLReRPwA!FwsGVY1e|ciJ_lpDLIt zX;qOIdAujNvIZ(sa8CIE&D2c+k8G8F!&+ozBH!KKhdDvru$Kam}q*u zk(1Mav&lOOei*?npM~-MWSuXOr}4)5NTpRSxZ!4An#Xx}$5%Xtxhbv&UMc!*b;*3{ zegHA^7$Lj$3t(68OJZ_U!;V_DJA^3)N8i=*0CRVixh2cb#B-=cb?;f~-U4D?q9fXS zCY)%M1rh_LUnwbnFq63%!`lj+N|TnL$!U<7roY@8o1n9BtX8Ww$-79 z-}pyCl9IC*8;iKOi$-ldDjdPa3guOZa`Kekb~xtSEgr~f=5)(?@uuxySTM?v%ghhA zjN#i$llE1lj0{3%+I?-|%SNTzORWt58|(XY0gi^_Ng4JT)6lQMW$2eS}B8dMi+BX9F2@cq;4gPNkRGok0#EAtcdD@VL3d zC}8LdIsXZTtIS{K2F5DuPCov2MX?l6$M1qO&C@X;sQXt6cr#pfkpE>t4#xSgOkl&M zcVhc9W2x&0aOIz4w9Dm~e0SX19OA+x%|R6B3UA|nNH}$gK#M&Aa?Sr-H3)Pj8^Hla z`$z`R431XFl=58L6Q}R8zzQi`o{4<656XZ3wn6O3gzmYm;DtxW%s2J`<*pX+;wlw` z{O{txUtn6gEZDz6y=#sw@Y`!@oH)cl4AHmKEo#mEt*hYjOa!!ktk5(i3&VJE)5&$I zR^(z2WULLAAHB8azK_m|Hy8}?StK+;&}Z}ok{bSg3XLDfmj-Cp z8!fG{tl8?h-m)j=sAprn1D4m}QriyI?az~vGDhc1gd;ATzxh1oFOb{;`wt{TKRO6r zIbZsQQ>^JEH`uFiTzFQ9&QyE?j4N11o(?LHQi_`Or;B@7_2LS3a{;S`*t35sIWsZg zY0nD02@5al{g`WO?Qty^bv-c|(40Lb2(8Y&4x0un)}gy>Pjl3az{?!jq&EHRTz6)M zeTxm^oEpo;v!jm|9%#oITUT7c4&AE4i!gB$nfQmP8w!Xfe$IlB*TWd(bzbsoM&e}C zjdHVa`gr~VBVDa_>r$qYvNV?$jhBRs76JObAIwV8Za-D}MgF{!qdl1!aaGd8OruEN z(c|dGQE=*hE9 zAOldO19a&X^3zmQz`LD|2`Mzr$hAb~{#1ChN$p1PMR7(BFp3s*CVBX`ODx$&E$76A z!HuONT!_kz!DtB0Onbd1O3}LWhM#U{lvTW5O|#MyGi~Pm6ZD-CLrHAzM%v)l$}h(| zVf1|Vdm2i#A)sD_=p=jOpfTiRA#cx<&5pT773n0`i7VTw}g$mS_#GdN8J1F zg=Y)R5d6LDZrWy#&&3}3eEp$rgIE(!TvMeEr)9(Yg%a5LB`!<+AbR0kcML5=PmrE^ zx&60v>jDK5@!Y2|_sAE}XHm)2PPlupcnyODVvLh z7+&@Q&=Dg}Q2!Qq(9Mh(J&{-Kju?S*DZMc~!0YwuqG;W_+i^GiUjR z3ByUbUx79XWfkjZ_)|sNjrxvzD_B>eD;DRHJ7hh1XZjrtJYY1iT?|PKZsFeZ@`zeOVI#R2n&WF;Ga5 zneFFRdM{zMwG!~9657Q*@!Ywfn&W3iA!(Z#q&ssRZ5_hLaH6j^?~%WSxCv*4VX}0Z zS+jHEke8>Y`?iA@V#H!{Ti?FCo;&a~#;S_7dqrWwxcQaMIoKH)|w2)MOtb$2b^WN-Cjz(HKy11 zk`_(74dF)bdoOabEm4U4R9qL2i6SFM|N zQ^^u3*Fz5@aJ92FY^1u8T8Ql~JsZey|rzq>$u*dleRYFoNNPUjRw-xMmnx%N}?E*w=pfp0WVUV-4TG3K+r6zh{{MvuQ~n zaJb#P*#>WV?aJpT@jmjqyBKI_1VaMN>#X`oAYW&19#7tE=rYm8NQ;t_Mhkp6i7756 zFG6`XlwD{z1nDWZo_FnC5N>lW1{b9vJNTwJcQtV5K&xGM?U3j;DmRfugl{MTNY>Y( zk<;Fi1~c3w^{uF?fEDiH-FzGe_fhT*YlBVIntkTan+o0+OW9`wkK7$B(bO=&NnV5yO{_YOb%P@4!TS(`W5P z3HL9sbY)!dv97Ee62&}AdJ44LW;DeEuL@gv_<-QE^gtSw3kbQ&?eK9wA$M!-RrM0x z$>-giE;l}%iV?bs`_1j@n0dN##2}Vc#@eGbfn$brTlrqpj`P?JCk}|O|88#_>T%s{ z&067xf?YQYUWu4#5D<&(OYhf6bYHt6Um8Wy6;E$XFMKnTb1``bIY7G|+17lwdIEbz zw*(?RJ*%z$TzV?h;N@=B%O$Lf9CLD7RIha>r18{U@qX+Vd31r{n6XHiJCZ^#{u-Re zIOPocZvB2VB4)C=1l|;zUsvc^8T>H8D;=uVg^HACS67*`?M)`uL_fPNtJW?_OS{du zdCZi6bLBZd1WvKk?OI_8y>6NikFyqJNxfbTZ%kX9OmW$|`Z|TQYo@z%ZCbPFJcH@* zhzI-PfsV7jOCT14W(P}`kIDVY`R+C6N7eUbt)-fLt-8ximh_*iP2t*;Si!~LImYfhdZOj{IMr7XNy!n8w2OWoD4NlBebMVb%vz^ zLweD@zGEd2ahiZGBvwX+qrF}g;fL1RCRX^n62^9xNQ6pH5OnOpO3TX>s4--E%B;0J z9Bowf*&Ri@4O}7lA9G%H!M6Tre_DL_ph`X^K`}P0(g&HaE&{~rGbdB;SueVNjfqJf zqt~aAXpA*)5lEmW={h?k&FH(@AglF^&6rpH?~G>3;1|db(2V0>+Hb$&DYsa-EyF9C=GREYprHuJdp9NDd<0jpA)jyxU50R*7tWUt@yc8EQ8KH9 znPZ|;7a7lE6>n(1WB_C*BXoDTd?%fsZG+TJN)@5Fd9oV9SU>za+T8}CWvACwK>~@n zkbTt~DoD{`-O2_yml}Ru{T7d~xE00eUfC|iZR^xt<~ov*m&apwmf)8&*b7T=ZR;<6 z@~{!89SvVZ6j3CBJmC7~%SbocOi^0r+omzdc*|#W%cph$FE_H*u`=j@3B8SN-f(qJ z8w5_6`_Zo~HeX9huQpaLFMMoC{cFIuN!ME2kMR^eIxo74}+g&tiwbOQtsC@hFfE!>jBw$z1xqoYBJ-IZQ+LpjSsB z2MR7wT;XJT+AhxL(DX}m_F{tI%v!~a0R`2VD}J(#cRxdBCr0XPxSVpjOg_yWPUdwX z1$q_|Q|rC}mHHG3wK_J&7)rMFd}mg@LyF@i`;ay=QlKUyP^=LYjYa|Z!3(Z4Ji7(E zTRT~OSL}TQ`S0_ZnPQJK`+#ILHAk03cCmT5IFM|qLhAysp`AXc2FolAo|^YQSu;Y$Um z*tQz<=C*+9nAM3sXQ6)X^4E4l##|DzCEPpbExDY*%&Tw7ZopH+}ET>WVFA%Ox{m~pF_JovwvC=t8}`DhS% zv1>Oqd;CPo8|!DwtMyZMi)^SJ7UHOfaD~OjAVz{7Xh!qdP)D>^79N+bI9BU5MeJXQ zBe~+6LE#fj@?~g9wdsRkQfY?kUXLUp;eJ55F;c(W4Th+bqB~c>rfA z4!7UXg^FxW8~)@vo9PqQWQ)0l75%vhzTe45!+UR@2cXA0DV}r7)54}7Qxem_)2J-C z$nX1LXlMjDzPp2H0+|3gYxmLX4*_}F-52Jx-yM;_Ls*(rFH`oR><^%gw1pFPKf9r# Lsa$;3Jm`M_YN^F3 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (7).png b/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (7).png new file mode 100644 index 0000000000000000000000000000000000000000..1412291a55af3fab85dd1830d9fe23e88d636372 GIT binary patch literal 102768 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 Lsa$;3Jm`M_YN^F3 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (8).png b/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (8).png new file mode 100644 index 0000000000000000000000000000000000000000..1412291a55af3fab85dd1830d9fe23e88d636372 GIT binary patch literal 102768 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 Lsa$;3Jm`M_YN^F3 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (9).png b/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (9).png new file mode 100644 index 0000000000000000000000000000000000000000..1412291a55af3fab85dd1830d9fe23e88d636372 GIT binary patch literal 102768 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 Lsa$;3Jm`M_YN^F3 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/github-flow.png b/docs/.gitbook/assets/github-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9fdeb82bc5c0f1ab38ff7f6b977dc3d0cbaf90 GIT binary patch literal 19577 zcmce;WmFy8vM@?Wf+V<0uoWaoaMxhLA-F@(g}Zwoz``AZEjAuJxI=JvcXxM(ugN~= zo_o)^-y7rocyEnlbf;52XU&>5%d3OF$ciDqA$S7=1A{CfE}{Sf^Rg2L=7l2yEbt_o z+0YQUAlitl+rz-1v_JoS5l4$c2s}i05LI(fv^I8d*0VE$QM59((X)3j(#9QJfPo=} zkq{A7a!J`=0DEXoJir|z@Pd?=2WIVRw4Qn6eB#3AC9(B9pQ$?zbc6v32u0;8pPUG%F93sxQ z=k15|)Z!@sbYNhPaT&&6|G5)k7cqOj@$n&5c=>$u>QxlM^OckoGX8vpc_Eku_k2Y_ z0I@w^KYc>Wd+~e&>no1@d__b1|8fZ5FSux~YVnYCub4(j7MsF}FH?FJN0sME`;-N3 zhlc(hpDA(3yT9WjMz=cLoEO$$R0>gJVn`uj?v6fV2|;iTFh}YuOD`s4{zX@-rea-j zls{rwFs@>HJHVd6;2az5LSeQMJ(^`7tQ2HN7NKWD2W;mjanhkzh@gvWHBfHM#P$H; zRkd}&_->ff6ET%My_P~!g`G|Sw|wu`8s{s3cs+i+m`afGHJh60V*b4@cy4y0!*{

kjP4f%}lKFR2x>!2XW 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 literal 0 HcmV?d00001 diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index 9010ef9cf11..e26dd9f4adb 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -155,16 +155,7 @@ To use IntelliJ IDEA's internal build system when you build JabRef through **Bui ![Ignore the Gradle project "buildSrc"](../.gitbook/assets/intellij-gradle-config-ignore-buildSrc%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%286%29%20%284%29.png) -* Add `src-gen` as root: - 1. Right click on the project "jabref". - 2. Select "Open Module Settings" - 3. Expand "JabRef" - 4. Select "main" - 5. Select tab "Sources" - 6. Click "+ Add Content Root" - 7. Select the `src-gen` directory - 8. Click "OK". When expanding "main", "java" should have been selected as source - 9. Click "OK" to save the changes +* Add `src-gen` as root: 1. Right click on the project "jabref". 2. Select "Open Module Settings" 3. Expand "JabRef" 4. Select "main" 5. Select tab "Sources" 6. Click "+ Add Content Root" 7. Select the `src-gen` directory 8. Click "OK". When expanding "main", "java" should have been selected as source 9. Click "OK" to save the changes * In case the above step does not work, run with gradle, import gradle project again, and try again. * Delete `org.jabref.gui.logging.plugins.Log4jPlugins` \(location: `src-gen/main/java/org/jabref/gui/logging/plugins/Log4jPlugins.java`\). Otherwise, you will see following error: @@ -256,6 +247,22 @@ Make sure your Eclipse installation us up to date. 5. Optional: Install the [e\(fx\)clipse plugin](http://www.eclipse.org/efxclipse/index.html) from the Eclipse marketplace: 1. Help -> Eclipse Marketplace... -> Search tab 2. Enter "e\(fx\)clipse" in the search dialogue 3. Click "Go" 4. Click "Install" button next to the plugin 5. Click "Finish" 6. Now you can build and run/debug the application by either using "JabRefLauncher" or "JabRefMain". This is the recommended way, since the application starts quite fast. +### Localization Test Configuration \(IDEA\) + +TODO + +### Localization Test Configuration \(Eclipse\) + +To run the `LocalizationConsistencyTest` you need to add some extra module information: Right-click on the file -> "Run/Debug as JUnit test". Go to the Run/debug configuration created for that file and in the arguments tab under VM-configurations add: + +```text +--add-exports javafx.graphics/com.sun.javafx.application=ALL-UNNAMED +--add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED +--add-exports javafx.graphics/com.sun.javafx.stage=com.jfoenix +``` + +Now the test will run. + ## Final comments Got it running? GREAT! You are ready to lurk the code and contribute to JabRef. Please make sure to also read our [contribution guide](https://github.com/JabRef/jabref/blob/master/CONTRIBUTING.md). @@ -303,7 +310,7 @@ java.lang.module.FindException: Module org.jsoup not found, required by org.jabr This can include different modules. -1. Go to File -> Invalidate caches... +1. Go to File -> Invalidate caches... 2. Check "Clear file system cache and Local History". 3. Check "Clear VCS Log caches and indexes". 4. Uncheck the others. @@ -324,9 +331,7 @@ As a workaround, you can remove all local openjfx artifacts by deleting the whol ### Issues with `JournalAbbreviationLoader` -In case of a NPE at `Files.copy` at `org.jabref.logic.journals.JournalAbbreviationLoader.loadRepository(JournalAbbreviationLoader.java:30) ~[classes/:?]`, -invalidate caches and restart IntelliJ. -Then, Build -> Rebuild Project. +In case of a NPE at `Files.copy` at `org.jabref.logic.journals.JournalAbbreviationLoader.loadRepository(JournalAbbreviationLoader.java:30) ~[classes/:?]`, invalidate caches and restart IntelliJ. Then, Build -> Rebuild Project. If that does not help: @@ -335,3 +340,4 @@ If that does not help: 3. Delete all non-versioned items: `git clean -xdf`. This really destroys data 4. Execute `./gradlew run` 5. Start IntelliJ and try again. + diff --git a/docs/teaching.md b/docs/teaching.md index 4ec09c73058..f8d8e5094a9 100644 --- a/docs/teaching.md +++ b/docs/teaching.md @@ -46,7 +46,7 @@ In short, the contribution is **reviewed by two JabRef developers**. Typically, GitHub describes that in their page [Understanding the GitHub flow](https://guides.github.com/introduction/flow/): -[![GitHub flow](.gitbook/assets/github-flow%20%281%29.png)](https://github.com/JabRef/jabref/tree/ed275b62fe7dac57a086e43802e36deb93c63e31/docs/images/github-flow.png) +[![GitHub flow](.gitbook/assets/github-flow.png)](https://github.com/JabRef/jabref/tree/ed275b62fe7dac57a086e43802e36deb93c63e31/docs/images/github-flow.png) ## Process for Java newcomers From 56bc15646bb1cb0ca6ac5c40b81572016815ca5d Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 1 Sep 2021 22:04:55 +0000 Subject: [PATCH 13/15] GitBook: [main] one page modified --- ...elines-for-setting-up-a-local-workspace.md | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index e26dd9f4adb..7f1b1b7dfb9 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -155,7 +155,18 @@ To use IntelliJ IDEA's internal build system when you build JabRef through **Bui ![Ignore the Gradle project "buildSrc"](../.gitbook/assets/intellij-gradle-config-ignore-buildSrc%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%286%29%20%284%29.png) -* Add `src-gen` as root: 1. Right click on the project "jabref". 2. Select "Open Module Settings" 3. Expand "JabRef" 4. Select "main" 5. Select tab "Sources" 6. Click "+ Add Content Root" 7. Select the `src-gen` directory 8. Click "OK". When expanding "main", "java" should have been selected as source 9. Click "OK" to save the changes +* Add `src-gen` as root: + + 1. Right click on the project "jabref". + 2. Select "Open Module Settings" + 3. Expand "JabRef" + 4. Select "main" + 5. Select tab "Sources" + 6. Click "+ Add Content Root" + 7. Select the `src-gen` directory + 8. Click "OK". When expanding "main", "java" should have been selected as source + 9. Click "OK" to save the changes + * In case the above step does not work, run with gradle, import gradle project again, and try again. * Delete `org.jabref.gui.logging.plugins.Log4jPlugins` \(location: `src-gen/main/java/org/jabref/gui/logging/plugins/Log4jPlugins.java`\). Otherwise, you will see following error: @@ -249,7 +260,14 @@ Make sure your Eclipse installation us up to date. ### Localization Test Configuration \(IDEA\) -TODO +In the run configuration, at the "VM options" \(the box below the java version\), following content needs to be present: + +`-ea +--add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref +--add-exports=org.controlsfx.controls/impl.org.controlsfx.skin=org.jabref +--add-exports javafx.graphics/com.sun.javafx.application=ALL-UNNAMED +--add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED +--add-exports javafx.graphics/com.sun.javafx.stage=com.jfoenix` ### Localization Test Configuration \(Eclipse\) @@ -261,7 +279,7 @@ To run the `LocalizationConsistencyTest` you need to add some extra module info --add-exports javafx.graphics/com.sun.javafx.stage=com.jfoenix ``` -Now the test will run. +Now the test will run, there is a "Build and run" section. In the ## Final comments From 39064b6b8651e345d3f91e7ccaa5025e3bf6bb06 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 2 Sep 2021 00:46:48 +0000 Subject: [PATCH 14/15] GitBook: [main] one page modified --- .../guidelines-for-setting-up-a-local-workspace.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index 7f1b1b7dfb9..17afe187c6a 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -359,3 +359,11 @@ If that does not help: 4. Execute `./gradlew run` 5. Start IntelliJ and try again. +### Issue with org/jabref/build/JournalAbbreviationConverter$\_convert\_closure1$\_closure2.class is a duplicate but no duplicate handling strategy has been set. + +After changing the contents of build.gradle, on may geht following error: + +`Entry org/jabref/build/JournalAbbreviationConverter$_convert_closure1$_closure2.class is a duplicate but no duplicate handling strategy has been set.` + +Currently, no "real" solution is known. One has to start from scratch \(git clean, ...\). + From 1a08b3860f73dc7085a70030ef0082a575f6400b Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 2 Sep 2021 10:13:26 +0200 Subject: [PATCH 15/15] Enable copy&paste for IntelliJ run configuration --- ...uidelines-for-setting-up-a-local-workspace.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index 17afe187c6a..b7ccea53313 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -155,7 +155,7 @@ To use IntelliJ IDEA's internal build system when you build JabRef through **Bui ![Ignore the Gradle project "buildSrc"](../.gitbook/assets/intellij-gradle-config-ignore-buildSrc%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%286%29%20%284%29.png) -* Add `src-gen` as root: +* Add `src-gen` as root: 1. Right click on the project "jabref". 2. Select "Open Module Settings" @@ -262,12 +262,14 @@ Make sure your Eclipse installation us up to date. In the run configuration, at the "VM options" \(the box below the java version\), following content needs to be present: -`-ea +```text +-ea --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref --add-exports=org.controlsfx.controls/impl.org.controlsfx.skin=org.jabref --add-exports javafx.graphics/com.sun.javafx.application=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED ---add-exports javafx.graphics/com.sun.javafx.stage=com.jfoenix` +--add-exports javafx.graphics/com.sun.javafx.stage=com.jfoenix +``` ### Localization Test Configuration \(Eclipse\) @@ -309,7 +311,7 @@ java.lang.UnsupportedClassVersionError: org/javamodularity/moduleplugin/ModuleSy ### Issues with generated source files -In rare cases you might encounter problems due to out-dated automatically generated source files. Running `./gradlew clean` deletes these old copies. Do not forget to run at least `./gradlew eclipse` or `./gradlew build` afterwards to regenerate the source files. \`\` +In rare cases you might encounter problems due to out-dated automatically generated source files. Running `./gradlew clean` deletes these old copies. Do not forget to run at least `./gradlew eclipse` or `./gradlew build` afterwards to regenerate the source files. ### Issues with `buildSrc` @@ -359,11 +361,11 @@ If that does not help: 4. Execute `./gradlew run` 5. Start IntelliJ and try again. -### Issue with org/jabref/build/JournalAbbreviationConverter$\_convert\_closure1$\_closure2.class is a duplicate but no duplicate handling strategy has been set. +### Issue with org/jabref/build/JournalAbbreviationConverter$\_convert\_closure1$\_closure2.class is a duplicate but no duplicate handling strategy has been set -After changing the contents of build.gradle, on may geht following error: +After changing the contents of `build.gradle`, on might get following error: `Entry org/jabref/build/JournalAbbreviationConverter$_convert_closure1$_closure2.class is a duplicate but no duplicate handling strategy has been set.` -Currently, no "real" solution is known. One has to start from scratch \(git clean, ...\). +Currently, no "real" solution is known. One has to start from scratch \(`git clean -xdf`, ...\).