Exemplo n.º 1
0
 protected function update_init_params(array &$params, context $context, array $options = null)
 {
     global $OUTPUT;
     if ($this->get_config('requireemoticon', 1)) {
         // If emoticon filter is disabled, do not add button.
         $filters = filter_get_active_in_context($context);
         if (!array_key_exists('filter/emoticon', $filters)) {
             return;
         }
     }
     // Add button after 'image' in advancedbuttons3.
     $this->add_button_after($params, 3, 'moodleemoticon', 'image');
     // Add JS file, which uses default name.
     $this->add_js_plugin($params);
     // Extra params specifically for emoticon plugin.
     $manager = get_emoticon_manager();
     $emoticons = $manager->get_emoticons();
     $imgs = array();
     // See the TinyMCE plugin moodleemoticon for how the emoticon index is (ab)used.
     $index = 0;
     foreach ($emoticons as $emoticon) {
         $imgs[$emoticon->text] = $OUTPUT->render($manager->prepare_renderable_emoticon($emoticon, array('class' => 'emoticon emoticon-index-' . $index++)));
     }
     $params['moodleemoticon_emoticons'] = json_encode($imgs);
 }
Exemplo n.º 2
0
 protected function update_init_params(array &$params, context $context, array $options = null)
 {
     // If TeX filter is disabled, do not add button.
     $filters = filter_get_active_in_context($context);
     if (!array_key_exists('filter/tex', $filters)) {
         return;
     }
     // Add button before 'nonbreaking' in advancedbuttons3.
     $this->add_button_before($params, 3, 'dragmath', 'nonbreaking');
     // Add JS file, which uses default name.
     $this->add_js_plugin($params);
 }
Exemplo n.º 3
0
 /** Load all the filters required by this context. */
 protected function load_filters($context, $courseid)
 {
     $filters = filter_get_active_in_context($context);
     $this->textfilters[$context->id] = array();
     $this->stringfilters[$context->id] = array();
     foreach ($filters as $filtername => $localconfig) {
         $filter = $this->make_filter_object($filtername, $context, $courseid, $localconfig);
         if (is_null($filter)) {
             continue;
         }
         $this->textfilters[$context->id][] = $filter;
         if (in_array($filtername, $this->stringfilternames)) {
             $this->stringfilters[$context->id][] = $filter;
         }
     }
 }
Exemplo n.º 4
0
 protected function update_init_params(array &$params, context $context, array $options = null)
 {
     // 'binumi' is the key used in Moodle >= 2.5
     $filters = filter_get_active_in_context($context);
     $enabled = array_key_exists('binumi', $filters);
     // If binumi filter is disabled, do not add button.
     if (!$enabled) {
         return;
     }
     $binumi_client = new binumi_client();
     $params = $params + $binumi_client->get_texteditor_params();
     $numrows = $this->count_button_rows($params);
     $this->add_button_after($params, $numrows, '|,binumi');
     // Add JS file, which uses default name.
     $this->add_js_plugin($params);
 }
Exemplo n.º 5
0
 protected function update_init_params(array &$params, context $context, array $options = null)
 {
     if ($this->get_config('requiretex', 1)) {
         // If TeX filter is disabled, do not add button.
         $filters = filter_get_active_in_context($context);
         if (!array_key_exists('tex', $filters)) {
             return;
         }
     }
     if ($row = $this->find_button($params, 'nonbreaking')) {
         // Add button before 'nonbreaking'.
         $this->add_button_before($params, $row, 'dragmath', 'nonbreaking');
     } else {
         // If 'nonbreaking' is not found, add button in the end of the last row:
         $this->add_button_after($params, $this->count_button_rows($params), 'dragmath');
     }
     // Add JS file, which uses default name.
     $this->add_js_plugin($params);
 }
 protected function update_init_params(array &$params, context $context, array $options = null)
 {
     if ($this->get_config('requiremultilang2', 1)) {
         // If multi-language content filter (v2) is disabled, do not add drop down menu.
         $filters = filter_get_active_in_context($context);
         if (!array_key_exists('multilang2', $filters)) {
             return;
         }
     }
     if (!has_capability('tinymce/moodlelang2:viewlanguagemenu', $context)) {
         return;
     }
     if ($row = $this->find_button($params, 'formatselect')) {
         // Add button after 'formatselect'.
         $this->add_button_after($params, $row, 'moodlelang2', 'formatselect');
     } else {
         // Add this button in the end of the first row (by default 'formatselect' button should be in the first row).
         $this->add_button_after($params, 1, 'moodlelang2');
     }
     // We need to pass the list of languages to tinymce.
     if ($this->get_config('showalllangs')) {
         $langs = get_string_manager()->get_list_of_languages();
     } else {
         $langs = get_string_manager()->get_list_of_translations();
     }
     asort($langs);
     $params['moodlelang2_langs'] = json_encode($langs);
     if ($highlight = $this->get_config('highlight', 1)) {
         $params['moodlelang2_highlight'] = json_encode($highlight);
     }
     require dirname(__FILE__) . '/default-css.php';
     if ($highlight_css = $this->get_config('highlight_css', $moodlelang2_default_css)) {
         $params['moodlelang2_css'] = json_encode($highlight_css);
     }
     // Add JS file, which uses default name.
     $this->add_js_plugin($params);
 }
 /**
  * Save a post using the submitted data
  * 
  * @param type $data
  * @return type
  */
 public function save_post($data, $course)
 {
     global $USER, $DB, $CFG, $PAGE;
     require_once $CFG->dirroot . '/mod/url/locallib.php';
     $context = \context_course::instance($data->courseid);
     // ... create post.
     $post = new \stdClass();
     $update = false;
     // If id is not empty, ensure that post is existing and test whether user is updating the post.
     if (!empty($data->id)) {
         if ($exists = $DB->get_record('format_socialwall_posts', array('id' => $data->id))) {
             $post = $exists;
             // Check, whether user is allowed to update the post.
             $caneditpost = ($post->fromuserid == $USER->id and has_capability('format/socialwall:updateownpost', $context));
             $caneditpost = ($caneditpost or has_capability('format/socialwall:updateanypost', $context));
             if (!$caneditpost) {
                 print_error('missingcapupdatepost', 'format_socialwall');
             }
             $update = true;
         } else {
             print_error('noposttoupdate', 'format_socialwall');
         }
     }
     // ...save when even a posttext or a externalurl or a file or a actvitiy is given.
     $cmsequence = $data->cmsequence;
     // ... are there added activities?
     if (!empty($cmsequence)) {
         $cmsequence = $this->check_and_move_module($data->courseid, $cmsequence);
     }
     // If user may not add any activity but may add a file or a link, replace existing files with new file.
     if (!$PAGE->user_allowed_editing()) {
         // ... add a resource.
         if (!empty($data->files)) {
             $canpostfile = has_capability('format/socialwall:postfile', $context) && !empty($course->enablestudentupload);
             if (!$canpostfile) {
                 print_error('missingcappostfile', 'format_socialwall');
             }
             $cmsequence = $this->create_mod_files($data);
         } else {
             // ... check externalurl and create a activity in section 1, if necessary.
             if (!empty($data->externalurl)) {
                 $canposturl = has_capability('format/socialwall:posturl', $context) && !empty($course->enablestudentupload);
                 if (!$canposturl) {
                     print_error('missingcapposturl', 'format_socialwall');
                 }
                 $cmsequence = $this->create_mod_url($data->externalurl);
                 // ... set filter Plugin here.
                 $filters = filter_get_active_in_context($context);
                 if (isset($filters['urlresource'])) {
                     require_once $CFG->dirroot . '/filter/urlresource/lib.php';
                     \filter_url_resource_helper::save_externalurl($data, $cmsequence);
                 }
             }
         }
     }
     if (empty($data->posttext) and empty($cmsequence)) {
         print_error('attachmentorpostrequired', 'format_socialwall');
     }
     $post->courseid = $data->courseid;
     $post->fromuserid = $USER->id;
     $post->togroupid = $data->togroupid;
     if (is_array($data->posttext)) {
         $posttext = $data->posttext['text'];
     } else {
         $posttext = $data->posttext;
     }
     if (has_capability('format/socialwall:posthtml', $context)) {
         $post->posttext = clean_text($posttext);
     } else {
         $post->posttext = clean_param($posttext, PARAM_NOTAGS);
     }
     if (isset($data->poststatus)) {
         $post->sticky = $data->poststatus == 1;
         $post->private = $data->poststatus == 2;
         $post->alert = $data->poststatus == 4;
     } else {
         $post->sticky = 0;
         $post->private = 0;
         $post->alert = 0;
     }
     if ($update) {
         $post->timemodified = time();
         $DB->update_record('format_socialwall_posts', $post);
         // ...reset postid if post was updated.
         $cache = \cache::make('format_socialwall', 'timelinefilter');
         $cache->purge_current_user();
     } else {
         $post->timecreated = time();
         $post->timemodified = $post->timecreated;
         $post->id = $DB->insert_record('format_socialwall_posts', $post);
     }
     attaches::save_attaches($post->id, $cmsequence);
     // We use a instant enqueueing, if needed you might use events here.
     notification::enqueue_post_created($post);
     // ...clear the inputed values.
     $cache = \cache::make('format_socialwall', 'postformparams');
     $cache->purge();
     // ...clear the attached actvities.
     $cache = \cache::make('format_socialwall', 'attachedrecentactivities');
     $cache->purge();
     return array('error' => '0', 'message' => 'postsaved');
 }
 protected function definition()
 {
     global $OUTPUT, $PAGE, $COURSE, $CFG, $USER;
     $mform =& $this->_form;
     $courseid = $this->_customdata['courseid'];
     $postid = !empty($this->_customdata['options']->postid) ? $this->_customdata['options']->postid : 0;
     // Update of save a post.
     $action = $postid > 0 ? 'updatepost' : 'savepost';
     $context = context_course::instance($courseid);
     // ...get formparameters from cache.
     $cache = cache::make('format_socialwall', 'postformparams');
     $formparams = $cache->get($courseid . '_' . $postid);
     $loadposteditor = optional_param('loadposteditor', -1, PARAM_INT);
     if ($loadposteditor != -1) {
         $formparams['loadposteditor'] = $loadposteditor;
         // ...remember this setting, if page is reloaded.
         $cache->set($courseid . '_' . $postid, $formparams);
     }
     // ...get errors from cache and set them to elements.
     $errorcache = cache::make('format_socialwall', 'postformerrors');
     if ($errors = $errorcache->get($courseid)) {
         foreach ($errors as $element => $error) {
             $mform->setElementError($element, $error['message']);
         }
     }
     $errorcache->delete($courseid);
     // ... value of this element is set by javascript (postform.js) before submit.
     $mform->addElement('hidden', 'cmsequence', '', array('id' => 'cmsequence'));
     $mform->setType('cmsequence', PARAM_TEXT);
     $mform->setDefault('cmsequence', '');
     // ... posttext.
     $buttongroup = array();
     $buttongroup[] = $mform->createElement('submit', 'submitbutton', get_string($action, 'format_socialwall'));
     if ($action == 'updatepost') {
         $buttongroup[] = $mform->createElement('cancel');
     }
     $mform->addGroup($buttongroup);
     // ... htmleditor/texarea to post text.
     $canposthtml = has_capability('format/socialwall:posthtml', $context);
     $showeditor = (!empty($formparams['loadposteditor']) and $canposthtml);
     $params = array('class' => 'sw-texarea', 'id' => 'posttext');
     if ($showeditor) {
         $mform->addElement('editor', 'posttext', get_string('poststatusordnote', 'format_socialwall'), $params);
         $mform->setType('posttext', PARAM_RAW);
         if (isset($formparams['posttext'])) {
             $element = $mform->getElement('posttext');
             $element->setValue(array('text' => $formparams['posttext']));
         }
     } else {
         $mform->addElement('textarea', 'posttext', get_string('poststatusordnote', 'format_socialwall'), $params);
         $mform->setType('posttext', PARAM_TEXT);
         if (isset($formparams['posttext'])) {
             $mform->setDefault('posttext', $formparams['posttext']);
         }
     }
     $postoptions = array();
     // ... Select group.
     $groupmode = groups_get_course_groupmode($COURSE);
     if ($groupmode == SEPARATEGROUPS and !has_capability('moodle/course:managegroups', $context)) {
         $allgroups = groups_get_all_groups($courseid, $USER->id);
     } else {
         $allgroups = groups_get_all_groups($courseid);
     }
     $groupsmenu = array();
     $groupsmenu[0] = get_string('allparticipants');
     foreach ($allgroups as $gid => $unused) {
         $groupsmenu[$gid] = format_string($allgroups[$gid]->name);
     }
     if (count($groupsmenu) > 0) {
         $postoptions[] = $mform->createElement('select', 'togroupid', '', $groupsmenu);
         if (isset($formparams['togroupid'])) {
             $mform->setDefault('togroupid', $formparams['togroupid']);
         }
     }
     // ... options group.
     $poststatusmenu = array(0 => get_string('poststatus', 'format_socialwall'));
     if (has_capability('format/socialwall:makesticky', $context)) {
         $poststatusmenu[1] = get_string('makesticky', 'format_socialwall');
     }
     if (has_capability('format/socialwall:postprivate', $context)) {
         $poststatusmenu[2] = get_string('privatepost', 'format_socialwall');
     }
     if ($PAGE->user_allowed_editing()) {
         $poststatusmenu[4] = get_string('makealert', 'format_socialwall');
     }
     if (count($poststatusmenu) > 1) {
         $postoptions[] = $mform->createElement('select', 'poststatus', '', $poststatusmenu);
         if (isset($formparams['poststatus'])) {
             $mform->setDefault('poststatus', $formparams['poststatus']);
         }
     }
     // ...switch htmleditor on/off.
     if ($canposthtml) {
         $key = !empty($formparams['loadposteditor']) ? 'turneditoroff' : 'turneditoron';
         $postoptions[] = $mform->createElement('submit', $key, get_string($key, 'format_socialwall'));
     }
     if (count($postoptions) > 0) {
         $mform->addGroup($postoptions);
     }
     // ... display the activites prepared for the next post only by a teacher.
     if ($PAGE->user_allowed_editing()) {
         if (!isset($USER->editing) or !$USER->editing) {
             $addstr = get_string('addactivityresource', 'format_socialwall');
             $mform->addElement('submit', 'turneditingon', $addstr, array('id' => 'sw-addactivitylink'));
         }
     } else {
         $o = html_writer::tag('div', '', array('class' => 'clearfix'));
         $mform->addElement('html', $o);
         // ...upload options for all users, which cannot edit page.
         $attachgroup = array();
         $course = course_get_format($COURSE)->get_course();
         $canpostfile = has_capability('format/socialwall:postfile', $context) && !empty($course->enablestudentupload);
         if ($canpostfile) {
             $uploadfileicon = html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('icon', 'resource')));
             $linktext = $uploadfileicon . get_string('uploadafile', 'format_socialwall');
             $url = new moodle_url('/course/view.php', array('id' => $courseid, 'loadfilemanager' => 1));
             $link = html_writer::link($url, $linktext, array('id' => 'uploadfile'));
             $attachgroup[] = $mform->createElement('static', 'uploadfile', '', $link);
         }
         $canposturl = has_capability('format/socialwall:posturl', $context) && !empty($course->enablestudentupload);
         if ($canposturl) {
             $addlinkicon = html_writer::empty_tag('img', array('src' => $OUTPUT->pix_url('icon', 'url')));
             $at = html_writer::link('#', $addlinkicon . get_string('addalink', 'format_socialwall'), array('id' => 'addalink'));
             $attachgroup[] = $mform->createElement('static', 'addalink', '', $at);
         }
         if (!empty($attachgroup)) {
             $mform->addGroup($attachgroup);
         }
         $loadfilemanager = optional_param('loadfilemanager', 0, PARAM_INT);
         if ($canpostfile and $loadfilemanager == 1) {
             $mform->addElement('html', html_writer::start_div('', array('id' => 'fileswrapper')));
             // ... filemanager.
             $filemanageroptions = array();
             $filemanageroptions['accepted_types'] = '*';
             $filemanageroptions['maxbytes'] = 0;
             $filemanageroptions['maxfiles'] = 1;
             $filemanageroptions['mainfile'] = true;
             $mform->addElement('filemanager', 'files', get_string('selectfiles'), array(), $filemanageroptions);
             $mform->addElement('html', html_writer::end_div());
             $mform->addElement('hidden', 'loadfilemanager', '1', array('id' => 'loadfilemanager'));
             $mform->setType('loadfilemanager', PARAM_INT);
         }
         // ...external url.
         $style = isset($errors['externalurl']) ? 'display:auto' : 'display:none';
         $mform->addElement('html', html_writer::start_div('', array('id' => 'externalurlwrapper', 'style' => $style)));
         $mform->addElement('url', 'externalurl', get_string('externalurl', 'url'), array('size' => '60'), array('usefilepicker' => true));
         $mform->setType('externalurl', PARAM_URL);
         if (isset($errors['externalurl'])) {
             $mform->setDefault('externalurl', $errors['externalurl']['value']);
         }
         // ... get urlresource filter a try.
         $filters = filter_get_active_in_context($context);
         if (isset($filters['urlresource'])) {
             require_once $CFG->dirroot . '/filter/urlresource/lib.php';
             filter_url_resource_helper::add_postformfields($mform, $courseid);
         }
         $mform->addElement('html', html_writer::end_div());
     }
     // Id of post to remember the update option for further pageloads.
     $mform->addElement('hidden', 'id', 0, array('id' => 'id'));
     $mform->setType('id', PARAM_INT);
     $mform->setDefault('id', $postid);
     // Id of course we are in.
     $mform->addElement('hidden', 'courseid');
     $mform->setType('courseid', PARAM_INT);
     $mform->setDefault('courseid', $courseid);
     $mform->addElement('hidden', 'action', $action);
     $mform->setType('action', PARAM_TEXT);
     $mform->disable_form_change_checker();
 }
Exemplo n.º 9
0
 private function assert_matches($modinfo)
 {
     global $FILTERLIB_PRIVATE;
     // Use preload cache...
     $FILTERLIB_PRIVATE = new stdClass();
     filter_preload_activities($modinfo);
     // Get data and check no queries are made
     $before = $this->testdb->perf_get_reads();
     $plfilters1 = filter_get_active_in_context($this->activity1context);
     $plfilters2 = filter_get_active_in_context($this->activity2context);
     $after = $this->testdb->perf_get_reads();
     $this->assertEqual($before, $after);
     // Repeat without cache and check it makes queries now
     $FILTERLIB_PRIVATE = new stdClass();
     $before = $this->testdb->perf_get_reads();
     $filters1 = filter_get_active_in_context($this->activity1context);
     $filters2 = filter_get_active_in_context($this->activity2context);
     $after = $this->testdb->perf_get_reads();
     $this->assertTrue($after > $before);
     // Check they match
     $this->assertEqual($plfilters1, $filters1);
     $this->assertEqual($plfilters2, $filters2);
 }
Exemplo n.º 10
0
 /**
  * fix_filters
  *
  * @return xxx
  */
 function fix_filters()
 {
     global $CFG;
     if (isset($CFG->textfilters)) {
         $textfilters = $CFG->textfilters;
     } else {
         $textfilters = '';
     }
     if ($this->hotpot->usefilters) {
         $filters = filter_get_active_in_context($this->hotpot->context);
         $filters = array_keys($filters);
     } else {
         $filters = array();
     }
     if ($this->hotpot->useglossary && !in_array('mod/glossary', $filters)) {
         $filters[] = 'mod/glossary';
     }
     if ($this->hotpot->usemediafilter) {
         // exclude certain unnecessary or miscreant $filters
         //  - "mediaplugins" because it duplicates work done by "usemediafilter" setting
         //  - "asciimath" because it does not behave like a filter is supposed to behave
         $filters = preg_grep('/^filter\\/(mediaplugin|asciimath)$/', $filters, PREG_GREP_INVERT);
     }
     $CFG->textfilters = implode(',', $filters);
     $this->filter_text_headcontent();
     $this->filter_text_bodycontent();
     $CFG->textfilters = $textfilters;
     // fix unwanted conversions by the Moodle's Tex filter
     // http://moodle.org/mod/forum/discuss.php?d=68435
     // http://tracker.moodle.org/browse/MDL-7849
     if (preg_match('/jcross|jmix/', get_class($this))) {
         $search = '/(?<=replace\\(\\/)' . '<a[^>]*><img[^>]*class="texrender"[^>]*title="(.*?)"[^>]*><\\/a>' . '(?=\\/g)/is';
         $replace = '\\[' . '$1' . '\\]';
         $this->headcontent = preg_replace($search, $replace, $this->headcontent);
     }
     // make sure openpopup() function is available if needed (for glossary entries)
     // Note: this could also be done using filter_add_javascript($this->htmlcontent)
     // but that function expects entire htmlcontent, where we would prefer just the headcontent
     if ($this->hotpot->navigation == hotpot::NAVIGATION_ORIGINAL && in_array('mod/glossary', $filters)) {
         // add openwindow() function (from lib/javascript.php)
         $this->headcontent .= "\n" . '<script type="text/javascript">' . "\n" . '//<![CDATA[' . "\n" . 'function openpopup(url, name, options, fullscreen) {' . "\n" . '    var fullurl = "' . $CFG->httpswwwroot . '" + url;' . "\n" . '    var windowobj = window.open(fullurl, name, options);' . "\n" . '    if (!windowobj) {' . "\n" . '        return true;' . "\n" . '    }' . "\n" . '    if (fullscreen) {' . "\n" . '        windowobj.moveTo(0, 0);' . "\n" . '        windowobj.resizeTo(screen.availWidth, screen.availHeight);' . "\n" . '    }' . "\n" . '    windowobj.focus();' . "\n" . '    return false;' . "\n" . '}' . "\n" . '//]]>' . "\n" . '</script>';
     }
 }
Exemplo n.º 11
0
 public function test_config_from_other_filter_not_returned()
 {
     // Setup fixture.
     filter_set_global_state('filter/name', TEXTFILTER_ON);
     filter_set_local_config('filter/name', $this->childcontext->id, 'settingname', 'A value');
     filter_set_local_config('filter/other', $this->childcontext->id, 'anothersettingname', 'Another value');
     // Exercise SUT.
     $filters = filter_get_active_in_context($this->childcontext);
     // Validate.
     $this->assertEqual(array('settingname' => 'A value'), $filters['filter/name']);
 }
Exemplo n.º 12
0
 /**
  * Method for hooking into the Moodle 2.3 Tinymce plugin lib.php
  * file
  *
  * Moodle 2.4+ uses different logic -- see Binumi plugin
  * installation instructions for details.
  *
  * @param array $filters
  * @param array $params
  * @return array
  */
 public function configure_tinymce_lib_params($filters, $params)
 {
     if (!function_exists('filter_get_active_in_context')) {
         throw new Zend_Exception('This class can only be called ' . 'from within the tinymce/lib.php file');
     }
     if (!isset($filters)) {
         $filters = filter_get_active_in_context($context);
     }
     if (array_key_exists('filter/binumi', $filters)) {
         $params = $params + $this->get_texteditor_params();
         $params['plugins'] .= ',binumi';
         if (isset($params['theme_advanced_buttons3_add'])) {
             $params['theme_advanced_buttons3_add'] .= ",|,binumi";
         } else {
             $params['theme_advanced_buttons3_add'] = ",|,binumi";
         }
     }
     return $params;
 }
Exemplo n.º 13
0
/**
 * Prints a preview for a question in an offlinequiz to Stdout.
 *
 * @param object $question
 * @param array $choiceorder
 * @param int $number
 * @param object $context
 */
function offlinequiz_print_question_preview($question, $choiceorder, $number, $context, $page)
{
    global $CFG, $DB;
    require_once $CFG->dirroot . '/filter/mathjaxloader/filter.php';
    $letterstr = 'abcdefghijklmnopqrstuvwxyz';
    echo '<div id="q' . $question->id . '" class="preview">
            <div class="question">
              <span class="number">';
    if ($question->qtype != 'description') {
        echo $number . ')&nbsp;&nbsp;';
    }
    echo '    </span>';
    $text = question_rewrite_question_preview_urls($question->questiontext, $question->id, $question->contextid, 'question', 'questiontext', $question->id, $context->id, 'offlinequiz');
    // Remove leading paragraph tags because the cause a line break after the question number.
    $text = preg_replace('!^<p>!i', '', $text);
    // Filter only for tex formulas.
    $texfilter = null;
    $mathjaxfilter = null;
    $filters = filter_get_active_in_context($context);
    if (array_key_exists('mathjaxloader', $filters)) {
        $mathjaxfilter = new filter_mathjaxloader($context, array());
        $mathjaxfilter->setup($page, $context);
    }
    if (array_key_exists('tex', $filters)) {
        $texfilter = new filter_tex($context, array());
    }
    if ($mathjaxfilter) {
        $text = $mathjaxfilter->filter($text);
        if ($question->qtype != 'description') {
            foreach ($choiceorder as $key => $answer) {
                $question->options->answers[$answer]->answer = $mathjaxfilter->filter($question->options->answers[$answer]->answer);
            }
        }
    } else {
        if ($texfilter) {
            $text = $texfilter->filter($text);
            if ($question->qtype != 'description') {
                foreach ($choiceorder as $key => $answer) {
                    $question->options->answers[$answer]->answer = $texfilter->filter($question->options->answers[$answer]->answer);
                }
            }
        }
    }
    echo $text;
    echo '  </div>';
    if ($question->qtype != 'description') {
        echo '  <div class="grade">';
        echo '(' . get_string('marks', 'quiz') . ': ' . ($question->maxmark + 0) . ')';
        echo '  </div>';
        foreach ($choiceorder as $key => $answer) {
            $answertext = $question->options->answers[$answer]->answer;
            // Remove all HTML comments (typically from MS Office).
            $answertext = preg_replace("/<!--.*?--\\s*>/ms", "", $answertext);
            // Remove all paragraph tags because they mess up the layout.
            $answertext = preg_replace("/<p[^>]*>/ms", "", $answertext);
            $answertext = preg_replace("/<\\/p[^>]*>/ms", "", $answertext);
            echo "<div class=\"answer\">{$letterstr[$key]})&nbsp;&nbsp;";
            echo $answertext;
            echo "</div>";
        }
    }
    echo "</div>";
}
Exemplo n.º 14
0
 protected function get_init_params($elementid, array $options = null)
 {
     global $CFG, $PAGE;
     //TODO: we need to implement user preferences that affec tthe editor setup too
     //TODO: reimplement rulesets, maybe it would be better to implement it some other way
     //$xmlruleset     = file_get_contents('extra/xhtml_ruleset.txt');
     $directionality = get_string('thisdirection');
     $strtime = get_string('strftimetime');
     $strdate = get_string('strftimedaydate');
     $lang = str_replace('_utf8', '', current_language());
     // use more standard language codes
     $contentcss = $CFG->themewww . '/' . current_theme() . '/styles.php';
     // should be customizable
     $context = empty($options['context']) ? get_context_instance(CONTEXT_SYSTEM) : $options['context'];
     if (!empty($options['legacy'])) {
         $xmedia = '';
     } else {
         if (!empty($options['noclean']) or !empty($options['trusted'])) {
             $xmedia = 'media,';
         } else {
             $xmedia = '';
         }
     }
     $filters = filter_get_active_in_context($context);
     if (array_key_exists('filter/tex', $filters)) {
         $xdragmath = 'dragmath,';
     } else {
         $xdragmath = '';
     }
     $params = array('mode' => "exact", 'elements' => $elementid, 'relative_urls' => false, 'document_base_url' => $CFG->httpswwwroot, 'content_css' => $contentcss, 'language' => $lang, 'directionality' => $directionality, 'plugin_insertdate_dateFormat ' => $strdate, 'plugin_insertdate_timeFormat ' => $strtime, 'theme' => "advanced", 'skin' => "o2k7", 'skin_variant' => "silver", 'apply_source_formatting' => true, 'remove_script_host' => false, 'entity_encoding' => "raw", 'plugins' => "safari,table,style,layer,advhr,advimage,advlink,emotions,inlinepopups,{$xmedia}searchreplace,paste,directionality,fullscreen,moodlenolink,{$xdragmath}nonbreaking,contextmenu,insertdatetime,save,iespell,preview,print,noneditable,visualchars,xhtmlxtras,template,pagebreak", 'theme_advanced_font_sizes' => "1,2,3,4,5,6,7", 'theme_advanced_layout_manager' => "SimpleLayout", 'theme_advanced_toolbar_align' => "left", 'theme_advanced_buttons1' => "fontselect,fontsizeselect,formatselect,styleselect", 'theme_advanced_buttons1_add' => "|,undo,redo,|,search,replace,|,fullscreen", 'theme_advanced_buttons2' => "bold,italic,underline,strikethrough,sub,sup,|,justifyleft,justifycenter,justifyright,justifyfull,|,cite,abbr,acronym", 'theme_advanced_buttons2_add' => "|,selectall,cleanup,removeformat,pastetext,pasteword,|,forecolor,backcolor,|,ltr,rtl", 'theme_advanced_buttons3' => "bullist,numlist,outdent,indent,|,link,unlink,moodlenolink,anchor,|,emotions,image,{$xmedia}{$xdragmath}advhr,nonbreaking,charmap", 'theme_advanced_buttons3_add' => "|,table,insertlayer,styleprops,visualchars,|,code,preview", 'theme_advanced_fonts' => "Trebuchet=Trebuchet MS,Verdana,Arial,Helvetica,sans-serif;Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;Wingdings=wingdings", 'theme_advanced_resize_horizontal' => true, 'theme_advanced_resizing' => true, 'theme_advanced_toolbar_location' => "top", 'theme_advanced_statusbar_location' => "bottom");
     if (empty($options['legacy'])) {
         if (isset($options['maxfiles']) and $options['maxfiles'] != 0) {
             $params['file_browser_callback'] = "mce_moodlefilemanager";
         }
     }
     return $params;
 }
Exemplo n.º 15
0
 protected function get_init_params($elementid, array $options = null)
 {
     global $CFG, $PAGE, $OUTPUT;
     //TODO: we need to implement user preferences that affect the editor setup too
     $directionality = get_string('thisdirection', 'langconfig');
     $strtime = get_string('strftimetime');
     $strdate = get_string('strftimedaydate');
     $lang = current_language();
     $contentcss = $PAGE->theme->editor_css_url()->out(false);
     $context = empty($options['context']) ? get_context_instance(CONTEXT_SYSTEM) : $options['context'];
     $xmedia = 'moodlemedia,';
     // HQ thinks it should be always on, so it is no matter if it will actually work or not
     /*
             if (!empty($options['legacy'])) {
                 $xmedia = 'moodlemedia,';
             } else {
                 if (!empty($options['noclean']) or !empty($options['trusted'])) {
                 }
             }*/
     $filters = filter_get_active_in_context($context);
     if (array_key_exists('filter/tex', $filters)) {
         $xdragmath = 'dragmath,';
     } else {
         $xdragmath = '';
     }
     if (array_key_exists('filter/emoticon', $filters)) {
         $xemoticon = 'moodleemoticon,';
     } else {
         $xemoticon = '';
     }
     $params = array('mode' => "exact", 'elements' => $elementid, 'relative_urls' => false, 'document_base_url' => $CFG->httpswwwroot, 'content_css' => $contentcss, 'language' => $lang, 'directionality' => $directionality, 'plugin_insertdate_dateFormat ' => $strdate, 'plugin_insertdate_timeFormat ' => $strtime, 'theme' => "advanced", 'skin' => "o2k7", 'skin_variant' => "silver", 'apply_source_formatting' => true, 'remove_script_host' => false, 'entity_encoding' => "raw", 'plugins' => "{$xmedia}advimage,safari,table,style,layer,advhr,advlink,emotions,inlinepopups,searchreplace,paste,directionality,fullscreen,moodlenolink,{$xemoticon}{$xdragmath}nonbreaking,contextmenu,insertdatetime,save,iespell,preview,print,noneditable,visualchars,xhtmlxtras,template,pagebreak,spellchecker", 'theme_advanced_font_sizes' => "1,2,3,4,5,6,7", 'theme_advanced_layout_manager' => "SimpleLayout", 'theme_advanced_toolbar_align' => "left", 'theme_advanced_buttons1' => "fontselect,fontsizeselect,formatselect", 'theme_advanced_buttons1_add' => "|,undo,redo,|,search,replace,|,fullscreen", 'theme_advanced_buttons2' => "bold,italic,underline,strikethrough,sub,sup,|,justifyleft,justifycenter,justifyright", 'theme_advanced_buttons2_add' => "|,cleanup,removeformat,pastetext,pasteword,|,forecolor,backcolor,|,ltr,rtl", 'theme_advanced_buttons3' => "bullist,numlist,outdent,indent,|,link,unlink,moodlenolink,|,image,{$xemoticon}{$xmedia}{$xdragmath}nonbreaking,charmap", 'theme_advanced_buttons3_add' => "table,|,code,spellchecker", 'theme_advanced_fonts' => "Trebuchet=Trebuchet MS,Verdana,Arial,Helvetica,sans-serif;Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;Wingdings=wingdings", 'theme_advanced_resize_horizontal' => true, 'theme_advanced_resizing' => true, 'theme_advanced_resizing_min_height' => 30, 'theme_advanced_toolbar_location' => "top", 'theme_advanced_statusbar_location' => "bottom", 'spellchecker_rpc_url' => $CFG->wwwroot . "/lib/editor/tinymce/tiny_mce/{$this->version}/plugins/spellchecker/rpc.php", 'spellchecker_languages' => get_config('editor_tinymce', 'spelllanguagelist'));
     if ($xemoticon) {
         $manager = get_emoticon_manager();
         $emoticons = $manager->get_emoticons();
         $imgs = array();
         // see the TinyMCE plugin moodleemoticon for how the emoticon index is (ab)used :-S
         $index = 0;
         foreach ($emoticons as $emoticon) {
             $imgs[$emoticon->text] = $OUTPUT->render($manager->prepare_renderable_emoticon($emoticon, array('class' => 'emoticon emoticon-index-' . $index++)));
         }
         $params['moodleemoticon_emoticons'] = json_encode($imgs);
     }
     if (empty($CFG->xmlstrictheaders) and (!empty($options['legacy']) or !empty($options['noclean']) or !empty($options['trusted']))) {
         // now deal somehow with non-standard tags, people scream when we do not make moodle code xtml strict,
         // but they scream even more when we strip all tags that are not strict :-(
         $params['valid_elements'] = 'script[src|type],*[*]';
         // for some reason the *[*] does not inlcude javascript src attribute MDL-25836
         $params['invalid_elements'] = '';
     }
     if (empty($options['legacy'])) {
         if (isset($options['maxfiles']) and $options['maxfiles'] != 0) {
             $params['file_browser_callback'] = "M.editor_tinymce.filepicker";
         }
     }
     //Add onblur event for client side text validation
     if (!empty($options['required'])) {
         $params['init_instance_callback'] = 'M.editor_tinymce.onblur_event';
     }
     return $params;
 }
Exemplo n.º 16
0
 /** save a post using the submitted data
  * 
  * @global type $USER
  * @global obejct $DB
  * @param type $data
  * @return type
  */
 public function save_post($data, $course)
 {
     global $USER, $DB, $CFG;
     require_once $CFG->dirroot . '/mod/url/locallib.php';
     $context = \context_course::instance($data->id);
     // ...save when even a posttext or a externalurl or a file or a actvitiy is given.
     $cmsequence = $data->cmsequence;
     // ... added activity?
     if (!empty($cmsequence)) {
         $cmsequence = $this->check_and_move_module($data->id, $cmsequence);
     } else {
         // ... add a resource.
         if (!empty($data->files)) {
             $canpostfile = has_capability('format/socialwall:postfile', $context) && !empty($course->enablestudentupload);
             if (!$canpostfile) {
                 print_error('missingcappostfile', 'format_socialwall');
             }
             $cmsequence = $this->create_mod_files($data);
         } else {
             // ... check externalurl and create a activity in section 1, if necessary.
             if (!empty($data->externalurl)) {
                 $canposturl = has_capability('format/socialwall:posturl', $context) && !empty($course->enablestudentupload);
                 if (!$canposturl) {
                     print_error('missingcapposturl', 'format_socialwall');
                 }
                 $cmsequence = $this->create_mod_url($data->externalurl);
                 // ... set filter Plugin here.
                 $filters = filter_get_active_in_context($context);
                 if (isset($filters['urlresource'])) {
                     require_once $CFG->dirroot . '/filter/urlresource/lib.php';
                     \filter_url_resource_helper::save_externalurl($data, $cmsequence);
                 }
             }
         }
     }
     if (empty($data->posttext) and empty($cmsequence)) {
         print_error('attachmentorpostrequired', 'format_socialwall');
     }
     // ... create post.
     $post = new \stdClass();
     $post->courseid = $data->id;
     $post->fromuserid = $USER->id;
     $post->togroupid = $data->togroupid;
     if (is_array($data->posttext)) {
         $posttext = $data->posttext['text'];
     } else {
         $posttext = $data->posttext;
     }
     if (has_capability('format/socialwall:posthtml', $context)) {
         $post->posttext = clean_text($posttext);
     } else {
         $post->posttext = clean_param($posttext, PARAM_NOTAGS);
     }
     if (isset($data->poststatus)) {
         $post->sticky = $data->poststatus == 1;
         $post->private = $data->poststatus == 2;
         $post->alert = $data->poststatus == 4;
     } else {
         $post->sticky = 0;
         $post->private = 0;
         $post->alert = 0;
     }
     $post->timecreated = time();
     $post->timemodified = $post->timecreated;
     $post->id = $DB->insert_record('format_socialwall_posts', $post);
     if (!empty($cmsequence)) {
         attaches::save_attaches($post->id, $cmsequence);
     }
     // We use a instant enqueueing, if needed you might use events here.
     notification::enqueue_post_created($post);
     // ...clear the inputed values.
     $cache = \cache::make('format_socialwall', 'postformparams');
     $cache->purge();
     return array('error' => '0', 'message' => 'postsaved');
 }
Exemplo n.º 17
0
 function filter($text, array $options = array())
 {
     global $CFG, $DB, $PAGE;
     $texfilterenabled = array_key_exists("tex", filter_get_active_in_context($PAGE->context));
     if ($texfilterenabled) {
         print_error("disable regular TeX notation filter!");
     }
     $mathjaxenabled = array_key_exists("mathjaxloader", filter_get_active_in_context($PAGE->context));
     /// Do a quick check using stripos to avoid unnecessary work
     if (!preg_match('/<tex/i', $text) && strpos($text, '$$') === false && strpos($text, '\\[') === false && strpos($text, '\\(') === false && !preg_match('/\\[tex/i', $text)) {
         return $text;
     }
     $text .= ' ';
     preg_match_all('/\\$(\\$\\$+?)([^\\$])/s', $text, $matches);
     for ($i = 0; $i < count($matches[0]); $i++) {
         $replacement = str_replace('$', '&#x00024;', $matches[1][$i]) . $matches[2][$i];
         $text = str_replace($matches[0][$i], $replacement, $text);
     }
     // <tex> TeX expression </tex>
     // or <tex alt="My alternative text to be used instead of the TeX form"> TeX expression </tex>
     // or $$ TeX expression $$
     // or \[ TeX expression \]          // original tag of MathType and TeXaide (dlnsk)
     // or [tex] TeX expression [/tex]   // somtime it's more comfortable than <tex> (dlnsk)
     $rules = array('<tex(?:\\s+alt=["\'](.*?)["\'])?>(.+?)<\\/tex>', '\\$\\$(.+?)\\$\\$', '\\\\\\[(.+?)\\\\\\]', '\\\\\\((.+?)\\\\\\)', '\\[tex\\](.+?)\\[\\/tex\\]');
     if ($mathjaxenabled == true) {
         $rules = array('<tex(?:\\s+alt=["\'](.*?)["\'])?>(.+?)<\\/tex>', '\\$\\$(.+?)\\$\\$', '\\[tex\\](.+?)\\[\\/tex\\]');
     }
     $megarule = '/' . implode($rules, '|') . '/is';
     preg_match_all($megarule, $text, $matches);
     for ($i = 0; $i < count($matches[0]); $i++) {
         $texexp = '';
         for ($j = 0; $j < count($rules); $j++) {
             $texexp .= $matches[$j + 2][$i];
         }
         $alt = $matches[1][$i];
         $texexp = str_replace('<nolink>', '', $texexp);
         $texexp = str_replace('</nolink>', '', $texexp);
         $texexp = str_replace('<span class="nolink">', '', $texexp);
         $texexp = str_replace('</span>', '', $texexp);
         $texexp = preg_replace("/<br[[:space:]]*\\/?>/i", '', $texexp);
         //dlnsk
         $align = "middle";
         if (preg_match('/^align=bottom /', $texexp)) {
             $align = "text-bottom";
             $texexp = preg_replace('/^align=bottom /', '', $texexp);
         } else {
             if (preg_match('/^align=top /', $texexp)) {
                 $align = "text-top";
                 $texexp = preg_replace('/^align=top /', '', $texexp);
             }
         }
         // decode entities encoded by editor, luckily there is very little chance of double decoding
         $texexp = html_entity_decode($texexp, ENT_QUOTES, 'UTF-8');
         if ($texexp === '') {
             continue;
         }
         $md5 = md5($texexp);
         if (!$DB->record_exists("cache_filters", array("filter" => "texwjax", "md5key" => $md5))) {
             $texcache = new stdClass();
             $texcache->filter = 'texwjax';
             $texcache->version = 1;
             $texcache->md5key = $md5;
             $texcache->rawtext = $texexp;
             $texcache->timemodified = time();
             $DB->insert_record("cache_filters", $texcache, false);
         }
         $convertformat = get_config('filter_texwjax', 'convertformat');
         if ($convertformat == 'svg' && !core_useragent::supports_svg()) {
             $convertformat = 'png';
         }
         $filename = $md5 . ".{$convertformat}";
         $text = str_replace($matches[0][$i], filter_text_image_wjax($filename, $texexp, 0, 0, $align, $alt), $text);
     }
     return $text;
 }