diff --git a/.gitignore b/.gitignore index 74af831..02373ea 100644 --- a/.gitignore +++ b/.gitignore @@ -25,19 +25,9 @@ Thumbs.db *.log logs/ -# Storage -app/storage/* -!app/storage/.gitkeep - -# Public uploads (keep directory, ignore contents) -app/public/images/articles/* -!app/public/images/articles/.gitkeep -app/public/images/profiles/* -!app/public/images/profiles/.gitkeep - -# LaTeX output -app/storage/latex/* -!app/storage/latex/.gitkeep +# Artikeluploads via de website (runtime gegenereerd) +resources/images/articles/* +!resources/images/articles/.gitkeep # Database dumps *.sql diff --git a/Latex/Articles.tex b/Latex/Articles.tex deleted file mode 100644 index 7dfdfcf..0000000 --- a/Latex/Articles.tex +++ /dev/null @@ -1,105 +0,0 @@ -\headline{Circus Barones} -\byline{11-11-2023}{Diede} -\showOneWriter{Images/ProfilePictures/Diede.jpg}{Diede} -\par Op zaterdag 11 november hadden drie vrienden en ik afgesproken in Antwerpen om iets te gaan doen. We hadden geen zin om gewoon op café te gaan en besloten daarom om naar het circus in Diest te gaan. Aangekomen bij het circus bleken er nog heel wat mensen hetzelfde plan te hebben voor die dag. Heel de tent was gevuld met ouders en jonge kindjes. Hoewel alle kinderen enthousiast waren over de acts, konden ze absoluut niet tippen aan het enthousiasme dat wij vier meebrachten. We klapten altijd het hardste en moedigde de circusartiesten luidkeels aan. Dat bleef niet onopgemerkt door de artiesten. Wanneer dan het moment gekomen was dat er enkele afgevaardigden uit het publiek op podium moesten komen, wezen de circusartiesten natuurlijk naar ons vier. Zo hebben wij onze carrière als circusartiest die zaterdag ingezet, gevolgd door een daverend applaus! -\showInlineImage{Images/Articles/Circus Barones.jpg}{} - - -\headline{Dagje Utrecht} -\byline{9-12-2023}{Diede} -\showOneWriter{Images/ProfilePictures/Diede.jpg}{Diede} -\par Op zaterdag 9 december ging ik met drie vrienden naar Utrecht. We hebben daar heel de dag rondgewandeld, zonder dat de regen ons kon deren. Na een tijdje waren we echter zo doorweekt dat we op zoek zijn gegaan naar een cafeetje om droog te zitten. Blijkbaar is dat op een zaterdag in Utrecht niet zo evident en verwachten ze dat je van tevoren reserveert. Na even zoeken hadden we dan toch een cafeetje gevonden waar er nog een tafeltje vrij was. Toevallig lag er op één van de stoelen aan dat tafeltje ook een katje te slapen, we vermoeden het katje van de eigenaar. Die is flink bij ons blijven liggen tot we drie uur later weer zijn weggegaan. Na het café zijn we nog tot de vroege uurtjes uitgeweest in Utrecht waarna een vriendin ons is komen ophalen om ons thuis te brengen. -\showInlineImage{Images/Articles/Dagje Utrecht.jpg}{} - - -\headline{En hedde gij meubelen,en hedde gij huisgerief.} -\byline{22-12-2023}{Dien} -\showOneWriter{Images/ProfilePictures/Dien.jpg}{Dien} -\par Een nieuw jaar, een nieuw interieur. Ten huize Ravers werden kosten nog moeite gespaard om hun woonkamer een nieuwe look te geven. De oude lederen hoekbank werd vervangen door een beige driezit en een Togo zetel. Een echte chill zetel waar voor gevochten gaat worden om wie er in mag zitten. We zijn al super blij met deze aankoop maar er moet nog heel wat gebeuren om de look die we voor ogen hebben,te verwezenlijken. Zo zijn we nog op zoek naar een bijpassende salontafel en een tof clubke voor erbij. In maart wordt onze nieuwe keuken geplaatst en dan kunnen we er weeral tegen voor de volgende 20 jaar. -\showInlineImage{Images/Articles/En hedde gij meubelen,en hedde gij huisgerief..jpg}{} - - -\headline{Het leven van alle dag} -\byline{24-12-2023}{Chris} -\showTwoWriters{Images/ProfilePictures/Chris.jpg}{Chris}{Images/ProfilePictures/Geert.jpg}{Geert} -\par Wat wij de voorbije maanden zoal deden, is zeer gewoon: werken en wat hobby's en that's it! In september start van het nieuwe schooljaar, in oktober fietsen we naar het gemeentehuis van Retie om te protesteren tegen de geplande verkaveling van de Chiroterreinen, onder initiatief van Schoonbroek stikt, waar ook onze zoon zijn schouders mee heeft ondergezet. En met succes, het project gaat 'voorlopig' niet door. Verder zijn Mathilde en ik gestart in Studio Doe, waar we potten leren draaien, gieten en inleggen. We vierden ook onze 34ste huwelijksverjaardag deze maand. In november maakten we weer een mooie herinnering met onze vriend Dirk door samen naar een optreden van zijn zoon te gaan. Hij kreeg in april de diagnose ALS en het gaat snel! In december nemen we met een paar vrienden zijn tuin onder handen. Geert ging deze maand mee op jacht als tracker en binnenkort eten we everzwijn. En verder staat december in het teken van feesten, wij hebben er al 2 achter de rug, op naar het volgende! -\showInlineImage{Images/Articles/Het leven van alle dag.jpg}{} - - -\headline{Workshop houtbranden} -\byline{20-9-2023}{Annick} -\showOneWriter{Images/ProfilePictures/Annick.jpg}{Annick} -\par Op IOK hadden wij personeelsdag. In de voormiddag een grote wandeling gemaakt in de Liereman in Oud-Turnhout. In de namiddag een workshop houtbranden. Dit was echt heel leuk en ontspannend om te doen. Zoals je kan zien op de foto heb ik onze achternaam weer alle eer aangedaan. 😜 -\showInlineImage{Images/Articles/Workshop houtbranden.jpg}{} - - -\headline{Escapewandeling Hasselt} -\byline{23-11-2023}{Annick} -\showOneWriter{Images/ProfilePictures/Annick.jpg}{Annick} -\par Met de personeelsdienst van IOK hadden we een escapewandeling in Hasselt ‘s avonds na ons werk. Winterland was daar ook net begonnen. Heel leuk en gezellig . -\showInlineImage{Images/Articles/Escapewandeling Hasselt.jpg}{} - - -\headline{Schümbroekse diskonaaijt in de spiegeltent van Schoonbroek leeft} -\byline{23-12-2023}{Annick} -\showOneWriter{Images/ProfilePictures/Annick.jpg}{Annick} -\par Een zalig disco-dansavondje met mijn vriendinnen van de Singel in Schoonbroek. En dan nog een groen daarbij die ook familie was. Maar eigenlijk was heel die tent daar wel ergens familie van mekaar 😝. Heerlijk om zo nog eens in mijn geboortedorp op stap te gaan en bij bomma en bompa te gaan slapen. Nogmaals dank 🙏 -\showInlineImage{Images/Articles/Schümbroekse diskonaaijt in de spiegeltent van Schoonbroek leeft.jpg}{} - - -\headline{Een dagje zoo} -\byline{1-10-2023}{Cedric} -\showOneWriter{Images/ProfilePictures/Cedric.jpg}{Cedric} -\par Cedric mocht met een vriendje van de leefgroep met de trein naar de Zoo in Antwerpen. Hij heeft er echt van genoten. -\showInlineImage{Images/Articles/Een dagje zoo.jpg}{} - - -\headline{Kerstfeestje in de leefgroep} -\byline{21-12-2023}{Cedric} -\showOneWriter{Images/ProfilePictures/Cedric.jpg}{Cedric} -\par Cedric had kerstfeestje in zijn leefgroep met heel lekker eten en iedereen kreeg een cadeautje . Cedric heeft sloefen van Club Brugge gekregen en hij is er héél blij mee. -\showInlineImage{Images/Articles/Kerstfeestje in de leefgroep.jpg}{} - - -\headline{Zalig Kerstfeest!!!!} -\byline{25-12-2023}{Cedric} -\showOneWriter{Images/ProfilePictures/Cedric.jpg}{Cedric} -\par Dit kerstmanneke wenst heel de familie ne zalige Kerstmis!!!! -\showInlineImage{Images/Articles/Zalig Kerstfeest!!!!.jpg}{} - - -\headline{Marathon} -\byline{12-11-2023}{Gunter} -\showOneWriter{Images/ProfilePictures/Gunter.jpg}{Gunter} -\par Inge heeft marathon gelopen in Kasterlee en ze was daarbij de snelste van Kasterlee -\showInlineImage{Images/Articles/Marathon.jpg}{} - - -\headline{Going to 'Murica } -\byline{19-10-2023}{Douwe} -\showTwoWriters{Images/ProfilePictures/Douwe.jpg}{Douwe}{Images/ProfilePictures/Pauline.jpg}{Pauline} -\par Van 19 oktober tot 2 november zijn Pauline en ik naar New York geweest. Ik moest naar een driedaagse conferentie op Roosevelt Island, en Pauline en ik hebben er dan een reis aan gekoppeld. Het was voor ons allebei de eerste keer naar een ander continent. Na 9 uur op het vliegtuig en 2 uur op de metro en bus begonnen we onze reis in Weehawken, New Jersey, een echt Amerikaans dorpje met de typische gele schoolbussen en deli’s in elke straat. Daarna verhuisden we naar een chic hotel op Roosevelt Island, een klein eilandje van 7km omtrek tussen de Upper East Side op Manhattan en Long Island. Toen Douwe op zijn conferentie was, ging Pauline alleen op pad. Ons laatste verblijf was diep in Brooklyn, en tot onze spijt hadden we extra gasten in ons appartement: kakkerlakken. Maar we lieten onze spirit er niet door beïnvloeden. Reden te meer om lang in de stad te blijven en op restaurant te gaan. New York moet je echt eens gezien hebben, je zou versteld staan van de cultuurshock die je toch ervaart. -\showInlineImage{Images/Articles/Going to 'Murica .jpg}{} - - -\headline{Eerste kerstboom in Brugge} -\byline{25-11-2023}{Douwe} -\showTwoWriters{Images/ProfilePictures/Douwe.jpg}{Douwe}{Images/ProfilePictures/Pauline.jpg}{Pauline} -\par Op 25 november zijn Pauline en ik onze allereerste kerstboom gaan kopen voor op ons appartementje. Onze kerstballen zijn helaas niet heel op ons appartement geraakt. Pauline haalde de kerstballen uit het koffer en ik nam de grote doos van de kerstboom. Maar toen ik omdraaide met de doos had ik niet gezien dat Pauline vlak naast mij stond. Eén doos kerstballen op de grond dus. Gelukkig zie je aan de versierde kerstboom niet dat er ballen ontbreken. -\showInlineImage{Images/Articles/Eerste kerstboom in Brugge.jpg}{} - - -\headline{Advertentie: Oeps, Kleurenavontuur!} -\byline{26-12-2023}{Daan} -\showTwoWriters{Images/ProfilePictures/Daan.jpg}{Daan}{Images/ProfilePictures/Kyala.jpg}{Kyala} -\par Heeft u ooit een verfpot geopend en een kleur ontdekt die een eigen wil lijkt te hebben? Wij wel! Ons kleurenexperiment bleek iets minder charmant dan verwacht. Voor degenen die houden van verrassingen en onconventionele interieurs: Grijp nu uw kans op de meest unieke verfkleur van het jaar! Kleurencode: S1010-Y30R Inhoud: 30L muurverf + 5L deurenverf Merk: SIGMA Limited edition – omdat sommige kleuren gewoon niet te plannen zijn. 🎨✨ -\showInlineImage{Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg}{} - - -\headline{Mini cooper met zwembad} -\byline{26-12-2023}{Michel} -\showOneWriter{Images/ProfilePictures/Michel.jpg}{Michel} -\par Onlangs kreeg onze mini (auto) kuren, spontaan deed de auto z'n ramen ongevraagd open en bleven de lichten achteraan branden ook al stond alles af, het leek wel Herbie (de kever..) die een eigen leven leidde. Na lang zoeken bleek er elektrische kortsluiting te zitten op wat onderdelen omdat de vloer aan bestuurderszijde wat nat aanvoelde... Na het verwijderen van de vloerbekleding bleek er zowat 6liter water in de auto te staan, ik kon m'n hand gewoon onder water steken. De officiële garage was supersnel en efficiënt in het opmaken van een gepeperde offerte om alles wat nat was te vervangen, hoe en van waar het water kwam en hoe ze dit gingen oplossen daar hadden ze nog niet over nagedacht... Gelukkig was er Wim VM die nog een projectje zocht om z'n studenten automechanica voor te leggen... . In Januari verhuist ons rijdend binnenzwembad richting schoolpoort om daar binnenstebuiten gedraaid te worden om lek en elektronica onder controle te krijgen, hopelijk doet Herbie daarna terug gewoon ... -\showInlineImage{Images/Articles/Mini cooper met zwembad.jpg}{} - - diff --git a/Latex/Images/Articles/Aan boord van de Red Star Line.jpg b/Latex/Images/Articles/Aan boord van de Red Star Line.jpg deleted file mode 100644 index 7d402e8..0000000 Binary files a/Latex/Images/Articles/Aan boord van de Red Star Line.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg b/Latex/Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg deleted file mode 100644 index f03b4f8..0000000 Binary files a/Latex/Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Blankenberge, Blankenberge, parel aan de kust.jpg b/Latex/Images/Articles/Blankenberge, Blankenberge, parel aan de kust.jpg deleted file mode 100644 index 12eb0da..0000000 Binary files a/Latex/Images/Articles/Blankenberge, Blankenberge, parel aan de kust.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Bootje varen in Gent.jpg b/Latex/Images/Articles/Bootje varen in Gent.jpg deleted file mode 100644 index 5d33707..0000000 Binary files a/Latex/Images/Articles/Bootje varen in Gent.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Cedric de baas van de politieagenten.jpg b/Latex/Images/Articles/Cedric de baas van de politieagenten.jpg deleted file mode 100644 index f1769c7..0000000 Binary files a/Latex/Images/Articles/Cedric de baas van de politieagenten.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Cedric de ochtendwandelaar.jpg b/Latex/Images/Articles/Cedric de ochtendwandelaar.jpg deleted file mode 100644 index dac6456..0000000 Binary files a/Latex/Images/Articles/Cedric de ochtendwandelaar.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Cinderella.jpg b/Latex/Images/Articles/Cinderella.jpg deleted file mode 100644 index 6a70c70..0000000 Binary files a/Latex/Images/Articles/Cinderella.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Circus Barones.jpg b/Latex/Images/Articles/Circus Barones.jpg deleted file mode 100644 index b60c91e..0000000 Binary files a/Latex/Images/Articles/Circus Barones.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Coely in OLT.jpg b/Latex/Images/Articles/Coely in OLT.jpg deleted file mode 100644 index 5225201..0000000 Binary files a/Latex/Images/Articles/Coely in OLT.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Dagje Utrecht.jpg b/Latex/Images/Articles/Dagje Utrecht.jpg deleted file mode 100644 index 5c23f3f..0000000 Binary files a/Latex/Images/Articles/Dagje Utrecht.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Denemarken.jpg b/Latex/Images/Articles/Denemarken.jpg deleted file mode 100644 index 410a29f..0000000 Binary files a/Latex/Images/Articles/Denemarken.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Een dagje zoo.jpg b/Latex/Images/Articles/Een dagje zoo.jpg deleted file mode 100644 index 92b1354..0000000 Binary files a/Latex/Images/Articles/Een dagje zoo.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Eenhoornfeestje in Kasterlee.jpg b/Latex/Images/Articles/Eenhoornfeestje in Kasterlee.jpg deleted file mode 100644 index 03560fe..0000000 Binary files a/Latex/Images/Articles/Eenhoornfeestje in Kasterlee.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Eerste kerstboom in Brugge.jpg b/Latex/Images/Articles/Eerste kerstboom in Brugge.jpg deleted file mode 100644 index c01108b..0000000 Binary files a/Latex/Images/Articles/Eerste kerstboom in Brugge.jpg and /dev/null differ diff --git a/Latex/Images/Articles/En hedde gij meubelen,en hedde gij huisgerief..jpg b/Latex/Images/Articles/En hedde gij meubelen,en hedde gij huisgerief..jpg deleted file mode 100644 index f2bea33..0000000 Binary files a/Latex/Images/Articles/En hedde gij meubelen,en hedde gij huisgerief..jpg and /dev/null differ diff --git a/Latex/Images/Articles/Er groeien vogels aan de takken. .jpg b/Latex/Images/Articles/Er groeien vogels aan de takken. .jpg deleted file mode 100644 index 02c5f8c..0000000 Binary files a/Latex/Images/Articles/Er groeien vogels aan de takken. .jpg and /dev/null differ diff --git a/Latex/Images/Articles/Escapewandeling Hasselt.jpg b/Latex/Images/Articles/Escapewandeling Hasselt.jpg deleted file mode 100644 index 0286dd2..0000000 Binary files a/Latex/Images/Articles/Escapewandeling Hasselt.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Feest bij de familie Ravers.jpg b/Latex/Images/Articles/Feest bij de familie Ravers.jpg deleted file mode 100644 index 70e9a74..0000000 Binary files a/Latex/Images/Articles/Feest bij de familie Ravers.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Gesponsorde grasmatten in de Broekstraat.jpg b/Latex/Images/Articles/Gesponsorde grasmatten in de Broekstraat.jpg deleted file mode 100644 index 5df0765..0000000 Binary files a/Latex/Images/Articles/Gesponsorde grasmatten in de Broekstraat.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Going to 'Murica .jpg b/Latex/Images/Articles/Going to 'Murica .jpg deleted file mode 100644 index f150472..0000000 Binary files a/Latex/Images/Articles/Going to 'Murica .jpg and /dev/null differ diff --git a/Latex/Images/Articles/Gorieen, gorieen gego .jpg b/Latex/Images/Articles/Gorieen, gorieen gego .jpg deleted file mode 100644 index 34c4837..0000000 Binary files a/Latex/Images/Articles/Gorieen, gorieen gego .jpg and /dev/null differ diff --git a/Latex/Images/Articles/Het leven van alle dag.jpg b/Latex/Images/Articles/Het leven van alle dag.jpg deleted file mode 100644 index 219f46b..0000000 Binary files a/Latex/Images/Articles/Het leven van alle dag.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Jaamjaam Nepal.jpg b/Latex/Images/Articles/Jaamjaam Nepal.jpg deleted file mode 100644 index 1d4b097..0000000 Binary files a/Latex/Images/Articles/Jaamjaam Nepal.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Kerstfeestje in de leefgroep.jpg b/Latex/Images/Articles/Kerstfeestje in de leefgroep.jpg deleted file mode 100644 index e8fdca6..0000000 Binary files a/Latex/Images/Articles/Kerstfeestje in de leefgroep.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Kerstgrotten in Valkenburg.jpg b/Latex/Images/Articles/Kerstgrotten in Valkenburg.jpg deleted file mode 100644 index ddcc70c..0000000 Binary files a/Latex/Images/Articles/Kerstgrotten in Valkenburg.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Kerstwandeling bijna fataal voor Saartje.jpg b/Latex/Images/Articles/Kerstwandeling bijna fataal voor Saartje.jpg deleted file mode 100644 index 3bf4304..0000000 Binary files a/Latex/Images/Articles/Kerstwandeling bijna fataal voor Saartje.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Lichtjeswandeling in Brussel.jpg b/Latex/Images/Articles/Lichtjeswandeling in Brussel.jpg deleted file mode 100644 index 43993dd..0000000 Binary files a/Latex/Images/Articles/Lichtjeswandeling in Brussel.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Marathon Kasterlee.jpg b/Latex/Images/Articles/Marathon Kasterlee.jpg deleted file mode 100644 index ffb2be7..0000000 Binary files a/Latex/Images/Articles/Marathon Kasterlee.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Marathon.jpg b/Latex/Images/Articles/Marathon.jpg deleted file mode 100644 index c7a95c6..0000000 Binary files a/Latex/Images/Articles/Marathon.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Mid weekje Oostende.jpg b/Latex/Images/Articles/Mid weekje Oostende.jpg deleted file mode 100644 index 7584ee5..0000000 Binary files a/Latex/Images/Articles/Mid weekje Oostende.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Middeleeuws eten en een IT job the story of a man who did it all.jpg b/Latex/Images/Articles/Middeleeuws eten en een IT job the story of a man who did it all.jpg deleted file mode 100644 index 09abbab..0000000 Binary files a/Latex/Images/Articles/Middeleeuws eten en een IT job the story of a man who did it all.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Middeleeuws eten en moderne jobs the story of a man who did it all.jpg b/Latex/Images/Articles/Middeleeuws eten en moderne jobs the story of a man who did it all.jpg deleted file mode 100644 index 09abbab..0000000 Binary files a/Latex/Images/Articles/Middeleeuws eten en moderne jobs the story of a man who did it all.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Mini cooper met zwembad.jpg b/Latex/Images/Articles/Mini cooper met zwembad.jpg deleted file mode 100644 index b4c5757..0000000 Binary files a/Latex/Images/Articles/Mini cooper met zwembad.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Naar spoed in plaats van naar de film..jpg b/Latex/Images/Articles/Naar spoed in plaats van naar de film..jpg deleted file mode 100644 index 44f7aca..0000000 Binary files a/Latex/Images/Articles/Naar spoed in plaats van naar de film..jpg and /dev/null differ diff --git a/Latex/Images/Articles/Nachtje Düsseldorf.jpg b/Latex/Images/Articles/Nachtje Düsseldorf.jpg deleted file mode 100644 index 47cfcdd..0000000 Binary files a/Latex/Images/Articles/Nachtje Düsseldorf.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Onvergetelijke roadtrip in de Highlands.jpg b/Latex/Images/Articles/Onvergetelijke roadtrip in de Highlands.jpg deleted file mode 100644 index b3d1d3c..0000000 Binary files a/Latex/Images/Articles/Onvergetelijke roadtrip in de Highlands.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Op bezoek in Amsterdam.jpg b/Latex/Images/Articles/Op bezoek in Amsterdam.jpg deleted file mode 100644 index 008a79f..0000000 Binary files a/Latex/Images/Articles/Op bezoek in Amsterdam.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Op stap met de Singel.jpg b/Latex/Images/Articles/Op stap met de Singel.jpg deleted file mode 100644 index b2aa7f0..0000000 Binary files a/Latex/Images/Articles/Op stap met de Singel.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Op weekend in een boomhut.jpg b/Latex/Images/Articles/Op weekend in een boomhut.jpg deleted file mode 100644 index 255693b..0000000 Binary files a/Latex/Images/Articles/Op weekend in een boomhut.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Op zoek naar de bron van de Ninglinspo.jpg b/Latex/Images/Articles/Op zoek naar de bron van de Ninglinspo.jpg deleted file mode 100644 index 35a652d..0000000 Binary files a/Latex/Images/Articles/Op zoek naar de bron van de Ninglinspo.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Overlijdensbericht.jpg b/Latex/Images/Articles/Overlijdensbericht.jpg deleted file mode 100644 index 183ab7d..0000000 Binary files a/Latex/Images/Articles/Overlijdensbericht.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Paul.jpg b/Latex/Images/Articles/Paul.jpg deleted file mode 100644 index 1fb8f15..0000000 Binary files a/Latex/Images/Articles/Paul.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Pauline en Douwe trekken westwaarts.jpg b/Latex/Images/Articles/Pauline en Douwe trekken westwaarts.jpg deleted file mode 100644 index c19c227..0000000 Binary files a/Latex/Images/Articles/Pauline en Douwe trekken westwaarts.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Reünie in Tübingen.jpg b/Latex/Images/Articles/Reünie in Tübingen.jpg deleted file mode 100644 index 3a6e5a5..0000000 Binary files a/Latex/Images/Articles/Reünie in Tübingen.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Schümbroekse diskonaaijt in de spiegeltent van Schoonbroek leeft.jpg b/Latex/Images/Articles/Schümbroekse diskonaaijt in de spiegeltent van Schoonbroek leeft.jpg deleted file mode 100644 index f36213b..0000000 Binary files a/Latex/Images/Articles/Schümbroekse diskonaaijt in de spiegeltent van Schoonbroek leeft.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Te koop.jpg b/Latex/Images/Articles/Te koop.jpg deleted file mode 100644 index 9393aef..0000000 Binary files a/Latex/Images/Articles/Te koop.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Toch nog naar de sneeuw. .jpg b/Latex/Images/Articles/Toch nog naar de sneeuw. .jpg deleted file mode 100644 index c54370e..0000000 Binary files a/Latex/Images/Articles/Toch nog naar de sneeuw. .jpg and /dev/null differ diff --git a/Latex/Images/Articles/Uitgestelde reis.jpg b/Latex/Images/Articles/Uitgestelde reis.jpg deleted file mode 100644 index ba259f0..0000000 Binary files a/Latex/Images/Articles/Uitgestelde reis.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Uitwaaien in Oostende.jpg b/Latex/Images/Articles/Uitwaaien in Oostende.jpg deleted file mode 100644 index c1cf807..0000000 Binary files a/Latex/Images/Articles/Uitwaaien in Oostende.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Verborgen parels in Antwerpen.jpg b/Latex/Images/Articles/Verborgen parels in Antwerpen.jpg deleted file mode 100644 index 8b27907..0000000 Binary files a/Latex/Images/Articles/Verborgen parels in Antwerpen.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Verjaardag Cedric.jpg b/Latex/Images/Articles/Verjaardag Cedric.jpg deleted file mode 100644 index 3015350..0000000 Binary files a/Latex/Images/Articles/Verjaardag Cedric.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Workshop houtbranden.jpg b/Latex/Images/Articles/Workshop houtbranden.jpg deleted file mode 100644 index 408ecce..0000000 Binary files a/Latex/Images/Articles/Workshop houtbranden.jpg and /dev/null differ diff --git a/Latex/Images/Articles/Zalig Kerstfeest!!!!.jpg b/Latex/Images/Articles/Zalig Kerstfeest!!!!.jpg deleted file mode 100644 index 7406e52..0000000 Binary files a/Latex/Images/Articles/Zalig Kerstfeest!!!!.jpg and /dev/null differ diff --git a/Latex/Images/Articles/ho.. ho.. ho....jpg b/Latex/Images/Articles/ho.. ho.. ho....jpg deleted file mode 100644 index 64f60fb..0000000 Binary files a/Latex/Images/Articles/ho.. ho.. ho....jpg and /dev/null differ diff --git a/Latex/Images/ProfilePictures/Lucca.jpg b/Latex/Images/ProfilePictures/Lucca.jpg deleted file mode 100644 index dbdf1cc..0000000 Binary files a/Latex/Images/ProfilePictures/Lucca.jpg and /dev/null differ diff --git a/Latex/Images/ProfilePictures/Vincent.jpg b/Latex/Images/ProfilePictures/Vincent.jpg deleted file mode 100644 index 1f1aa86..0000000 Binary files a/Latex/Images/ProfilePictures/Vincent.jpg and /dev/null differ diff --git a/Latex/Main.aux b/Latex/Main.aux deleted file mode 100644 index 2330c57..0000000 --- a/Latex/Main.aux +++ /dev/null @@ -1,6 +0,0 @@ -\relax -\providecommand\babel@aux[2]{} -\@nameuse{bbl@beforestart} -\catcode `"\active -\babel@aux{dutch}{} -\gdef \@abspage@last{5} diff --git a/Latex/Main.log b/Latex/Main.log deleted file mode 100644 index 4e97a33..0000000 --- a/Latex/Main.log +++ /dev/null @@ -1,1366 +0,0 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (MiKTeX 23.10.12) (preloaded format=pdflatex 2023.12.26) 26 DEC 2023 14:29 -entering extended mode - restricted \write18 enabled. - %&-line parsing enabled. -**../Latex/Main.tex -(../Latex/Main.tex -LaTeX2e <2023-11-01> -L3 programming layer <2023-12-11> -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/base\article.cls -Document Class: article 2023/05/17 v1.4n Standard LaTeX document class -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/base\size10.clo -File: size10.clo 2023/05/17 v1.4n Standard LaTeX file (size option) -) -\c@part=\count187 -\c@section=\count188 -\c@subsection=\count189 -\c@subsubsection=\count190 -\c@paragraph=\count191 -\c@subparagraph=\count192 -\c@figure=\count193 -\c@table=\count194 -\abovecaptionskip=\skip48 -\belowcaptionskip=\skip49 -\bibindent=\dimen140 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/base\inputenc.sty -Package: inputenc 2021/02/14 v1.3d Input encoding file -\inpenc@prehook=\toks17 -\inpenc@posthook=\toks18 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/base\fontenc.sty -Package: fontenc 2021/04/29 v2.0v Standard LaTeX package -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/microtype\microtype.sty -Package: microtype 2023/03/13 v3.1a Micro-typographical refinements (RS) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics\keyval.sty -Package: keyval 2022/05/29 v1.15 key=value parser (DPC) -\KV@toks@=\toks19 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/etoolbox\etoolbox.sty -Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) -\etb@tempcnta=\count195 -) -\MT@toks=\toks20 -\MT@tempbox=\box51 -\MT@count=\count196 -LaTeX Info: Redefining \noprotrusionifhmode on input line 1059. -LaTeX Info: Redefining \leftprotrusion on input line 1060. -\MT@prot@toks=\toks21 -LaTeX Info: Redefining \rightprotrusion on input line 1078. -LaTeX Info: Redefining \textls on input line 1368. -\MT@outer@kern=\dimen141 -LaTeX Info: Redefining \textmicrotypecontext on input line 1988. -\MT@listname@count=\count197 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/microtype\microtype-pdf -tex.def -File: microtype-pdftex.def 2023/03/13 v3.1a Definitions specific to pdftex (RS) - -LaTeX Info: Redefining \lsstyle on input line 902. -LaTeX Info: Redefining \lslig on input line 902. -\MT@outer@space=\skip50 -) -Package microtype Info: Loading configuration file microtype.cfg. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/microtype\microtype.cfg -File: microtype.cfg 2023/03/13 v3.1a microtype main configuration file (RS) -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newspaper\newspaper.sty -Package: newspaper -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/yfonts\yfonts.sty -Package: yfonts 2019/04/04 v1.4 (WaS&NP) -Now handling font encoding LY ... -... no UTF-8 mapping file for font encoding LY -Now handling font encoding LYG ... -... no UTF-8 mapping file for font encoding LYG -LaTeX Info: Composite with undeclared \" in encoding LYG on input line 58. -) -\c@volume=\count198 -\c@issue=\count199 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/babel\babel.sty -Package: babel 2023/12/10 v3.99 The Babel package -\babel@savecnt=\count266 -\U@D=\dimen142 -\l@unhyphenated=\language79 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/babel\txtbabel.def) -\bbl@readstream=\read2 -\bbl@dirlevel=\count267 - -************************************* -* Local config file bblopts.cfg used -* -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/arabi\bblopts.cfg -File: bblopts.cfg 2005/09/08 v0.1 add Arabic and Farsi to "declared" options of - babel -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/babel-dutch\dutch.ldf -Language: dutch 2021/08/29 v3.8l Dutch support from the babel system -Package babel Info: Making " an active character on input line 127. -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/babel/locale/nl\babel --dutch.tex -Package babel Info: Importing font and identification data for dutch -(babel) from babel-nl.ini. Reported on input line 11. -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics\graphicx.sty -Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics\graphics.sty -Package: graphics 2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics\trig.sty -Package: trig 2021/08/11 v1.11 sin cos tan (DPC) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics-cfg\graphics.c -fg -File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration -) -Package graphics Info: Driver file: pdftex.def on input line 107. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics-def\pdftex.def -File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex -)) -\Gin@req@height=\dimen143 -\Gin@req@width=\dimen144 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/frontendlayer\tikz. -sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/basiclayer\pgf.sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/utilities\pgfrcs.st -y -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgfutil --common.tex -\pgfutil@everybye=\toks22 -\pgfutil@tempdima=\dimen145 -\pgfutil@tempdimb=\dimen146 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgfutil --latex.def -\pgfutil@abb=\box52 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgfrcs. -code.tex -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf\pgf.revision.tex) -Package: pgfrcs 2023-01-15 v3.1.10 (3.1.10) -)) -Package: pgf 2023-01-15 v3.1.10 (3.1.10) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/basiclayer\pgfcore. -sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/systemlayer\pgfsys. -sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/systemlayer\pgfsy -s.code.tex -Package: pgfsys 2023-01-15 v3.1.10 (3.1.10) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgfkeys -.code.tex -\pgfkeys@pathtoks=\toks23 -\pgfkeys@temptoks=\toks24 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgfkeys -libraryfiltered.code.tex -\pgfkeys@tmptoks=\toks25 -)) -\pgf@x=\dimen147 -\pgf@y=\dimen148 -\pgf@xa=\dimen149 -\pgf@ya=\dimen150 -\pgf@xb=\dimen151 -\pgf@yb=\dimen152 -\pgf@xc=\dimen153 -\pgf@yc=\dimen154 -\pgf@xd=\dimen155 -\pgf@yd=\dimen156 -\w@pgf@writea=\write3 -\r@pgf@reada=\read3 -\c@pgf@counta=\count268 -\c@pgf@countb=\count269 -\c@pgf@countc=\count270 -\c@pgf@countd=\count271 -\t@pgf@toka=\toks26 -\t@pgf@tokb=\toks27 -\t@pgf@tokc=\toks28 -\pgf@sys@id@count=\count272 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/systemlayer\pgf.c -fg -File: pgf.cfg 2023-01-15 v3.1.10 (3.1.10) -) -Driver file for pgf: pgfsys-pdftex.def - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/systemlayer\pgfsy -s-pdftex.def -File: pgfsys-pdftex.def 2023-01-15 v3.1.10 (3.1.10) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/systemlayer\pgfsy -s-common-pdf.def -File: pgfsys-common-pdf.def 2023-01-15 v3.1.10 (3.1.10) -))) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/systemlayer\pgfsy -ssoftpath.code.tex -File: pgfsyssoftpath.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgfsyssoftpath@smallbuffer@items=\count273 -\pgfsyssoftpath@bigbuffer@items=\count274 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/systemlayer\pgfsy -sprotocol.code.tex -File: pgfsysprotocol.code.tex 2023-01-15 v3.1.10 (3.1.10) -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/xcolor\xcolor.sty -Package: xcolor 2023/11/15 v3.01 LaTeX color extensions (UK) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics-cfg\color.cfg -File: color.cfg 2016/01/02 v1.6 sample color configuration -) -Package xcolor Info: Driver file: pdftex.def on input line 274. -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/graphics\mathcolor.ltx) -Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1350. -Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1354. -Package xcolor Info: Model `RGB' extended on input line 1366. -Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1368. -Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1369. -Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1370. -Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1371. -Package xcolor Info: Model `Gray' substituted by `gray' on input line 1372. -Package xcolor Info: Model `wave' substituted by `hsb' on input line 1373. -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -e.code.tex -Package: pgfcore 2023-01-15 v3.1.10 (3.1.10) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmath.code -.tex -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathutil. -code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathparse -r.code.tex -\pgfmath@dimen=\dimen157 -\pgfmath@count=\count275 -\pgfmath@box=\box53 -\pgfmath@toks=\toks29 -\pgfmath@stack@operand=\toks30 -\pgfmath@stack@operation=\toks31 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.basic.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.trigonometric.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.random.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.comparison.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.base.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.round.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.misc.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfunct -ions.integerarithmetics.code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathcalc. -code.tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmathfloat -.code.tex -\c@pgfmathroundto@lastzeros=\count276 -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfint.code. -tex) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -epoints.code.tex -File: pgfcorepoints.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgf@picminx=\dimen158 -\pgf@picmaxx=\dimen159 -\pgf@picminy=\dimen160 -\pgf@picmaxy=\dimen161 -\pgf@pathminx=\dimen162 -\pgf@pathmaxx=\dimen163 -\pgf@pathminy=\dimen164 -\pgf@pathmaxy=\dimen165 -\pgf@xx=\dimen166 -\pgf@xy=\dimen167 -\pgf@yx=\dimen168 -\pgf@yy=\dimen169 -\pgf@zx=\dimen170 -\pgf@zy=\dimen171 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -epathconstruct.code.tex -File: pgfcorepathconstruct.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgf@path@lastx=\dimen172 -\pgf@path@lasty=\dimen173 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -epathusage.code.tex -File: pgfcorepathusage.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgf@shorten@end@additional=\dimen174 -\pgf@shorten@start@additional=\dimen175 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -escopes.code.tex -File: pgfcorescopes.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgfpic=\box54 -\pgf@hbox=\box55 -\pgf@layerbox@main=\box56 -\pgf@picture@serial@count=\count277 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -egraphicstate.code.tex -File: pgfcoregraphicstate.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgflinewidth=\dimen176 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -etransformations.code.tex -File: pgfcoretransformations.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgf@pt@x=\dimen177 -\pgf@pt@y=\dimen178 -\pgf@pt@temp=\dimen179 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -equick.code.tex -File: pgfcorequick.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -eobjects.code.tex -File: pgfcoreobjects.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -epathprocessing.code.tex -File: pgfcorepathprocessing.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -earrows.code.tex -File: pgfcorearrows.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgfarrowsep=\dimen180 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -eshade.code.tex -File: pgfcoreshade.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgf@max=\dimen181 -\pgf@sys@shading@range@num=\count278 -\pgf@shadingcount=\count279 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -eimage.code.tex -File: pgfcoreimage.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -eexternal.code.tex -File: pgfcoreexternal.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgfexternal@startupbox=\box57 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -elayers.code.tex -File: pgfcorelayers.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -etransparency.code.tex -File: pgfcoretransparency.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -epatterns.code.tex -File: pgfcorepatterns.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/basiclayer\pgfcor -erdf.code.tex -File: pgfcorerdf.code.tex 2023-01-15 v3.1.10 (3.1.10) -))) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/modules\pgfmodule -shapes.code.tex -File: pgfmoduleshapes.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgfnodeparttextbox=\box58 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/modules\pgfmodule -plot.code.tex -File: pgfmoduleplot.code.tex 2023-01-15 v3.1.10 (3.1.10) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/compatibility\pgfco -mp-version-0-65.sty -Package: pgfcomp-version-0-65 2023-01-15 v3.1.10 (3.1.10) -\pgf@nodesepstart=\dimen182 -\pgf@nodesepend=\dimen183 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/compatibility\pgfco -mp-version-1-18.sty -Package: pgfcomp-version-1-18 2023-01-15 v3.1.10 (3.1.10) -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/utilities\pgffor.st -y -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/utilities\pgfkeys.s -ty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgfkeys -.code.tex)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/pgf/math\pgfmath.sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/math\pgfmath.code -.tex)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/utilities\pgffor. -code.tex -Package: pgffor 2023-01-15 v3.1.10 (3.1.10) -\pgffor@iter=\dimen184 -\pgffor@skip=\dimen185 -\pgffor@stack=\toks32 -\pgffor@toks=\toks33 -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/frontendlayer/tik -z\tikz.code.tex -Package: tikz 2023-01-15 v3.1.10 (3.1.10) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/libraries\pgflibr -aryplothandlers.code.tex -File: pgflibraryplothandlers.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgf@plot@mark@count=\count280 -\pgfplotmarksize=\dimen186 -) -\tikz@lastx=\dimen187 -\tikz@lasty=\dimen188 -\tikz@lastxsaved=\dimen189 -\tikz@lastysaved=\dimen190 -\tikz@lastmovetox=\dimen191 -\tikz@lastmovetoy=\dimen192 -\tikzleveldistance=\dimen193 -\tikzsiblingdistance=\dimen194 -\tikz@figbox=\box59 -\tikz@figbox@bg=\box60 -\tikz@tempbox=\box61 -\tikz@tempbox@bg=\box62 -\tikztreelevel=\count281 -\tikznumberofchildren=\count282 -\tikznumberofcurrentchild=\count283 -\tikz@fig@count=\count284 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/modules\pgfmodule -matrix.code.tex -File: pgfmodulematrix.code.tex 2023-01-15 v3.1.10 (3.1.10) -\pgfmatrixcurrentrow=\count285 -\pgfmatrixcurrentcolumn=\count286 -\pgf@matrix@numberofcolumns=\count287 -) -\tikz@expandcount=\count288 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/pgf/frontendlayer/tik -z/libraries\tikzlibrarytopaths.code.tex -File: tikzlibrarytopaths.code.tex 2023-01-15 v3.1.10 (3.1.10) -))) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/tools\multicol.sty -Package: multicol 2023/03/30 v1.9f multicolumn formatting (FMi) -\c@tracingmulticols=\count289 -\mult@box=\box63 -\multicol@leftmargin=\dimen195 -\c@unbalance=\count290 -\c@collectmore=\count291 -\doublecol@number=\count292 -\multicoltolerance=\count293 -\multicolpretolerance=\count294 -\full@width=\dimen196 -\page@free=\dimen197 -\premulticols=\dimen198 -\postmulticols=\dimen199 -\multicolsep=\skip51 -\multicolbaselineskip=\skip52 -\partial@page=\box64 -\last@line=\box65 -\mc@boxedresult=\box66 -\maxbalancingoverflow=\dimen256 -\mult@rightbox=\box67 -\mult@grightbox=\box68 -\mult@firstbox=\box69 -\mult@gfirstbox=\box70 -\@tempa=\box71 -\@tempa=\box72 -\@tempa=\box73 -\@tempa=\box74 -\@tempa=\box75 -\@tempa=\box76 -\@tempa=\box77 -\@tempa=\box78 -\@tempa=\box79 -\@tempa=\box80 -\@tempa=\box81 -\@tempa=\box82 -\@tempa=\box83 -\@tempa=\box84 -\@tempa=\box85 -\@tempa=\box86 -\@tempa=\box87 -\@tempa=\box88 -\@tempa=\box89 -\@tempa=\box90 -\@tempa=\box91 -\@tempa=\box92 -\@tempa=\box93 -\@tempa=\box94 -\@tempa=\box95 -\@tempa=\box96 -\@tempa=\box97 -\@tempa=\box98 -\@tempa=\box99 -\@tempa=\box100 -\@tempa=\box101 -\@tempa=\box102 -\@tempa=\box103 -\@tempa=\box104 -\@tempa=\box105 -\@tempa=\box106 -\c@minrows=\count295 -\c@columnbadness=\count296 -\c@finalcolumnbadness=\count297 -\last@try=\dimen257 -\multicolovershoot=\dimen258 -\multicolundershoot=\dimen259 -\mult@nat@firstbox=\box107 -\colbreak@box=\box108 -\mc@col@check@num=\count298 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/subfiles\subfiles.sty -Package: subfiles 2020/11/14 v2.2 Multi-file projects (package) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/import\import.sty -Package: import 2020/04/01 v 6.2 -)) -(newspaper-mod.sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\newtxtext.sty -Package: newtxtext 2023/11/14 v1.734(Michael Sharpe) latex and unicode latex su -pport for TeXGyreTermesX - -`newtxtext' v1.734, 2023/11/14 Text macros taking advantage of TeXGyre Termes a -nd its extensions (msharpe) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/xpatch\xpatch.sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/l3kernel\expl3.sty -Package: expl3 2023-12-11 L3 programming layer (loader) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/l3backend\l3backend-pdf -tex.def -File: l3backend-pdftex.def 2023-11-09 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count299 -\l__pdf_internal_box=\box109 -)) -Package: xpatch 2020/03/25 v0.3a Extending etoolbox patching commands - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/l3packages/xparse\xpars -e.sty -Package: xparse 2023-10-10 L3 Experimental document command parser -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/iftex\iftex.sty -Package: iftex 2022/02/03 v1.0f TeX engine tests -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/xkeyval\xkeyval.sty -Package: xkeyval 2022/06/16 v2.9 package option processing (HA) - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\xkeyval.tex -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\xkvutils.tex -\XKV@toks=\toks34 -\XKV@tempa@toks=\toks35 -) -\XKV@depth=\count300 -File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) -)) (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/base\textcomp.sty -Package: textcomp 2020/02/02 v2.0n Standard LaTeX package -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/xstring\xstring.sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/xstring\xstring.tex -\xs_counta=\count301 -\xs_countb=\count302 -) -Package: xstring 2023/08/22 v1.86 String manipulations (CT) -) (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/base\ifthen.sty -Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/carlisle\scalefnt.sty) -LaTeX Font Info: Setting ntxLF sub-encoding to TS1/0 on input line 24. -LaTeX Font Info: Setting ntxTLF sub-encoding to TS1/0 on input line 24. -LaTeX Font Info: Setting ntxOsF sub-encoding to TS1/0 on input line 24. -LaTeX Font Info: Setting ntxTOsF sub-encoding to TS1/0 on input line 24. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/binhex\binhex.tex) -\ntx@tmpcnta=\count303 -\ntx@cnt=\count304 -\ntxsups@scale=\dimen260 -\ntxsups@raise=\dimen261 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/fontaxes\fontaxes.sty -Package: fontaxes 2020/07/21 v1.0e Font selection axes -LaTeX Info: Redefining \upshape on input line 29. -LaTeX Info: Redefining \itshape on input line 31. -LaTeX Info: Redefining \slshape on input line 33. -LaTeX Info: Redefining \swshape on input line 35. -LaTeX Info: Redefining \scshape on input line 37. -LaTeX Info: Redefining \sscshape on input line 39. -LaTeX Info: Redefining \ulcshape on input line 41. -LaTeX Info: Redefining \textsw on input line 47. -LaTeX Info: Redefining \textssc on input line 48. -LaTeX Info: Redefining \textulc on input line 49. -) -\tx@sixem=\dimen262 -\tx@y=\dimen263 -\tx@x=\dimen264 -\tx@tmpdima=\dimen265 -\tx@tmpdimb=\dimen266 -\tx@tmpdimc=\dimen267 -\tx@tmpdimd=\dimen268 -\tx@tmpdime=\dimen269 -\tx@tmpdimf=\dimen270 -\tx@dimA=\dimen271 -\tx@dimAA=\dimen272 -\tx@dimB=\dimen273 -\tx@dimBB=\dimen274 -\tx@dimC=\dimen275 -LaTeX Info: Redefining \oldstylenums on input line 871. -) (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\newtxmath.sty -Package: newtxmath 2023/11/05 v1.732 - -`newtxmath' v1.732, 2023/11/05 Math macros based originally on txfonts (msharpe -) (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsmath.sty -Package: amsmath 2023/05/13 v2.17o AMS math features -\@mathmargin=\skip53 - -For additional information on amsmath, use the `?' option. -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amstext.sty -Package: amstext 2021/08/26 v2.01 AMS text - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsgen.sty -File: amsgen.sty 1999/11/30 v2.0 generic functions -\@emptytoks=\toks36 -\ex@=\dimen276 -)) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsbsy.sty -Package: amsbsy 1999/11/29 v1.2d Bold Symbols -\pmbraise@=\dimen277 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsopn.sty -Package: amsopn 2022/04/08 v2.04 operator names -) -\inf@bad=\count305 -LaTeX Info: Redefining \frac on input line 234. -\uproot@=\count306 -\leftroot@=\count307 -LaTeX Info: Redefining \overline on input line 399. -LaTeX Info: Redefining \colon on input line 410. -\classnum@=\count308 -\DOTSCASE@=\count309 -LaTeX Info: Redefining \ldots on input line 496. -LaTeX Info: Redefining \dots on input line 499. -LaTeX Info: Redefining \cdots on input line 620. -\Mathstrutbox@=\box110 -\strutbox@=\box111 -LaTeX Info: Redefining \big on input line 722. -LaTeX Info: Redefining \Big on input line 723. -LaTeX Info: Redefining \bigg on input line 724. -LaTeX Info: Redefining \Bigg on input line 725. -\big@size=\dimen278 -LaTeX Font Info: Redeclaring font encoding OML on input line 743. -LaTeX Font Info: Redeclaring font encoding OMS on input line 744. -\macc@depth=\count310 -LaTeX Info: Redefining \bmod on input line 905. -LaTeX Info: Redefining \pmod on input line 910. -LaTeX Info: Redefining \smash on input line 940. -LaTeX Info: Redefining \relbar on input line 970. -LaTeX Info: Redefining \Relbar on input line 971. -\c@MaxMatrixCols=\count311 -\dotsspace@=\muskip16 -\c@parentequation=\count312 -\dspbrk@lvl=\count313 -\tag@help=\toks37 -\row@=\count314 -\column@=\count315 -\maxfields@=\count316 -\andhelp@=\toks38 -\eqnshift@=\dimen279 -\alignsep@=\dimen280 -\tagshift@=\dimen281 -\tagwidth@=\dimen282 -\totwidth@=\dimen283 -\lineht@=\dimen284 -\@envbody=\toks39 -\multlinegap=\skip54 -\multlinetaggap=\skip55 -\mathdisplay@stack=\toks40 -LaTeX Info: Redefining \[ on input line 2953. -LaTeX Info: Redefining \] on input line 2954. -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/oberdiek\centernot.sty -Package: centernot 2016/05/16 v1.4 Centers the not symbol horizontally (HO) -) -\tx@cntz=\count317 -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/generic/binhex\binhex.tex) -\tx@Isdigit=\count318 -\tx@IsAlNum=\count319 -\tx@tA=\toks41 -\tx@tB=\toks42 -\tx@su=\read4 - -amsthm NOT loaded -LaTeX Font Info: Redeclaring symbol font `operators' on input line 391. -LaTeX Font Info: Overwriting symbol font `operators' in version `normal' -(Font) OT1/cmr/m/n --> OT1/minntx/m/n on input line 391. -LaTeX Font Info: Overwriting symbol font `operators' in version `bold' -(Font) OT1/cmr/bx/n --> OT1/minntx/m/n on input line 391. -LaTeX Font Info: Overwriting symbol font `operators' in version `bold' -(Font) OT1/minntx/m/n --> OT1/minntx/b/n on input line 392. -LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 398. -LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' -(Font) OT1/cmss/m/n --> T1/qhv/m/n on input line 398. -LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' -(Font) OT1/cmss/bx/n --> T1/qhv/m/n on input line 398. -LaTeX Font Info: Redeclaring math alphabet \mathit on input line 399. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' -(Font) OT1/cmr/m/it --> OT1/minntx/m/it on input line 399. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' -(Font) OT1/cmr/bx/it --> OT1/minntx/m/it on input line 399. -LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 400. -LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' -(Font) OT1/cmtt/m/n --> T1/ntxtt/m/n on input line 400. -LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' -(Font) OT1/cmtt/m/n --> T1/ntxtt/m/n on input line 400. -LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 402. -LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' -(Font) OT1/cmr/bx/n --> OT1/minntx/b/n on input line 402. -LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' -(Font) OT1/cmr/bx/n --> OT1/minntx/b/n on input line 402. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' -(Font) OT1/minntx/m/it --> OT1/minntx/b/it on input line 403. -LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' -(Font) T1/qhv/m/n --> T1/qhv/b/n on input line 404. -LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' -(Font) T1/ntxtt/m/n --> T1/ntxtt/b/n on input line 405. -LaTeX Font Info: Redeclaring symbol font `letters' on input line 507. -LaTeX Font Info: Overwriting symbol font `letters' in version `normal' -(Font) OML/cmm/m/it --> OML/ntxmi/m/it on input line 507. -LaTeX Font Info: Overwriting symbol font `letters' in version `bold' -(Font) OML/cmm/b/it --> OML/ntxmi/m/it on input line 507. -LaTeX Font Info: Overwriting symbol font `letters' in version `bold' -(Font) OML/ntxmi/m/it --> OML/ntxmi/b/it on input line 508. -\symlettersA=\mathgroup4 -LaTeX Font Info: Overwriting symbol font `lettersA' in version `bold' -(Font) U/ntxmia/m/it --> U/ntxmia/b/it on input line 563. -Now handling font encoding LMS ... -... no UTF-8 mapping file for font encoding LMS -LaTeX Font Info: Redeclaring symbol font `symbols' on input line 584. -LaTeX Font Info: Encoding `OMS' has changed to `LMS' for symbol font -(Font) `symbols' in the math version `normal' on input line 584. -LaTeX Font Info: Overwriting symbol font `symbols' in version `normal' -(Font) OMS/cmsy/m/n --> LMS/ntxsy/m/n on input line 584. -LaTeX Font Info: Encoding `OMS' has changed to `LMS' for symbol font -(Font) `symbols' in the math version `bold' on input line 584. -LaTeX Font Info: Overwriting symbol font `symbols' in version `bold' -(Font) OMS/cmsy/b/n --> LMS/ntxsy/m/n on input line 584. -LaTeX Font Info: Overwriting symbol font `symbols' in version `bold' -(Font) LMS/ntxsy/m/n --> LMS/ntxsy/b/n on input line 585. -\symAMSm=\mathgroup5 -LaTeX Font Info: Overwriting symbol font `AMSm' in version `bold' -(Font) U/ntxsym/m/n --> U/ntxsym/b/n on input line 610. -\symsymbolsC=\mathgroup6 -LaTeX Font Info: Overwriting symbol font `symbolsC' in version `bold' -(Font) U/ntxsyc/m/n --> U/ntxsyc/b/n on input line 631. -Now handling font encoding LMX ... -... no UTF-8 mapping file for font encoding LMX -LaTeX Font Info: Redeclaring symbol font `largesymbols' on input line 644. -LaTeX Font Info: Encoding `OMX' has changed to `LMX' for symbol font -(Font) `largesymbols' in the math version `normal' on input line 6 -44. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `normal' -(Font) OMX/cmex/m/n --> LMX/ntxexx/m/n on input line 644. -LaTeX Font Info: Encoding `OMX' has changed to `LMX' for symbol font -(Font) `largesymbols' in the math version `bold' on input line 644 -. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `bold' -(Font) OMX/cmex/m/n --> LMX/ntxexx/m/n on input line 644. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `bold' -(Font) LMX/ntxexx/m/n --> LMX/ntxexx/b/n on input line 645. -\symlargesymbolsTXA=\mathgroup7 -LaTeX Font Info: Overwriting symbol font `largesymbolsTXA' in version `bold' - -(Font) U/ntxexa/m/n --> U/ntxexa/b/n on input line 659. -\tx@sbptoks=\toks43 -LaTeX Font Info: Redeclaring math delimiter \lfloor on input line 882. -LaTeX Font Info: Redeclaring math delimiter \rfloor on input line 883. -LaTeX Font Info: Redeclaring math delimiter \lceil on input line 884. -LaTeX Font Info: Redeclaring math delimiter \rceil on input line 885. -LaTeX Font Info: Redeclaring math delimiter \lbrace on input line 890. -LaTeX Font Info: Redeclaring math delimiter \rbrace on input line 891. -LaTeX Font Info: Redeclaring math delimiter \langle on input line 893. -LaTeX Font Info: Redeclaring math delimiter \rangle on input line 895. -LaTeX Font Info: Redeclaring math delimiter \arrowvert on input line 899. -LaTeX Font Info: Redeclaring math delimiter \vert on input line 900. -LaTeX Font Info: Redeclaring math symbol \hbar on input line 946. -LaTeX Font Info: Redeclaring math accent \dot on input line 971. -LaTeX Font Info: Redeclaring math accent \ddot on input line 972. -LaTeX Font Info: Redeclaring math accent \vec on input line 2045. -LaTeX Info: Redefining \Bbbk on input line 2835. -LaTeX Info: Redefining \not on input line 2983. -)) (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/lipsum\lipsum.sty -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/l3packages/l3keys2e\l3k -eys2e.sty -Package: l3keys2e 2023-10-10 LaTeX2e option processing using LaTeX3 keys -) -Package: lipsum 2021-09-20 v2.7 150 paragraphs of Lorem Ipsum dummy text -\g__lipsum_par_int=\count320 -\l__lipsum_a_int=\count321 -\l__lipsum_b_int=\count322 - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/lipsum\lipsum.ltd.tex)) -LaTeX Font Info: Trying to load font information for T1+ntxtlf on input line - 41. -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\t1ntxtlf.fd -File: t1ntxtlf.fd 2021/05/24 v1.1 font definition file for T1/ntx/tlf -) -LaTeX Font Info: Font shape `T1/ntxtlf/m/n' will be -(Font) scaled to size 10.0pt on input line 41. - -(Main.aux) -\openout1 = `Main.aux'. - -LaTeX Font Info: Checking defaults for OML/ntxmi/m/it on input line 41. -LaTeX Font Info: Trying to load font information for OML+ntxmi on input line - 41. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\omlntxmi.fd -File: omlntxmi.fd 2015/08/25 Fontinst v1.933 font definitions for OML/ntxmi. -) -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for U/ntxexa/m/n on input line 41. -LaTeX Font Info: Trying to load font information for U+ntxexa on input line -41. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\untxexa.fd -File: untxexa.fd 2012/04/16 Fontinst v1.933 font definitions for U/ntxexa. -) -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for LY/yfrak/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for LYG/ygoth/m/n on input line 41. -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for LMS/ntxsy/m/n on input line 41. -LaTeX Font Info: Trying to load font information for LMS+ntxsy on input line - 41. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\lmsntxsy.fd -File: lmsntxsy.fd 2016/07/02 Fontinst v1.933 font definitions for LMS/ntxsy. -) -LaTeX Font Info: ... okay on input line 41. -LaTeX Font Info: Checking defaults for LMX/ntxexx/m/n on input line 41. -LaTeX Font Info: Trying to load font information for LMX+ntxexx on input lin -e 41. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\lmxntxexx.fd -File: lmxntxexx.fd 2016/07/03 Fontinst v1.933 font definitions for LMX/ntxexx. -) -LaTeX Font Info: ... okay on input line 41. -LaTeX Info: Redefining \microtypecontext on input line 41. -Package microtype Info: Applying patch `item' on input line 41. -Package microtype Info: Applying patch `toc' on input line 41. -Package microtype Info: Applying patch `eqnum' on input line 41. -Package microtype Info: Applying patch `footnote' on input line 41. -Package microtype Info: Applying patch `verbatim' on input line 41. -Package microtype Info: Generating PDF output. -Package microtype Info: Character protrusion enabled (level 2). -Package microtype Info: Using default protrusion set `alltext'. -Package microtype Info: Automatic font expansion enabled (level 2), -(microtype) stretch: 20, shrink: 20, step: 1, non-selected. -Package microtype Info: Using default expansion set `alltext-nott'. -LaTeX Info: Redefining \showhyphens on input line 41. -Package microtype Info: No adjustment of tracking. -Package microtype Info: No adjustment of interword spacing. -Package microtype Info: No adjustment of character kerning. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/microtype\mt-ptm.cfg -File: mt-ptm.cfg 2006/04/20 v1.7 microtype config. file: Times (RS) -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/context/base/mkii\supp-pdf.mk -ii -[Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count323 -\scratchdimen=\dimen285 -\scratchbox=\box112 -\nofMPsegments=\count324 -\nofMParguments=\count325 -\everyMPshowfont=\toks44 -\MPscratchCnt=\count326 -\MPscratchDim=\dimen286 -\MPnumerator=\count327 -\makeMPintoPDFobject=\count328 -\everyMPtoPDFconversion=\toks45 -) -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/epstopdf-pkg\epstopdf-b -ase.sty -Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf -Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 -85. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/00miktex\epstopdf-sys.c -fg -File: epstopdf-sys.cfg 2021/03/18 v2.0 Configuration of epstopdf for MiKTeX -)) -\c@mv@tabular=\count329 -\c@mv@boldtabular=\count330 -LaTeX Info: Command `\dddot' is already robust on input line 41. -LaTeX Info: Command `\ddddot' is already robust on input line 41. -LaTeX Font Info: Font shape `T1/ntxtlf/m/n' will be -(Font) scaled to size 9.0pt on input line 42. -LaTeX Font Info: Trying to load font information for OT1+minntx on input lin -e 42. - (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\ot1minntx.fd -File: ot1minntx.fd 2023/09/09 v1.1 font definition file for OT1/minntx -) -Package microtype Info: Loading generic protrusion settings for font family -(microtype) `minntx' (encoding: OT1). -(microtype) For optimal results, create family-specific settings. -(microtype) See the microtype manual for details. -LaTeX Font Info: Trying to load font information for U+ntxmia on input line -42. - (C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\untxmia.fd -File: untxmia.fd 2018/04/14 Fontinst v1.933 font definitions for U/ntxmia. -) -LaTeX Font Info: Trying to load font information for U+ntxsym on input line -42. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\untxsym.fd -File: untxsym.fd 2023/08/16 Fontinst v1.933 font definitions for U/ntxsym. -) -LaTeX Font Info: Trying to load font information for U+ntxsyc on input line -42. - -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\untxsyc.fd -File: untxsyc.fd 2012/04/12 Fontinst v1.933 font definitions for U/ntxsyc. -) -LaTeX Font Info: Font shape `LYG/bigygoth/m/n' will be -(Font) scaled to size 51.85pt on input line 42. -LaTeX Font Info: Font shape `T1/ntxtlf/b/n' will be -(Font) scaled to size 10.0pt on input line 42. -LaTeX Font Info: Font shape `T1/ntxtlf/b/n' will be -(Font) scaled to size 8.0pt on input line 42. -LaTeX Font Info: Font shape `T1/ntxtlf/m/it' will be -(Font) scaled to size 9.0pt on input line 42. - -(Articles.tex -LaTeX Font Info: Font shape `T1/ntxtlf/m/it' will be -(Font) scaled to size 10.0pt on input line 1. -LaTeX Font Info: Font shape `T1/ntxtlf/m/it' will be -(Font) scaled to size 20.74pt on input line 1. -LaTeX Font Info: Font shape `T1/ntxtlf/m/sc' will be -(Font) scaled to size 10.0pt on input line 2. -Package microtype Info: Character `029' is missing -(microtype) in font `T1/ntxtlf/m/sc/10'. -(microtype) Ignoring protrusion settings for this character. -LaTeX Font Info: Font shape `T1/ntxtlf/m/sc' will be -(Font) scaled to size 14.4pt on input line 2. -Package microtype Info: Character `029' is missing -(microtype) in font `T1/ntxtlf/m/sc/14.4'. -(microtype) Ignoring protrusion settings for this character. -LaTeX Font Info: Font shape `T1/ntxtlf/m/sc' will be -(Font) scaled to size 8.0pt on input line 2. -Package microtype Info: Character `029' is missing -(microtype) in font `T1/ntxtlf/m/sc/8'. -(microtype) Ignoring protrusion settings for this character. -LaTeX Font Info: Font shape `T1/ntxtlf/m/n' will be -(Font) scaled to size 8.0pt on input line 2. - -File: Images/ProfilePictures/Diede.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Diede.jpg used on input line 3 -. -(pdftex.def) Requested size: 64.78433pt x 86.25955pt. - -File: Images/Articles/Circus Barones.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Circus Barones.jpg used on input line - 5. -(pdftex.def) Requested size: 752.81065pt x 1338.99925pt. -File: Images/ProfilePictures/Diede.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Diede.jpg used on input line 1 -0. -(pdftex.def) Requested size: 64.78433pt x 86.25955pt. - -File: Images/Articles/Dagje Utrecht.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Dagje Utrecht.jpg used on input line -12. -(pdftex.def) Requested size: 2328.69434pt x 3099.57248pt. - -File: Images/ProfilePictures/Dien.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Dien.jpg used on input line 17 -. -(pdftex.def) Requested size: 64.78433pt x 69.41737pt. - -File: Images/Articles/En hedde gij meubelen,en hedde gij huisgerief..jpg Graphi -c file (type jpg) - -Package pdftex.def Info: Images/Articles/En hedde gij meubelen,en hedde gij hui -sgerief..jpg used on input line 19. -(pdftex.def) Requested size: 4014.99026pt x 3011.24269pt. -LaTeX Font Info: Font shape `T1/ntxtlf/m/n' will be -(Font) scaled to size 20.74pt on input line 22. - [1 - -{C:/Users/douwe/AppData/Local/MiKTeX/fonts/map/pdftex/pdftex.map}{C:/Users/douw -e/AppData/Local/Programs/MiKTeX/fonts/enc/dvips/newtx/ntx-ec-tlf.enc}{C:/Users/ -douwe/AppData/Local/Programs/MiKTeX/fonts/enc/dvips/newtx/ntx-ec-tlf-pc.enc} <. -/Images/ProfilePictures/Diede.jpg> <./Images/Articles/Circus Barones.jpg> <./Im -ages/Articles/Dagje Utrecht.jpg> <./Images/ProfilePictures/Dien.jpg>] - -File: Images/ProfilePictures/Chris.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Chris.jpg used on input line 2 -4. -(pdftex.def) Requested size: 64.78433pt x 86.36467pt. - - -LaTeX Warning: File `Images/ProfilePictures/Geert.jpg' not found on input line -24. - - -! Package pdftex.def Error: File `Images/ProfilePictures/Geert.jpg' not found: -using draft setting. - -See the pdftex.def package documentation for explanation. -Type H for immediate help. - ... - -l.24 ...}{Images/ProfilePictures/Geert.jpg}{Geert} - -? -LaTeX Font Info: Trying to load font information for T1+ntxtt on input line -24. -(C:\Users\douwe\AppData\Local\Programs\MiKTeX\tex/latex/newtx\t1ntxtt.fd -File: t1ntxtt.fd 2012/04/20 v3.1 -) -LaTeX Font Info: Font shape `T1/ntxtt/m/n' will be -(Font) scaled to size 10.0pt on input line 24. -Package microtype Info: Loading generic protrusion settings for font family -(microtype) `ntxtt' (encoding: T1). -(microtype) For optimal results, create family-specific settings. -(microtype) See the microtype manual for details. - -Overfull \hbox (2.60533pt too wide) in paragraph at lines 24--25 -[]$[]$ - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 24--25 - - [] - - -File: Images/Articles/Het leven van alle dag.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Het leven van alle dag.jpg used on in -put line 26. -(pdftex.def) Requested size: 4143.46994pt x 3107.60246pt. - -File: Images/ProfilePictures/Annick.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Annick.jpg used on input line -31. -(pdftex.def) Requested size: 64.78433pt x 64.76157pt. - -! LaTeX Error: Unicode character 😜 (U+1F61C) - not set up for use with LaTeX. - -See the LaTeX manual or LaTeX Companion for explanation. -Type H for immediate help. - ... - -l.32 ...e achternaam weer alle eer aangedaan. 😜 - -? - -File: Images/Articles/Workshop houtbranden.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Workshop houtbranden.jpg used on inpu -t line 33. -(pdftex.def) Requested size: 1246.65446pt x 1633.09729pt. -File: Images/ProfilePictures/Annick.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Annick.jpg used on input line -38. -(pdftex.def) Requested size: 64.78433pt x 64.76157pt. - - -File: Images/Articles/Escapewandeling Hasselt.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Escapewandeling Hasselt.jpg used on i -nput line 40. -(pdftex.def) Requested size: 1246.65446pt x 1648.15349pt. -File: Images/ProfilePictures/Annick.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Annick.jpg used on input line -45. -(pdftex.def) Requested size: 64.78433pt x 64.76157pt. - -! LaTeX Error: Unicode character 😝 (U+1F61D) - not set up for use with LaTeX. - -See the LaTeX manual or LaTeX Companion for explanation. -Type H for immediate help. - ... - -l.46 ...nt daar wel ergens familie van mekaar 😝 - . Heerlijk om zo nog eens ... - -? - -! LaTeX Error: Unicode character 🙏 (U+1F64F) - not set up for use with LaTeX. - -See the LaTeX manual or LaTeX Companion for explanation. -Type H for immediate help. - ... - -l.46 ...n bompa te gaan slapen. Nogmaals dank 🙏 - -? - -File: Images/Articles/Schümbroekse diskonaaijt in de spiegeltent van Schoonbro -ek leeft.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Schümbroekse diskonaaijt in de spiege -ltent van Schoonbroek leeft.jpg used on input line 47. -(pdftex.def) Requested size: 1246.65446pt x 950.54893pt. - -Overfull \vbox (26.0125pt too high) has occurred while \output is active [] - - -[2 <./Images/Articles/En hedde gij meubelen,en hedde gij huisgerief..jpg> <./Im -ages/ProfilePictures/Chris.jpg> <./Images/Articles/Het leven van alle dag.jpg> -<./Images/ProfilePictures/Annick.jpg> <./Images/Articles/Workshop houtbranden.j -pg> <./Images/Articles/Escapewandeling Hasselt.jpg>] - -File: Images/ProfilePictures/Cedric.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Cedric.jpg used on input line -52. -(pdftex.def) Requested size: 64.78433pt x 64.77948pt. - -File: Images/Articles/Een dagje zoo.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Een dagje zoo.jpg used on input line -54. -(pdftex.def) Requested size: 1246.65446pt x 904.37656pt. -File: Images/ProfilePictures/Cedric.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Cedric.jpg used on input line -59. -(pdftex.def) Requested size: 64.78433pt x 64.77948pt. - -File: Images/Articles/Kerstfeestje in de leefgroep.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Kerstfeestje in de leefgroep.jpg used - on input line 61. -(pdftex.def) Requested size: 1246.65446pt x 1652.16847pt. -File: Images/ProfilePictures/Cedric.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Cedric.jpg used on input line -66. -(pdftex.def) Requested size: 64.78433pt x 64.77948pt. - -File: Images/Articles/Zalig Kerstfeest!!!!.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Zalig Kerstfeest!!!!.jpg used on inpu -t line 68. -(pdftex.def) Requested size: 1246.65446pt x 1646.146pt. - -Underfull \hbox (badness 10000) in paragraph at lines 67--69 -[]\T1/ntxtlf/m/n/10 (+20) Dit kerst-man-neke wenst heel - [] - - -Underfull \hbox (badness 5374) in paragraph at lines 67--69 -\T1/ntxtlf/m/n/10 (+20) de fa-mi-lie ne za-lige Kerst-mis!!!! - [] - - -File: Images/ProfilePictures/Gunter.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Gunter.jpg used on input line -73. -(pdftex.def) Requested size: 64.78433pt x 64.7838pt. - -File: Images/Articles/Marathon.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Marathon.jpg used on input line 75. -(pdftex.def) Requested size: 3011.24269pt x 4014.99026pt. - -File: Images/ProfilePictures/Douwe.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Douwe.jpg used on input line 8 -0. -(pdftex.def) Requested size: 64.78433pt x 69.40376pt. - -File: Images/ProfilePictures/Pauline.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Pauline.jpg used on input line - 80. -(pdftex.def) Requested size: 64.78433pt x 68.74008pt. - -Overfull \hbox (2.60533pt too wide) in paragraph at lines 80--81 -[]$[]$ - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 80--81 - - [] - - -File: Images/Articles/Going to 'Murica .jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Going to 'Murica .jpg used on input l -ine 82. -(pdftex.def) Requested size: 303.13176pt x 404.51025pt. - -Overfull \vbox (26.0125pt too high) has occurred while \output is active [] - - -[3 <./Images/Articles/Schümbroekse diskonaaijt in de spiegeltent van Schoonbro -ek leeft.jpg> <./Images/ProfilePictures/Cedric.jpg> <./Images/Articles/Een dagj -e zoo.jpg> <./Images/Articles/Kerstfeestje in de leefgroep.jpg> <./Images/Artic -les/Zalig Kerstfeest!!!!.jpg> <./Images/ProfilePictures/Gunter.jpg> <./Images/A -rticles/Marathon.jpg>] -File: Images/ProfilePictures/Douwe.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Douwe.jpg used on input line 8 -7. -(pdftex.def) Requested size: 64.78433pt x 69.40376pt. -File: Images/ProfilePictures/Pauline.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Pauline.jpg used on input line - 87. -(pdftex.def) Requested size: 64.78433pt x 68.74008pt. - -Overfull \hbox (2.60533pt too wide) in paragraph at lines 87--88 -[]$[]$ - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 87--88 - - [] - - -File: Images/Articles/Eerste kerstboom in Brugge.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Eerste kerstboom in Brugge.jpg used o -n input line 89. -(pdftex.def) Requested size: 1517.6663pt x 2023.55507pt. - -File: Images/ProfilePictures/Daan.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Daan.jpg used on input line 94 -. -(pdftex.def) Requested size: 64.78433pt x 64.78043pt. - -File: Images/ProfilePictures/Kyala.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Kyala.jpg used on input line 9 -4. -(pdftex.def) Requested size: 64.78433pt x 69.5989pt. - -Overfull \hbox (2.60533pt too wide) in paragraph at lines 94--95 -[]$[]$ - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 94--95 - - [] - - -! LaTeX Error: Unicode character 🎨 (U+1F3A8) - not set up for use with LaTeX. - -See the LaTeX manual or LaTeX Companion for explanation. -Type H for immediate help. - ... - -l.95 ... kleuren gewoon niet te plannen zijn. 🎨 - ✨ -? - -! LaTeX Error: Unicode character ✨ (U+2728) - not set up for use with LaTeX. - -See the LaTeX manual or LaTeX Companion for explanation. -Type H for immediate help. - ... - -l.95 ...euren gewoon niet te plannen zijn. 🎨✨ - -? - -File: Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg Graphic file (type - jpg) - -Package pdftex.def Info: Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg - used on input line 96. -(pdftex.def) Requested size: 1084.04736pt x 1927.19533pt. - -File: Images/ProfilePictures/Michel.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/ProfilePictures/Michel.jpg used on input line -101. -(pdftex.def) Requested size: 64.78433pt x 63.8882pt. - -File: Images/Articles/Mini cooper met zwembad.jpg Graphic file (type jpg) - -Package pdftex.def Info: Images/Articles/Mini cooper met zwembad.jpg used on i -nput line 103. -(pdftex.def) Requested size: 722.69823pt x 1605.99611pt. - -Overfull \vbox (26.0125pt too high) has occurred while \output is active [] - - -[4 <./Images/ProfilePictures/Douwe.jpg> <./Images/ProfilePictures/Pauline.jpg> -<./Images/Articles/Going to 'Murica .jpg> <./Images/Articles/Eerste kerstboom i -n Brugge.jpg> <./Images/ProfilePictures/Daan.jpg> <./Images/ProfilePictures/Kya -la.jpg> <./Images/Articles/Advertentie Oeps, Kleurenavontuur!.jpg> <./Images/Pr -ofilePictures/Michel.jpg>]) -Overfull \vbox (26.0125pt too high) has occurred while \output is active [] - - -[5 <./Images/Articles/Mini cooper met zwembad.jpg>] (Main.aux) - *********** -LaTeX2e <2023-11-01> -L3 programming layer <2020/03/25> - *********** - ) -Here is how much of TeX's memory you used: - 21150 strings out of 474495 - 403756 string characters out of 5743934 - 1949460 words of memory out of 5000000 - 42906 multiletter control sequences out of 15000+600000 - 611790 words of font info for 129 fonts, out of 8000000 for 9000 - 1141 hyphenation exceptions out of 8191 - 95i,13n,107p,1073b,934s stack positions out of 10000i,1000n,20000p,200000b,200000s - -Output written on Main.pdf (5 pages, 21735817 bytes). -PDF statistics: - 85 PDF objects out of 1000 (max. 8388607) - 0 named destinations out of 1000 (max. 500000) - 26767 words of extra memory for PDF output out of 29859 (max. 10000000) - diff --git a/Latex/Main.tex b/Latex/Main.tex deleted file mode 100644 index dea2a7a..0000000 --- a/Latex/Main.tex +++ /dev/null @@ -1,50 +0,0 @@ -\documentclass{article} - -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} -\usepackage{microtype} - -\usepackage{newspaper} - -\usepackage[dutch]{babel} - -\date{\today} -\currentvolume{1} -\currentissue{1} - -%% The banner headline on the first page -%% (The colon after s: is to get a more -%% modern majuscule s in this font instead of -%% the medieval tall s. -\SetPaperName{Proo{s:}tenKrant} - -%% The name used in the running header after -%% the first page -\SetHeaderName{ProostenKrant} - -%% and also... -\SetPaperLocation{Regio Kempen} -\SetPaperSlogan{``Een krant van en voor Proosten.''} -\SetPaperPrice{NUL EURO} - -\usepackage{graphicx} -\usepackage{tikz} -\usepackage{multicol} -\usepackage{subfiles} -\usepackage{newspaper-mod} - - -%%%%%%%%% Front matter %%%%%%%%%% - -\usepackage{lipsum} - -\begin{document} -\maketitle - -\begin{multicols}{3} - -\subfile{Articles} - -\newpage -\end{multicols} -\end{document} \ No newline at end of file diff --git a/Latex/newspaper-mod.sty b/Latex/newspaper-mod.sty deleted file mode 100644 index e193d65..0000000 --- a/Latex/newspaper-mod.sty +++ /dev/null @@ -1,50 +0,0 @@ -\usepackage{newtxtext,newtxmath} -\usepackage{etoolbox} -\newcommand{\headlinestyle}{\itshape\huge} -\newcommand{\bylinestyle}{\scshape\Large} -\patchcmd{\headline}{#1}{\headlinestyle #1}{}{} -\patchcmd{\byline}{#1}{\bylinestyle #1}{}{} - -\newcommand{\showInlineImage}[2] -{ -$ -\begin{array}{c} - \resizebox{0.8\columnwidth}{!}{\includegraphics{#1}} \\ - $#2$ -\end{array} -$ -} - - -\newcommand{\showOneWriter}[2] -{ -$ -\hfill -\begin{array}{c} - \begin{tikzpicture} - \clip (0,0) circle (0.2\columnwidth) ; - \node[anchor=center] at (0,0) {\includegraphics[width=0.4\columnwidth]{#1}}; - \end{tikzpicture} \\ - $#2$ -\end{array} -\hfill -$ -} - -\newcommand{\showTwoWriters}[4] -{ -$ -\begin{array}{cc} - \begin{tikzpicture} - \clip (0,0) circle (0.2\columnwidth) ; - \node[anchor=center] at (0,0) {\includegraphics[width=0.4\columnwidth]{#1}}; - \end{tikzpicture} - & - \begin{tikzpicture} - \clip (0,0) circle (0.2\columnwidth) ; - \node[anchor=center] at (0,0) {\includegraphics[width=0.4\columnwidth]{#3}}; - \end{tikzpicture} \\ - $#2$ & $#4$ -\end{array} -$ -} diff --git a/README.md b/README.md index d9fc404..e342db9 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,6 @@ nu aangestuurd vanuit .NET. docker compose up -d --build ``` -Regressietest (draait tegen de draaiende stack; maakt testartikelen en drukt een proefeditie): - -```bash -scripts/e2e-test.sh -``` - Daarna: - Website: http://localhost:8080 @@ -76,18 +70,28 @@ proostenkrant.net/ ├── src/ProostenKrant/ # Blazor-applicatie │ ├── Components/Pages/ # Alle pagina's (Razor, static SSR) │ ├── Services/ # Db, ArticleService, LatexService, auth, uploads -│ └── wwwroot/ # css, fonts, EU-vlag, uploads (volume-mounted) +│ └── wwwroot/ # css, fonts, EU-vlag (resources volume-mounted) ├── deploy/ │ ├── Dockerfile # Build + runtime met texlive (gecachete laag) │ └── mysql/init.sql # Database-initialisatie -├── compose.yml # app + mysql stack -├── app/ # (legacy) PHP-versie — niet verwijderd, zie hieronder -└── Latex/ # (legacy) origineel krantenontwerp ter referentie +├── resources/ +│ ├── archive/ # Gedrukte edities (PDF's) +│ ├── images/ +│ │ ├── profiles/ # Profielfoto's (naam = weergavenaam) +│ │ └── articles/ # Artikelafbeeldingen (via website geüpload) +│ └── templates/latex/ # LaTeX-ontwerp ter referentie +└── compose.yml # app + mysql stack ``` -De artikel- en profielfoto's uit de PHP-versie worden hergebruikt via volumes: -`app/public/images/articles` en `app/public/images/profiles` worden gekoppeld aan de -uploadmappen van de Blazor-app. De gedrukte PDF's landen in `app/storage/latex`. +De volledige resources-map wordt via volumes aan de app gekoppeld: + +- `resources/images` → `wwwroot/resources/images` — profielfoto's en + artikelafbeeldingen. Een profielfoto hoort bij een familielid als de + bestandsnaam (zonder extensie) overeenkomt met de weergavenaam + (`Geert.jpg` → Geert). Een later toegevoegde foto wordt dus automatisch + gekoppeld; een verwijderde foto valt terug op `Unknown.jpg`. +- `resources/archive` → `/app/archive` — de bestaande archief-edities + worden getoond en pas gedrukte kranten worden hier bewaard. De Europese vlag in de voettekst is een SVG (`src/ProostenKrant/wwwroot/images/european-flag.svg`) volgens de officiële specificaties (12 gouden sterren, cirkelradius ⅓ van de hoogte). @@ -103,8 +107,9 @@ volgens de officiële specificaties (12 gouden sterren, cirkelradius ⅓ van de 4. Zet eventueel een reverse proxy met HTTPS (Caddy/nginx) voor `http://server:8080`. Overweeg de MySQL-poort (`3306`) dicht te zetten in `compose.yml` als de database niet van buitenaf benodigd is. -5. Backups: `resources/` (repo), `app/public/images/` (foto's) en de mysql-data volume - bevatten alles; `docker compose down -v` verwijdert de data definitief. +5. Backups: de `resources/`-map (foto's, artikelafbeeldingen, archief-PDF's) en + de mysql-data volume bevatten alles; `docker compose down -v` verwijdert de + data definitief. De eerste build installeert texlive eenmalig (±2 GB, enkele minuten); daarna pakken Docker-lagen alles en duurt een rebuild seconden. @@ -116,9 +121,16 @@ Omgevingsvariabelen (of `.env`): - `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASSWORD` — database (standaard `mysql`/`proostenkrant`) - `UNIVERSAL_PASSWORD` — inlogwachtwoord en paszin (standaard `ProostenKrant2024!`) +Paden (standaarden in `appsettings.json`, sectie `Paths`): + +- `StaticArchive` / `LatexOutput` — map voor archief-edities én pas gedrukte + kranten (`archive`, gekoppeld aan `resources/archive`) +- `ResourceImages` — map voor afbeeldingen uit de resources (`resources/images`, + gekoppeld aan `resources/images`; submappen `profiles` en `articles`) + ## Legacy PHP-versie -De oude PHP-applicatie staat nog in `app/` en is niet verwijderd; de oude -`docker-compose`-bestanden zijn verplaatst naar `legacy/` zodat Compose automatisch -de Blazor-stack (`compose.yml`) pakt. Zodra de Blazor-versie goedgekeurd is, kunnen -`app/`, `docker/` en `legacy/` worden opgeruimd. +De oude PHP-applicatie is opgeruimd; de foto's en archief-PDF's zijn verplaatst +naar de `resources/`-map. Alleen de oude `docker/`-map (nginx/php-config van de +PHP-versie) staat nog in de repo en kan verwijderd worden — de Blazor-stack +gebruikt enkel `compose.yml` en `deploy/Dockerfile`. diff --git a/app/config/app.php b/app/config/app.php deleted file mode 100755 index 8349d60..0000000 --- a/app/config/app.php +++ /dev/null @@ -1,26 +0,0 @@ - 'ProostenKrant', - 'app_description' => 'Een krant van en voor Proosten', - 'app_slogan' => 'Een krant van en voor Proosten', - - 'universal_password' => getenv('UNIVERSAL_PASSWORD') ?: 'wachtwoord', - - 'upload_paths' => [ - 'articles' => __DIR__ . '/../public/images/articles/', - 'profiles' => __DIR__ . '/../public/images/profiles/', - ], - - 'latex_paths' => [ - 'templates' => __DIR__ . '/../templates/latex/', - 'output' => __DIR__ . '/../storage/latex/', - ], - - 'seasons' => [ - 1 => ['name' => 'Lente', 'color' => '#90EE90'], - 2 => ['name' => 'Zomer', 'color' => '#FFD700'], - 3 => ['name' => 'Herfst', 'color' => '#FF8C00'], - 4 => ['name' => 'Winter', 'color' => '#ADD8E6'], - ], -]; diff --git a/app/config/database.php b/app/config/database.php deleted file mode 100755 index 9500aad..0000000 --- a/app/config/database.php +++ /dev/null @@ -1,10 +0,0 @@ - getenv('DB_HOST') ?: 'mysql', - 'database' => getenv('DB_NAME') ?: 'proostenkrant', - 'username' => getenv('DB_USER') ?: 'proostenkrant', - 'password' => getenv('DB_PASSWORD') ?: 'proostenkrant', - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', -]; diff --git a/app/config/routes.php b/app/config/routes.php deleted file mode 100755 index 4040aea..0000000 --- a/app/config/routes.php +++ /dev/null @@ -1,45 +0,0 @@ - [ - '/' => 'PublicController@index', - '/index.php' => 'PublicController@index', - '/archive' => 'PublicController@archive', - - // Submission routes - '/submit' => 'SubmissionController@showPassphrase', - '/submit/passphrase' => 'SubmissionController@showPassphrase', - '/submit/form' => 'SubmissionController@showForm', - '/submit/confirmation' => 'SubmissionController@showConfirmation', - '/submit/edit' => 'SubmissionController@showEditPassphrase', - '/submit/edit/list' => 'SubmissionController@showEditList', - '/submit/edit/(\d+)' => 'SubmissionController@showWriterVerification', - - // Legacy routes (for logged in users) - '/login' => 'AuthController@showLogin', - '/logout' => 'AuthController@logout', - '/dashboard' => 'DashboardController@index', - '/articles' => 'ArticleController@index', - '/articles/new' => 'ArticleController@new', - '/articles/create' => 'ArticleController@create', - '/articles/(\d+)' => 'ArticleController@show', - '/articles/(\d+)/verify-writer' => 'ArticleController@showVerifyWriter', - '/articles/(\d+)/verify-passphrase' => 'ArticleController@showVerifyPassphrase', - '/seasons' => 'SeasonController@index', - '/generate-pdf' => 'PdfController@generate', - ], - 'POST' => [ - // Submission routes - '/submit/verify' => 'SubmissionController@verifyPassphrase', - '/submit/store' => 'SubmissionController@store', - '/submit/edit/verify' => 'SubmissionController@verifyEditPassphrase', - '/submit/edit/verify-writer' => 'SubmissionController@verifyWriter', - - // Legacy routes - '/login' => 'AuthController@login', - '/articles' => 'ArticleController@store', - '/upload-image' => 'UploadController@upload', - '/articles/verify-writer' => 'ArticleController@verifyWriter', - '/articles/verify-passphrase' => 'ArticleController@verifyPassphrase', - ], -]; diff --git a/app/public/.htaccess.bak b/app/public/.htaccess.bak deleted file mode 100755 index 2068705..0000000 --- a/app/public/.htaccess.bak +++ /dev/null @@ -1,19 +0,0 @@ - - RewriteEngine On - RewriteBase / - - # Redirect all requests to index.php - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)$ index.php [QSA,L] - - -# Allow .htaccess overrides -AllowOverride All - -# PHP settings - - php_value upload_max_filesize 50M - php_value post_max_size 52M - php_value max_execution_time 300 - diff --git a/app/public/css/douwco-style.css b/app/public/css/douwco-style.css deleted file mode 100755 index 44adfbe..0000000 --- a/app/public/css/douwco-style.css +++ /dev/null @@ -1,1291 +0,0 @@ -/* ===== Font Faces ===== */ -@font-face { - font-family: 'Righteous'; - src: url('/assets/fonts/Righteous-Regular.ttf') format('truetype'); - font-display: swap; -} - -@font-face { - font-family: 'Montserrat'; - src: url('/assets/fonts/Montserrat-Regular.ttf') format('truetype'); - font-display: swap; -} - -@font-face { - font-family: 'Montserrat'; - src: url('/assets/fonts/Montserrat-Bold.ttf') format('truetype'); - font-weight: bold; - font-display: swap; -} - -/* ===== CSS Variables ===== */ -:root { - --background-clr: #283e3e; - --background-accent-clr: #324f4f; - --blue-clr: #47bcdf; - --green-clr: #6ede9a; - --white-clr: #ffffff; - --card-border-radius: 25px; - --dark-green: #1a3d2e; - --dark-teal: #2c5f5f; - --orange-clr: #f39c12; - --text-color: #e0e0e0; - --text-muted: #a0a0a0; - --border-clr: #4a6a6a; - --success-clr: #2ecc71; - --error-clr: #e74c3c; - --warning-clr: #f39c12; -} - -/* ===== Reset and Base Styles ===== */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html, body { - height: 100%; - margin: 0; - padding: 0; - font-size: 18px; -} - -body { - font-family: 'Montserrat', sans-serif; - background-color: var(--background-clr); - color: var(--text-color); - line-height: 1.6; - display: flex; - flex-direction: column; - min-height: 100vh; -} - -/* ===== Typography ===== */ -.title { - font-family: 'Righteous', sans-serif; -} - -h1, h2, h3, h4, h5, h6 { - font-family: 'Righteous', sans-serif; - color: var(--white-clr); -} - -a { - color: var(--blue-clr); - text-decoration: none; - transition: color 0.3s ease; -} - -a:hover { - color: var(--green-clr); -} - -/* ===== Layout ===== */ -.container { - max-width: 1400px; - margin: 0 auto; - padding: 0 20px; - width: 100%; -} - -header { - background-color: var(--background-clr); - padding: 20px 0; - border-bottom: 1px solid var(--border-clr); -} - -main { - flex: 1; - padding: 30px 0; -} - -footer { - background-color: var(--background-clr); - color: var(--text-muted); - padding: 20px 0; - border-top: 1px solid var(--border-clr); - flex-shrink: 0; -} - -.footer-content { - display: flex; - justify-content: space-between; - align-items: center; - max-width: 1200px; - margin: 0 auto; - padding: 0 20px; -} - -.copyright { - color: var(--text-muted); - font-size: 0.9rem; -} - -.hosted { - color: var(--text-muted); - font-size: 0.9rem; -} - -.eu-flag { - display: inline-block; - width: 20px; - height: 14px; - background: linear-gradient(to bottom, #003399 0%, #003399 33%, #ffcc00 33%, #ffcc00 66%, #003399 66%); - border-radius: 2px; - vertical-align: middle; - margin: 0 5px; - box-shadow: 0 0 2px rgba(0,0,0,0.5); - position: relative; -} - -.eu-flag::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: repeating-linear-gradient( - 45deg, - transparent, - transparent 2px, - rgba(255,255,255,0.3) 2px, - rgba(255,255,255,0.3) 4px - ); - border-radius: 2px; -} - -/* ===== Header/Navigation ===== */ -.header-content { - text-align: center; - margin-bottom: 20px; -} - -.logo { - font-size: 3rem; - font-weight: bold; - color: var(--white-clr); - margin-bottom: 5px; -} - -.logo a { - color: var(--white-clr); - text-decoration: none; -} - -.logo a:hover { - color: var(--green-clr); -} - -.slogan { - font-size: 1.3rem; - color: var(--text-muted); - margin-bottom: 5px; -} - -.nav { - display: flex; - justify-content: center; - gap: 20px; - flex-wrap: wrap; - padding-top: 20px; - border-top: 1px solid var(--border-clr); -} - -.nav a { - color: var(--white-clr); - text-decoration: none; - padding: 10px 20px; - border-radius: 10px; - transition: all 0.3s ease; - font-weight: 500; -} - -.nav a:hover { - background-color: var(--background-accent-clr); - color: var(--green-clr); -} - -.nav a.btn { - background-color: var(--green-clr); - color: var(--background-clr); -} - -.nav a.btn:hover { - background-color: #5ed58a; - color: var(--background-clr); -} - -/* ===== Buttons ===== */ -.btn { - display: inline-block; - padding: 12px 24px; - background-color: var(--green-clr); - color: var(--background-clr); - text-decoration: none; - border: none; - border-radius: 10px; - cursor: pointer; - font-size: 1rem; - font-weight: bold; - transition: all 0.3s ease; - text-align: center; -} - -.btn:hover { - background-color: #5ed58a; - transform: translateY(-2px); -} - -.btn-primary { - background-color: var(--green-clr); - color: var(--background-clr); -} - -.btn-primary:hover { - background-color: #5ed58a; -} - -.btn-secondary { - background-color: var(--background-accent-clr); - color: var(--white-clr); - border: 1px solid var(--border-clr); -} - -.btn-secondary:hover { - background-color: var(--border-clr); -} - -.btn-small { - padding: 8px 12px; - font-size: 0.9rem; - background-color: var(--background-accent-clr); - color: var(--white-clr); -} - -.btn-small:hover { - background-color: var(--border-clr); -} - -.btn-icon { - padding: 10px; - border-radius: 50%; - width: 40px; - height: 40px; - display: inline-flex; - align-items: center; - justify-content: center; -} - -.btn-danger { - background-color: var(--error-clr); - color: var(--white-clr); -} - -.btn-danger:hover { - background-color: #c0392b; -} - -/* ===== Cards ===== */ -.card { - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - padding: 25px; - margin-bottom: 20px; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); - border: 1px solid var(--border-clr); -} - -.card h2, .card h3, .card h4 { - color: var(--green-clr); - margin-bottom: 15px; -} - -.card-title { - font-family: 'Righteous', sans-serif; - color: var(--green-clr); - font-size: 1.5rem; - margin-bottom: 10px; -} - -.card-content { - color: var(--text-color); - line-height: 1.7; -} - -/* ===== Article Cards ===== */ -.article-card { - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - padding: 25px; - margin-bottom: 20px; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); - border: 1px solid var(--border-clr); - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.article-card:hover { - transform: translateY(-5px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.5); -} - -.article-card .article-title { - font-family: 'Righteous', sans-serif; - color: var(--green-clr); - font-size: 1.5rem; - margin-bottom: 10px; -} - -.article-card .article-meta { - color: var(--text-muted); - font-size: 0.9rem; - margin-bottom: 15px; - display: flex; - flex-wrap: wrap; - gap: 10px; -} - -.article-card .article-meta span { - display: inline-flex; - align-items: center; - gap: 5px; -} - -.article-card .article-meta span::before { - content: ''; - display: inline-block; - width: 4px; - height: 4px; - background-color: var(--green-clr); - border-radius: 50%; -} - -.article-card .article-text { - color: var(--text-color); - line-height: 1.7; - margin-bottom: 15px; -} - -.article-card .article-image { - width: 100%; - max-height: 250px; - object-fit: cover; - border-radius: 10px; - margin-top: 15px; - transition: transform 0.3s ease; -} - -.article-card:hover .article-image { - transform: scale(1.02); -} - -/* Redacted text styling for WIP preview */ -.redacted-text { - color: transparent; - background-color: var(--border-clr); - border-radius: 3px; - padding: 2px 4px; - margin: 2px 0; - display: inline; - line-height: 1.4; -} - -.redacted-text::selection { - background: var(--green-clr); - color: var(--background-clr); -} - -/* ===== Forms ===== */ -.form-group { - display: flex; - flex-direction: column; - gap: 8px; - margin-bottom: 20px; -} - -.form-group label { - font-weight: 500; - color: var(--white-clr); - font-size: 1rem; -} - -.form-control { - padding: 12px 15px; - border: 1px solid var(--border-clr); - border-radius: 8px; - font-size: 1rem; - background-color: var(--background-clr); - color: var(--white-clr); - transition: border-color 0.3s ease, box-shadow 0.3s ease; -} - -.form-control:focus { - border-color: var(--green-clr); - box-shadow: 0 0 0 3px rgba(110, 222, 154, 0.2); - outline: none; -} - -.form-control.error { - border-color: var(--error-clr); -} - -.form-control::placeholder { - color: var(--text-muted); -} - -textarea.form-control { - resize: vertical; - min-height: 120px; -} - -select.form-control { - cursor: pointer; - appearance: none; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ffffff' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right 15px center; - padding-right: 40px; -} - -select.form-control option { - background-color: var(--background-clr); - color: var(--white-clr); -} - -.error-message { - color: var(--error-clr); - font-size: 0.85rem; - margin-top: 5px; -} - -.help-text { - color: var(--text-muted); - font-size: 0.85rem; - font-style: italic; -} - -/* ===== Form Rows and Layout ===== */ -.form-row { - display: flex; - gap: 20px; - margin-bottom: 20px; -} - -.form-row .form-group { - flex: 1; -} - -.form-row .full-width { - flex: none; - width: 100%; -} - -.form-actions { - display: flex; - gap: 15px; - margin-top: 30px; -} - -/* ===== Checkbox and Radio ===== */ -.checkbox-group, .radio-group { - display: flex; - flex-wrap: wrap; - gap: 12px; - margin-top: 10px; -} - -.checkbox-label, .radio-label { - display: flex; - align-items: center; - gap: 8px; - cursor: pointer; - padding: 10px 15px; - background-color: var(--background-clr); - border: 1px solid var(--border-clr); - border-radius: 8px; - transition: all 0.3s ease; - font-size: 0.95rem; -} - -.checkbox-label:hover, .radio-label:hover { - background-color: var(--background-accent-clr); - border-color: var(--green-clr); -} - -.checkbox-label input[type="checkbox"], -.checkbox-label input[type="radio"], -.radio-label input[type="checkbox"], -.radio-label input[type="radio"] { - cursor: pointer; - width: 18px; - height: 18px; - accent-color: var(--green-clr); -} - -/* ===== Alerts and Notifications ===== */ -.alert { - padding: 15px 20px; - margin-bottom: 20px; - border-radius: 10px; - display: flex; - justify-content: space-between; - align-items: center; - animation: slideIn 0.5s ease; -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.alert-success { - background-color: rgba(46, 204, 113, 0.15); - color: var(--green-clr); - border: 1px solid var(--green-clr); -} - -.alert-error { - background-color: rgba(231, 76, 60, 0.15); - color: var(--error-clr); - border: 1px solid var(--error-clr); -} - -.alert-warning { - background-color: rgba(243, 156, 18, 0.15); - color: var(--warning-clr); - border: 1px solid var(--warning-clr); -} - -.alert .close { - cursor: pointer; - font-weight: bold; - padding: 0 10px; - background: transparent; - border: none; - color: inherit; - font-size: 1.2rem; -} - -.alert .close:hover { - opacity: 0.7; -} - -/* ===== Section Headings ===== */ -.section { - margin-bottom: 40px; -} - -.section-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - padding-bottom: 10px; - border-bottom: 1px solid var(--border-clr); -} - -.section-header h2 { - color: var(--green-clr); - font-family: 'Righteous', sans-serif; - font-size: 2rem; -} - -.section-actions { - display: flex; - gap: 10px; -} - -.section-title { - text-align: center; - margin-bottom: 30px; -} - -.section-title h2 { - color: var(--green-clr); - font-family: 'Righteous', sans-serif; - font-size: 2.2rem; -} - -/* ===== Grids ===== */ -.articles-grid, -.cards-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); - gap: 25px; - margin: 20px 0; -} - -/* ===== Tables ===== */ -.table { - width: 100%; - border-collapse: collapse; - margin: 20px 0; -} - -.table th, -.table td { - padding: 15px; - text-align: left; - border-bottom: 1px solid var(--border-clr); -} - -.table th { - background-color: var(--background-clr); - color: var(--white-clr); - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.table tr:hover { - background-color: rgba(255, 255, 255, 0.05); -} - -.table tr.selected { - background-color: rgba(110, 222, 154, 0.1); -} - -/* ===== Status Badges ===== */ -.status-badge { - padding: 5px 12px; - border-radius: 20px; - font-size: 0.8rem; - font-weight: 500; - display: inline-block; -} - -.status-badge.published { - background-color: rgba(46, 204, 113, 0.2); - color: var(--green-clr); -} - -.status-badge.draft { - background-color: rgba(243, 156, 18, 0.2); - color: var(--warning-clr); -} - -.status-badge.pending { - background-color: rgba(71, 188, 223, 0.2); - color: var(--blue-clr); -} - -.status-badge.archived { - background-color: rgba(192, 57, 43, 0.2); - color: var(--error-clr); -} - -/* ===== Passphrase/Token Input ===== */ -.passphrase-container { - max-width: 500px; - margin: 50px auto; - padding: 30px; - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - border: 1px solid var(--border-clr); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); -} - -.passphrase-container h2 { - color: var(--green-clr); - text-align: center; - margin-bottom: 20px; -} - -.passphrase-container p { - text-align: center; - color: var(--text-muted); - margin-bottom: 30px; -} - -.passphrase-input { - display: flex; - gap: 15px; -} - -.passphrase-input .form-control { - flex: 1; -} - -/* ===== Confirmation Screen ===== */ -.confirmation-container { - max-width: 600px; - margin: 50px auto; - padding: 40px; - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - border: 1px solid var(--border-clr); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); - text-align: center; -} - -.confirmation-container .icon { - font-size: 4rem; - color: var(--green-clr); - margin-bottom: 20px; -} - -.confirmation-container h2 { - color: var(--green-clr); - margin-bottom: 15px; -} - -.confirmation-container p { - color: var(--text-color); - margin-bottom: 30px; - line-height: 1.8; -} - -/* ===== Archive/PDF List ===== */ -.archive-container { - margin: 30px 0; -} - -.pdf-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 15px 20px; - background-color: var(--background-accent-clr); - border-radius: 10px; - margin-bottom: 15px; - border: 1px solid var(--border-clr); - transition: background-color 0.3s ease; -} - -.pdf-item:hover { - background-color: var(--border-clr); -} - -.pdf-info { - flex: 1; -} - -.pdf-info h4 { - color: var(--green-clr); - margin-bottom: 5px; -} - -.pdf-info p { - color: var(--text-muted); - font-size: 0.9rem; -} - -.pdf-actions { - display: flex; - gap: 10px; -} - -.pdf-icon { - width: 40px; - height: 40px; - background-color: var(--green-clr); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: var(--background-clr); - font-size: 1.2rem; - transition: transform 0.3s ease; -} - -.pdf-icon:hover { - transform: scale(1.1); -} - -/* ===== Edit List ===== */ -.edit-list { - margin: 20px 0; -} - -.edit-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 15px 20px; - background-color: var(--background-accent-clr); - border-radius: 10px; - margin-bottom: 10px; - border: 1px solid var(--border-clr); - transition: all 0.3s ease; -} - -.edit-item:hover { - background-color: var(--border-clr); -} - -.edit-item-title { - flex: 1; - color: var(--white-clr); - font-weight: 500; -} - -.edit-item-actions { - display: flex; - gap: 10px; -} - -.edit-icon { - width: 40px; - height: 40px; - background-color: var(--blue-clr); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: var(--background-clr); - font-size: 1.2rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.edit-icon:hover { - background-color: #3a9ed9; - transform: scale(1.05); -} - -/* ===== Image Upload Preview ===== */ -.image-preview { - margin-top: 20px; - position: relative; -} - -.image-preview-container { - width: 150px; - height: 150px; - border: 2px dashed var(--border-clr); - border-radius: 10px; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - background-color: var(--background-clr); -} - -.image-preview-container img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.image-preview-placeholder { - color: var(--text-muted); - text-align: center; - padding: 20px; -} - -.image-preview-actions { - margin-top: 10px; - display: flex; - gap: 10px; - justify-content: center; -} - -/* Client-side image preview (from file input) */ -.file-upload-wrapper + p.file-upload-info + .image-preview { - display: block; - margin-top: 15px; -} - -.file-upload-wrapper + p.file-upload-info + .image-preview img { - max-width: 200px; - max-height: 200px; - border-radius: 5px; - display: block; -} - -/* ===== Writer Verification ===== */ -.writer-verification { - max-width: 500px; - margin: 50px auto; - padding: 30px; - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - border: 1px solid var(--border-clr); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); -} - -.writer-verification h2 { - color: var(--green-clr); - text-align: center; - margin-bottom: 20px; -} - -.writer-verification p { - text-align: center; - color: var(--text-muted); - margin-bottom: 30px; -} - -.writer-select { - margin-bottom: 20px; -} - -/* ===== Home Page Sections ===== */ -.home-sections { - display: flex; - flex-direction: column; - gap: 40px; -} - -.submit-section { - text-align: center; - padding: 40px; - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - border: 1px solid var(--border-clr); -} - -.submit-section h2 { - color: var(--green-clr); - margin-bottom: 15px; -} - -.submit-section p { - color: var(--text-muted); - margin-bottom: 25px; - max-width: 600px; - margin-left: auto; - margin-right: auto; -} - -.submit-section .btn { - font-size: 1.1rem; - padding: 15px 30px; -} - -.wip-section { - padding: 30px; - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - border: 1px solid var(--border-clr); -} - -.wip-section h2 { - color: var(--green-clr); - margin-bottom: 20px; - text-align: center; -} - -.wip-articles { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 20px; -} - -.wip-article { - background-color: var(--background-clr); - border-radius: 10px; - padding: 20px; - border: 1px solid var(--border-clr); -} - -.wip-article h4 { - color: var(--green-clr); - margin-bottom: 10px; -} - -.wip-article .wip-content { - color: var(--text-muted); - font-style: italic; -} - -.archive-section { - padding: 30px; - background-color: var(--background-accent-clr); - border-radius: var(--card-border-radius, 20px); - border: 1px solid var(--border-clr); -} - -.archive-section h2 { - color: var(--green-clr); - margin-bottom: 20px; - text-align: center; -} - -/* ===== Icons ===== */ -.icon { - display: inline-flex; - align-items: center; - justify-content: center; - vertical-align: middle; -} - -.icon.small { - width: 24px; - height: 24px; - font-size: 14px; -} - -.icon.medium { - width: 36px; - height: 36px; - font-size: 18px; -} - -.icon.large { - width: 48px; - height: 48px; - font-size: 24px; -} - -/* ===== Responsive Design ===== */ -@media (max-width: 768px) { - html, body { - font-size: 16px; - } - - .logo { - font-size: 2.2rem; - } - - .slogan { - font-size: 1rem; - } - - .nav { - flex-direction: column; - align-items: center; - gap: 10px; - } - - .nav a { - padding: 8px 12px; - font-size: 0.9rem; - } - - .container { - padding: 0 15px; - } - - main { - padding: 20px 0; - } - - .form-row { - flex-direction: column; - gap: 0; - } - - .articles-grid, - .cards-grid, - .wip-articles { - grid-template-columns: 1fr; - } - - .form-actions { - flex-direction: column; - } - - .form-actions .btn { - width: 100%; - } - - .section-header { - flex-direction: column; - align-items: flex-start; - gap: 15px; - } - - .alert { - flex-direction: column; - gap: 10px; - text-align: center; - } - - .submit-section p { - font-size: 0.95rem; - } - - .passphrase-input { - flex-direction: column; - } - - .passphrase-input .btn { - width: 100%; - } -} - -@media (max-width: 480px) { - .logo { - font-size: 1.8rem; - } - - .card, - .article-card, - .confirmation-container, - .passphrase-container, - .writer-verification { - padding: 20px; - } - - .section-header h2 { - font-size: 1.5rem; - } - - .btn { - padding: 10px 20px; - font-size: 0.95rem; - } - - .pdf-item, - .edit-item { - flex-direction: column; - gap: 10px; - text-align: center; - } - - .pdf-info p, - .edit-item-title { - font-size: 0.9rem; - } -} - -/* ===== Print Styles ===== */ -@media print { - .nav, - .header-content, - .btn, - .form-actions, - .section-actions { - display: none !important; - } - - .card, - .article-card, - .pdf-item { - box-shadow: none; - border: 1px solid #ccc; - page-break-inside: avoid; - background-color: white !important; - color: black !important; - } - - .card h2, .card h3, .card h4, - .article-card .article-title { - color: #333 !important; - } -} - -/* ===== Animations ===== */ -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes slideUp { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.fade-in { - animation: fadeIn 0.5s ease; -} - -.slide-up { - animation: slideUp 0.5s ease; -} - -/* ===== Utility Classes ===== */ -.text-center { - text-align: center; -} - -.text-muted { - color: var(--text-muted); -} - -.text-green { - color: var(--green-clr); -} - -.text-error { - color: var(--error-clr); -} - -.mt-10 { margin-top: 10px; } -.mt-20 { margin-top: 20px; } -.mt-30 { margin-top: 30px; } -.mb-10 { margin-bottom: 10px; } -.mb-20 { margin-bottom: 20px; } -.mb-30 { margin-bottom: 30px; } - -.p-10 { padding: 10px; } -.p-20 { padding: 20px; } - -.gap-10 { gap: 10px; } -.gap-20 { gap: 20px; } - -/* ===== Scrollbar Styling ===== */ -::-webkit-scrollbar { - width: 10px; - height: 10px; -} - -::-webkit-scrollbar-track { - background: var(--background-clr); -} - -::-webkit-scrollbar-thumb { - background: var(--border-clr); - border-radius: 5px; -} - -::-webkit-scrollbar-thumb:hover { - background: var(--green-clr); -} - -/* ===== File Upload Styling ===== */ -.file-upload-wrapper { - position: relative; - overflow: hidden; - display: inline-block; -} - -.file-upload-wrapper input[type="file"] { - position: absolute; - left: 0; - top: 0; - opacity: 0; - cursor: pointer; - width: 100%; - height: 100%; -} - -.file-upload-label { - display: inline-block; - padding: 12px 24px; - background-color: var(--background-accent-clr); - color: var(--white-clr); - border: 1px solid var(--border-clr); - border-radius: 8px; - cursor: pointer; - transition: all 0.3s ease; -} - -.file-upload-label:hover { - background-color: var(--border-clr); - border-color: var(--green-clr); -} - -.file-upload-info { - margin-top: 10px; - font-size: 0.85rem; - color: var(--text-muted); -} diff --git a/app/public/css/style.css b/app/public/css/style.css deleted file mode 100755 index f357077..0000000 --- a/app/public/css/style.css +++ /dev/null @@ -1,582 +0,0 @@ -/* Reset and Base Styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - line-height: 1.6; - color: #333; - background-color: #f5f5f5; -} - -/* Container */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 20px; -} - -/* Header */ -.header { - background: linear-gradient(135deg, #8B4513, #A0522D); - color: white; - padding: 20px 0; - margin-bottom: 30px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.header-content { - text-align: center; - margin-bottom: 20px; -} - -.logo { - font-size: 2.5rem; - font-weight: bold; - margin-bottom: 5px; -} - -.logo a { - color: white; - text-decoration: none; -} - -.logo a:hover { - text-decoration: underline; -} - -.slogan { - font-style: italic; - font-size: 1.2rem; - margin-bottom: 5px; -} - -.location { - font-size: 1rem; - opacity: 0.9; -} - -/* Navigation */ -.nav { - display: flex; - justify-content: center; - gap: 20px; - flex-wrap: wrap; - padding-top: 20px; - border-top: 1px solid rgba(255, 255, 255, 0.2); -} - -.nav a { - color: white; - text-decoration: none; - padding: 10px 15px; - border-radius: 5px; - transition: background-color 0.3s; -} - -.nav a:hover { - background-color: rgba(255, 255, 255, 0.2); -} - -.nav a.btn { - background-color: #4CAF50; -} - -.nav a.btn:hover { - background-color: #45a049; -} - -.nav a.btn-logout { - background-color: #f44336; -} - -.nav a.btn-logout:hover { - background-color: #d32f2f; -} - -/* Main Content */ -.main { - padding: 20px 0; - min-height: calc(100vh - 200px); -} - -/* Footer */ -.footer { - background-color: #8B4513; - color: white; - text-align: center; - padding: 20px 0; - margin-top: 30px; -} - -/* Alerts */ -.alert { - padding: 15px 20px; - margin-bottom: 20px; - border-radius: 5px; - display: flex; - justify-content: space-between; - align-items: center; -} - -.alert-success { - background-color: #d4edda; - color: #155724; - border: 1px solid #c3e6cb; -} - -.alert-error { - background-color: #f8d7da; - color: #721c24; - border: 1px solid #f5c6cb; -} - -.alert .close { - cursor: pointer; - font-weight: bold; -} - -/* Login Page */ -.login-container { - display: flex; - justify-content: center; - align-items: center; - min-height: 70vh; -} - -.login-card { - background-color: white; - padding: 40px; - border-radius: 10px; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); - width: 100%; - max-width: 500px; -} - -.login-card h2 { - text-align: center; - color: #8B4513; - margin-bottom: 20px; -} - -.login-card p { - text-align: center; - color: #666; - margin-bottom: 30px; -} - -.login-form { - display: flex; - flex-direction: column; - gap: 20px; -} - -/* Form Styles */ -.form-group { - display: flex; - flex-direction: column; - gap: 5px; -} - -.form-control { - padding: 12px; - border: 1px solid #ddd; - border-radius: 5px; - font-size: 1rem; - transition: border-color 0.3s; -} - -.form-control:focus { - border-color: #8B4513; - outline: none; -} - -.form-control.error { - border-color: #f44336; -} - -.error-message { - color: #f44336; - font-size: 0.9rem; - margin-top: 5px; -} - -label { - font-weight: 500; - color: #333; -} - -/* Buttons */ -.btn { - display: inline-block; - padding: 12px 24px; - background-color: #8B4513; - color: white; - text-decoration: none; - border: none; - border-radius: 5px; - cursor: pointer; - font-size: 1rem; - transition: background-color 0.3s; -} - -.btn:hover { - background-color: #A0522D; -} - -.btn-primary { - background-color: #4CAF50; -} - -.btn-primary:hover { - background-color: #45a049; -} - -.btn-secondary { - background-color: #607d8b; -} - -.btn-secondary:hover { - background-color: #455a64; -} - -.btn-small { - padding: 8px 12px; - font-size: 0.9rem; - background-color: #607d8b; -} - -.btn-small:hover { - background-color: #455a64; -} - -/* Tables */ -.articles-table { - width: 100%; - border-collapse: collapse; - margin: 20px 0; -} - -.articles-table th, -.articles-table td { - padding: 15px; - text-align: left; - border-bottom: 1px solid #ddd; -} - -.articles-table th { - background-color: #f5f5f5; - font-weight: 600; -} - -.articles-table tr:hover { - background-color: #f9f9f9; -} - -/* Status Badges */ -.status-badge { - padding: 5px 10px; - border-radius: 15px; - font-size: 0.85rem; - font-weight: 500; -} - -.status-badge.published { - background-color: #d4edda; - color: #155724; -} - -.status-badge.draft { - background-color: #fff3cd; - color: #856404; -} - -.status-badge.archived { - background-color: #f8d7da; - color: #721c24; -} - -/* Cards */ -.article-card, -.season-card, -.dashboard-card { - background-color: white; - border-radius: 10px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.article-card h4, -.season-card h4, -.dashboard-card h3 { - color: #8B4513; - margin-bottom: 10px; -} - -.article-card .article-meta { - color: #666; - font-size: 0.9rem; - margin-bottom: 10px; -} - -.article-card p { - color: #444; - line-height: 1.5; -} - -.article-image { - width: 100%; - max-height: 200px; - object-fit: cover; - border-radius: 5px; - margin-top: 15px; -} - -/* Grids */ -.articles-grid, -.seasons-grid, -.dashboard-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 20px; - margin: 20px 0; -} - -.dashboard-grid { - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); -} - -/* Season Banner */ -.season-banner, -.season-info { - padding: 20px; - border-radius: 10px; - margin: 20px 0; - color: #333; -} - -.season-banner h3, -.season-info h3 { - color: #333; -} - -/* Form Layout */ -.form-row { - display: flex; - gap: 20px; - margin-bottom: 20px; -} - -.form-row .form-group { - flex: 1; -} - -.form-row .full-width { - flex: none; - width: 100%; -} - -.checkbox-group { - display: flex; - flex-wrap: wrap; - gap: 15px; -} - -.checkbox-label { - display: flex; - align-items: center; - gap: 8px; - cursor: pointer; - padding: 8px 12px; - background-color: #f5f5f5; - border-radius: 5px; - transition: background-color 0.3s; -} - -.checkbox-label:hover { - background-color: #e0e0e0; -} - -.checkbox-label input[type="checkbox"] { - cursor: pointer; -} - -.form-actions { - display: flex; - gap: 15px; - margin-top: 30px; -} - -/* Article Detail */ -.article-detail { - background-color: white; - border-radius: 10px; - padding: 30px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.article-detail h2 { - color: #8B4513; - margin-bottom: 20px; -} - -.article-meta { - display: flex; - flex-wrap: wrap; - gap: 20px; - margin-bottom: 20px; - padding-bottom: 20px; - border-bottom: 1px solid #eee; -} - -.meta-item { - display: flex; - flex-direction: column; -} - -.meta-item strong { - color: #8B4513; -} - -.article-image-container { - margin: 20px 0; - text-align: center; -} - -.article-image { - max-width: 100%; - max-height: 500px; - border-radius: 5px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.article-content { - line-height: 1.8; - color: #444; -} - -.article-actions { - margin-top: 30px; - display: flex; - gap: 15px; -} - -/* Quick Links */ -.quick-links { - display: flex; - gap: 15px; - flex-wrap: wrap; - margin-top: 20px; -} - -.quick-links a { - display: inline-block; - padding: 10px 20px; - background-color: white; - color: #8B4513; - text-decoration: none; - border: 1px solid #ddd; - border-radius: 5px; - transition: all 0.3s; -} - -.quick-links a:hover { - background-color: #8B4513; - color: white; -} - -/* Season Detail */ -.season-detail { - background-color: white; - border-radius: 10px; - padding: 30px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.season-detail h2 { - color: #8B4513; - margin-bottom: 20px; -} - -.season-info { - background-color: #f9f9f9; - padding: 15px; - border-radius: 5px; - margin-bottom: 30px; -} - -.season-actions { - margin-top: 20px; -} - -.back-link { - margin-top: 30px; -} - -.back-link a { - color: #8B4513; - text-decoration: none; -} - -.back-link a:hover { - text-decoration: underline; -} - -/* Responsive */ -@media (max-width: 768px) { - .header-content { - text-align: left; - } - - .logo { - font-size: 2rem; - } - - .nav { - flex-direction: column; - align-items: center; - } - - .form-row { - flex-direction: column; - gap: 0; - } - - .articles-grid, - .seasons-grid, - .dashboard-grid { - grid-template-columns: 1fr; - } - - .article-meta { - flex-direction: column; - gap: 10px; - } - - .form-actions { - flex-direction: column; - } -} - -/* Print Styles */ -@media print { - .nav, - .header-content { - display: none; - } - - .article-card, - .season-card, - .dashboard-card { - box-shadow: none; - page-break-inside: avoid; - } -} diff --git a/app/public/images/profiles/.gitkeep b/app/public/images/profiles/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/app/public/index.php b/app/public/index.php deleted file mode 100755 index 6900636..0000000 --- a/app/public/index.php +++ /dev/null @@ -1,114 +0,0 @@ - $handler) { - // Convert route pattern to regex - // First, replace route parameter patterns before quoting - $patternForRegex = preg_replace('/\(\d+\)/', '(\d+)', $pattern); - $patternForRegex = preg_replace('/\(\w+\)/', '([^\/]+)', $patternForRegex); - $regex = '#^' . $patternForRegex . '$#'; - - if (preg_match($regex, $uri, $matches)) { - // Remove first match (full match) - array_shift($matches); - - // Parse handler - list($controllerName, $actionName) = explode('@', $handler); - - // Instantiate controller - $controllerClass = 'App\\Controllers\\' . $controllerName; - if (class_exists($controllerClass)) { - $controller = new $controllerClass(); - - // Call action with parameters - if (method_exists($controller, $actionName)) { - call_user_func_array([$controller, $actionName], $matches); - $matched = true; - break; - } - } - } -} - -// Handle 404 -if (!$matched) { - http_response_code(404); - - // Show a simple 404 page - echo ''; - echo ''; - echo '404 - Pagina niet gevonden'; - echo ''; - echo '

404 - Pagina niet gevonden

'; - echo '

Ga terug naar de homepagina

'; - echo ''; -} diff --git a/app/public/js/app.js b/app/public/js/app.js deleted file mode 100755 index 015592f..0000000 --- a/app/public/js/app.js +++ /dev/null @@ -1,97 +0,0 @@ -// ProostenKrant JavaScript - -document.addEventListener('DOMContentLoaded', function() { - // Auto-hide alerts after 5 seconds - const alerts = document.querySelectorAll('.alert'); - alerts.forEach(alert => { - setTimeout(() => { - alert.style.opacity = '0'; - setTimeout(() => { - alert.remove(); - }, 500); - }, 5000); - }); - - // Form validation feedback - const formGroups = document.querySelectorAll('.form-group'); - formGroups.forEach(group => { - const input = group.querySelector('.form-control'); - const errorMessage = group.querySelector('.error-message'); - - if (input && errorMessage && errorMessage.textContent.trim() !== '') { - input.addEventListener('focus', function() { - input.classList.remove('error'); - errorMessage.style.display = 'none'; - }); - } - }); - - // Auto-focus first input on login page - if (document.querySelector('.login-form')) { - const firstInput = document.querySelector('.login-form .form-control'); - if (firstInput) { - firstInput.focus(); - } - } - - // Smooth scrolling for anchor links - document.querySelectorAll('a[href^="#"]').forEach(anchor => { - anchor.addEventListener('click', function(e) { - e.preventDefault(); - const target = document.querySelector(this.getAttribute('href')); - if (target) { - target.scrollIntoView({ - behavior: 'smooth', - block: 'start' - }); - } - }); - }); - - // Image preview for article form - const imageInputs = [document.getElementById('article_image'), document.getElementById('image')]; - imageInputs.forEach(input => { - if (input) { - const form = input.closest('form'); - const previewContainer = document.createElement('div'); - previewContainer.className = 'image-preview'; - previewContainer.style.display = 'none'; - previewContainer.style.marginTop = '15px'; - - input.parentNode.parentNode.appendChild(previewContainer); - - input.addEventListener('change', function(e) { - const file = e.target.files[0]; - if (file && file.type.startsWith('image/')) { - const reader = new FileReader(); - reader.onload = function(e) { - previewContainer.innerHTML = ''; - previewContainer.style.display = 'block'; - }; - reader.readAsDataURL(file); - } else { - previewContainer.style.display = 'none'; - } - }); - } - }); - - // Confirm before logout - const logoutLinks = document.querySelectorAll('.btn-logout, a[href="/logout"]'); - logoutLinks.forEach(link => { - link.addEventListener('click', function(e) { - if (!confirm('Weet u zeker dat u wilt uitloggen?')) { - e.preventDefault(); - } - }); - }); - - // Season color indicator - const seasonCards = document.querySelectorAll('.season-card'); - seasonCards.forEach(card => { - const bgColor = card.style.backgroundColor; - if (bgColor) { - card.style.borderLeft = '5px solid ' + bgColor; - } - }); -}); diff --git a/app/public/storage/latex b/app/public/storage/latex deleted file mode 120000 index 3c53548..0000000 --- a/app/public/storage/latex +++ /dev/null @@ -1 +0,0 @@ -/var/www/html/storage/latex \ No newline at end of file diff --git a/app/src/controllers/ArticleController.php b/app/src/controllers/ArticleController.php deleted file mode 100755 index 26cf477..0000000 --- a/app/src/controllers/ArticleController.php +++ /dev/null @@ -1,192 +0,0 @@ -requireAuth(); - - $articles = Article::all(); - $this->view('articles/index', ['articles' => $articles]); - } - - public function new() { - $this->requireAuth(); - - $seasons = Season::all(); - $users = User::all(); - - $this->view('articles/new', [ - 'seasons' => $seasons, - 'users' => $users - ]); - } - - public function create() { - // This will handle the form display for creating a new article - $this->new(); - } - - public function store() { - $this->requireAuth(); - - $validationRules = [ - 'title' => 'required|min:5|max:255', - 'content' => 'required|min:10', - 'author_id' => 'required', - 'event_date' => 'required|date', - 'season_id' => 'required', - ]; - - $errors = $this->validate($_POST, $validationRules); - - if (!empty($errors)) { - $_SESSION['errors'] = $errors; - $_SESSION['old_input'] = $_POST; - $this->redirect('/articles/new'); - } - - // Process participants - $participants = $_POST['participants'] ?? []; - if (empty($participants)) { - $participants = [$_POST['author_id']]; - } - - $articleImage = null; - if (isset($_FILES['article_image']) && $_FILES['article_image']['error'] === UPLOAD_ERR_OK) { - $uploadDir = $this->config['upload_paths']['articles']; - $filename = uniqid() . '_' . basename($_FILES['article_image']['name']); - $targetPath = $uploadDir . $filename; - - if (move_uploaded_file($_FILES['article_image']['tmp_name'], $targetPath)) { - $articleImage = 'images/articles/' . $filename; - } - } - - $articleData = [ - 'title' => $_POST['title'], - 'content' => $_POST['content'], - 'author_id' => $_POST['author_id'], - 'participants' => implode(',', $participants), - 'event_date' => $_POST['event_date'], - 'season_id' => $_POST['season_id'], - 'article_image' => $articleImage, - 'status' => 'published', - ]; - - $articleId = Article::create($articleData); - - $_SESSION['success'] = 'Artikel succesvol toegevoegd!'; - $this->redirect('/articles'); - } - - public function show($id) { - $article = Article::find($id); - - if (!$article) { - $this->redirect('/articles'); - } - - $participantIds = explode(',', $article['participants']); - $participants = User::getByIds($participantIds); - - $this->view('articles/show', [ - 'article' => $article, - 'participants' => $participants - ]); - } - - public function showVerifyWriter($id) { - $this->requireAuth(); - - $article = Article::find($id); - - if (!$article) { - $_SESSION['error'] = 'Artikel niet gevonden.'; - $this->redirect('/articles'); - } - - $users = User::all(); - - $this->view('articles/verify_writer', [ - 'article' => $article, - 'users' => $users - ]); - } - - public function showVerifyPassphrase($id) { - $this->requireAuth(); - - $article = Article::find($id); - - if (!$article) { - $_SESSION['error'] = 'Artikel niet gevonden.'; - $this->redirect('/articles'); - } - - // Ensure edit_article_id is set in session for the passphrase verification - if (!isset($_SESSION['edit_article_id']) || $_SESSION['edit_article_id'] != $id) { - $_SESSION['edit_article_id'] = $id; - } - - $this->view('articles/verify_passphrase', [ - 'article' => $article - ]); - } - - public function verifyWriter() { - $this->requireAuth(); - - $articleId = $_POST['article_id'] ?? null; - $writerId = $_POST['writer_id'] ?? null; - - if (!$articleId || !$writerId) { - $_SESSION['error'] = 'Ongeldige verificatie.'; - $this->redirect('/articles'); - } - - $article = Article::find($articleId); - if (!$article) { - $_SESSION['error'] = 'Artikel niet gevonden.'; - $this->redirect('/articles'); - } - - if ($article['author_id'] != $writerId) { - $_SESSION['error'] = 'Enkel de schrijver van het artikel kan deze bewerken.'; - $this->redirect('/articles'); - } - - $this->redirect('/articles/' . $articleId . '/verify-passphrase'); - } - - public function verifyPassphrase() { - $this->requireAuth(); - - $articleId = $_SESSION['edit_article_id'] ?? null; - $passphrase = $_POST['passphrase'] ?? ''; - $universalPassword = $this->config['universal_password'] ?? 'ProostenKrant2024!'; - - if (!$articleId) { - $_SESSION['error'] = 'Geen artikel geselecteerd voor bewerken.'; - $this->redirect('/articles'); - } - - $article = Article::find($articleId); - if (!$article) { - $_SESSION['error'] = 'Artikel niet gevonden.'; - $this->redirect('/articles'); - } - - if ($passphrase !== $universalPassword) { - $_SESSION['error'] = 'Onjuiste paszin. Probeer het opnieuw.'; - $this->redirect('/articles/' . $articleId . '/verify-passphrase'); - } - - // Redirect to submission form with article data - $this->redirect('/submit/form'); - } -} diff --git a/app/src/controllers/AuthController.php b/app/src/controllers/AuthController.php deleted file mode 100755 index 2524b25..0000000 --- a/app/src/controllers/AuthController.php +++ /dev/null @@ -1,46 +0,0 @@ -isLoggedIn()) { - $this->redirect('/dashboard'); - } - - $this->view('login', ['page_title' => 'Inloggen']); - } - - public function login() { - $password = $_POST['password'] ?? ''; - $username = $_POST['username'] ?? ''; - - $universalPassword = Setting::get('universal_password', $this->config['universal_password']); - - $user = User::findByUsername($username); - - if ($user && $password === $universalPassword) { - $_SESSION['user_id'] = $user['id']; - $_SESSION['username'] = $user['username']; - $_SESSION['display_name'] = $user['display_name']; - $_SESSION['is_logged_in'] = true; - - $redirect = $_SESSION['redirect_after_login'] ?? '/dashboard'; - unset($_SESSION['redirect_after_login']); - - $this->redirect($redirect); - } else { - $_SESSION['error'] = 'Ongeldige gebruikersnaam of wachtwoord'; - $this->redirect('/login'); - } - } - - public function logout() { - session_unset(); - session_destroy(); - $this->redirect('/login'); - } -} diff --git a/app/src/controllers/Controller.php b/app/src/controllers/Controller.php deleted file mode 100755 index 8fdec57..0000000 --- a/app/src/controllers/Controller.php +++ /dev/null @@ -1,95 +0,0 @@ -config = include __DIR__ . '/../../config/app.php'; - } - - protected function view($viewName, $data = []) { - $this->data = array_merge($this->data, $data); - - // Try different view directories - $viewPaths = [ - __DIR__ . '/../views/' . $viewName . '.php', - __DIR__ . '/../views/pages/' . $viewName . '.php', - __DIR__ . '/../views/public/' . $viewName . '.php', - __DIR__ . '/../views/submission/' . $viewName . '.php', - __DIR__ . '/../views/articles/' . $viewName . '.php', - __DIR__ . '/../views/seasons/' . $viewName . '.php', - ]; - - $viewPath = null; - foreach ($viewPaths as $path) { - if (file_exists($path)) { - $viewPath = $path; - break; - } - } - - if (!$viewPath) { - die("View not found: " . $viewName); - } - - // Make config available to views - $this->data['config'] = $this->config; - - extract($this->data); - require $viewPath; - } - - protected function redirect($url) { - header("Location: {$url}"); - exit(); - } - - protected function validate($data, $rules) { - $errors = []; - - foreach ($rules as $field => $ruleString) { - $rulesList = explode('|', $ruleString); - - foreach ($rulesList as $rule) { - $ruleParts = explode(':', $rule); - $ruleName = $ruleParts[0]; - $ruleParam = $ruleParts[1] ?? null; - - if ($ruleName === 'required' && empty($data[$field])) { - $errors[$field] = "Het veld {$field} is verplicht"; - } - - if ($ruleName === 'min' && isset($data[$field]) && strlen($data[$field]) < $ruleParam) { - $errors[$field] = "Het veld {$field} moet minstens {$ruleParam} karakters lang zijn"; - } - - if ($ruleName === 'max' && isset($data[$field]) && strlen($data[$field]) > $ruleParam) { - $errors[$field] = "Het veld {$field} mag maximaal {$ruleParam} karakters lang zijn"; - } - - if ($ruleName === 'date' && isset($data[$field]) && !$this->isValidDate($data[$field])) { - $errors[$field] = "Het veld {$field} moet een geldige datum zijn"; - } - } - } - - return $errors; - } - - protected function isValidDate($date) { - return preg_match('/^\d{4}-\d{2}-\d{2}$/', $date); - } - - protected function isLoggedIn() { - return isset($_SESSION['user_id']); - } - - protected function requireAuth() { - if (!$this->isLoggedIn()) { - $_SESSION['redirect_after_login'] = $_SERVER['REQUEST_URI']; - $this->redirect('/login'); - } - } -} diff --git a/app/src/controllers/DashboardController.php b/app/src/controllers/DashboardController.php deleted file mode 100755 index 00e5c02..0000000 --- a/app/src/controllers/DashboardController.php +++ /dev/null @@ -1,28 +0,0 @@ -requireAuth(); - - $currentSeason = Season::getCurrent(); - $userId = $_SESSION['user_id']; - - // Get articles by current user - $userArticles = Article::all(); - - // Get all users - $users = User::all(); - - $this->view('dashboard', [ - 'currentSeason' => $currentSeason, - 'userArticles' => $userArticles, - 'users' => $users - ]); - } -} diff --git a/app/src/controllers/HomeController.php b/app/src/controllers/HomeController.php deleted file mode 100755 index 2bc610d..0000000 --- a/app/src/controllers/HomeController.php +++ /dev/null @@ -1,17 +0,0 @@ -redirect('/'); - } - - public function test() { - $this->view('test', ['page_title' => 'Test']); - } -} diff --git a/app/src/controllers/PdfController.php b/app/src/controllers/PdfController.php deleted file mode 100755 index 331ee92..0000000 --- a/app/src/controllers/PdfController.php +++ /dev/null @@ -1,285 +0,0 @@ -requireAuth(); - - $seasonId = $_GET['season_id'] ?? null; - - if ($seasonId) { - $articles = Article::getBySeason($seasonId); - $season = Season::find($seasonId); - } else { - $articles = Article::all('published'); - $season = Season::getCurrent(); - } - - if (empty($articles)) { - $_SESSION['error'] = 'Geen artikelen gevonden voor deze editie'; - $this->redirect('/articles'); - } - - // Generate LaTeX - $latexContent = $this->generateLatex($articles, $season); - - // Save LaTeX file - $latexDir = $this->config['latex_paths']['output']; - if (!is_dir($latexDir)) { - mkdir($latexDir, 0755, true); - } - - $latexFilename = $latexDir . 'ProostenKrant_' . ($season ? $season['name'] : 'Algemeen') . '_' . date('Y-m-d') . '.tex'; - file_put_contents($latexFilename, $latexContent); - - // Generate PDF using LaTeX compiler - $this->compileLatex($latexFilename); - - $_SESSION['success'] = 'PDF succesvol gegenereerd!'; - $this->redirect('/articles'); - } - - private function generateLatex($articles, $season = null) { - $config = $this->config; - - $latex = "\\documentclass{article}\\ -"; - $latex .= "\\usepackage[utf8]{inputenc}\\ -"; - $latex .= "\\usepackage[T1]{fontenc}\\ -"; - $latex .= "\\usepackage{microtype}\\ -"; - $latex .= "\\usepackage[dutch]{babel}\\ -"; - $latex .= "\\usepackage{newspaper}\\ -"; - $latex .= "\\usepackage{graphicx}\\ -"; - $latex .= "\\usepackage{tikz}\\ -"; - $latex .= "\\usepackage{multicol}\\ -"; - $latex .= "\\usepackage{geometry}\\ -"; - $latex .= "\\usepackage{array}\\ -"; - $latex .= "\\usepackage{wrapfig}\\ -"; - $latex .= "\\usepackage{lipsum}\\ -"; - $latex .= "\\usepackage{newtxtext,newtxmath}\\ -"; - $latex .= "\\usepackage{etoolbox}\\ -"; - - // Custom styling from original project - $latex .= "\\newcommand{\\headlinestyle}{\\itshape\\huge}\\ -"; - $latex .= "\\newcommand{\\bylinestyle}{\\scshape\\Large}\\ -"; - $latex .= "\\patchcmd{\\headline}{#1}{\\headlinestyle #1}{}{}\\ -"; - $latex .= "\\patchcmd{\\byline}{#1}{\\bylinestyle #1}{}{}\\ -"; - - // Improved image handling commands - $latex .= $this->getImageCommands(); - - // Document metadata - $latex .= "\\\\date{\\today}\\ -"; - $latex .= "\\currentvolume{1}\\ -"; - $latex .= "\\currentissue{1}\\ -"; - $latex .= "\\SetPaperName{Proo{s:}tenKrant}\\ -"; - $latex .= "\\SetHeaderName{ProostenKrant}\\ -"; - $latex .= "\\SetPaperLocation{$config['app_location']}\\ -"; - $latex .= "\\SetPaperSlogan{{$config['app_slogan']}}\\ -"; - $latex .= "\\SetPaperPrice{$config['app_price']}\\ -"; - - $latex .= "\\\\begin{document}\\ -"; - $latex .= "\\maketitle\\\\\\ -"; - - // Determine season name - $seasonName = $season ? $season['name'] : 'Algemeen'; - $latex .= "\\\\noindent\\textbf{\\LARGE Editie: {$seasonName}}\\ -"; - $latex .= "\\\\\\ -"; - - $latex .= "\\\\begin{multicols}{3}\\ -"; - - // Add articles - foreach ($articles as $article) { - $latex .= $this->articleToLatex($article); - } - - $latex .= "\\\\end{multicols}\\ -"; - $latex .= "\\end{document}"; - - return $latex; - } - - private function getImageCommands() { - return - "\\newcommand{\\showInlineImage}[2]\n" . - "{\n" . - " \\begin{center}\n" . - " \\begin{minipage}{0.9\\columnwidth}\n" . - " \\centering\n" . - " \\framebox{\n" . - " \\resizebox{\\linewidth}{!}{\\\\includegraphics{#1}}\n" . - " }\\\\\n" . - " \\small #2\\\n" . - " \\end{minipage}\n" . - " \\end{center}\n" . - "}\n\n" . - - "\\newcommand{\\showPortraitImage}[2]\n" . - "{\n" . - " \\begin{minipage}[t]{0.45\\columnwidth}\n" . - " \\centering\n" . - " \\begin{tikzpicture}\n" . - " \\clip (0,0) circle (1.5cm);\n" . - " \\node[anchor=center] at (0,0) {\\\\includegraphics[width=3cm, height=3cm, keepaspectratio]{#1}};\n" . - " \\end{tikzpicture}\n" . - " \\smallskip\\\n" . - " #2\\\n" . - " \\end{minipage}\n" . - "}\n\n" . - - "\\newcommand{\\showLandscapeImage}[2]\n" . - "{\n" . - " \\begin{minipage}[t]{\\columnwidth}\n" . - " \\centering\n" . - " \\includegraphics[width=\\linewidth, keepaspectratio]{#1}\\par\n" . - " \\small #2\\\n" . - " \\end{minipage}\n" . - "}\n\n" . - - "\\newcommand{\\showOneWriter}[2]\n" . - "{\n" . - " \\hfill\n" . - " \\begin{minipage}[t]{0.4\\columnwidth}\n" . - " \\centering\n" . - " \\begin{tikzpicture}\n" . - " \\clip (0,0) circle (1.2cm);\n" . - " \\node[anchor=center] at (0,0) {\\\\includegraphics[width=2.5cm, height=2.5cm, keepaspectratio]{#1}};\n" . - " \\end{tikzpicture}\n" . - " \\\n" . - " \\small #2\\\n" . - " \\end{minipage}\n" . - " \\hfill\n" . - "}\n\n" . - - "\\newcommand{\\showTwoWriters}[4]\n" . - "{\n" . - " \\begin{center}\n" . - " \\begin{minipage}[t]{0.8\\columnwidth}\n" . - " \\centering\n" . - " \\begin{tikzpicture}\n" . - " \\clip (0,0) circle (1cm);\n" . - " \\node[anchor=west] at (0,0) {\\\\includegraphics[width=2cm, height=2cm, keepaspectratio]{#1}};\n" . - " \\end{tikzpicture}\n" . - " \\hspace{0.5cm}\n" . - " \\begin{tikzpicture}\n" . - " \\clip (0,0) circle (1cm);\n" . - " \\node[anchor=east] at (0,0) {\\\\includegraphics[width=2cm, height=2cm, keepaspectratio]{#3}};\n" . - " \\end{tikzpicture}\n" . - " \\\n" . - " \\small #2 \\quad #4\\\n" . - " \\end{minipage}\n" . - " \\end{center}\n" . - "}\n\n"; - } - - private function articleToLatex($article) { - $latex = "\\headline{{$article['title']}}\\ -"; - $latex .= "\\byline{{$article['event_date']}}{{$article['author_name']}}\\ -"; - - // Get base public path from config - $uploadPaths = $this->config['upload_paths'] ?? []; - $profilesPath = $uploadPaths['profiles'] ?? __DIR__ . '/../../public/images/profiles/'; - $articlesPath = $uploadPaths['articles'] ?? __DIR__ . '/../../public/images/articles/'; - $publicPath = dirname(dirname($profilesPath)) . '/'; - - // Get participants - $participantIds = explode(',', $article['participants']); - $participants = User::getByIds($participantIds); - - if (count($participants) === 1) { - $profileImage = $participants[0]['profile_image'] ? $publicPath . $participants[0]['profile_image'] : $profilesPath . 'Unknown.jpg'; - $latex .= "\\showOneWriter{{$profileImage}}{{$participants[0]['display_name']}}\\ -"; - } elseif (count($participants) === 2) { - $profileImage1 = $participants[0]['profile_image'] ? $publicPath . $participants[0]['profile_image'] : $profilesPath . 'Unknown.jpg'; - $profileImage2 = $participants[1]['profile_image'] ? $publicPath . $participants[1]['profile_image'] : $profilesPath . 'Unknown.jpg'; - $latex .= "\\showTwoWriters{{$profileImage1}}{{$participants[0]['display_name']}}{{$profileImage2}}{{$participants[1]['display_name']}}\\ -"; - } - - // Content - $content = $article['content']; - // Escape special LaTeX characters - $content = str_replace(['#', '$', '%', '&', '_', '{', '}', '\\', '~', '^'], - ['\\#', '\\$', '\\%', '\\&', '\\_', '\\{', '\\}', '\\\\', '\\~', '\\^'], - $content); - $latex .= "\\par {$content}\\par\n\\\n"; - - // Article image - if ($article['article_image']) { - $imagePath = $publicPath . $article['article_image']; - // Check if image exists - if (file_exists($imagePath)) { - $latex .= "\\showInlineImage{{$imagePath}}{}\\ -"; - } - } - - $latex .= "\\\n\\\n"; - - return $latex; - } - - private function compileLatex($latexFilename) { - $outputDir = pathinfo($latexFilename, PATHINFO_DIRNAME); - $baseName = pathinfo($latexFilename, PATHINFO_FILENAME); - - // Run pdflatex twice to resolve references - $commands = [ - "cd {$outputDir} && pdflatex -interaction=nonstopmode {$latexFilename}", - "cd {$outputDir} && pdflatex -interaction=nonstopmode {$latexFilename}", - ]; - - foreach ($commands as $command) { - shell_exec($command); - } - - // Clean up temporary files - $tempFiles = [$baseName . '.aux', $baseName . '.log', $baseName . '.out']; - foreach ($tempFiles as $tempFile) { - $tempPath = $outputDir . '/' . $tempFile; - if (file_exists($tempPath)) { - unlink($tempPath); - } - } - } -} diff --git a/app/src/controllers/PublicController.php b/app/src/controllers/PublicController.php deleted file mode 100755 index d491719..0000000 --- a/app/src/controllers/PublicController.php +++ /dev/null @@ -1,141 +0,0 @@ -config; - - // Get current season - $currentSeason = Season::getCurrent(); - - // Get recent articles (draft status for WIP) - $draftArticles = Article::all('draft'); - - // Get published articles for archive preview - $publishedArticles = Article::all('published'); - - // Scan for PDF files in multiple directories - $pdfFiles = []; - - // Check storage/latex directory - $pdfDirs = [ - __DIR__ . '/../../storage/latex/', - __DIR__ . '/../../../Latex/', - __DIR__ . '/../../../Build/', - __DIR__ . '/../../../Proostenkrant.NET/', - ]; - - foreach ($pdfDirs as $pdfDir) { - if (is_dir($pdfDir)) { - $files = scandir($pdfDir); - foreach ($files as $file) { - if (pathinfo($file, PATHINFO_EXTENSION) === 'pdf') { - $filepath = $pdfDir . $file; - $pdfFiles[] = [ - 'filename' => $file, - 'path' => $this->getPdfPath($pdfDir, $file), - 'date' => date('Y-m-d', filemtime($filepath)), - 'fullpath' => $filepath - ]; - } - } - } - } - - // Sort by date descending - usort($pdfFiles, function($a, $b) { - return strtotime($b['date']) - strtotime($a['date']); - }); - - $users = User::all(); - $usersById = []; - foreach ($users as $user) { - $usersById[$user['id']] = $user['display_name']; - } - - $this->view('public/home', [ - 'page_title' => 'Home', - 'show_nav' => true, - 'config' => $config, - 'currentSeason' => $currentSeason, - 'draftArticles' => $draftArticles, - 'publishedArticles' => $publishedArticles, - 'pdfFiles' => $pdfFiles, - 'usersById' => $usersById - ]); - } - - private function getPdfPath($directory, $filename) { - // Map directory to public URL - $baseDir = __DIR__ . '/../../'; - - if (strpos($directory, '/storage/latex') !== false) { - return '/storage/latex/' . $filename; - } elseif (strpos($directory, '/Latex/') !== false) { - return '/Latex/' . $filename; - } elseif (strpos($directory, '/Build/') !== false) { - return '/Build/' . $filename; - } elseif (strpos($directory, '/Proostenkrant.NET/') !== false) { - return '/Proostenkrant.NET/' . $filename; - } - - return '/' . basename($directory) . '/' . $filename; - } - - public function archive() { - $pdfFiles = []; - - // Check multiple directories for PDFs - $pdfDirs = [ - __DIR__ . '/../../storage/latex/', - __DIR__ . '/../../../Latex/', - __DIR__ . '/../../../Build/', - __DIR__ . '/../../../Proostenkrant.NET/', - ]; - - foreach ($pdfDirs as $pdfDir) { - if (is_dir($pdfDir)) { - $files = scandir($pdfDir); - foreach ($files as $file) { - if (pathinfo($file, PATHINFO_EXTENSION) === 'pdf') { - $filepath = $pdfDir . $file; - // Try to extract date and edition from filename - $basename = pathinfo($file, PATHINFO_FILENAME); - $date = date('Y-m-d', filemtime($filepath)); - - // Check if filename has a date pattern - if (preg_match('/(\d{4}-\d{2}-\d{2})/', $basename, $matches)) { - $date = $matches[1]; - } - - $editionName = str_replace(['_', '-'], ' ', $basename); - - $pdfFiles[] = [ - 'filename' => $file, - 'path' => $this->getPdfPath($pdfDir, $file), - 'date' => $date, - 'edition_name' => $editionName, - 'fullpath' => $filepath - ]; - } - } - } - } - - // Sort by date descending - usort($pdfFiles, function($a, $b) { - return strtotime($b['date']) - strtotime($a['date']); - }); - - $this->view('public/archive', [ - 'page_title' => 'Archief', - 'show_nav' => true, - 'pdfFiles' => $pdfFiles - ]); - } -} diff --git a/app/src/controllers/SeasonController.php b/app/src/controllers/SeasonController.php deleted file mode 100755 index 88c1d7b..0000000 --- a/app/src/controllers/SeasonController.php +++ /dev/null @@ -1,39 +0,0 @@ -requireAuth(); - - $seasons = Season::all(); - $currentSeason = Season::getCurrent(); - - foreach ($seasons as &$season) { - $season['article_count'] = count(Article::getBySeason($season['id'])); - } - - $this->view('seasons/index', [ - 'seasons' => $seasons, - 'currentSeason' => $currentSeason - ]); - } - - public function show($id) { - $season = Season::find($id); - - if (!$season) { - $this->redirect('/seasons'); - } - - $articles = Article::getBySeason($id); - - $this->view('seasons/show', [ - 'season' => $season, - 'articles' => $articles - ]); - } -} diff --git a/app/src/controllers/SubmissionController.php b/app/src/controllers/SubmissionController.php deleted file mode 100755 index ef87ea0..0000000 --- a/app/src/controllers/SubmissionController.php +++ /dev/null @@ -1,287 +0,0 @@ -view('submission/passphrase', [ - 'page_title' => 'Artikel Indienen - Beveiliging', - 'show_nav' => true, - 'next_page' => '/submit/form' - ]); - } - - public function verifyPassphrase() { - $passphrase = $_POST['passphrase'] ?? ''; - $universalPassword = $this->config['universal_password'] ?? 'ProostenKrant2024!'; - - if ($passphrase === $universalPassword) { - // Store in session that user has passed the passphrase check - $_SESSION['passphrase_verified'] = true; - $_SESSION['passphrase_timestamp'] = time(); - - // Redirect to submission form - $this->redirect('/submit/form'); - } else { - $_SESSION['error'] = 'Onjuiste paszin. Probeer het opnieuw.'; - $this->redirect('/submit'); - } - } - - public function showForm() { - // Check if passphrase is verified OR if we're coming from article edit flow - $isEditFlow = isset($_SESSION['edit_article_id']) && $_SESSION['edit_article_id']; - - if (!$isEditFlow && (!isset($_SESSION['passphrase_verified']) || !$_SESSION['passphrase_verified'])) { - $this->redirect('/submit'); - } - - $users = User::all(); - - // Get old input if validation failed - $oldInput = $_SESSION['old_input'] ?? []; - unset($_SESSION['old_input']); - $errors = $_SESSION['errors'] ?? []; - unset($_SESSION['errors']); - - // Check if we're editing an existing article - $articleId = $_SESSION['edit_article_id'] ?? null; - $article = null; - if ($articleId) { - $article = Article::find($articleId); - unset($_SESSION['edit_article_id']); - } - - $this->view('submission/form', [ - 'page_title' => $article ? 'Artikel Bewerken' : 'Artikel Indienen', - 'show_nav' => true, - 'users' => $users, - 'oldInput' => $oldInput, - 'errors' => $errors, - 'article' => $article - ]); - } - - public function store() { - // Check if passphrase is verified OR if we're coming from article edit flow (which already verified) - $isEditFlow = isset($_POST['article_id']) && $_POST['article_id']; - - if (!$isEditFlow && (!isset($_SESSION['passphrase_verified']) || !$_SESSION['passphrase_verified'])) { - $_SESSION['error'] = 'Je moet eerst de beveiligingspaszin invoeren.'; - $this->redirect('/submit'); - } - - $users = User::all(); - $userMap = []; - foreach ($users as $user) { - $userMap[$user['id']] = $user['display_name']; - } - - $validationRules = [ - 'title' => 'required|min:5|max:255', - 'content' => 'required|min:10', - 'writer' => 'required', - 'participants' => 'required', - ]; - - $errors = $this->validate($_POST, $validationRules); - - // Check if image was uploaded - $articleImage = null; - if (isset($_FILES['image'])) { - if ($_FILES['image']['error'] === UPLOAD_ERR_OK) { - // Use configured upload path for articles - $uploadDir = $this->config['upload_paths']['articles'] ?? __DIR__ . '/../../public/images/articles/'; - $filename = uniqid() . '_' . basename($_FILES['image']['name']); - $targetPath = $uploadDir . '/' . $filename; - - // Make sure the directory exists and is writable - if (!is_dir($uploadDir)) { - mkdir($uploadDir, 0777, true); - } - - // Ensure directory has proper permissions - if (!is_writable($uploadDir)) { - chmod($uploadDir, 0777); - } - - if (move_uploaded_file($_FILES['image']['tmp_name'], $targetPath)) { - $articleImage = 'images/articles/' . $filename; - // Store in session to show preview on redirect - $_SESSION['uploaded_image'] = $articleImage; - } else { - $error = error_get_last(); - $errors['image'] = 'Fout bij het uploaden van de afbeelding: ' . ($error ? $error['message'] : 'Onbekende fout'); - } - } else { - // Image upload error - no file selected - $errors['image'] = 'Selecteer een afbeelding om te uploaden.'; - } - } else { - // No image file was sent - $errors['image'] = 'Een afbeelding is verplicht.'; - } - - if (!empty($errors)) { - $_SESSION['errors'] = $errors; - $_SESSION['old_input'] = $_POST; - $this->redirect('/submit/form'); - } - - // Get the writer's user ID - $writerId = $_POST['writer']; - $writerName = $userMap[$writerId] ?? 'Onbekend'; - - // Process participants - $participantIds = $_POST['participants'] ?? []; - if (!is_array($participantIds)) { - $participantIds = [$participantIds]; - } - - // Ensure writer is in participants - if (!in_array($writerId, $participantIds)) { - array_unshift($participantIds, $writerId); - } - - $articleData = [ - 'title' => $_POST['title'], - 'content' => $_POST['content'], - 'author_id' => $writerId, - 'participants' => implode(',', $participantIds), - 'event_date' => $_POST['event_date'] ?? date('Y-m-d'), - 'article_image' => $articleImage, - 'status' => 'draft', - 'created_at' => date('Y-m-d H:i:s'), - ]; - - // Check if we're editing or creating new - $articleId = $_POST['article_id'] ?? null; - if ($articleId) { - // For existing articles, preserve the status - $existingArticle = Article::find($articleId); - if ($existingArticle) { - $articleData['status'] = $existingArticle['status']; - } - Article::update($articleId, $articleData); - $_SESSION['success'] = 'Artikel succesvol bijgewerkt!'; - } else { - $articleId = Article::create($articleData); - $_SESSION['success'] = 'Artikel succesvol ingediend!'; - } - - // Clear passphrase verification for security - unset($_SESSION['passphrase_verified']); - unset($_SESSION['passphrase_timestamp']); - - // Store article ID for confirmation - $_SESSION['submitted_article_id'] = $articleId; - - $this->redirect('/submit/confirmation'); - } - - public function showConfirmation() { - // Check if there's a submitted article - $articleId = $_SESSION['submitted_article_id'] ?? null; - unset($_SESSION['submitted_article_id']); - - $article = null; - if ($articleId) { - $article = Article::find($articleId); - } - - $this->view('submission/confirmation', [ - 'page_title' => 'Bevestiging', - 'show_nav' => true, - 'article' => $article - ]); - } - - public function showEditList() { - // Check if passphrase is verified - if (!isset($_SESSION['passphrase_verified']) || !$_SESSION['passphrase_verified']) { - $this->redirect('/submit/edit'); - } - - $articles = Article::all('draft'); - $users = User::all(); - $usersById = []; - foreach ($users as $user) { - $usersById[$user['id']] = $user['display_name']; - } - - $this->view('submission/edit_list', [ - 'page_title' => 'Artikelen Bewerken', - 'show_nav' => true, - 'articles' => $articles, - 'usersById' => $usersById - ]); - } - - public function verifyEditPassphrase() { - $passphrase = $_POST['passphrase'] ?? ''; - $universalPassword = $this->config['universal_password'] ?? 'ProostenKrant2024!'; - - if ($passphrase === $universalPassword) { - $_SESSION['passphrase_verified'] = true; - $_SESSION['passphrase_timestamp'] = time(); - $this->redirect('/submit/edit/list'); - } else { - $_SESSION['error'] = 'Onjuiste paszin. Probeer het opnieuw.'; - $this->redirect('/submit/edit'); - } - } - - public function showEditPassphrase() { - $this->view('submission/edit_passphrase', [ - 'page_title' => 'Artikelen Bewerken - Beveiliging', - 'show_nav' => true - ]); - } - - public function showWriterVerification($articleId) { - $article = Article::find($articleId); - - if (!$article) { - $_SESSION['error'] = 'Artikel niet gevonden.'; - $this->redirect('/submit/edit/list'); - } - - $users = User::all(); - - $this->view('submission/verify_writer', [ - 'page_title' => 'Verifieer Schrijver', - 'show_nav' => true, - 'article' => $article, - 'users' => $users - ]); - } - - public function verifyWriter() { - $articleId = $_POST['article_id'] ?? null; - $writerId = $_POST['writer_id'] ?? null; - - if (!$articleId || !$writerId) { - $_SESSION['error'] = 'Ongeldige verificatie.'; - $this->redirect('/submit/edit/list'); - } - - $article = Article::find($articleId); - if (!$article) { - $_SESSION['error'] = 'Artikel niet gevonden.'; - $this->redirect('/submit/edit/list'); - } - - if ($article['author_id'] != $writerId) { - $_SESSION['error'] = 'Alleen de schrijver van het artikel kan deze bewerken.'; - $this->redirect('/submit/edit/list'); - } - - // Store article ID in session for editing - $_SESSION['edit_article_id'] = $articleId; - - $this->redirect('/submit/form'); - } -} diff --git a/app/src/controllers/UploadController.php b/app/src/controllers/UploadController.php deleted file mode 100755 index fa05fdb..0000000 --- a/app/src/controllers/UploadController.php +++ /dev/null @@ -1,138 +0,0 @@ -requireAuth(); - - if (!isset($_FILES['file'])) { - echo json_encode(['error' => 'No file uploaded']); - exit(); - } - - $file = $_FILES['file']; - - if ($file['error'] !== UPLOAD_ERR_OK) { - echo json_encode(['error' => 'Upload error: ' . $file['error']]); - exit(); - } - - $type = $_POST['type'] ?? 'articles'; - $validTypes = ['articles', 'profiles']; - - if (!in_array($type, $validTypes)) { - echo json_encode(['error' => 'Invalid upload type']); - exit(); - } - - $uploadDir = $this->config['upload_paths'][$type]; - - // Create directory if it doesn't exist - if (!is_dir($uploadDir)) { - mkdir($uploadDir, 0755, true); - } - - // Generate unique filename - $ext = pathinfo($file['name'], PATHINFO_EXTENSION); - $filename = uniqid() . '.' . $ext; - $targetPath = $uploadDir . $filename; - - // Validate image - $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp']; - if (!in_array(strtolower($ext), $allowedExtensions)) { - echo json_encode(['error' => 'Only images are allowed']); - exit(); - } - - $imageInfo = getimagesize($file['tmp_name']); - if ($imageInfo === false) { - echo json_encode(['error' => 'Invalid image file']); - exit(); - } - - // Resize large images to prevent issues with LaTeX - if ($imageInfo[0] > 4000 || $imageInfo[1] > 4000) { - $this->resizeImage($file['tmp_name'], $targetPath, 2000, 2000); - } else { - if (!move_uploaded_file($file['tmp_name'], $targetPath)) { - echo json_encode(['error' => 'Failed to move uploaded file']); - exit(); - } - } - - echo json_encode([ - 'success' => true, - 'filename' => $filename, - 'path' => 'images/' . $type . '/' . $filename, - 'url' => '/images/' . $type . '/' . $filename - ]); - } - - private function resizeImage($source, $target, $maxWidth, $maxHeight) { - $imageInfo = getimagesize($source); - $width = $imageInfo[0]; - $height = $imageInfo[1]; - $mime = $imageInfo['mime']; - - $ratio = min($maxWidth / $width, $maxHeight / $height); - $newWidth = (int)($width * $ratio); - $newHeight = (int)($height * $ratio); - - $sourceImage = null; - switch ($mime) { - case 'image/jpeg': - $sourceImage = imagecreatefromjpeg($source); - break; - case 'image/png': - $sourceImage = imagecreatefrompng($source); - break; - case 'image/gif': - $sourceImage = imagecreatefromgif($source); - break; - case 'image/webp': - $sourceImage = imagecreatefromwebp($source); - break; - default: - move_uploaded_file($source, $target); - return; - } - - if (!$sourceImage) { - move_uploaded_file($source, $target); - return; - } - - $destinationImage = imagecreatetruecolor($newWidth, $newHeight); - - // Preserve transparency for PNG and GIF - if ($mime === 'image/png' || $mime === 'image/gif') { - imagealphablending($destinationImage, false); - imagesavealpha($destinationImage, true); - $transparent = imagecolorallocatealpha($destinationImage, 255, 255, 255, 127); - imagefilledrectangle($destinationImage, 0, 0, $newWidth, $newHeight, $transparent); - } - - imagecopyresampled($destinationImage, $sourceImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); - - switch ($mime) { - case 'image/jpeg': - imagejpeg($destinationImage, $target, 90); - break; - case 'image/png': - imagepng($destinationImage, $target, 9); - break; - case 'image/gif': - imagegif($destinationImage, $target); - break; - case 'image/webp': - imagewebp($destinationImage, $target, 90); - break; - } - - imagedestroy($sourceImage); - imagedestroy($destinationImage); - } -} diff --git a/app/src/helpers/AuthHelper.php b/app/src/helpers/AuthHelper.php deleted file mode 100755 index 9e85c8e..0000000 --- a/app/src/helpers/AuthHelper.php +++ /dev/null @@ -1,36 +0,0 @@ - $_SESSION['user_id'] ?? null, - 'username' => $_SESSION['username'] ?? null, - 'display_name' => $_SESSION['display_name'] ?? null, - ]; - } - - public static function requireAuth() { - if (!self::check()) { - $_SESSION['redirect_after_login'] = $_SERVER['REQUEST_URI'] ?? '/'; - header('Location: /login'); - exit(); - } - } - - public static function redirectIfAuthenticated() { - if (self::check()) { - header('Location: /dashboard'); - exit(); - } - } -} diff --git a/app/src/helpers/ImageHelper.php b/app/src/helpers/ImageHelper.php deleted file mode 100755 index 8adf194..0000000 --- a/app/src/helpers/ImageHelper.php +++ /dev/null @@ -1,128 +0,0 @@ - $width; - } - - public static function isImageLandscape($imagePath) { - if (!file_exists($imagePath)) { - return false; - } - - $imageInfo = getimagesize($imagePath); - if ($imageInfo === false) { - return false; - } - - list($width, $height) = $imageInfo; - return $width > $height; - } - - public static function getImageOrientation($imagePath) { - if (!file_exists($imagePath)) { - return 'unknown'; - } - - $imageInfo = getimagesize($imagePath); - if ($imageInfo === false) { - return 'unknown'; - } - - list($width, $height) = $imageInfo; - - if ($width > $height) { - return 'landscape'; - } elseif ($height > $width) { - return 'portrait'; - } else { - return 'square'; - } - } -} diff --git a/app/src/models/Article.php b/app/src/models/Article.php deleted file mode 100755 index 1260f67..0000000 --- a/app/src/models/Article.php +++ /dev/null @@ -1,90 +0,0 @@ -fetchAll( - "SELECT a.*, u.display_name as author_name, s.name as season_name " . - "FROM " . self::$table . " a " . - "LEFT JOIN users u ON a.author_id = u.id " . - "LEFT JOIN seasons s ON a.season_id = s.id " . - "WHERE a.status = ? ORDER BY a.event_date DESC, a.created_at DESC", - [$status] - ); - } - - public static function find($id) { - $db = Database::getInstance(); - return $db->fetch( - "SELECT a.*, u.display_name as author_name, s.name as season_name " . - "FROM " . self::$table . " a " . - "LEFT JOIN users u ON a.author_id = u.id " . - "LEFT JOIN seasons s ON a.season_id = s.id " . - "WHERE a.id = ?", - [$id] - ); - } - - public static function create($data) { - $db = Database::getInstance(); - - // Process participants - if (isset($data['participants']) && is_array($data['participants'])) { - $data['participants'] = implode(',', $data['participants']); - } - - return $db->insert(self::$table, $data); - } - - public static function update($id, $data) { - $db = Database::getInstance(); - - if (isset($data['participants']) && is_array($data['participants'])) { - $data['participants'] = implode(',', $data['participants']); - } - - return $db->update(self::$table, $data, ['id' => $id]); - } - - public static function delete($id) { - $db = Database::getInstance(); - return $db->delete(self::$table, ['id' => $id]); - } - - public static function getBySeason($seasonId) { - $db = Database::getInstance(); - return $db->fetchAll( - "SELECT a.*, u.display_name as author_name " . - "FROM " . self::$table . " a " . - "LEFT JOIN users u ON a.author_id = u.id " . - "WHERE a.season_id = ? AND a.status = 'published' " . - "ORDER BY a.event_date DESC", - [$seasonId] - ); - } - - public static function getByUser($userId) { - $db = Database::getInstance(); - return $db->fetchAll( - "SELECT a.*, u.display_name as author_name " . - "FROM " . self::$table . " a " . - "LEFT JOIN users u ON a.author_id = u.id " . - "WHERE a.author_id = ? OR a.participants LIKE ? " . - "ORDER BY a.event_date DESC", - [$userId, "%,{$userId},%"] - ); - } - - public static function getCurrentSeasonId() { - $db = Database::getInstance(); - $result = $db->fetch( - "SELECT id FROM seasons " . - "WHERE start_date <= CURDATE() AND end_date >= CURDATE() " . - "ORDER BY start_date DESC LIMIT 1" - ); - return $result ? $result['id'] : null; - } -} diff --git a/app/src/models/Database.php b/app/src/models/Database.php deleted file mode 100755 index 9347e0b..0000000 --- a/app/src/models/Database.php +++ /dev/null @@ -1,98 +0,0 @@ -connection = new PDO( - $dsn, - $config['username'], - $config['password'], - [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false, - ] - ); - } catch (PDOException $e) { - die("Database connection failed: " . $e->getMessage()); - } - } - - public static function getInstance() { - if (self::$instance === null) { - self::$instance = new self(); - } - return self::$instance; - } - - public function getConnection() { - return $this->connection; - } - - public function query($sql, $params = []) { - $stmt = $this->connection->prepare($sql); - $stmt->execute($params); - return $stmt; - } - - public function fetchAll($sql, $params = []) { - return $this->query($sql, $params)->fetchAll(); - } - - public function fetch($sql, $params = []) { - return $this->query($sql, $params)->fetch(); - } - - public function insert($table, $data) { - $columns = implode(', ', array_keys($data)); - $placeholders = ':' . implode(', :', array_keys($data)); - - $sql = "INSERT INTO {$table} ({$columns}) VALUES ({$placeholders})"; - $stmt = $this->connection->prepare($sql); - $stmt->execute($data); - - return $this->connection->lastInsertId(); - } - - public function update($table, $data, $where) { - $setParts = []; - foreach ($data as $key => $value) { - $setParts[] = "{$key} = :{$key}"; - } - - $whereParts = []; - foreach ($where as $key => $value) { - $whereParts[] = "{$key} = :where_{$key}"; - $data["where_{$key}"] = $value; - } - - $sql = "UPDATE {$table} SET " . implode(', ', $setParts) . - " WHERE " . implode(' AND ', $whereParts); - - $stmt = $this->connection->prepare($sql); - return $stmt->execute($data); - } - - public function delete($table, $where) { - $whereParts = []; - $params = []; - foreach ($where as $key => $value) { - $whereParts[] = "{$key} = :{$key}"; - $params[$key] = $value; - } - - $sql = "DELETE FROM {$table} WHERE " . implode(' AND ', $whereParts); - return $this->query($sql, $params)->rowCount(); - } -} diff --git a/app/src/models/Season.php b/app/src/models/Season.php deleted file mode 100755 index 6ee3d22..0000000 --- a/app/src/models/Season.php +++ /dev/null @@ -1,41 +0,0 @@ -fetchAll("SELECT * FROM " . self::$table . " ORDER BY start_date"); - } - - public static function find($id) { - $db = Database::getInstance(); - return $db->fetch("SELECT * FROM " . self::$table . " WHERE id = ?", [$id]); - } - - public static function getActive() { - $db = Database::getInstance(); - return $db->fetchAll( - "SELECT * FROM " . self::$table . " WHERE is_active = 1 ORDER BY start_date" - ); - } - - public static function getCurrent() { - $db = Database::getInstance(); - return $db->fetch( - "SELECT * FROM " . self::$table . " " . - "WHERE start_date <= CURDATE() AND end_date >= CURDATE() " . - "ORDER BY start_date DESC LIMIT 1" - ); - } - - public static function getNext() { - $db = Database::getInstance(); - return $db->fetch( - "SELECT * FROM " . self::$table . " " . - "WHERE start_date > CURDATE() " . - "ORDER BY start_date ASC LIMIT 1" - ); - } -} diff --git a/app/src/models/Setting.php b/app/src/models/Setting.php deleted file mode 100755 index d4a13e2..0000000 --- a/app/src/models/Setting.php +++ /dev/null @@ -1,24 +0,0 @@ -fetch("SELECT value FROM " . self::$table . " WHERE key_name = ?", [$key]); - return $result ? $result['value'] : $default; - } - - public static function set($key, $value) { - $db = Database::getInstance(); - - $existing = $db->fetch("SELECT id FROM " . self::$table . " WHERE key_name = ?", [$key]); - - if ($existing) { - return $db->update(self::$table, ['value' => $value], ['key_name' => $key]); - } else { - return $db->insert(self::$table, ['key_name' => $key, 'value' => $value]); - } - } -} diff --git a/app/src/models/User.php b/app/src/models/User.php deleted file mode 100755 index 8ebd8f3..0000000 --- a/app/src/models/User.php +++ /dev/null @@ -1,34 +0,0 @@ -fetchAll("SELECT * FROM " . self::$table . " WHERE is_active = 1 ORDER BY display_name"); - } - - public static function find($id) { - $db = Database::getInstance(); - return $db->fetch("SELECT * FROM " . self::$table . " WHERE id = ?", [$id]); - } - - public static function findByUsername($username) { - $db = Database::getInstance(); - return $db->fetch("SELECT * FROM " . self::$table . " WHERE username = ? AND is_active = 1", [$username]); - } - - public static function getByIds($ids) { - if (empty($ids)) return []; - - $placeholders = implode(',', array_fill(0, count($ids), '?')); - $db = Database::getInstance(); - return $db->fetchAll("SELECT * FROM " . self::$table . " WHERE id IN ({$placeholders}) AND is_active = 1", $ids); - } - - public static function updateProfileImage($userId, $imagePath) { - $db = Database::getInstance(); - return $db->update(self::$table, ['profile_image' => $imagePath], ['id' => $userId]); - } -} diff --git a/app/src/test_view.php b/app/src/test_view.php deleted file mode 100644 index 90c136f..0000000 --- a/app/src/test_view.php +++ /dev/null @@ -1,5 +0,0 @@ -index(); diff --git a/app/src/views/articles/index.php b/app/src/views/articles/index.php deleted file mode 100755 index 3b19bd5..0000000 --- a/app/src/views/articles/index.php +++ /dev/null @@ -1,52 +0,0 @@ - - -
-
-

Alle Artikelen

- Nieuw Artikel -
- - - - - - - - - - - - - - - - - - - - - - - - - -
TitelAuteurDatumSeizoenStatusActies
- - - - - Bekijken - ✏️ -
- -

Er zijn nog geen artikelen.

- -
- - \ No newline at end of file diff --git a/app/src/views/articles/new.php b/app/src/views/articles/new.php deleted file mode 100755 index b8b9f0a..0000000 --- a/app/src/views/articles/new.php +++ /dev/null @@ -1,128 +0,0 @@ - - -
-

Nieuw Artikel Toevoegen

- -
-
-
- - - - - -
-
- -
-
- - - - - -
-
- -
-
- - - - - -
- -
- - - - - -
-
- -
-
- -
- - - -
-
-
- -
-
- - - - - -
-
- -
-
- - -

Upload een foto bij het artikel. tantoon landscape als portret foto's worden ondersteund.

-
-
- -
- - Annuleren -
-
-
- - \ No newline at end of file diff --git a/app/src/views/articles/show.php b/app/src/views/articles/show.php deleted file mode 100755 index 8ef5852..0000000 --- a/app/src/views/articles/show.php +++ /dev/null @@ -1,57 +0,0 @@ - - -
-

- - - - -
- <?= htmlspecialchars($article['title']) ?> -
- - -
- -
- -
- Terug naar Overzicht - Bewerken -
-
- - \ No newline at end of file diff --git a/app/src/views/articles/verify_passphrase.php b/app/src/views/articles/verify_passphrase.php deleted file mode 100644 index ed8e584..0000000 --- a/app/src/views/articles/verify_passphrase.php +++ /dev/null @@ -1,50 +0,0 @@ - - -
-

Beveiligingscontrole

- - -
-

-

- Voer het algemene passphrase in om dit artikel te bewerken. -

-
- - - -
- - -
- - -
- -
- - -
- -
- - Annuleren -
-
-
- - \ No newline at end of file diff --git a/app/src/views/articles/verify_writer.php b/app/src/views/articles/verify_writer.php deleted file mode 100644 index f56b4de..0000000 --- a/app/src/views/articles/verify_writer.php +++ /dev/null @@ -1,58 +0,0 @@ - - -
-

Verifieer Schrijver

- - -
-

-

- Om dit artikel te bewerken, bevestig aub wie de schrijver is. -

-
- - - -
- - -
- - -
- - -
- - -
- -
- - - Terug naar Artikelen - -
-
-
- - \ No newline at end of file diff --git a/app/src/views/layouts/main.php b/app/src/views/layouts/main.php deleted file mode 100755 index 271eb1a..0000000 --- a/app/src/views/layouts/main.php +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - <?= htmlspecialchars($config['app_name'] ?? 'ProostenKrant') ?> - <?= htmlspecialchars($this->data['page_title'] ?? '') ?> - - - - -
- -
-
-

- -

-

-
- - data['show_nav']) && $this->data['show_nav']): ?> - - -
- - -
- -
- - - -
- - - -
- - - -
- - - -
- - -
- -
-
- - diff --git a/app/src/views/pages/dashboard.php b/app/src/views/pages/dashboard.php deleted file mode 100755 index 49ee2b8..0000000 --- a/app/src/views/pages/dashboard.php +++ /dev/null @@ -1,52 +0,0 @@ - - -
-

Welkom, !

- - -
-

Huidig Seizoen:

-

-
- - -
-
-

Artikelen Toevoegen

-

Voeg nieuwe artikelen toe voor de volgende editie.

- Nieuw Artikel -
- -
-

Mijn Artikelen

-

Beheer uw eigen artikelen.

- Bekijk Artikelen -
- -
-

Seizoenen

-

Bekijk alle seizoensedities.

- Bekijk Seizoenen -
- -
-

PDF Genereren

-

Genereer een PDF van de huidige editie.

- Genereer PDF -
-
- -

Sneltoetsen

- -
- - \ No newline at end of file diff --git a/app/src/views/pages/login.php b/app/src/views/pages/login.php deleted file mode 100755 index 6ae2c8d..0000000 --- a/app/src/views/pages/login.php +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/app/src/views/public/archive.php b/app/src/views/public/archive.php deleted file mode 100755 index 13961a3..0000000 --- a/app/src/views/public/archive.php +++ /dev/null @@ -1,46 +0,0 @@ - - -
-
-

Archief van ProostenKrant Edities

-
- - -
- -
-
-

-

- Datum: - -

-
- -
- -
- -
-

Er zijn nog geen PDF edities beschikbaar in het archief.

-

- Terug naar Home -

-
- -
- - diff --git a/app/src/views/public/home.php b/app/src/views/public/home.php deleted file mode 100755 index d911476..0000000 --- a/app/src/views/public/home.php +++ /dev/null @@ -1,121 +0,0 @@ - - -
- -
-

Artikel Indienen

-

Heb je een leuk verhaal, een bijeenkomst of een bijzondere gebeurtenis meegemaakt? - Deel het met de hele familie door een artikel in te dienen voor de ProostenKrant!

- - + Artikel Indienen - -
- - -
-
-

Huidige Editie (Werk in Uitvoering)

-
- - - artikelen in voorbereiding - - - Geen artikelen in voorbereiding - -
-
- - -
- -
-
-

- - - ✏️ - - -
-

- Deelnemers: - - - - -
- Datum: - - -

-
- -
- -
-

Er zijn momenteel geen artikelen in voorbereiding.

-

Wees de eerste om een artikel in te dienen!

-
- -
- - -
- - - -
- -
-
-

-

- Gepubliceerd op: - -

-
- -
- -
- -
-

Er zijn nog geen eerdere edities beschikbaar.

-
- -
-
- - diff --git a/app/src/views/seasons/index.php b/app/src/views/seasons/index.php deleted file mode 100755 index eb94cf1..0000000 --- a/app/src/views/seasons/index.php +++ /dev/null @@ -1,44 +0,0 @@ - - -
-

Seizoensedities

- -

Hier vindt u een overzicht van alle seizoensedities.

- - -
-

Huidig Seizoen

-
-

-

-

Van - tot

-

Aantal artikelen:

- PDF Genereren -
-
- - -

Alle Seizoenen

-
- -
-

-

-

Van - tot

-

Aantal artikelen:

- PDF - Bekijken -
- -
-
- - \ No newline at end of file diff --git a/app/src/views/seasons/show.php b/app/src/views/seasons/show.php deleted file mode 100755 index e7c178d..0000000 --- a/app/src/views/seasons/show.php +++ /dev/null @@ -1,57 +0,0 @@ - - -
-

- -
-

Beschrijving:

-

Periode: Van - tot

-
- -

Artikelen in deze editie

- - -
- -
-

- -

...

- - <?= htmlspecialchars($article['title']) ?> - -
- Lees meer - - ✏️ - -
-
- -
- - - -

Er zijn nog geen artikelen voor deze editie.

- - - -
- - \ No newline at end of file diff --git a/app/src/views/submission/confirmation.php b/app/src/views/submission/confirmation.php deleted file mode 100755 index 691fec6..0000000 --- a/app/src/views/submission/confirmation.php +++ /dev/null @@ -1,37 +0,0 @@ - - -
-
✓
-

Artikel Succesvol Ingediend!

- - -
-

- -

- Je artikel is opgeslagen en zal zichtbaar zijn in de volgende editie van de ProostenKrant. -

-
- -

Je artikel is succesvol ingediend en zal zichtbaar zijn in de volgende editie.

- - - -
- - diff --git a/app/src/views/submission/edit_list.php b/app/src/views/submission/edit_list.php deleted file mode 100755 index 2f02ac7..0000000 --- a/app/src/views/submission/edit_list.php +++ /dev/null @@ -1,57 +0,0 @@ - - -
-
-

Artikelen om te Bewerken

- - ← Terug - -
- - -
- -
- - -
- -
- -
-

Er zijn geen artikelen om te bewerken.

-

- Nieuw Artikel Indienen -

-
- -
- - diff --git a/app/src/views/submission/edit_passphrase.php b/app/src/views/submission/edit_passphrase.php deleted file mode 100755 index 29b1cf7..0000000 --- a/app/src/views/submission/edit_passphrase.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
-

Artikelen Bewerken

-

Voer de familypaszin in om artikelen te kunnen bewerken:

- -
-
- - -
- -
- - Annuleren -
-
-
- - diff --git a/app/src/views/submission/form.php b/app/src/views/submission/form.php deleted file mode 100755 index 43490af..0000000 --- a/app/src/views/submission/form.php +++ /dev/null @@ -1,192 +0,0 @@ - $article['title'], - 'content' => $article['content'], - 'writer' => $article['author_id'], - 'event_date' => $article['event_date'], - 'article_id' => $article['id'] - ]; - - // Parse participants - if (!empty($article['participants'])) { - $participantIds = explode(',', $article['participants']); - } else { - $participantIds = []; - } -} - -// Get selected participants from old input -$selectedParticipants = []; -if (!empty($oldInput['participants'])) { - if (is_array($oldInput['participants'])) { - $selectedParticipants = $oldInput['participants']; - } else { - $selectedParticipants = [$oldInput['participants']]; - } -} elseif (isset($participantIds)) { - $selectedParticipants = $participantIds; -} - -// Check if we have an uploaded image in session or from old input -$uploadedImage = null; -if (isset($_SESSION['uploaded_image'])) { - $uploadedImage = $_SESSION['uploaded_image']; - unset($_SESSION['uploaded_image']); -} elseif ($article && $article['article_image']) { - $uploadedImage = $article['article_image']; -} -?> - -
- - -
- - - - -
-
- - - - - -
-
- -
-
- - - - - -
-
- -
-
- - - - - -
- -
- - -
-
- -
-
- -

Selecteer alle personages die bij dit verhaal betrokken zijn.

-
- - - -
-

Selecteer minstens één deelnemer

- - - -
-
- -
-
- -
- - -
-

- Upload een foto bij het artikel. Zowel landscape als portret foto's worden ondersteund. -

- - -
-
- Geselecteerde afbeelding -
-

Afbeelding succesvol geupload:

-
- - - - - -
-
- -
- - Annuleren -
-
-
- - diff --git a/app/src/views/submission/passphrase.php b/app/src/views/submission/passphrase.php deleted file mode 100755 index c244dbd..0000000 --- a/app/src/views/submission/passphrase.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
-

Beveiligingscontrole

-

Voer de familypaszin in om een artikel in te dienen:

- -
-
- - -
- -
- - Annuleren -
-
-
- - diff --git a/app/src/views/submission/verify_writer.php b/app/src/views/submission/verify_writer.php deleted file mode 100755 index eca7590..0000000 --- a/app/src/views/submission/verify_writer.php +++ /dev/null @@ -1,51 +0,0 @@ - - -
-

Verifieer Schrijver

- - -
-

-

- Om dit artikel te bewerken, bevestig aub wie de schrijver is. -

-
- - -
- - -
- - -
- -
- - - ← Terug naar Lijst - -
-
-
- - diff --git a/app/storage/.gitkeep b/app/storage/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/compose.yml b/compose.yml index dceadc5..1b94f35 100644 --- a/compose.yml +++ b/compose.yml @@ -20,15 +20,12 @@ services: UNIVERSAL_PASSWORD: ${UNIVERSAL_PASSWORD:-ProostenKrant2024!} HOOGTES_BEWAREN: ${HOOGTES_BEWAREN:-0} volumes: - # Bestaande artikel- en profielfoto's hergebruiken - - ./app/public/images/articles:/app/wwwroot/uploads/articles - - ./app/public/images/profiles:/app/wwwroot/uploads/profiles - # Gedrukte kranten (PDF's) op de host bewaren - - ./app/storage/latex:/app/storage/latex - # Permanente archief-edities (oude kranten) + # Foto's en afbeeldingen uit de resources-map: profielfoto's + # (resources/images/profiles) en artikeluploads (resources/images/articles) + - ./resources/images:/app/wwwroot/resources/images + # Archief-edities: bestaande PDF's tonen én pas gedrukte kranten + # worden hier bewaard (resources/archive) - ./resources/archive:/app/archive - # Profielfoto's uit de resources-map (o.a. nieuwe familieleden) - - ./resources/images:/app/wwwroot/resources-images depends_on: mysql: condition: service_healthy diff --git a/deploy/Dockerfile b/deploy/Dockerfile index 4703a41..e2940c9 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -40,7 +40,7 @@ ENV ASPNETCORE_URLS=http://+:8080 \ WORKDIR /app COPY --from=build /app/publish . -RUN mkdir -p /app/wwwroot/uploads/articles /app/wwwroot/uploads/profiles /app/storage/latex +RUN mkdir -p /app/wwwroot/resources/images/profiles /app/wwwroot/resources/images/articles /app/archive EXPOSE 8080 ENTRYPOINT ["dotnet", "ProostenKrant.dll"] diff --git a/deploy/mysql/init.sql b/deploy/mysql/init.sql index 7a01fb6..95a7077 100755 --- a/deploy/mysql/init.sql +++ b/deploy/mysql/init.sql @@ -77,7 +77,8 @@ INSERT INTO users (username, display_name, profile_image) VALUES ('mathilde', 'Mathilde', NULL), ('kevin', 'Kevin', NULL), ('luc', 'Luc', NULL), -('tilde', 'Tilde', NULL); +('tilde', 'Tilde', NULL), +('mattis', 'Mattis', NULL); -- Insert universal password setting INSERT INTO settings (key_name, value) VALUES diff --git a/resources/archive/ProostenKrant22Herfs.pdf b/resources/archive/ProostenKrant22Herfs.pdf new file mode 100644 index 0000000..a990a7f Binary files /dev/null and b/resources/archive/ProostenKrant22Herfs.pdf differ diff --git a/Latex/Main.pdf b/resources/archive/ProostenKrant22Winter.pdf similarity index 69% rename from Latex/Main.pdf rename to resources/archive/ProostenKrant22Winter.pdf index c26968d..da58b89 100644 Binary files a/Latex/Main.pdf and b/resources/archive/ProostenKrant22Winter.pdf differ diff --git a/resources/archive/ProostenKrant_Herfst_2026-10-09.pdf b/resources/archive/ProostenKrant_Herfst_2026-10-09.pdf new file mode 100644 index 0000000..f3fd112 Binary files /dev/null and b/resources/archive/ProostenKrant_Herfst_2026-10-09.pdf differ diff --git a/resources/archive/ProostenKrant_Herfst_2026-10-09.tex b/resources/archive/ProostenKrant_Herfst_2026-10-09.tex new file mode 100644 index 0000000..6c4522e --- /dev/null +++ b/resources/archive/ProostenKrant_Herfst_2026-10-09.tex @@ -0,0 +1,59 @@ +\documentclass[10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{microtype} +\usepackage[dutch]{babel} +\usepackage{newspaper} +\usepackage[letterpaper,left=36pt,right=36pt,top=0.55in,bottom=36pt,headheight=40pt,headsep=12pt]{geometry} +\usepackage{graphicx} +\usepackage{tikz} +\usepackage[export]{adjustbox} +\usepackage{calc} +\usepackage{newtxtext} + +\date{\today} +\currentvolume{1} +\currentissue{1} +\SetPaperName{Proo{s:}tenKrant} +\SetHeaderName{ProostenKrant} +\SetPaperLocation{Regio Kempen} +\SetPaperSlogan{``Een krant van en voor Proosten.''} +\SetPaperPrice{NUL EURO} + +\newcommand{\blocksep}{\par\nointerlineskip\vspace{11pt}\noindent{\rule{\linewidth}{0.4pt}}\par\vspace{11pt}} +\newcommand{\colrule}{\hfill{\vrule width 0.3pt}\hfill} +\begin{document} +\maketitle +\noindent\textbf{\LARGE Editie: Herfst}\par +\vspace{8pt} + +\expandafter\newsavebox\csname blk1W\endcsname +\expandafter\savebox\csname blk1W\endcsname{\parbox{356.0pt}{{\noindent{\LARGE\itshape De Proostenkrant is back baby!!!}\par +\vspace{3pt}{\footnotesize\scshape 9 oktober 2026 --- Douwe}\par +\vspace{6pt}\noindent +\begin{minipage}[t]{0.63\linewidth} +\vspace*{0pt}Whoehoe! We voelde allemaal dat er iets miste in ons leven de laatste tijd. Sommige dachten dat dat een McDonalds in Schoonbroek was, andere dachten dat ze gewoon naar de andere kant van de wereld moesten reizen voor onbepaalde duur, maar gelukkig weet ik echt wat er mist. De 4 jaarlijkse editie van de ProostenKrant. Met men eigen server-infrastructuur ter Turnhout kan ik nu lekker gemakkelijk zelf de ProostenKrant website hosten en kunnen jullie allemaal nog gemakkelijker artikels indienen. Dus aan allen der Proosten, verdeel en rapporteer u!\par +\end{minipage} +\hfill +\begin{minipage}[t]{0.34\linewidth} +\vspace*{0pt}\setlength{\fboxsep}{3pt}\framebox{\includegraphics[max width=\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax,max height=0.26\textheight,keepaspectratio]{/app/wwwroot/resources/images/articles/05568e0b_ScreenshotFrom20261009133307.png}}\par +\end{minipage} +\par\vspace{6pt}\centering\begin{minipage}[c]{103.0pt}\centering\begin{tikzpicture}\clip (0,0) circle (44.5pt);\node at (0,0) {\includegraphics[width=89.0pt,height=89.0pt,keepaspectratio]{/app/wwwroot/resources/images/profiles/Douwe.jpg}};\end{tikzpicture}\par\vspace{2pt}{\footnotesize Douwe}\end{minipage}\par +} +}} + +\noindent +\begin{minipage}[t]{356.0pt} +\expandafter\usebox\csname blk1W\endcsname\par\vspace{14pt} +\noindent +\begin{minipage}[t]{172.0pt} +\vspace*{0pt} +\end{minipage}\colrule +\begin{minipage}[t]{172.0pt} +\vspace*{0pt} +\end{minipage} +\end{minipage}\colrule +\begin{minipage}[t]{172.0pt} +\vspace*{0pt} +\end{minipage} +\end{document} diff --git a/resources/archive/Proostenkrant23Lente.pdf b/resources/archive/Proostenkrant23Lente.pdf new file mode 100644 index 0000000..e4d390c Binary files /dev/null and b/resources/archive/Proostenkrant23Lente.pdf differ diff --git a/resources/archive/Proostenkrant23Zomer.pdf b/resources/archive/Proostenkrant23Zomer.pdf new file mode 100644 index 0000000..9001f2e Binary files /dev/null and b/resources/archive/Proostenkrant23Zomer.pdf differ diff --git a/app/public/images/articles/.gitkeep b/resources/images/articles/.gitkeep old mode 100755 new mode 100644 similarity index 100% rename from app/public/images/articles/.gitkeep rename to resources/images/articles/.gitkeep diff --git a/Latex/Images/ProfilePictures/Annick.jpg b/resources/images/profiles/Annick.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Annick.jpg rename to resources/images/profiles/Annick.jpg diff --git a/Latex/Images/ProfilePictures/Cedric.jpg b/resources/images/profiles/Cedric.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Cedric.jpg rename to resources/images/profiles/Cedric.jpg diff --git a/Latex/Images/ProfilePictures/Chris.jpg b/resources/images/profiles/Chris.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Chris.jpg rename to resources/images/profiles/Chris.jpg diff --git a/Latex/Images/ProfilePictures/Daan.jpg b/resources/images/profiles/Daan.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Daan.jpg rename to resources/images/profiles/Daan.jpg diff --git a/Latex/Images/ProfilePictures/Diede.jpg b/resources/images/profiles/Diede.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Diede.jpg rename to resources/images/profiles/Diede.jpg diff --git a/Latex/Images/ProfilePictures/Dien.jpg b/resources/images/profiles/Dien.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Dien.jpg rename to resources/images/profiles/Dien.jpg diff --git a/Latex/Images/ProfilePictures/Douwe.jpg b/resources/images/profiles/Douwe.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Douwe.jpg rename to resources/images/profiles/Douwe.jpg diff --git a/Latex/Images/ProfilePictures/Dries.jpg b/resources/images/profiles/Dries.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Dries.jpg rename to resources/images/profiles/Dries.jpg diff --git a/Latex/Images/ProfilePictures/Gunter.jpg b/resources/images/profiles/Gunter.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Gunter.jpg rename to resources/images/profiles/Gunter.jpg diff --git a/resources/images/profiles/Kevin.jpg b/resources/images/profiles/Kevin.jpg new file mode 100644 index 0000000..4c4a9b4 Binary files /dev/null and b/resources/images/profiles/Kevin.jpg differ diff --git a/Latex/Images/ProfilePictures/Kyala.jpg b/resources/images/profiles/Kyala.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Kyala.jpg rename to resources/images/profiles/Kyala.jpg diff --git a/resources/images/profiles/Luc.jpg b/resources/images/profiles/Luc.jpg new file mode 100644 index 0000000..4968138 Binary files /dev/null and b/resources/images/profiles/Luc.jpg differ diff --git a/Latex/Images/ProfilePictures/Mathilde.jpg b/resources/images/profiles/Mathilde.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Mathilde.jpg rename to resources/images/profiles/Mathilde.jpg diff --git a/Latex/Images/ProfilePictures/Mattis.jpg b/resources/images/profiles/Mattis.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Mattis.jpg rename to resources/images/profiles/Mattis.jpg diff --git a/Latex/Images/ProfilePictures/Michel.jpg b/resources/images/profiles/Michel.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Michel.jpg rename to resources/images/profiles/Michel.jpg diff --git a/Latex/Images/ProfilePictures/Pauline.jpg b/resources/images/profiles/Pauline.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Pauline.jpg rename to resources/images/profiles/Pauline.jpg diff --git a/Latex/Images/ProfilePictures/Pieter.jpg b/resources/images/profiles/Pieter.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Pieter.jpg rename to resources/images/profiles/Pieter.jpg diff --git a/resources/images/profiles/Tilde.jpg b/resources/images/profiles/Tilde.jpg new file mode 100644 index 0000000..816340c Binary files /dev/null and b/resources/images/profiles/Tilde.jpg differ diff --git a/Latex/Images/ProfilePictures/Unknown.jpg b/resources/images/profiles/Unknown.jpg old mode 100644 new mode 100755 similarity index 100% rename from Latex/Images/ProfilePictures/Unknown.jpg rename to resources/images/profiles/Unknown.jpg diff --git a/app/templates/latex/Main.tex b/resources/templates/latex/Main.tex similarity index 100% rename from app/templates/latex/Main.tex rename to resources/templates/latex/Main.tex diff --git a/app/templates/latex/newspaper-mod.sty b/resources/templates/latex/newspaper-mod.sty similarity index 100% rename from app/templates/latex/newspaper-mod.sty rename to resources/templates/latex/newspaper-mod.sty diff --git a/scratchpad/repro-meting.tex b/scratchpad/repro-meting.tex new file mode 100644 index 0000000..5506781 --- /dev/null +++ b/scratchpad/repro-meting.tex @@ -0,0 +1,80 @@ +\documentclass[10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{microtype} +\usepackage[dutch]{babel} +\usepackage{newspaper} +\usepackage[letterpaper,left=36pt,right=36pt,top=0.55in,bottom=36pt,headheight=40pt,headsep=12pt]{geometry} +\usepackage{graphicx} +\usepackage{tikz} +\usepackage[export]{adjustbox} +\usepackage{calc} +\usepackage{newtxtext} + +\date{\today} +\currentvolume{1} +\currentissue{1} +\SetPaperName{Proo{s:}tenKrant} +\SetHeaderName{ProostenKrant} +\SetPaperLocation{Regio Kempen} +\SetPaperSlogan{``Een krant van en voor Proosten.''} +\SetPaperPrice{NUL EURO} + +\newcommand{\blocksep}{\par\nointerlineskip\vspace{11pt}\noindent{\rule{\linewidth}{0.4pt}}\par\vspace{11pt}} +\newcommand{\colrule}{\hfill{\vrule width 0.3pt}\hfill} +\newwrite\hoogtes +\immediate\openout\hoogtes=hoogtes.txt +\begin{document} +\maketitle +\noindent\textbf{\LARGE Editie: Herfst}\par +\vspace{8pt} +\pdfsavepos +\newpage +\immediate\write\hoogtes{MASTHEAD \the\pdflastypos} +\immediate\write\hoogtes{GEOM \the\textwidth,\the\textheight} + +\expandafter\newsavebox\csname blk1V\endcsname +\expandafter\savebox\csname blk1V\endcsname{\parbox{172.0pt}{{\noindent{\large\itshape De Proostenkrant is back baby!!!}\par +\vspace{3pt}{\footnotesize\scshape 9 oktober 2026 --- Douwe}\par +\vspace{5pt}Whoehoe! We voelde allemaal dat er iets miste in ons leven de laatste tijd. Sommige dachten dat dat een McDonalds in Schoonbroek was, andere dachten dat ze gewoon naar de andere kant van de wereld moesten reizen voor onbepaalde duur, maar gelukkig weet ik echt wat er mist. De 4 jaarlijkse editie van de ProostenKrant. Met men eigen server-infrastructuur ter Turnhout kan ik nu lekker gemakkelijk zelf de ProostenKrant website hosten en kunnen jullie allemaal nog gemakkelijker artikels indienen. \par Dus aan allen der Proosten, verdeel en rapporteer u!\par +\vspace{5pt}\centering\begin{minipage}[c]{57.0pt}\centering\begin{tikzpicture}\clip (0,0) circle (21.5pt);\node at (0,0) {\includegraphics[width=43.0pt,height=43.0pt,keepaspectratio]{/app/wwwroot/resources/images/profiles/Douwe.jpg}};\end{tikzpicture}\par\vspace{2pt}{\footnotesize Douwe}\end{minipage}\par +\vspace{5pt}\setlength{\fboxsep}{3pt}\framebox{\includegraphics[max width=\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax,max height=0.22\textheight,keepaspectratio]{/app/wwwroot/resources/images/articles/05568e0b_ScreenshotFrom20261009133307.png}}\par +}}} +\setlength{\dimen0}{\ht\csname blk1V\endcsname}% +\advance\dimen0 by \dp\csname blk1V\endcsname +\immediate\write\hoogtes{H 1 V \the\dimen0} + +\expandafter\newsavebox\csname blk1H\endcsname +\expandafter\savebox\csname blk1H\endcsname{\parbox{172.0pt}{{\noindent +\begin{minipage}[t]{0.63\linewidth} +\vspace*{0pt}\noindent{\large\itshape De Proostenkrant is back baby!!!}\par +\vspace{3pt}{\footnotesize\scshape 9 oktober 2026 --- Douwe}\par +\vspace{5pt}Whoehoe! We voelde allemaal dat er iets miste in ons leven de laatste tijd. Sommige dachten dat dat een McDonalds in Schoonbroek was, andere dachten dat ze gewoon naar de andere kant van de wereld moesten reizen voor onbepaalde duur, maar gelukkig weet ik echt wat er mist. De 4 jaarlijkse editie van de ProostenKrant. Met men eigen server-infrastructuur ter Turnhout kan ik nu lekker gemakkelijk zelf de ProostenKrant website hosten en kunnen jullie allemaal nog gemakkelijker artikels indienen. \par Dus aan allen der Proosten, verdeel en rapporteer u!\par +\end{minipage} +\hfill +\begin{minipage}[t]{0.34\linewidth} +\vspace*{0pt}\setlength{\fboxsep}{3pt}\framebox{\includegraphics[max width=\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax,max height=0.30\textheight,keepaspectratio]{/app/wwwroot/resources/images/articles/05568e0b_ScreenshotFrom20261009133307.png}}\par +\end{minipage} +\par\vspace{5pt}\centering\begin{minipage}[c]{57.0pt}\centering\begin{tikzpicture}\clip (0,0) circle (21.5pt);\node at (0,0) {\includegraphics[width=43.0pt,height=43.0pt,keepaspectratio]{/app/wwwroot/resources/images/profiles/Douwe.jpg}};\end{tikzpicture}\par\vspace{2pt}{\footnotesize Douwe}\end{minipage}\par +}}} +\setlength{\dimen0}{\ht\csname blk1H\endcsname}% +\advance\dimen0 by \dp\csname blk1H\endcsname +\immediate\write\hoogtes{H 1 H \the\dimen0} + +\expandafter\newsavebox\csname blk1W\endcsname +\expandafter\savebox\csname blk1W\endcsname{\parbox{356.0pt}{{\noindent{\LARGE\itshape De Proostenkrant is back baby!!!}\par +\vspace{3pt}{\footnotesize\scshape 9 oktober 2026 --- Douwe}\par +\vspace{6pt}\noindent +\begin{minipage}[t]{0.63\linewidth} +\vspace*{0pt}Whoehoe! We voelde allemaal dat er iets miste in ons leven de laatste tijd. Sommige dachten dat dat een McDonalds in Schoonbroek was, andere dachten dat ze gewoon naar de andere kant van de wereld moesten reizen voor onbepaalde duur, maar gelukkig weet ik echt wat er mist. De 4 jaarlijkse editie van de ProostenKrant. Met men eigen server-infrastructuur ter Turnhout kan ik nu lekker gemakkelijk zelf de ProostenKrant website hosten en kunnen jullie allemaal nog gemakkelijker artikels indienen. \par Dus aan allen der Proosten, verdeel en rapporteer u!\par +\end{minipage} +\hfill +\begin{minipage}[t]{0.34\linewidth} +\vspace*{0pt}\setlength{\fboxsep}{3pt}\framebox{\includegraphics[max width=\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax,max height=0.26\textheight,keepaspectratio]{/app/wwwroot/resources/images/articles/05568e0b_ScreenshotFrom20261009133307.png}}\par +\end{minipage} +\par\vspace{6pt}\centering\begin{minipage}[c]{103.0pt}\centering\begin{tikzpicture}\clip (0,0) circle (44.5pt);\node at (0,0) {\includegraphics[width=89.0pt,height=89.0pt,keepaspectratio]{/app/wwwroot/resources/images/profiles/Douwe.jpg}};\end{tikzpicture}\par\vspace{2pt}{\footnotesize Douwe}\end{minipage}\par +}}} +\setlength{\dimen0}{\ht\csname blk1W\endcsname}% +\advance\dimen0 by \dp\csname blk1W\endcsname +\immediate\write\hoogtes{H 1 W \the\dimen0} +\end{document} diff --git a/scripts/demo-articles.tsv b/scripts/demo-articles.tsv deleted file mode 100644 index 3c55731..0000000 --- a/scripts/demo-articles.tsv +++ /dev/null @@ -1,21 +0,0 @@ -Herfstwandeling in het Hallerbos|Zaterdagochtend trokken Douwe en Pauline eropuit voor een lange herfstwandeling in het Hallerbos. Het bos kleurde prachtig goudgeel en de paden lagen bezaaid met kastanjes. Onderweg picknikten ze bij de oude jachthut, waar Pauline verrassend goede thermoskoffie bleek te hebben meegenomen. Na ruim drie uur kwamen ze voldaan weer thuis. Volgende maand willen ze het bos nog eens bezoeken, dan met de kleine kinderen mee.|Douwe|Douwe,Pauline|2026-10-06 -Cedric loopt zijn eerste halve marathon|Het is gelukt: Cedric heeft zondag zijn allereerste halve marathon uitgelopen in Kasterlee. Na maandenlange training in de vroege ochtenduren finishte hij in twee uur en acht minuten, wat niemand had verwacht. Langs de finish stonden Geert en Oma Dien hem luidkeels aan te moedigen. Ter afsluiting was er natuurlijk een stevige portie pasta bij de familie thuis.|Geert|Cedric,Geert|2026-10-12 -De pompoensoep van Oma Dien is niet te evenaren|Met de eerste koele dagen van het najaar verschijnt hij weer op tafel: de beroemde pompoensoep van Oma Dien. Dit jaar gebruikte ze pompoenen uit eigen tuin, die volgens kenners de beste van de Broekstraat zijn. Het geheime recept gaat van generatie op generatie, maar wie denkt dat het alleen om de pompoen gaat, heeft het mis. De kruidnagel en een scheutje room maken het verschil.|Dien|Dien|2026-10-03 -Weekend in de Ardennen met de neven|Gunter en Daan trokken een lang weekend naar de Ardennen voor hun jaarlijkse broertjesuitje. De wandeltocht langs de Ourthe was zwaar maar prachtig, en de avonden bij de open haard in de gite maakten alles goed. Op zondag bezochten ze nog de grotten van Han, waar Daan zoals altijd de gids verbeterde. Volgend jaar hopen ze de Vogelberg te beklimmen.|Gunter|Gunter,Daan|2026-10-17 -Luc haalt zijn duikbrevet|Groot nieuws uit de duikschool: Luc heeft met lof zijn duikbrevet gehaald. Na maanden oefenen in het binnenbad van Herentals was de proefduik in de Nete een groot succes. De zichtbaarheid onder water was verrassend goed, al bleef het koud volgens de beginnende duiker. Ter beloning ging de hele bende eten bij de frituur, wat volgens Luc het beste deel van de dag was.|Mathilde|Mathilde,Luc|2026-10-05 -Appelpluk bij boer Janssens|Zondag werd er massaal appels geplukt bij boer Janssens. Chris en Geert kregen hulp van de hele bende en brachten ruim veertig kilo appels naar huis. Volgens Chris was het de beste oogst in jaren, dankzij de zachte zomer. In de komende weken staat er dus appelmoes, appeltaart en vers geperst sap op het menu. De kinderen mochten in de hooiberg spelen.|Chris|Chris,Geert|2026-09-27 -Kerstmarkt in Keulen met de trein|Pauline en Douwe zijn traditiegetrouw per trein naar de kerstmarkt in Keulen gereisd. De Dom stak prachtig af tegen de sneeuw die zaterdag viel, en de gluhwein was zoals elk jaar weer stevig lekker. Douwe kocht een onnodig maar magnifiek houten klokje op de handwerkmarkt. Na een lange dag kwamen ze laat maar voldaan terug in het Kempenland.|Pauline|Pauline,Douwe|2026-11-21 -Mathilde op kamers in Leuven|Een nieuw hoofdstuk voor Mathilde: ze is begonnen met haar studies in Leuven en woont nu op een studentenkamer boven de Oude Markt. De verhuizing verliep vlot, al moest er flink geboend worden voordat het gezellig werd. In het weekend komt ze geregeld naar huis om bij te slapen en de was te doen, netjes volgens de familiegebruiken.|Mathilde|Mathilde|2026-09-28 -De renovatie van de Broekstraat is eindelijk af|Na zes maanden stof, steigers en geduld is de renovatie van de Broekstraat officieel afgerond. Kevin coördineerde het hele traject en toont zich trots op het resultaat. De nieuwe gevels zijn terug in de originele kleuren geschilderd en de straatklinkers zijn compleet vernieuwd. De buren organiseerden een gezellige straatfeest, waar tot laat in de avond werd nagepraat.|Kevin|Kevin,Chris|2026-10-09 -Sinterklaas bij de Proostens|Ook dit jaar wist Sinterklaas de Broekstraat weer feilloos te vinden. De kinderen zongen luidkeels hun liederen en de pepernoten vlogen in het rond. Kyala en Michel hadden de zolder weer omgetoverd tot een ware surpriseschuur. Voor Tilde was er een echte racebaan, en de volwassenen kregen zoals elk jaar gedichten die niemand ongestraft overleeft.|Kyala|Kyala,Michel,Tilde|2026-12-05 -Pieter en de oude tractor|Pieter heeft dit najaar een ware schat gerestaureerd: een aftandse oldtimer tractor uit 1962, gevonden op een veiling in Peer. Maandenlang prutste hij elke zaterdag in de schuur, tot de motor onlangs weer aansloeg. De tractor trekt inmiddels hout aan voor de open haard van de hele familie. Volgende lente wil hij ermee naar de trekkermeeting in Bree.|Pieter|Pieter|2026-10-11 -Dagje Düsseldorf met de trein|Dries pakte de vroege trein voor een dagje shoppen in Düsseldorf. De Konigsallee was een walhalla, al bleef zijn portemonnee verrassend gesloten. Op de terugweg viel hij in slaap en reed hij bijna zijn halte voorbij, wat zijn mede-reizigers deed grijnzen. Een geslaagd dagje volgens de vaste normen van de familie.|Dries|Dries,Kyala|2026-10-18 -Boomhut timmeren in de achtertuin|Kevin en Luc zijn een weekend bezig geweest met de bouw van een echte boomhut in de grote eik achteraan de tuin. Het plan werd zorgvuldig getekend op een pak cornflakes. Na wat geschuifel met planken en vele koppen limonade staat er nu een fort om trots op te zijn. De opening was gisteren, met linten en een feestelijke ontvangst voor de buurtkinderen.|Kevin|Kevin,Luc|2026-10-25 -De tuin winterklaar maken|Zondag werd de laatste hand aan de wintervoorbereiding gelegd: de tuin is officieel winterklaar. Dien en Chris sneden de hagen, ruimden het onkruid en de vijver kreeg een winterdek. De laatste chrysanten staan nog in bloei en kleuren de moestuin verrassend feestelijk. Volgens insiders wordt het een strenge winter, dus de kachelhoutvoorraad is aanzienlijk.|Dien|Dien,Chris|2026-11-08 -Opa wordt tachtig, en het hele dier komt feesten|Het was een dag om in te lijsten: Oma Dien en Opa werden verrast met een knalfeest ter gelegenheid van zijn tachtigste verjaardag. De garage was omgebouwd tot feestzaal en de gasten stonden tot op straat. Er was muziek van de fanfare, een zelfgebakken taart van drie verdiepingen en speechen die het ochtendjournaal haalden. Opa hield het droog, al kwamen de zakdoeken wel tevoorschijn.|Gunter|Gunter,Daan,Kyala,Michel|2026-10-30 -Cedric pakt brons op de judocompetitie|Het judoseizoen is goed begonnen: Cedric pakte zondag brons op de interclubcompetitie in Turnhout. Na twee gewonnen gevechten volgde een spannende beslissingswedstrijd die net niet werd gehaald. Trainer Geert noemde het de beste techniek van de dag. Volgende maand staat de beker van Kempen op het programma, waar de familie uiteraard weer massaal aanwezig zal zijn.|Geert|Cedric,Geert|2026-11-15 -Kerstboom kopen in de eerste sneeuw|Met de eerste echte sneeuw van het seizoen erbij was de kerstboommarkt een sprookje. Douwe en Pauline kozen dit jaar weer een echte Nordman, ditmaal eentje van ruim tweeeneenhalf meter, wat een heuse discussie gaf over de auto. Thuis versierd met de oude ballen van Bomma en nieuwe lichtjes uit de kraam van de scouting. De katten zijn dolblij met de nieuwe klimboom.|Douwe|Douwe,Pauline|2026-12-12 -Kyala start als teamleider bij de bank|Goed nieuws uit het bankwezen: Kyala is per dit najaar bevorderd tot teamleider van het kantoor in Retie. De familie was niet verbaasd; wie Kyala kent weet dat ze overal de leiding neemt. De afdeling werd alvast omgetoverd met planten en een echt koffiezetapparaat. Over een promotiebonus wordt gefluisterd, maar daarover is nog niets bekendgemaakt.|Kyala|Kyala|2026-10-02 -Zondagsrit naar de kust|Michel en Mathilde pakten de fiets voor een lange zondagsrit naar de kust. Via de kanalen en over de veer bij Mariekerke bereikten ze Oostende in drie uur. Er werd vis gegeten aan de grote kaai, en het ijsje op de zeedijk was niet aan de familie te besteden. Op de terugweg deden ze nog de steenweg van Blankenberge aan.|Michel|Michel,Mathilde|2026-10-19 -Voorbereidingen voor de nieuwjaarsduik|Het is weer bijna zover: de jaarlijkse nieuwjaarsduik in het kanaal. Daan en Gunter trainen al weken, in badpak en met een ernstig gezicht. Er wordt gewed op wie dit jaar het langste in het ijskoude water durft te blijven. De wafels en de jenever waren alvast veiliggesteld bij de plaatselijke bakker.|Daan|Daan,Gunter|2026-12-13 -Tilde blitst de oudekoektrommel op|Tilde heeft met man en macht de oude koektrommel van Bomma teruggevonden en geschonken laten herstellen. De koperen rand glimt weer als een spiegel en volgens de kenners is dit het mooiste stuk van de hele collectie. Bij de onthulling werd er natuurlijk gevulde koek geserveerd. Wie de trommel ooit weer leeg zag, deed een gooi naar het verhaal van de kerst van 1994.|Tilde|Tilde,Dien|2026-11-01 diff --git a/scripts/demo-krant.sh b/scripts/demo-krant.sh deleted file mode 100755 index 786ee57..0000000 --- a/scripts/demo-krant.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -# Simuleert 20 familiezendingen via de echte website-flow (paszin -> formulier), -# publiceert ze als redactie en drukt de Herfst-editie. -set -u -BASE=http://localhost:8080 -PASS="ProostenKrant2024!" -JAR=/tmp/sim.cookies -IMG1="/home/douwe/Projects/proostenkrant.net/app/public/images/articles/930c7e6f_ScreenshotFrom20260806141156.png" -IMG2="/home/douwe/Projects/proostenkrant.net/app/public/images/articles/3b901c4e_ScreenshotFrom20260212232013.png" - -get_token() { - curl -s -b "$JAR" -c "$JAR" "$BASE$1" -o "$2" - TOKEN=$(grep -o 'name="__RequestVerificationToken"[^>]*value="[^"]*"' "$2" | head -1 | sed 's/.*value="//;s/"$//') - HANDLER=$(grep -o 'name="_handler" value="[^"]*"' "$2" | head -1 | sed 's/.*value="//;s/"$//') -} - -echo "=== Opruimen: testartikelen van eerder ===" -docker exec proostenkrant-mysql mysql -u proostenkrant -pproostenkrant proostenkrant -e "TRUNCATE TABLE articles;" 2>/dev/null - -echo "=== 20 artikelen indienen via /indienen ===" -n=0 -declare -A UID_MAP -while IFS=$'\t' read -r naam id; do - UID_MAP["$naam"]="$id" -done < <(docker exec proostenkrant-mysql mysql -N -u proostenkrant -pproostenkrant proostenkrant -e "SELECT display_name, id FROM users;" 2>/dev/null | tr -d ' ') -id_van() { echo "${UID_MAP[$1]:-0}"; } - -while IFS='|' read -r TITEL TEKST SCHRIJVER DEELNEMERS DATUM; do - [ -z "$TITEL" ] && continue - n=$((n+1)) - # paszin-flow per artikel (cookie wordt na elke indiening gewist) - rm -f "$JAR" - get_token "/indienen" /tmp/sim_pas.html - curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Paszin=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null - get_token "/indienen/formulier" /tmp/sim_form.html - # wissel de twee dummy-afbeeldingen af - if [ $((n % 2)) -eq 1 ]; then IMG="$IMG1"; else IMG="$IMG2"; fi - IFS=',' read -ra NAMEN <<< "$DEELNEMERS" - ARGS=() - for d in "${NAMEN[@]}"; do ARGS+=(-F "Participants=$(id_van "$d")"); done - code=$(curl -s -b "$JAR" -X POST "$BASE/indienen/formulier" \ - -F "_handler=$HANDLER" \ - -F "Input.Title=$TITEL" \ - -F "Input.Content=$TEKST" \ - -F "Input.WriterId=$(id_van "$SCHRIJVER")" \ - -F "Input.EventDate=$DATUM" \ - "${ARGS[@]}" \ - -F "Afbeelding=@$IMG" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "%{http_code}") - echo "artikel $n: $code - $TITEL" -done < /home/douwe/Projects/proostenkrant.net/scripts/demo-articles.tsv - -echo "=== Inloggen als redactie en publiceren ===" -rm -f "$JAR" -get_token "/login" /tmp/sim_login.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/login" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Username=douwe" \ - --data-urlencode "Input.Password=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null - -IDS=$(docker exec proostenkrant-mysql mysql -N -u proostenkrant -pproostenkrant proostenkrant -e "SELECT id FROM articles WHERE status='draft' ORDER BY id;" 2>/dev/null) -for id in $IDS; do - get_token "/artikelen/$id" /tmp/sim_art.html - code=$(curl -s -b "$JAR" -X POST "$BASE/artikelen/$id" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "%{http_code}") - echo "publiceer $id: $code" -done - -echo "=== Krant drukken (Herfst) ===" -get_token "/seizoenen" /tmp/sim_seiz.html -curl -s -b "$JAR" -X POST "$BASE/api/genereer-pdf" \ - -F "SeizoenId=3" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "drukken: %{http_code} -> %{redirect_url}\n" --max-time 240 -ls -la /home/douwe/Projects/proostenkrant.net/app/storage/latex/*.pdf diff --git a/scripts/e2e-test.sh b/scripts/e2e-test.sh deleted file mode 100755 index dd4adcf..0000000 --- a/scripts/e2e-test.sh +++ /dev/null @@ -1,265 +0,0 @@ -#!/bin/bash -# ProostenKrant end-to-end regressietest (draait tegen een draaiende stack op localhost:8080). -# Gebruik: docker compose up -d && scripts/e2e-test.sh -# Let op: de test maakt artikelen aan in de database en drukt een proefeditie. -set -u -# ProostenKrant end-to-end test -set -u -BASE=http://localhost:8080 -JAR=/tmp/krant.cookies -PASS="ProostenKrant2024!" -PASS_FAILED=0 - -ok() { echo "PASS: $1"; } -fail() { echo "FAIL: $1"; PASS_FAILED=1; } - -check() { # desc, expected, actual - if [ "$2" = "$3" ]; then ok "$1"; else fail "$1 (expected [$2], got [$3])"; fi -} -contains() { # desc, file, pattern - if grep -q "$3" "$2"; then ok "$1"; else fail "$1 (pattern '$3' not found in $2)"; fi -} -notcontains() { - if ! grep -q "$3" "$2"; then ok "$1"; else fail "$1 (unexpected pattern '$3' in $2)"; fi -} - -get_token() { # url, outfile -> sets TOKEN - curl -s -b "$JAR" -c "$JAR" "$BASE$1" -o "$2" - TOKEN=$(grep -o 'name="__RequestVerificationToken"[^>]*value="[^"]*"' "$2" | head -1 | sed 's/.*value="//;s/"$//') - HANDLER=$(grep -o 'name="_handler" value="[^"]*"' "$2" | head -1 | sed 's/.*value="//;s/"$//') -} - -echo "=== 1. Publieke pagina's (anoniem) ===" -for p in "/" "/archief" "/indienen" "/login"; do - code=$(curl -s -o /dev/null -w "%{http_code}" "$BASE$p") - check "GET $p" 200 "$code" -done -code=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/dashboard") -check "GET /dashboard anoniem -> 302" 302 "$code" - -echo "=== 2. Inloggen ===" -rm -f "$JAR" -get_token "/login" /tmp/t_login.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/login" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Username=douwe" \ - --data-urlencode "Input.Password=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "" -code=$(curl -s -b "$JAR" -o /tmp/t_dash.html -w "%{http_code}" "$BASE/dashboard") -check "GET /dashboard ingelogd" 200 "$code" -contains "dashboard toont welkom" /tmp/t_dash.html "Welkom, Douwe" -contains "dashboard toont stats" /tmp/t_dash.html "Kladartikelen" - -echo "=== 2b. Fout wachtwoord ===" -rm -f "$JAR" -get_token "/login" /tmp/t_login.html -resp=$(curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/login" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Username=douwe" \ - --data-urlencode "Input.Password=fout" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" -o /tmp/t_loginbad.html -w "%{http_code}") -check "POST login met fout wachtwoord -> 200 met foutmelding" 200 "$resp" -contains "foutmelding tonen" /tmp/t_loginbad.html "Ongeldige gebruikersnaam of wachtwoord" - -echo "=== 3. Opnieuw inloggen + artikel maken (redactie) ===" -rm -f "$JAR" -get_token "/login" /tmp/t_login.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/login" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Username=douwe" \ - --data-urlencode "Input.Password=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" -o /dev/null - -get_token "/artikelen/nieuw" /tmp/t_nieuw.html -code=$(curl -s -b "$JAR" -X POST "$BASE/artikelen/nieuw" \ - -F "_handler=$HANDLER" \ - -F "Input.Title=Eerste artikel in de Blazor-krant" \ - -F "Input.Content=Dit is de eerste testcase. De ProostenKrant is nu een Blazor-applicatie en dit artikel moet netjes in de database belanden." \ - -F "Input.WriterId=1" \ - -F "Input.EventDate=2026-10-01" \ - -F "Input.SeasonId=3" \ - -F "Input.Status=published" \ - -F "Participants=1" -F "Participants=2" \ - -F "Afbeelding=@/home/douwe/Projects/proostenkrant.net/app/public/images/articles/Marathon.jpg" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "%{http_code}") -check "POST nieuw artikel -> 302" 302 "$code" -curl -s -b "$JAR" "$BASE/artikelen" -o /tmp/t_lijst.html -contains "artikel staat in de lijst" /tmp/t_lijst.html "Eerste artikel in de Blazor-krant" - -echo "=== 4. Artikeldetail (publiek voor published) ===" -NIEUWID=$(grep -o 'href="/artikelen/[0-9]*">Eerste artikel in de Blazor-krant' /tmp/t_lijst.html | grep -o '[0-9]*' | head -1) -code=$(curl -s -o /tmp/t_art.html -w "%{http_code}" "$BASE/artikelen/$NIEUWID") -check "GET /artikelen/$NIEUWID anoniem" 200 "$code" -contains "artikelkop" /tmp/t_art.html "Eerste artikel in de Blazor-krant" -contains "deelnemers avatars" /tmp/t_art.html "participant-avatar" -if grep -q "uploads/articles" /tmp/t_art.html; then ok "artikelafbeelding geupload"; else fail "artikelafbeelding geupload"; fi - -echo "=== 5. Seizoenen + PDF genereren ===" -curl -s -b "$JAR" "$BASE/seizoenen" -o /tmp/t_seizoenen.html -contains "seizoenenoverzicht" /tmp/t_seizoenen.html "Druk deze editie" -get_token "/seizoenen" /tmp/t_seizoenen.html -code=$(curl -s -b "$JAR" -X POST "$BASE/api/genereer-pdf" \ - -F "SeizoenId=3" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "%{http_code}" --max-time 240) -check "POST druk Herfst-editie -> 302" 302 "$code" -PDF=$(ls -t /home/douwe/Projects/proostenkrant.net/app/storage/latex/*.pdf 2>/dev/null | head -1) -if [ -n "$PDF" ] && [ -f "$PDF" ]; then ok "PDF gegenereerd: $(basename "$PDF")"; else fail "PDF gegenereerd"; PDF=""; fi -if [ -n "$PDF" ]; then - head -c 4 "$PDF" | grep -q "%PDF" && ok "PDF header geldig" || fail "PDF header geldig" - size=$(stat -c%s "$PDF") - [ "$size" -gt 20000 ] && ok "PDF grootte redelijk ($size b)" || fail "PDF grootte ($size b)" -fi - -echo "=== 6. Editie downloaden en archief ===" -if [ -n "$PDF" ]; then - code=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/edities/$(basename "$PDF")") - check "GET /edities/PDF" 200 "$code" -fi -curl -s "$BASE/archief" -o /tmp/t_archief.html -contains "archief toont editie" /tmp/t_archief.html "ProostenKrant" -contains "archief toont gepubliceerd artikel" /tmp/t_archief.html "Eerste artikel in de Blazor-krant" - -echo "" -echo "=== RESULTAAT DEEL 1: $([ $PASS_FAILED = 0 ] && echo ALLES GESLAAGD || echo FOUTEN GEVONDEN) ===" - -echo "" -rm -f /tmp/krant.cookies2 -# ProostenKrant end-to-end test — deel 2: inzendflow, bewerkflow, uitloggen -set -u -BASE=http://localhost:8080 -JAR=/tmp/krant.cookies2 -PASS="ProostenKrant2024!" -PASS_FAILED=0 - -ok() { echo "PASS: $1"; } -fail() { echo "FAIL: $1"; PASS_FAILED=1; } -check() { if [ "$2" = "$3" ]; then ok "$1"; else fail "$1 (expected [$2], got [$3])"; fi; } -contains() { if grep -q "$3" "$2"; then ok "$1"; else fail "$1 (pattern '$3' niet in $2)"; fi; } - -get_token() { - curl -s -b "$JAR" -c "$JAR" "$BASE$1" -o "$2" - TOKEN=$(grep -o 'name="__RequestVerificationToken"[^>]*value="[^"]*"' "$2" | head -1 | sed 's/.*value="//;s/"$//') - HANDLER=$(grep -o 'name="_handler" value="[^"]*"' "$2" | head -1 | sed 's/.*value="//;s/"$//') -} - -echo "=== 7. Inzendflow: paszin ===" -rm -f "$JAR" -code=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/indienen/formulier") -check "formulier zonder paszin -> redirect (302)" 302 "$code" - -get_token "/indienen" /tmp/u_ind.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Paszin=foutezin" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /tmp/u_ind_bad.html -contains "foute paszin -> foutmelding" /tmp/u_ind_bad.html "Onjuiste paszin" - -get_token "/indienen" /tmp/u_ind.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Paszin=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "" -D /tmp/u_ind_ok.headers -contains "juiste paszin -> cookie" /tmp/u_ind_ok.headers "ProostenKrant=" -code=$(curl -s -b "$JAR" -o /tmp/u_form.html -w "%{http_code}" "$BASE/indienen/formulier") -check "formulier met paszin -> 200" 200 "$code" -contains "formulier toont titelveld" /tmp/u_form.html "Titel" - -echo "=== 8. Inzendflow: artikel indienen met foto ===" -get_token "/indienen/formulier" /tmp/u_form.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen/formulier" \ - -F "_handler=$HANDLER" \ - -F "Input.Title=Een dagje aan zee" \ - -F "Input.Content=We gingen met de hele familie naar Blankenberge. Het was prachtig weer en de zee was kalm. Iedereen heeft genoten van de dag." \ - -F "Input.WriterId=2" \ - -F "Input.EventDate=2026-10-05" \ - -F "Participants=2" -F "Participants=3" \ - -F "Afbeelding=@/tmp/blankenberge.jpg" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -D /tmp/u_post.h -w "" -loc=$(grep -i "^location" /tmp/u_post.h | tr -d '\r' | awk '{print $2}') -echo "redirect: $loc" -contains "redirect naar bevestiging" /tmp/u_post.h "indienen/bevestiging" -curl -s "$loc" -o /tmp/u_bev.html -contains "bevestiging toont titel" /tmp/u_bev.html "Een dagje aan zee" -ARTID=$(echo "$loc" | grep -o "artikel=[0-9]*" | cut -d= -f2) -echo "nieuw artikel-id: $ARTID" - -echo "=== 9. Cookie verlopen na indienen ===" -code=$(curl -s -b "$JAR" -o /dev/null -w "%{http_code}" "$BASE/indienen/formulier") -check "formulier opnieuw -> redirect (cookie weg)" 302 "$code" - -echo "=== 10. Bewerkflow: paszin -> lijst -> schrijver verificatie ===" -rm -f "$JAR" -get_token "/indienen/bewerken" /tmp/u_bp.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen/bewerken" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Paszin=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -curl -s -b "$JAR" "$BASE/indienen/bewerken/lijst" -o /tmp/u_lijst.html -contains "lijst toont kladartikel" /tmp/u_lijst.html "Een dagje aan zee" - -echo "--- foute schrijver (id 1, echte schrijver is 2) ---" -get_token "/indienen/bewerken/$ARTID" /tmp/u_ver.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen/bewerken/$ARTID" \ - -F "_handler=$HANDLER" \ - -F "Input.WriterId=1" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /tmp/u_ver_fout.html -w "foute POST status: %{http_code}\n" -contains "verkeerde schrijver geweigerd" /tmp/u_ver_fout.html "Alleen de schrijver" - -echo "--- juiste schrijver (id 2) ---" -get_token "/indienen/bewerken/$ARTID" /tmp/u_ver.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen/bewerken/$ARTID" \ - -F "_handler=$HANDLER" \ - -F "Input.WriterId=2" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -D /tmp/u_ver_ok.h -w "juiste POST status: %{http_code}\n" -loc=$(grep -i "^location" /tmp/u_ver_ok.h | tr -d '\r' | awk '{print $2}') -echo "redirect: $loc" -curl -s -b "$JAR" "$loc" -o /tmp/u_edit.html -contains "bewerkformulier toont bestaande titel" /tmp/u_edit.html "Een dagje aan zee" -contains "bewerkformulier staat in bewerkmodus" /tmp/u_edit.html "Artikel bewerken" - -echo "--- wijzig opslaan ---" -get_token "/indienen/formulier" /tmp/u_edit.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/indienen/formulier" \ - -F "_handler=$HANDLER" \ - -F "Input.Title=Een dagje aan zee (ge-edit)" \ - -F "Input.Content=We gingen met de hele familie naar Blankenberge. Het was prachtig weer en de zee was kalm. Iedereen heeft genoten van de dag. Update: het artikel is bewerkt." \ - -F "Input.WriterId=2" \ - -F "Input.EventDate=2026-10-05" \ - -F "Participants=2" \ - -F "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -D /tmp/u_edit_post.h -contains "wijziging doorgestuurd" /tmp/u_edit_post.h "indienen/bevestiging" - -echo "=== 11. Redactie ziet nieuwe kladartikelen ===" -rm -f "$JAR" -get_token "/login" /tmp/u_login.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/login" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "Input.Username=douwe" \ - --data-urlencode "Input.Password=$PASS" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" -o /dev/null -curl -s -b "$JAR" "$BASE/artikelen?status=draft" -o /tmp/u_drafts.html -contains "klad-overzicht toont bewerkte titel" /tmp/u_drafts.html "Een dagje aan zee (ge-edit)" - -echo "=== 12. Uitloggen ===" -get_token "/uitloggen" /tmp/u_uit.html -curl -s -b "$JAR" -c "$JAR" -X POST "$BASE/uitloggen" \ - --data-urlencode "_handler=$HANDLER" \ - --data-urlencode "__RequestVerificationToken=$TOKEN" \ - -o /dev/null -w "" -D /tmp/u_uit.h -code=$(curl -s -b "$JAR" -o /dev/null -w "%{http_code}" "$BASE/dashboard") -check "dashboard na uitloggen -> 302" 302 "$code" - -echo "" -echo "=== RESULTAAT DEEL 2: $([ $PASS_FAILED = 0 ] && echo ALLES GESLAAGD || echo FOUTEN GEVONDEN) ===" - -exit $PASS_FAILED diff --git a/src/ProostenKrant/Program.cs b/src/ProostenKrant/Program.cs index d662d13..8446848 100644 --- a/src/ProostenKrant/Program.cs +++ b/src/ProostenKrant/Program.cs @@ -71,7 +71,7 @@ app.MapGet("/edities/{bestand}", (string bestand) => } var dirs = new[] { - Path.Combine(app.Environment.ContentRootPath, app.Configuration["Paths:LatexOutput"] ?? "storage/latex"), + Path.Combine(app.Environment.ContentRootPath, app.Configuration["Paths:LatexOutput"] ?? "archive"), Path.Combine(app.Environment.ContentRootPath, app.Configuration["Paths:StaticArchive"] ?? "archive"), }; var path = dirs.Select(d => Path.Combine(d, safe)).FirstOrDefault(File.Exists); diff --git a/src/ProostenKrant/Services/LatexService.cs b/src/ProostenKrant/Services/LatexService.cs index ebd3c19..c4e987a 100644 --- a/src/ProostenKrant/Services/LatexService.cs +++ b/src/ProostenKrant/Services/LatexService.cs @@ -36,7 +36,7 @@ public class LatexService private const double SafetyPt = 8; private string OutputDir => Path.Combine(_env.ContentRootPath, - _config["Paths:LatexOutput"] ?? "storage/latex"); + _config["Paths:LatexOutput"] ?? "archive"); private string ArchiveDir => Path.Combine(_env.ContentRootPath, _config["Paths:StaticArchive"] ?? "archive"); @@ -59,7 +59,9 @@ public class LatexService public List ListEditions() { var result = new List(); - foreach (var dir in new[] { OutputDir, ArchiveDir }) + var gezien = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var dir in new[] { OutputDir, ArchiveDir }.DistinctBy(d => d, + StringComparer.OrdinalIgnoreCase)) { if (!Directory.Exists(dir)) { @@ -68,6 +70,10 @@ public class LatexService foreach (var file in Directory.GetFiles(dir, "*.pdf")) { var name = Path.GetFileName(file); + if (!gezien.Add(name)) + { + continue; + } var info = new FileInfo(file); DateTime? date = null; var match = Regex.Match(name, @"(\d{4}-\d{2}-\d{2})"); @@ -551,7 +557,9 @@ public class LatexService } var pagina = 0; - while (resterend.Count > 0) + // Loop ook wanneer resterend leeg is maar er wel een kopartikel is: + // anders verdwijnt het enige artikel van de editie uit de krant. + while (resterend.Count > 0 || (pagina == 0 && leadId != 0)) { var caps = new[] { diff --git a/src/ProostenKrant/Services/UploadService.cs b/src/ProostenKrant/Services/UploadService.cs index ee199b3..368aadf 100644 --- a/src/ProostenKrant/Services/UploadService.cs +++ b/src/ProostenKrant/Services/UploadService.cs @@ -3,10 +3,15 @@ namespace ProostenKrant.Services; public class UploadService { private readonly IWebHostEnvironment _env; + private readonly IConfiguration _config; private static readonly string[] AllowedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".webp" }; private const long MaxBytes = 25 * 1024 * 1024; - public UploadService(IWebHostEnvironment env) => _env = env; + public UploadService(IWebHostEnvironment env, IConfiguration config) + { + _env = env; + _config = config; + } public async Task<(string? WebPath, string? Error)> SaveArticleImageAsync(IFormFile? file) { @@ -30,11 +35,15 @@ public class UploadService var safeBase = new string(baseName.Where(char.IsLetterOrDigit).Take(40).ToArray()); var fileName = $"{Guid.NewGuid().ToString("N")[..8]}_{safeBase}{ext}"; - var dir = Path.Combine(_env.WebRootPath, "uploads", "articles"); + // Artikelafbeeldingen landen in de resources-map + // (resources/images/articles), zodat ze op de host bewaard blijven. + var resources = _config["Paths:ResourceImages"] ?? "resources/images"; + var dir = Path.Combine(_env.WebRootPath ?? ".", + resources.Replace('/', Path.DirectorySeparatorChar), "articles"); Directory.CreateDirectory(dir); await using var stream = File.Create(Path.Combine(dir, fileName)); await file.CopyToAsync(stream); - return ($"uploads/articles/{fileName}", null); + return ($"{resources}/articles/{fileName}", null); } } diff --git a/src/ProostenKrant/Services/UserService.cs b/src/ProostenKrant/Services/UserService.cs index d7a1df5..794d3df 100644 --- a/src/ProostenKrant/Services/UserService.cs +++ b/src/ProostenKrant/Services/UserService.cs @@ -49,46 +49,40 @@ public class UserService } /// - /// Zoekt de profielfoto van een familielid. Volgorde: eigen uploadmap, - /// resources-map (bijv. nieuwe familieleden), dan Unknown.jpg. + /// Zoekt de profielfoto van een familielid in de resources-map + /// (resources/images/profiles). Een foto hoort bij iemand als de + /// bestandsnaam (zonder extensie) overeenkomt met de weergavenaam; + /// een later toegevoegde foto wordt dus automatisch gekoppeld en een + /// verwijderde foto valt terug op Unknown.jpg. /// public string GetProfileWebPath(User user) { - var kandidaten = new List<(string Web, string Abs)>(); - + // Expliciet ingesteld pad (uit de database) gaat voor. if (!string.IsNullOrEmpty(user.ProfileImage)) { var rel = user.ProfileImage.TrimStart('/'); - kandidaten.Add(("/" + rel, AbsPath(rel))); - } - - kandidaten.Add(("/uploads/profiles/" + user.DisplayName + ".jpg", - AbsPath("uploads/profiles/" + user.DisplayName + ".jpg"))); - - var resources = _config["Paths:ResourceImages"] ?? "resources-images"; - var resDir = Path.Combine(_env.WebRootPath ?? ".", resources); - if (Directory.Exists(resDir)) - { - foreach (var bestand in Directory.GetFiles(resDir)) + if (File.Exists(AbsPath(rel))) { - var naam = Path.GetFileNameWithoutExtension(bestand); - var ext = Path.GetExtension(bestand).ToLowerInvariant(); - if (naam.Equals(user.DisplayName, StringComparison.OrdinalIgnoreCase) && - AfbeeldingExtensies.Contains(ext)) - { - kandidaten.Insert(1, ("/" + resources + "/" + Path.GetFileName(bestand), bestand)); - } + return "/" + rel; } } - foreach (var (web, abs) in kandidaten) + var resources = _config["Paths:ResourceImages"] ?? "resources/images"; + var dir = Path.Combine(_env.WebRootPath ?? ".", + resources.Replace('/', Path.DirectorySeparatorChar), "profiles"); + if (Directory.Exists(dir)) { - if (File.Exists(abs)) + var match = Directory.GetFiles(dir).FirstOrDefault(bestand => + AfbeeldingExtensies.Contains(Path.GetExtension(bestand).ToLowerInvariant()) && + Path.GetFileNameWithoutExtension(bestand) + .Equals(user.DisplayName, StringComparison.OrdinalIgnoreCase)); + if (match is not null) { - return web; + return $"/{resources}/profiles/{Path.GetFileName(match)}"; } } - return "/uploads/profiles/Unknown.jpg"; + + return $"/{resources}/profiles/Unknown.jpg"; } private string AbsPath(string webPath) => diff --git a/src/ProostenKrant/appsettings.json b/src/ProostenKrant/appsettings.json index 83212cd..5b58dd4 100644 --- a/src/ProostenKrant/appsettings.json +++ b/src/ProostenKrant/appsettings.json @@ -14,9 +14,9 @@ }, "UniversalPassword": "ProostenKrant2024!", "Paths": { - "LatexOutput": "storage/latex", + "LatexOutput": "archive", "StaticArchive": "archive", - "ResourceImages": "resources-images" + "ResourceImages": "resources/images" }, "Krant": { "PaperName": "Proo{s:}tenKrant",