├── CodemirrorAsset.php ├── CodemirrorWidget.php ├── LICENSE.md ├── README.md ├── composer.json └── presets ├── CssPreset.php ├── HtmlPreset.php ├── JavascriptPreset.php └── PhpPreset.php /CodemirrorAsset.php: -------------------------------------------------------------------------------- 1 | 'lib/codemirror.css', 238 | self::THEME_3024_DAY => 'theme/3024-day.css', 239 | self::THEME_3024_NIGHT => 'theme/3024-night.css', 240 | self::THEME_ABCDEF => 'theme/abcdef.css', 241 | self::THEME_AMBIANCE_MOBILE => 'theme/ambiance-mobile.css', 242 | self::THEME_AMBIANCE => 'theme/ambiance.css', 243 | self::THEME_BASE16_DARK => 'theme/base16-dark.css', 244 | self::THEME_BASE16_LIGHT => 'theme/base16-light.css', 245 | self::THEME_BLACKBOARD => 'theme/blackboard.css', 246 | self::THEME_COBALT => 'theme/cobalt.css', 247 | self::THEME_COLORFORTH => 'theme/colorforth.css', 248 | self::THEME_DRACULA => 'theme/dracula.css', 249 | self::THEME_ECLIPSE => 'theme/eclipse.css', 250 | self::THEME_ELEGANT => 'theme/elegant.css', 251 | self::THEME_ERLANG_DARK => 'theme/erlang-dark.css', 252 | self::THEME_ICECODER => 'theme/icecoder.css', 253 | self::THEME_LESSER_DARK => 'theme/lesser-dark.css', 254 | self::THEME_LIQUIBYTE => 'theme/liquibyte.css', 255 | self::THEME_MBO => 'theme/mbo.css', 256 | self::THEME_MDN_LIKE => 'theme/mdn-like.css', 257 | self::THEME_MIDNIGHT => 'theme/midnight.css', 258 | self::THEME_MONOKAI => 'theme/monokai.css', 259 | self::THEME_NEAT => 'theme/neat.css', 260 | self::THEME_NEO => 'theme/neo.css', 261 | self::THEME_NIGHT => 'theme/night.css', 262 | self::THEME_PARAISO_DARK => 'theme/paraiso-dark.css', 263 | self::THEME_PARAISO_LIGHT => 'theme/paraiso-light.css', 264 | self::THEME_PASTEL_ON_DARK => 'theme/pastel-on-dark.css', 265 | self::THEME_RUBYBLUE => 'theme/rubyblue.css', 266 | self::THEME_SETI => 'theme/seti.css', 267 | self::THEME_SOLARIZED => 'theme/solarized.css', 268 | self::THEME_THE_MATRIX => 'theme/the-matrix.css', 269 | self::THEME_TOMORROW_NIGHT_BRIGHT => 'theme/tomorrow-night-bright.css', 270 | self::THEME_TOMORROW_NIGHT_EIGHTIES => 'theme/tomorrow-night-eighties.css', 271 | self::THEME_TTCN => 'theme/ttcn.css', 272 | self::THEME_TWILIGHT => 'theme/twilight.css', 273 | self::THEME_VIBRANT_INK => 'theme/vibrant-ink.css', 274 | self::THEME_XQ_DARK => 'theme/xq-dark.css', 275 | self::THEME_XQ_LIGHT => 'theme/xq-light.css', 276 | self::THEME_YETI => 'theme/yeti.css', 277 | self::THEME_ZENBURN => 'theme/zenburn.css', 278 | 279 | self::ADDON_DIALOG => 'addon/dialog/dialog.css', 280 | self::ADDON_DISPLAY_FULLSCREEN => 'addon/display/fullscreen.css', 281 | self::ADDON_FOLD_FOLDGUTTER => 'addon/fold/foldgutter.css', 282 | self::ADDON_HINT_SHOW_HINT => 'addon/hint/show-hint.css', 283 | self::ADDON_LINT => 'addon/lint/lint.css', 284 | self::ADDON_MERGE => 'addon/merge/merge.css', 285 | self::ADDON_SCROLL_SIMPLESCROLLBARS => 'addon/scroll/simplescrollbars.css', 286 | self::ADDON_SEARCH_MATCHESONSCROLLBAR => 'addon/search/matchesonscrollbar.css', 287 | self::ADDON_TERN => 'addon/tern/tern.css', 288 | 289 | self::MODE_TIDDLYWIKI => 'mode/tiddlywiki/tiddlywiki.css', 290 | self::MODE_TIKI => 'mode/tiki/tiki.css', 291 | ]; 292 | 293 | private static $_js = [ 294 | 'lib' => 'lib/codemirror.js', 295 | self::ADDON_COMMENT => 'addon/comment/comment.js', 296 | self::ADDON_CONTINUECOMMENT => 'addon/comment/continuecomment.js', 297 | self::ADDON_DIALOG => 'addon/dialog/dialog.js', 298 | self::ADDON_DISPLAY_AUTOREFRESH => 'addon/display/autorefresh.js', 299 | self::ADDON_DISPLAY_FULLSCREEN => 'addon/display/fullscreen.js', 300 | self::ADDON_DISPLAY_PANEL => 'addon/display/panel.js', 301 | self::ADDON_DISPLAY_PLACEHOLDER => 'addon/display/placeholder.js', 302 | self::ADDON_DISPLAY_RULERS => 'addon/display/rulers.js', 303 | self::ADDON_EDIT_CLOSEBRACKETS => 'addon/edit/closebrackets.js', 304 | self::ADDON_EDIT_CLOSETAG => 'addon/edit/closetag.js', 305 | self::ADDON_EDIT_CONTINUELIST => 'addon/edit/continuelist.js', 306 | self::ADDON_EDIT_MATCHBRACKETS => 'addon/edit/matchbrackets.js', 307 | self::ADDON_EDIT_MATCHTAGS => 'addon/edit/matchtags.js', 308 | self::ADDON_EDIT_TRAILINGSPACE => 'addon/edit/trailingspace.js', 309 | self::ADDON_FOLD_BRACE_FOLD => 'addon/fold/brace-fold.js', 310 | self::ADDON_FOLD_COMMENT_FOLD => 'addon/fold/comment-fold.js', 311 | self::ADDON_FOLD_FOLDCODE => 'addon/fold/foldcode.js', 312 | self::ADDON_FOLD_FOLDGUTTER => 'addon/fold/foldgutter.js', 313 | self::ADDON_FOLD_INDENT_FOLD => 'addon/fold/indent-fold.js', 314 | self::ADDON_FOLD_MARKDOWN_FOLD => 'addon/fold/markdown-fold.js', 315 | self::ADDON_FOLD_XML_FOLD => 'addon/fold/xml-fold.js', 316 | self::ADDON_HINT_ANYWORD_HINT => 'addon/hint/anyword-hint.js', 317 | self::ADDON_HINT_CSS_HINT => 'addon/hint/css-hint.js', 318 | self::ADDON_HINT_HTML_HINT => 'addon/hint/html-hint.js', 319 | self::ADDON_HINT_JAVASCRIPT_HINT => 'addon/hint/javascript-hint.js', 320 | self::ADDON_HINT_SHOW_HINT => 'addon/hint/show-hint.js', 321 | self::ADDON_HINT_SQL_HINT => 'addon/hint/sql-hint.js', 322 | self::ADDON_HINT_XML_HINT => 'addon/hint/xml-hint.js', 323 | self::ADDON_LINT_COFFEESCRIPT_LINT => 'addon/lint/coffeescript-lint.js', 324 | self::ADDON_LINT_CSS_LINT => 'addon/lint/css-lint.js', 325 | self::ADDON_LINT_JAVASCRIPT_LINT => 'addon/lint/javascript-lint.js', 326 | self::ADDON_LINT_JSON_LINT => 'addon/lint/json-lint.js', 327 | self::ADDON_LINT => 'addon/lint/lint.js', 328 | self::ADDON_LINT_YAML_LINT => 'addon/lint/yaml-lint.js', 329 | self::ADDON_MERGE => 'addon/merge/merge.js', 330 | self::ADDON_MODE_LOADMODE => 'addon/mode/loadmode.js', 331 | self::ADDON_MODE_MULTIPLEX_TEST => 'addon/mode/multiplex_test.js', 332 | self::ADDON_MODE_MULTIPLEX => 'addon/mode/multiplex.js', 333 | self::ADDON_MODE_OVERLAY => 'addon/mode/overlay.js', 334 | self::ADDON_MODE_SIMPLE => 'addon/mode/simple.js', 335 | self::ADDON_RUNMODE_COLORIZE => 'addon/runmode/colorize.js', 336 | self::ADDON_RUNMODE_STANDALONE => 'addon/runmode/runmode-standalone.js', 337 | self::ADDON_RUNMODE => 'addon/runmode/runmode.js', 338 | self::ADDON_RUNMODE_NODE => 'addon/runmode/runmode.node.js', 339 | self::ADDON_SCROLL_ANNOTATESCROLLBAR => 'addon/scroll/annotatescrollbar.js', 340 | self::ADDON_SCROLL_SCROLLPASTEND => 'addon/scroll/scrollpastend.js', 341 | self::ADDON_SCROLL_SIMPLESCROLLBARS => 'addon/scroll/simplescrollbars.js', 342 | self::ADDON_SEARCH_MATCH_HIGHLIGHTER => 'addon/search/match-highlighter.js', 343 | self::ADDON_SEARCH_MATCHESONSCROLLBAR => 'addon/search/matchesonscrollbar.js', 344 | self::ADDON_SEARCH => 'addon/search/search.js', 345 | self::ADDON_SEARCHCURSOR => 'addon/search/searchcursor.js', 346 | self::ADDON_SELECTION_ACTIVE_LINE => 'addon/selection/active-line.js', 347 | self::ADDON_SELECTION_MARK_SELECTION => 'addon/selection/mark-selection.js', 348 | self::ADDON_SELECTION_POINTER => 'addon/selection/selection-pointer.js', 349 | self::ADDON_TERN => 'addon/tern/tern.js', 350 | self::ADDON_TERN_WORKER => 'addon/tern/worker.js', 351 | self::ADDON_WRAP_HARDWRAP => 'addon/wrap/hardwrap.js', 352 | 353 | self::KEYMAP_EMACS => 'keymap/emacs.js', 354 | self::KEYMAP_SUBLIME => 'keymap/sublime.js', 355 | self::KEYMAP_VIM => 'keymap/vim.js', 356 | 357 | self::MODE_APL => 'mode/apl/apl.js', 358 | self::MODE_ASCIIARMOR => 'mode/asciiarmor/asciiarmor.js', 359 | self::MODE_ASN_1 => 'mode/asn.1/asn.1.js', 360 | self::MODE_ASTERISK => 'mode/asterisk/asterisk.js', 361 | self::MODE_BRAINFUCK => 'mode/brainfuck/brainfuck.js', 362 | self::MODE_CLIKE => 'mode/clike/clike.js', 363 | self::MODE_CLOJURE => 'mode/clojure/clojure.js', 364 | self::MODE_CMAKE => 'mode/cmake/cmake.js', 365 | self::MODE_COBOL => 'mode/cobol/cobol.js', 366 | self::MODE_COFFEESCRIPT => 'mode/coffeescript/coffeescript.js', 367 | self::MODE_COMMONLISP => 'mode/commonlisp/commonlisp.js', 368 | self::MODE_CSS => 'mode/css/css.js', 369 | self::MODE_CYPHER => 'mode/cypher/cypher.js', 370 | self::MODE_D => 'mode/d/d.js', 371 | self::MODE_DART => 'mode/dart/dart.js', 372 | self::MODE_DIFF => 'mode/diff/diff.js', 373 | self::MODE_DJANGO => 'mode/django/django.js', 374 | self::MODE_DOCKERFILE => 'mode/dockerfile/dockerfile.js', 375 | self::MODE_DTD => 'mode/dtd/dtd.js', 376 | self::MODE_DYLAN => 'mode/dylan/dylan.js', 377 | self::MODE_EBNF => 'mode/ebnf/ebnf.js', 378 | self::MODE_ECL => 'mode/ecl/ecl.js', 379 | self::MODE_EIFFEL => 'mode/eiffel/eiffel.js', 380 | self::MODE_ELM => 'mode/elm/elm.js', 381 | self::MODE_ERLANG => 'mode/erlang/erlang.js', 382 | self::MODE_FACTOR => 'mode/factor/factor.js', 383 | self::MODE_FORTH => 'mode/forth/forth.js', 384 | self::MODE_FORTRAN => 'mode/fortran/fortran.js', 385 | self::MODE_GAS => 'mode/gas/gas.js', 386 | self::MODE_GFM => 'mode/gfm/gfm.js', 387 | self::MODE_GHERKIN => 'mode/gherkin/gherkin.js', 388 | self::MODE_GO => 'mode/go/go.js', 389 | self::MODE_GROOVY => 'mode/groovy/groovy.js', 390 | self::MODE_HAML => 'mode/haml/haml.js', 391 | self::MODE_HANDLEBARS => 'mode/handlebars/handlebars.js', 392 | self::MODE_HASKELL => 'mode/haskell/haskell.js', 393 | self::MODE_HAXE => 'mode/haxe/haxe.js', 394 | self::MODE_HTMLEMBEDDED => 'mode/htmlembedded/htmlembedded.js', 395 | self::MODE_HTMLMIXED => 'mode/htmlmixed/htmlmixed.js', 396 | self::MODE_HTTP => 'mode/http/http.js', 397 | self::MODE_IDL => 'mode/idl/idl.js', 398 | self::MODE_JADE => 'mode/jade/jade.js', 399 | self::MODE_JAVASCRIPT => 'mode/javascript/javascript.js', 400 | self::MODE_JINJA2 => 'mode/jinja2/jinja2.js', 401 | self::MODE_JSX => 'mode/jsx/jsx.js', 402 | self::MODE_JULIA => 'mode/julia/julia.js', 403 | self::MODE_KOTLIN => 'mode/kotlin/kotlin.js', 404 | self::MODE_LIVESCRIPT => 'mode/livescript/livescript.js', 405 | self::MODE_LUA => 'mode/lua/lua.js', 406 | self::MODE_MARKDOWN => 'mode/markdown/markdown.js', 407 | self::MODE_MATHEMATICA => 'mode/mathematica/mathematica.js', 408 | self::MODE_MIRC => 'mode/mirc/mirc.js', 409 | self::MODE_MLLIKE => 'mode/mllike/mllike.js', 410 | self::MODE_MODELICA => 'mode/modelica/modelica.js', 411 | self::MODE_MSCGEN => 'mode/modelica/mscgen.js', 412 | self::MODE_MUMPS => 'mode/modelica/mumps.js', 413 | self::MODE_NGINX => 'mode/nginx/nginx.js', 414 | self::MODE_NTRIPLES => 'mode/ntriples/ntriples.js', 415 | self::MODE_OCTAVE => 'mode/octave/octave.js', 416 | self::MODE_OZ => 'mode/oz/oz.js', 417 | self::MODE_PASCAL => 'mode/pascal/pascal.js', 418 | self::MODE_PEGJS => 'mode/pegjs/pegjs.js', 419 | self::MODE_PERL => 'mode/perl/perl.js', 420 | self::MODE_PHP => 'mode/php/php.js', 421 | self::MODE_PIG => 'mode/pig/pig.js', 422 | self::MODE_PROPERTIES => 'mode/properties/properties.js', 423 | self::MODE_PUPPET => 'mode/puppet/puppet.js', 424 | self::MODE_PYTHON => 'mode/python/python.js', 425 | self::MODE_Q => 'mode/q/q.js', 426 | self::MODE_R => 'mode/r/r.js', 427 | self::MODE_RPM => 'mode/rpm/rpm.js', 428 | self::MODE_RST => 'mode/rst/rst.js', 429 | self::MODE_RUBY => 'mode/ruby/ruby.js', 430 | self::MODE_RUST => 'mode/rust/rust.js', 431 | self::MODE_SASS => 'mode/sass/sass.js', 432 | self::MODE_SCHEME => 'mode/scheme/scheme.js', 433 | self::MODE_SHELL => 'mode/shell/shell.js', 434 | self::MODE_SIEVE => 'mode/sieve/sieve.js', 435 | self::MODE_SLIM => 'mode/slim/slim.js', 436 | self::MODE_SMALLTALK => 'mode/smalltalk/smalltalk.js', 437 | self::MODE_SMARTY => 'mode/smarty/smarty.js', 438 | self::MODE_SOLR => 'mode/solr/solr.js', 439 | self::MODE_SOY => 'mode/soy/soy.js', 440 | self::MODE_SPARQL => 'mode/sparql/sparql.js', 441 | self::MODE_SPREADSHEET => 'mode/spreadsheet/spreadsheet.js', 442 | self::MODE_SQL => 'mode/sql/sql.js', 443 | self::MODE_STEX => 'mode/stex/stex.js', 444 | self::MODE_STYLUS => 'mode/stylus/stylus.js', 445 | self::MODE_SWIFT => 'mode/swift/swift.js', 446 | self::MODE_TCL => 'mode/tcl/tcl.js', 447 | self::MODE_TEXTILE => 'mode/textile/textile.js', 448 | self::MODE_TIDDLYWIKI => 'mode/tiddlywiki/tiddlywiki.js', 449 | self::MODE_TIKI => 'mode/tiki/tiki.js', 450 | self::MODE_TOML => 'mode/toml/toml.js', 451 | self::MODE_TORNADO => 'mode/tornado/tornado.js', 452 | self::MODE_TROFF => 'mode/troff/troff.js', 453 | self::MODE_TTCN => 'mode/ttcn/ttcn.js', 454 | self::MODE_TTCN_CFG => 'mode/ttcn/ttcn-cfg.js', 455 | self::MODE_TURTLE => 'mode/turtle/turtle.js', 456 | self::MODE_TWIG => 'mode/twig/twig.js', 457 | self::MODE_VB => 'mode/vb/vb.js', 458 | self::MODE_VBSCRIPT => 'mode/vbscript/vbscript.js', 459 | self::MODE_VELOCITY => 'mode/velocity/velocity.js', 460 | self::MODE_VERILOG => 'mode/verilog/verilog.js', 461 | self::MODE_VHDL => 'mode/vhdl/vhdl.js', 462 | self::MODE_VUE => 'mode/vue/vue.js', 463 | self::MODE_XML => 'mode/xml/xml.js', 464 | self::MODE_XQUERY => 'mode/xquery/xquery.js', 465 | self::MODE_YAML => 'mode/yaml/yaml.js', 466 | self::MODE_Z80 => 'mode/z80/z80.js', 467 | ]; 468 | 469 | private static $_assets; 470 | 471 | 472 | // The files are not web directory accessible, therefore we need 473 | // to specify the sourcePath property. Notice the @bower alias used. 474 | public $sourcePath = '@bower/codemirror'; 475 | 476 | /** 477 | * Registers this asset bundle with a view. 478 | * @param View $view the view to be registered with 479 | * @param array() $assets 480 | * @return static the registered asset bundle instance 481 | */ 482 | public static function register($view, $assets = []) 483 | { 484 | self::$_assets = ArrayHelper::merge(self::$_assets, array_flip($assets)); 485 | return $view->registerAssetBundle(get_called_class()); 486 | } 487 | 488 | /** 489 | * Registers the CSS and JS files with the given view. 490 | * @param \yii\web\View $view the view that the asset files are to be registered with. 491 | */ 492 | public function registerAssetFiles($view) 493 | { 494 | if (is_array(self::$_assets)) { 495 | $this->css = array_values(array_intersect_key(self::$_css, self::$_assets)); 496 | $this->js = array_values(array_intersect_key(self::$_js, self::$_assets)); 497 | } 498 | array_unshift($this->css, self::$_css['lib']); 499 | array_unshift($this->js, self::$_js['lib']); 500 | parent::registerAssetFiles($view); 501 | } 502 | } 503 | -------------------------------------------------------------------------------- /CodemirrorWidget.php: -------------------------------------------------------------------------------- 1 | hasModel()) { 37 | echo Html::activeTextarea($this->model, $this->attribute, $this->options); 38 | } else { 39 | echo Html::textarea($this->name, $this->value, $this->options); 40 | } 41 | $this->registerAssets(); 42 | } 43 | 44 | 45 | /** 46 | * Registers Assets 47 | */ 48 | public function registerAssets() 49 | { 50 | $view = $this->getView(); 51 | $id = $this->options['id']; 52 | $settings = $this->settings; 53 | $assets = $this->assets; 54 | if ($this->preset) { 55 | $preset = $this->getPreset($this->preset); 56 | if (isset($preset['settings'])) { 57 | $settings = ArrayHelper::merge($preset['settings'], $settings); 58 | } 59 | if (isset($preset['assets'])) { 60 | $assets = ArrayHelper::merge($preset['assets'], $assets); 61 | } 62 | } 63 | $settings = Json::encode($settings); 64 | $instanceName = 'CM_'.preg_replace('/[^\w\d]/ius', '', $id); 65 | $js = "CodeMirror.fromTextArea(document.getElementById('$id'), $settings);"; 66 | $view->registerJs($js, $view::POS_READY); 67 | CodemirrorAsset::register($this->view, $assets); 68 | } 69 | 70 | public function getPreset($name) 71 | { 72 | if ($this->presetsDir) { 73 | $filename = $this->presetsDir . DIRECTORY_SEPARATOR . ucfirst($name) . 'Preset.php'; 74 | } else { 75 | $filename = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'presets' . DIRECTORY_SEPARATOR . ucfirst($name) . 'Preset.php'; 76 | } 77 | return require $filename; 78 | } 79 | } 80 | 81 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Andrey Borodulin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Codemirror widget for Yii2 framework 2 | ================= 3 | 4 | ## Description 5 | 6 | CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with a number of language modes and addons that implement more advanced editing functionality. 7 | For more information please visit [CodeMirror](http://codemirror.net/) 8 | 9 | ## Installation 10 | 11 | The preferred way to install this extension is through [composer](http://getcomposer.org/download/). 12 | 13 | To install, either run 14 | 15 | ``` 16 | $ php composer.phar require conquer/codemirror "*" 17 | ``` 18 | or add 19 | 20 | ``` 21 | "conquer/codemirror": "*" 22 | ``` 23 | 24 | to the ```require``` section of your `composer.json` file. 25 | 26 | ## Usage 27 | 28 | ```php 29 | use conquer\codemirror\CodemirrorWidget; 30 | 31 | $form->field($model, 'code')->widget( 32 | CodemirrorWidget::className(), 33 | [ 34 | 'preset'=>'php', 35 | 'options'=>['rows' => 20], 36 | ] 37 | ); 38 | ``` 39 | 40 | You can use ready-made presets, or create your own. To do this, specify the folder to your presets. 41 | 42 | ```php 43 | use conquer\codemirror\CodemirrorWidget; 44 | 45 | $form->field($model, 'code')->widget( 46 | CodemirrorWidget::className(), 47 | [ 48 | 'presetsDir'=>'/path_to_your_presets', 49 | 'preset'=>'sql', 50 | ] 51 | ); 52 | ``` 53 | 54 | In general, you can customize the widget directly specifying its properties. 55 | 56 | ```php 57 | use conquer\codemirror\CodemirrorWidget; 58 | use conquer\codemirror\CodemirrorAsset; 59 | 60 | $form->field($model, 'code')->widget( 61 | CodemirrorWidget::className(), 62 | [ 63 | 'assets'=>[ 64 | CodemirrorAsset::MODE_CLIKE, 65 | CodemirrorAsset::KEYMAP_EMACS, 66 | CodemirrorAsset::ADDON_EDIT_MATCHBRACKETS, 67 | CodemirrorAsset::ADDON_COMMENT, 68 | CodemirrorAsset::ADDON_DIALOG, 69 | CodemirrorAsset::ADDON_SEARCHCURSOR, 70 | CodemirrorAsset::ADDON_SEARCH, 71 | ], 72 | 'settings'=>[ 73 | 'lineNumbers' => true, 74 | 'mode' => 'text/x-csrc', 75 | 'keyMap' => 'emacs' 76 | ], 77 | ] 78 | ); 79 | ``` 80 | ##### JavaScript 81 | For access the instance of CodeMirror from JavaScript, you can use CodeMirror.instances[] . 82 | Example: 83 | ```js 84 | var instanceName = document.getElementById('textarea-id').dataset.codeMirror; 85 | 86 | var cm = CodeMirror.instances[instanceName]; 87 | 88 | var code = cm.getValue(); // Get the current editor content 89 | /* 90 | cm.save(); // Copy the content of the editor into the textarea 91 | cm.toTextArea(); // Remove the editor, and restore the original textarea 92 | */ 93 | ``` 94 | 95 | ## License 96 | 97 | **conquer/codemirror** is released under the MIT License. See the bundled `LICENSE.md` for details. 98 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "conquer/codemirror", 3 | "description": "Yii2 codemirror widget", 4 | "keywords": ["yii2", "extension", "widget", "codemirror"], 5 | "homepage": "https://github.com/borodulin/yii2-codemirror", 6 | "type": "yii2-extension", 7 | "license": "MIT", 8 | "support": { 9 | "issues": "https://github.com/borodulin/yii2-codemirror/issues", 10 | "source": "https://github.com/borodulin/yii2-codemirror" 11 | }, 12 | "authors": [ 13 | { 14 | "name": "Andrey Borodulin", 15 | "email": "borodulin@gmail.com" 16 | } 17 | ], 18 | "extra": { 19 | "branch-alias": { 20 | "dev-master": "2.0.3.x-dev" 21 | } 22 | }, 23 | "require": { 24 | "php": ">=5.4.0", 25 | "yiisoft/yii2": "*", 26 | "conquer/helpers": "~2.0.8", 27 | "bower-asset/codemirror": "^5" 28 | }, 29 | "autoload": { 30 | "psr-4": { 31 | "conquer\\codemirror\\": "" 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /presets/CssPreset.php: -------------------------------------------------------------------------------- 1 | [ 11 | CodemirrorAsset::ADDON_EDIT_MATCHBRACKETS, 12 | CodemirrorAsset::ADDON_CONTINUECOMMENT, 13 | CodemirrorAsset::ADDON_COMMENT, 14 | CodemirrorAsset::MODE_CSS, 15 | ], 16 | 'settings'=>[ 17 | 'lineNumbers'=> true, 18 | 'matchBrackets'=>true, 19 | 'continueComments' => "Enter", 20 | 'extraKeys' => ["Ctrl-/"=> "toggleComment"], 21 | ], 22 | ]; 23 | -------------------------------------------------------------------------------- /presets/HtmlPreset.php: -------------------------------------------------------------------------------- 1 | [ 11 | CodemirrorAsset::ADDON_EDIT_MATCHBRACKETS, 12 | CodemirrorAsset::ADDON_CONTINUECOMMENT, 13 | CodemirrorAsset::ADDON_COMMENT, 14 | CodemirrorAsset::MODE_XML, 15 | ], 16 | 'settings'=>[ 17 | 'lineNumbers'=> true, 18 | 'matchBrackets'=>true, 19 | 'continueComments' => "Enter", 20 | 'extraKeys' => ["Ctrl-/"=> "toggleComment"], 21 | ], 22 | ]; 23 | -------------------------------------------------------------------------------- /presets/JavascriptPreset.php: -------------------------------------------------------------------------------- 1 | [ 11 | CodemirrorAsset::ADDON_EDIT_MATCHBRACKETS, 12 | CodemirrorAsset::ADDON_CONTINUECOMMENT, 13 | CodemirrorAsset::ADDON_COMMENT, 14 | CodemirrorAsset::MODE_JAVASCRIPT, 15 | ], 16 | 'settings'=>[ 17 | 'lineNumbers'=> true, 18 | 'matchBrackets'=>true, 19 | 'continueComments' => "Enter", 20 | 'extraKeys' => ["Ctrl-/"=> "toggleComment"], 21 | ], 22 | ]; -------------------------------------------------------------------------------- /presets/PhpPreset.php: -------------------------------------------------------------------------------- 1 | [ 12 | CodemirrorAsset::MODE_CLIKE, 13 | CodemirrorAsset::MODE_PHP, 14 | CodemirrorAsset::ADDON_COMMENT, 15 | CodemirrorAsset::ADDON_DISPLAY_FULLSCREEN, 16 | CodemirrorAsset::THEME_ECLIPSE, 17 | ], 18 | 'settings'=>[ 19 | 'lineNumbers' => true, 20 | 'matchBrackets' => true, 21 | 'mode' => "application/x-httpd-php-open", 22 | 'indentUnit' => 4, 23 | 'indentWithTabs' => true, 24 | 'extraKeys' => [ 25 | "F11" => new JsExpression("function(cm){cm.setOption('fullScreen', !cm.getOption('fullScreen'));}"), 26 | "Esc" => new JsExpression("function(cm){if(cm.getOption('fullScreen')) cm.setOption('fullScreen', false);}"), 27 | ], 28 | ], 29 | ]; --------------------------------------------------------------------------------