$inputcode 為輸入的程式碼,變數 $mode 可以指定程式語言,適用的語言非常多。例如 Python, Perl, C/C++, PHP, Ruby, Shell, Java。tabMode: 'shift' 讓內縮使用 TAB。
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("$inputcode"), {
mode: $mode,
indentUnit: 4,
indentWithTabs: true,
enterMode: 'flat',
tabMode: 'shift',
lineNumbers: true,
matchBrackets: true
})
</script>
[root@dywang moodle23]# cp lib/form/textarea.php lib/form/codetextarea.php
[root@dywang moodle23]# diff -urN -wbBE lib/form/textarea.php lib/form/codetextarea.php
--- lib/form/textarea.php 2012-06-26 01:14:43.000000000 +0800
+++ lib/form/codetextarea.php 2014-03-02 14:20:04.566476633 +0800
@@ -16,28 +16,28 @@
/**
- * Textarea type form element
+ * CodeTextarea type form element
*
- * Contains HTML class for a textarea type element
+ * Contains HTML class for a codetextarea type element
*
* @package core_form
- * @copyright 2006 Jamie Pratt <me@jamiep.org>
+ * @copyright 2013 De-Yu Wang <dywang@csie.cyut.edu.tw>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('HTML/QuickForm/textarea.php');
/**
- * Textarea type form element
+ * CodeTextarea type form element
*
- * HTML class for a textarea type element
+ * HTML class for a codetextarea type element
*
* @package core_form
* @category form
- * @copyright 2006 Jamie Pratt <me@jamiep.org>
+ * @copyright 2013 De-Yu Wang <dywang@csie.cyut.edu.tw>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class MoodleQuickForm_textarea extends HTML_QuickForm_textarea{
+class MoodleQuickForm_codetextarea extends HTML_QuickForm_textarea{
/** @var string Need to store id of form as we may need it for helpbutton */
var $_formid = ”;
MoodleQuickForm_codetextarea 函式,若沒有指定程式語言,會以輸入的字串自動判斷程式語言,目前共有八種程式語言。
@@ -54,7 +54,7 @@
* @param string $elementLabel (optional) text field label
* @param string $attributes (optional) Either a typical HTML attribute string or an associative array
*/
- function MoodleQuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null) {
+ function MoodleQuickForm_codetextarea($elementName=null, $elementLabel=null, $attributes=null) {
parent::HTML_QuickForm_textarea($elementName, $elementLabel, $attributes);
}
@@ -100,7 +100,61 @@
return '<label class="accesshide" for="' . $this->getAttribute('id') . '" >' .
$this->getLabel() . '</label>' . parent::toHtml();
} else {
- return parent::toHtml();
+ if ($this->_flagFrozen) {
+ return $this->getFrozenHtml();
+ } else {
+ if ( preg_match('/^#!\/usr\/bin\/python/',$this->_value) > 0 ) {
+ $js='python/python';
+ $mode='python';
+ }
+ elseif ( preg_match('/^#!\/usr\/bin\/php/',$this->_value) > 0 ) {
+ $js='php/php';
+ $mode='text/x-php';
+ }
+ elseif ( preg_match('/^#!\/bin\/b?a?sh/',$this->_value) > 0 ) {
+ $js='shell/shell';
+ $mode='shell';
+ }
+ elseif ( preg_match('/^#!\/usr\/bin\/perl/',$this->_value) > 0 ) {
+ $js='perl/perl';
+ $mode='perl';
+ }
+ elseif ( preg_match('/^#!\/usr\/bin\/ruby/',$this->_value) > 0 ) {
+ $js='ruby/ruby';
+ $mode='ruby';
+ }
+ elseif ( preg_match('/#include.*iostream/',$this->_value) > 0 ) { //for c++
+ $js='clike/clike';
+ $mode='text/x-c++src';
+ }
+ elseif ( preg_match('/#include.*stdio\.h/',$this->_value) > 0 ) { //for c
+ $js='clike/clike';
+ $mode='text/x-csrc';
+ }
+ elseif ( preg_match('/public\ *class/',$this->_value) > 0 ) { //for java
+ $js='clike/clike';
+ $mode='text/x-java';
+ }
+ else {
+ $js = 'clike/clike';
+ $mode = 'text/x-csrc';
+ }
+ $codemirror= '../lib/form/codemirror-3.19/';
+ $src = '<link rel=stylesheet href=' . $codemirror . 'lib/codemirror.css>';
+ $src .= '<script src=' . $codemirror . 'lib/codemirror.js></script>';
+ $src .= '<script src=' . $codemirror . 'addon/edit/matchbrackets.js></script>';
+ $src .= '<script src=' . $codemirror . 'mode/'. $js . '.js></script>';
+ if ($js == "php/php") {$src .= '<script src=' . $codemirror . 'mode/clike/clike.js></script>';}
+ //auto tab for enter newline
+ $a=', indentUnit: 4, indentWithTabs: true, enterMode: \'flat\', tabMode: \'shift\'';
+ $script = '<script> var editor = CodeMirror.fromTextArea(document.getElementById(\'' . $this->_attributes[id] .'\'), {';
+ $script .= ' mode: \'' . $mode . '\''. $a . ', lineNumbers: true, matchBrackets: true });</script>';
+ return $this->_getTabs() . $src .
+ '<textarea' . $this->_getAttrString($this->_attributes) . '>' .
+ // because we wrap the form later we don't want the text indented
+ preg_replace("/(\r\n|\n|\r)/", '
', htmlspecialchars($this->_value)) .
+ '</textarea>' . $script;
+ }
}
}
[root@dywang moodle23]# diff -urNwbBE ../moodle/lib/formslib.php lib/formslib.php
--- ../moodle/lib/formslib.php 2012-08-10 08:05:01.000000000 +0800
+++ lib/formslib.php 2013-11-18 08:47:36.906293437 +0800
@@ -2615,6 +2615,7 @@
MoodleQuickForm::registerElementType('tags', "$CFG->libdir/form/tags.php", 'MoodleQuickForm_tags');
MoodleQuickForm::registerElementType('text', "$CFG->libdir/form/text.php", 'MoodleQuickForm_text');
MoodleQuickForm::registerElementType('textarea', "$CFG->libdir/form/textarea.php", 'MoodleQuickForm_textarea');
+MoodleQuickForm::registerElementType('codetextarea', "$CFG->libdir/form/codetextarea.php", 'MoodleQuickForm_codetextarea');
MoodleQuickForm::registerElementType('url', "$CFG->libdir/form/url.php", 'MoodleQuickForm_url');
MoodleQuickForm::registerElementType('warning', "$CFG->libdir/form/warning.php", 'MoodleQuickForm_warning');
edit_script_form.php 中使用 codetextarea。
[root@dywang script]# pwd
/var/www/html/moodle23/question/type/script
[root@dywang script]# vim edit_script_form.php
..............
public function get_per_answer_fields($mform, $label, $gradeoptions,
&$repeatedoptions, &$answersoption) {
$repeated = array();
$repeated[] = $mform->createElement('header', 'answerhdr', $label);
$repeated[] = $mform->createElement('codetextarea', 'answer',
get_string('answer', 'question'), array('size' => 70,'cols'=>70, 'rows' => 20));
$repeated[] = $mform->createElement('select', 'fraction',
get_string('grade'), $gradeoptions);
$repeated[] = $mform->createElement('editor', 'feedback',
get_string('feedback', 'question'), array('rows' => 2), $this->editoroptions); //dywang
$repeatedoptions['answer']['type'] = PARAM_RAW;
$repeatedoptions['fraction']['default'] = 1; //dywang
$answersoption = 'answers';
return $repeated;
}