From 847f6650e9db77b7297200fc9237fda3cbd8b448 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Thu, 19 May 2022 15:43:18 +0200 Subject: [PATCH] Grote push --- cgi-bin/init.py | 4 +- cgi-bin/scraper.py | 79 +++++++++++++++++++++++++++----------- cgi-bin/stresstest.py | 41 ++++++++++++++++++++ images/wikipedia_edit.png | Bin 0 -> 66383 bytes index.html | 15 ++++++-- index.js | 63 +++++++++++++++++++++++------- style.css | 15 ++++++++ 7 files changed, 175 insertions(+), 42 deletions(-) create mode 100644 cgi-bin/stresstest.py create mode 100644 images/wikipedia_edit.png create mode 100644 style.css diff --git a/cgi-bin/init.py b/cgi-bin/init.py index 499560c..ae521a3 100644 --- a/cgi-bin/init.py +++ b/cgi-bin/init.py @@ -9,11 +9,11 @@ De bestandsextensie werd aangepast om te kunnen debuggen op zowel Windows als Li import cgi import json -from scraper import run, converteer +from scraper import run parameters = cgi.FieldStorage() data = json.loads(parameters.getvalue('data')) -antwoord = run(data['taal'], converteer(data['start']), converteer(data['einde'])) +antwoord = run(data['taal'], data['start'], data['einde']) print("Content-Type: application/json") print() # Lege lijn na headers diff --git a/cgi-bin/scraper.py b/cgi-bin/scraper.py index 0ba0bb0..b31fc0a 100644 --- a/cgi-bin/scraper.py +++ b/cgi-bin/scraper.py @@ -9,11 +9,24 @@ from bs4 import BeautifulSoup import requests -def converteer(tekst, user=True): - if user: - return tekst.replace(' ', '_') +def converteer(tekst, gebruiker=True): + """ + >>> converteer('Northwestern Europe') + 'Northwestern Europe' + >>> converteer('Northwestern_Europe', False) + 'Northwestern_Europe' + >>> converteer('Medchal%E2%80%93Malkajgiri_district') + 'Medchal–Malkajgiri district' + >>> converteer('Medchal–Malkajgiri district', False) + 'Medchal%E2%80%93Malkajgiri_district' + """ + + from urllib import parse + + if gebruiker: + return parse.unquote(tekst).replace('_', ' ').split('#')[0] else: - return tekst.replace('_', ' ') + return parse.quote(tekst.replace(' ', '_')) def zoek_link(soep): @@ -31,10 +44,19 @@ def zoek_link(soep): 'High-level_programming_language' >>> zoek_link(BeautifulSoup(requests.get('https://en.wikipedia.org/wiki/Department_of_Standards_Malaysia').content, 'html.parser')) 'Ministry_of_International_Trade_and_Industry_(Malaysia)' - """ - # TODO Zorg ervoor dat tekst schuin of vetjes ook nog herkend wordt + >>> zoek_link(BeautifulSoup(requests.get('https://en.wikipedia.org/wiki/Malawi').content, 'html.parser')) + 'Tumbuka_language' - lijsttypes = ['ul', 'ol'] # Lijsttypes die we kunnen gebruiken + Maar eventueel als alternatief 'Landlocked_country' ?? + >>> zoek_link(BeautifulSoup(requests.get('https://en.wikipedia.org/wiki/%27s-Gravenweg_168,_Kralingen').content, 'html.parser')) + 'Kralingen' + """ + + # Ik heb besloten om ook lijsttypes te kunnen doorzoeken op nuttige linkjes. Dit is strikt genomen tegen de + # beschrijving van de opgave, maar volgens https://en.wikipedia.org/wiki/Wikipedia:Getting_to_Philosophy lijkt dit + # de logische methode, dus ik besloot ook lijsten te ondersteunen, als extra uitdaging. Ik vermoedde dat de opgave + # van het project eerder

specifieerde om ons wat hoofdbreuk te besparen. + ondersteuning = ['p', 'ul', 'ol'] link = None # Navigeer naar het niveau op de pagina waarop we zullen zoeken. @@ -43,7 +65,7 @@ def zoek_link(soep): # Niet recursief zoeken om niet in een tabel of iets dergelijke vast te komen. # Het niveau onder 'mw-parser-output' is wat we nodig hebben en waar alle nodige alinea's in staan. - alinea = soep.find(['p', lijsttypes], recursive=False) + alinea = soep.find(ondersteuning, recursive=False) # Ga steeds verder omlaag (niet dieper) totdat er een geldige link is gevonden. while link is None: @@ -52,9 +74,10 @@ def zoek_link(soep): # Negeer linkjes in superscript, dus zoek enkel op het huidige niveau. potentieel = alinea.find('a') + # Spans negeren is redelijk enkel en alleen om coördinaat stukjes te vermijden. while potentieel is None or alinea.findChild().name == 'span': - alinea = alinea.findNextSibling(['p', lijsttypes]) + alinea = alinea.findNextSibling(ondersteuning) # Het zou kunnen dat de bewerking hierboven ervoor zorgt dat we op het einde van de pagina zijn if alinea is None: @@ -110,42 +133,52 @@ def run(taal, start, stop): >>> run('en', "Belgium", "Philosophy") {'pad': ['Belgium', 'Northwestern Europe', 'Subregion', 'Region', 'Geography', 'Science', 'Scientific method', 'Empirical evidence', 'Proposition', 'Logic', 'Reason', 'Consciousness', 'Sentience', 'Emotion', 'Mental state', 'Mind', 'Phenomenon', 'Immanuel Kant', 'Philosophy']} >>> run('en', 'Department of Standards Malaysia', 'Philosophy') - {'pad': ['Department_of_Standards_Malaysia', 'Ministry of International Trade and Industry (Malaysia)', 'Ministry (government department)', 'Executive (government)', 'Government', 'State (polity)', 'Germans', 'Germany', 'Central Europe', 'Europe', 'Continent', 'Landmass', 'Region', 'Geography', 'Science', 'Scientific method', 'Empirical evidence', 'Proposition', 'Logic', 'Reason', 'Consciousness', 'Sentience', 'Emotion', 'Mental state', 'Mind', 'Phenomenon', 'Immanuel Kant', 'Philosophy']} + {'pad': ['Department of Standards Malaysia', 'Ministry of International Trade and Industry (Malaysia)', 'Ministry (government department)', 'Executive (government)', 'Government', 'State (polity)', 'Germans', 'Germany', 'Central Europe', 'Europe', 'Continent', 'Landmass', 'Region', 'Geography', 'Science', 'Scientific method', 'Empirical evidence', 'Proposition', 'Logic', 'Reason', 'Consciousness', 'Sentience', 'Emotion', 'Mental state', 'Mind', 'Phenomenon', 'Immanuel Kant', 'Philosophy']} >>> run('en', 'Malkajgiri mandal', 'Philosophy') - {'pad': ['Malkajgiri_mandal', 'Medchal%E2%80%93Malkajgiri district', 'District', 'Administrative division', 'Sovereign state', 'Polity', 'Politics', 'Decision-making', 'Psychology', 'Science', 'Scientific method', 'Empirical evidence', 'Proposition', 'Logic', 'Reason', 'Consciousness', 'Sentience', 'Emotion', 'Mental state', 'Mind', 'Phenomenon', 'Immanuel Kant', 'Philosophy']} + {'pad': ['Malkajgiri mandal', 'Medchal–Malkajgiri district', 'District', 'Administrative division', 'Sovereign state', 'Polity', 'Politics', 'Decision-making', 'Psychology', 'Science', 'Scientific method', 'Empirical evidence', 'Proposition', 'Logic', 'Reason', 'Consciousness', 'Sentience', 'Emotion', 'Mental state', 'Mind', 'Phenomenon', 'Immanuel Kant', 'Philosophy']} Loops >>> run('nl', 'België', 'Philosophy') + {'error': "Cyclus gedetecteerd op 'Wetenschap', het onafgewerkte pad zal niet worden toegevoegd aan het overzicht."} + >>> run('en', 'Tom Inglesby', 'Contract failure') + {'pad': ['Tom Inglesby', 'Johns Hopkins Center for Health Security', 'Nonprofit organization', 'Contract failure']} Doodlopende eindes + TODO Voorbeelden zoeken + + Foute linkjes + >>> run('en', 'Deze pagina bestaat niet', 'Philosophy') + {'error': "Er ging iets fout bij het inladen van 'Deze pagina bestaat niet'. Bestaat de website?"} """ # Negeer de 'random' waarde als er op deze manier gestart wordt. - lijst = [converteer(start)] if start != 'Special:Random' else [] + lijst = [converteer(start, True)] if start != 'Special:Random' else [] base = f"https://{taal}.wikipedia.org/wiki/" while start != stop: + # Pagina inladen. - pagina = requests.get(base + start) + pagina = requests.get(base + converteer(start, False)) + + # Stoppen indien het inladen van de pagina niet lukte. + if pagina.status_code != 200: + return {'error': f"Er ging iets fout bij het inladen van '{lijst[-1]}'. Bestaat de website?"} # Verwerken. soep = BeautifulSoup(pagina.content, 'html.parser') # Volgende link zoeken. - start = zoek_link(soep) + start = converteer(zoek_link(soep)) - # TODO Dit verder uitwerken if start is None: - return {'error': f'Er konden geen nieuwe links meer gevonden worden op {lijst[-1]}'} + return {'error': f"Er konden geen nieuwe links meer gevonden worden op '{lijst[-1]}'"} # Cyclus detecteren - nieuw = converteer(start.split('/')[-1], False) - if nieuw in lijst: - return { - 'error': - f'Cyclus gedetecteerd op {nieuw}, het onafgewerkte pad zal niet worden toegevoegd aan het overzicht' - } + if start in lijst: + return {'error': + f"Cyclus gedetecteerd op '{start}', startende vanaf '{lijst[0]}'. Het onafgewerkte pad zal niet worden toegevoegd aan het overzicht. " + } - lijst.append(nieuw) + lijst.append(start) return {'pad': lijst} diff --git a/cgi-bin/stresstest.py b/cgi-bin/stresstest.py new file mode 100644 index 0000000..5449bf8 --- /dev/null +++ b/cgi-bin/stresstest.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +""" +Dit script is enkel en alleen bedoeld om heel veel willekeurige pagina's te kunnen testen en +enkel degene eruit te halen die falen (en dus niet correct afgehandeld worden). +""" + +from bs4 import BeautifulSoup +import requests + +from scraper import converteer, zoek_link + + +def run(taal, start, stop): + lijst = [converteer(start, True)] if start != 'Special:Random' else [] + base = f"https://{taal}.wikipedia.org/wiki/" + + while start != stop: + + # Dit is het enigste dat we aanpassen. + print(lijst[-1] if len(lijst) != 0 else []) + + pagina = requests.get(base + converteer(start, False)) + if pagina.status_code != 200: + return {'error': f"Er ging iets fout bij het inladen van '{lijst[-1]}'. Bestaat de website?"} + soep = BeautifulSoup(pagina.content, 'html.parser') + start = converteer(zoek_link(soep)) + if start is None: + return {'error': f"Er konden geen nieuwe links meer gevonden worden op '{lijst[-1]}'"} + if start in lijst: + return {'error': + f"Cyclus gedetecteerd op '{start}', startende vanaf '{lijst[0]}'. Het onafgewerkte pad zal niet worden toegevoegd aan het overzicht. " + } + lijst.append(start) + return {'pad': lijst} + + +antwoord = run('en', 'Special:Random', 'Philosophy') +while 'pad' in antwoord or antwoord['error'].startswith('Cyclus'): + antwoord = run('en', 'Special:Random', 'Philosophy') +print(antwoord['error']) diff --git a/images/wikipedia_edit.png b/images/wikipedia_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe80ed0035b59c5158c484937c2e528b3dcde27 GIT binary patch literal 66383 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 - Phikipathia - Philosophy Wikipedia Path + Phikipathia + + +

+

Phikipathia

Philosophy Wikipedia Path visualiser

-
-
- +
+
+
+ diff --git a/index.js b/index.js index c60b5c2..b2a6ebf 100644 --- a/index.js +++ b/index.js @@ -1,19 +1,23 @@ -// TODO decodeURIComponent(String) +// TODO De huidige lijst meegeven en controleren tijdens het opstellen zodat er gestopt wordt vanaf er een titel gevonden is // Initialiseer de webpagina -const taal = document.querySelector('#taal'); -const start = document.querySelector('#start'); -const einde = document.querySelector('#einde'); -const toevoegKnop = document.querySelector('#toevoegKnop'); -const visualisatie = document.querySelector('#visualisatie'); +const taal = document.getElementById('taal'); +const start = document.getElementById('start'); +const einde = document.getElementById('einde'); +const toevoegKnop = document.getElementById('toevoegKnop'); +const visualisatie = document.getElementById('visualisatie'); -maakElementIn(getOrDefault(einde), visualisatie); +let huidigeTaal; +let huidigeDoel; + +refreshTree(); toevoegKnop.addEventListener('click', () => zoek()); +taal.addEventListener('input', () => inputWaarschuwing()) +einde.addEventListener('input', () => inputWaarschuwing()); /** - * Zoek een - * pad met scraper.py en voeg deze toe in de lijst. + * Zoek een pad met python backend en voeg deze toe in de lijst. */ function zoek() { @@ -21,6 +25,8 @@ function zoek() { // paden tegelijk toegevoegd kunnen worden. toevoegKnop.disabled = true; + refreshTree(); + const verzoek = { // Standaardwaarden gebruiken indien het veld leeg is. taal: getOrDefault(taal), start: getOrDefault(start), @@ -30,14 +36,14 @@ function zoek() { fetch(`cgi-bin/init.py?data=${JSON.stringify(verzoek)}`) .then(antwoord => antwoord.json()) .then(data => voegToe(data)) - .catch(reason => alert(reason)) + .catch(reason => alert('‼ ' + reason)) .finally(() => toevoegKnop.disabled = false); // Herstel de knop. Ook als er ondertussen iets mis ging. } function voegToe(data) { if (data.hasOwnProperty('error')) { - alert(data.error); + alert('↯ ' + data.error); } else { let pad = data.pad; @@ -58,21 +64,52 @@ function voegToe(data) { // Nieuw element creëren (zonder toe te voegen aan het DOM). for (let item of pad.reverse()) { - moeder = maakElementIn(item, moeder); + moeder = maakIn(item, moeder); } } } -function maakElementIn(titel, moeder) { +/** + * Maakt een element aan binnen een ander element, en geeft het nieuwste (diepste) element terug. + */ +function maakIn(titel, moeder, id) { let wrap = document.createElement('ul'); let nieuw = document.createElement('li'); nieuw.innerHTML = titel; nieuw.setAttribute('item', titel); wrap.appendChild(nieuw); + + if (id !== undefined) { + wrap.id = id; + } + moeder.appendChild(wrap); return nieuw; } +/** + * Probeer of de huidige boom verwijderd moet worden en voeg de bestemming reeds toe aan de nieuwe boom. + */ +function refreshTree() { + if (huidigeDoel !== getOrDefault(einde) || huidigeTaal !== getOrDefault(taal)) { + huidigeTaal = getOrDefault(taal); + huidigeDoel = getOrDefault(einde); + + visualisatie.innerHTML = ''; + maakIn(huidigeDoel, visualisatie, 'wortel'); + + inputWaarschuwing(); + } +} + +/** + * Toon of verberg een speciale waarschuwing die zegt of de huidige boom verwijderd zal worden + * bij een nieuwe toevoeging. + */ +function inputWaarschuwing() { + document.getElementById('waarschuwing').hidden = huidigeTaal === getOrDefault(taal) && huidigeDoel === getOrDefault(einde); +} + function getOrDefault(element) { return element.value === '' ? element.getAttribute('placeholder') : element.value; } diff --git a/style.css b/style.css new file mode 100644 index 0000000..2c7c3a6 --- /dev/null +++ b/style.css @@ -0,0 +1,15 @@ +li ul { + /* Zorg ervoor dat de kinderelementen met hun bolletje onder de eerste letter van het vorige element staan. */ + margin: 0.2vh 1ch; + padding: 0.2vh 1vw; +} + +ul { + /* list-style-type: symbols("↪");*/ + list-style-type: symbols("⬈"); +} + +ul#wortel { + padding: 0; + list-style-type: none; +}