diff --git a/.gitignore b/.gitignore index eb88b9ccfafd3c03fba70797e06eaf47066d1934..4ce455e4e95185668de32892133e7cb6ffeadad5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.min.js.map -.idea/ \ No newline at end of file +.idea/ +.vscode \ No newline at end of file diff --git a/externallib.php b/externallib.php index dccc9412a240d4299a491c5e78ce8fdf71beb9ca..e6dd8547ff001d3e0eaf38b82a8e03e65cb1b3db 100644 --- a/externallib.php +++ b/externallib.php @@ -192,8 +192,9 @@ class qtype_moopt_external extends external_api { break; } else if ($child->localName == 'attached-txt-file') { $pathinfo = pathinfo('/' . $child->nodeValue); + $encoding = $child->attributes->getNamedItem('encoding')->nodeValue; $filecontent = get_text_content_from_file($usercontext, $draftid, $keepfilename, - $pathinfo['dirname'] . '/', $pathinfo['basename']); + $pathinfo['dirname'] . '/', $pathinfo['basename'], true, $encoding); $defaultfilename = basename($child->nodeValue); $fileid = $file->attributes->getNamedItem('id')->nodeValue; $enablefreetext = true; @@ -259,8 +260,9 @@ class qtype_moopt_external extends external_api { } else if ($child->localName == 'attached-txt-file') { $pathinfo = pathinfo('/' . $child->nodeValue); $filename = basename($child->nodeValue); + $encoding = $child->attributes->getNamedItem('encoding')->nodeValue; $filecontent = get_text_content_from_file($usercontext, $draftid, $keepfilename, - $pathinfo['dirname'] . '/', $pathinfo['basename']); + $pathinfo['dirname'] . '/', $pathinfo['basename'], true, $encoding); } if(!empty($filecontent)) diff --git a/locallib.php b/locallib.php index 05cefaba98f9a2a8b9ef24a1f9fec9de96eeccc5..4a1df0d2cf4cfb395411ca411d39d3406011b749 100644 --- a/locallib.php +++ b/locallib.php @@ -282,7 +282,7 @@ function create_domdocument_from_task_xml($usercontext, $draftareaid, $xmlfilena * @return string * @throws invalid_parameter_exception */ -function get_text_content_from_file($usercontext, $draftareaid, $keepfilename, $filepath, $filename) +function get_text_content_from_file($usercontext, $draftareaid, $keepfilename, $filepath, $filename, $attached, $encoding) { $fs = get_file_storage(); $file = $fs->get_file($usercontext->id, 'user', 'draft', $draftareaid, $filepath, $filename); @@ -294,7 +294,22 @@ function get_text_content_from_file($usercontext, $draftareaid, $keepfilename, $ // TODO: make sure the mimetype is plain text // even task.xmls may contain mistakes (eg PDF ) - return $file->get_content(); + //check if encoding of attached ist utf-8 else convert + $content = $file->get_content(); + if($encoding!==false){ + $enc=$encoding; + } else { + $enc = mb_detect_encoding($content, mb_detect_order(), true); + if($enc===false){ + throw new invalid_parameter_exception('Encoding of attached file ' . $filepath . $filename . 'could\'nt be detectet.'); + } + } + $content = mb_convert_encoding($content, $enc, 'UTF-8'); + if($enc!=='UTF-8'){ + $content = mb_convert_encoding($content, 'UTF-8', $enc); + } + + return $content; }