FS-Mod/FSMod/TagJobboerse.php

239 lines
7.6 KiB
PHP

<?php
/**
* Jobbörse from FSMod extracted from FSMod.php
*
* @file
* @ingroup Extensions
* @author Björn Kinscher
* @copyright © 2009 Björn Kinscher
* @modified 2014 Christian Zirkelbach
* @modified 2018,2019 Einhard Leichtfuß
* @modified 2019,2022 Bennet Bleßmann
* @license GNU General Public Licence 2.0 or later
*/
if( !defined( 'MEDIAWIKI' ) ) {
echo( "This file is an extension to the MediaWiki software and cannot be used standalone.\n" );
die( 1 );
}
class TagJobboerse {
static function jobexchangePreviewRender (?string $input, array $args, Parser $parser, PPFrame $frame) {
if (!isset($args['source'])) {
return "Missing source attribute containing the url to retrieve the preview data from!";
}
$opts = [
'http' => [
'methode' => "GET"
]
];
$context = stream_context_create($opts);
$data_string = file_get_contents(strval($args['source']), false, $context);
if ($data_string === false) {
return "Failed to load Preview Data!";
}
$data = json_decode($data_string);
if (!is_object($data) || !isset($data->version)) {
return "Failed to parse Preview Data!";
}
$max = isset($args["limit"]) ? (@intval($args["limit"]) ?? 2) : 2;
$i = 0;
switch ($data->version) {
case "1": {
$output = "";
foreach ($data->entries as $entry) {
$i++;
if ($i > $max){
break;
}
$date = date('d.m.Y', strtotime($entry->submission_date));
$job_link = $parser->recursiveTagParse("[{$data->overview}#joboffer-{$entry->id} {$entry->title}]",$frame);
$output .= "<span style='font-size: 0.9em;'>{$date}</span><br />{$job_link}<br />\n";
}
return $output;
}
default:
return "Failed to load Preview Data unrecognized format version";
}
}
static function jobexchangeRender (?string $input, array $args, Parser $parser, PPFrame $frame) {
switch ($args['type']) {
case 'full':
return self::jobexchangeFull($input, $args, $parser, $frame);
case 'preview':
return self::jobexchangeMediawikiXMLPreview($input, $args, $parser, $frame);
default:
return "Expected Tag to have attribute 'type' with value of 'full' or 'preview'!";
}
}
static function jobexchangeMediawikiXMLPreview (?string $input, array $args, Parser $parser, PPFrame $frame) {
libxml_use_internal_errors(true);
// fallback to Jobbörse_Einträge if source is not present or null for legacy reasons
$article_text = FSMod::loadArticle($args['source']??'Jobbörse_Einträge', $parser);
$article = preg_replace('/<jobexchange type="full">|<\/jobexchange>/i', '', $article_text);
$xml = simplexml_load_string(trim($article));
if ($xml === false) {
$errors = libxml_get_errors();
return FSMod::handle_xml_errors($errors, $article, $parser);
}
// Jobbörse as legacy fallback
$full = $args['full_listing'] ?? "Jobbörse";
$elements = $xml->children();
$output = '';
$i = 0;
// fallback to 2 for legacy reasons
$max = isset($args["limit"]) ? (@intval($args["limit"]) ?? 2) : 2;
foreach ( $elements as $job ) {
$i++;
if ($i > $max){
break;
}
$date = date('d.m.Y', strtotime($job->date));
$id = isset($job['id'])? "#{$job['id']}" : '';
$short = $job->shortdesc;
$job_link = $parser->recursiveTagParse("[[{$full}{$id} | {$short}]]",$frame);
$output .= "<span style='font-size: 0.9em;'>{$date}</span><br />{$job_link}<br />\n";
}
return $output;
}
static function jobexchangeFull (?string $input, array $args, Parser $parser, PPFrame $frame) {
libxml_use_internal_errors(true);
$xml = simplexml_load_string(trim($input));
if ($xml === false) {
$errors = libxml_get_errors();
return FSMod::handle_xml_errors($errors, $input, $parser);
}
$elements = $xml->children();
$output = '';
$timezone = new DateTimeZone("Europe/Berlin");
foreach ( $elements as $job ) {
$dateEntry = null;
try {
$dateEntry = new DateTime((string) $job->date, $timezone);
} catch(Exception $e) {
$dateEntry = new DateTime("1970-01-01", $timezone);
}
$today = new DateTime("today", $timezone);
$date = $dateEntry->format('d.m.Y');
$id = isset($job['id'])? "id='{$job['id']}'" : '';
$short = FSMod::parseTagRecursive($job->shortdesc, $parser, $frame);
$full = FSMod::parseTagRecursive($job->fulldesc , $parser, $frame);
$explicitExpiery = count($job->expires) > 0 ? new DateTime((string) $job->expires, $timezone) : null;
$implicitExpiery = (clone $dateEntry)->modify("+6 month");
$expires = "";
if ($explicitExpiery !== null) {
$formatedExpiery = $explicitExpiery->format('d.m.Y');
// when an explicit expiery date is given show it in the listing
$expires = "Gültig bis: {$formatedExpiery} <br />";
} else if ($parser->getUserIdentity()->isRegistered() && $implicitExpiery < $today) {
// when the implicit expiery has passed an the current user is logged in show a note
$expires = "<strong>Älter als 6 Monate ohne explizites Ablauf Datum</strong><br/>";
}
$fileOutput = "";
if (isset($job->files)) {
$files = $job->files->children();
if (count($files) > 0 ) {
$fileOutput .= '<br />Anhänge:';
foreach ( $files as $file ) {
// fallback to name for legacy reasons
$filename = $file['filename'] ?? $file['name'];
// fallback to filename if title is not set
$filetitle = $file['title'] ?? $filename;
$file_link = $parser->recursiveTagParse("[[Media:{$filename} | {$filetitle}]]",$frame);
$fileOutput .= "<br />$file_link";
}
}
}
$linkOutput = "";
if (isset($job->links)) {
$links = $job->links->children();
if (count($links) > 0) {
$linkOutput .= '<br />Links:';
foreach ($links as $link) {
$link_href = $link['href'];
$link_title = isset($link['title'])? "title='{$link['title']}'" : '';
$link_alt = isset($link['alt']) ? "alt='{$link['alt']}'" : '' ;
// fallback to title or href if content is not set
$link_content = $link['content'] ?? $link['title'] ?? $link['href'];
$linkOutput .= "<br /><a class='external' referrerpolicy='no-referrer' rel='external' target='_blank' {$link_alt} {$link_title} href='{$link_href}'>{$link_content}</a>";
}
}
}
$entryOutput = <<<HTML
{$date}<br />
<strong {$id} > {$short} </strong><br />
{$expires}{$full}{$fileOutput}{$linkOutput}<br />
<br />
HTML;
$output .= $entryOutput;
}
return $output;
}
}