Head and Footer Scripts Inserter - Version 4.52

Version Description

  • Jul 19, 2021 =
  • Maintenance: Ensure compatibility with upcoming WordPress 5.8.
  • Framework update: The CodeMirror library has been updated to the latest version v5.62.0.
Download this release

Release Info

Developer Arthur Gareginyan
Plugin Icon 128x128 Head and Footer Scripts Inserter
Version 4.52
Comparing to
See all releases

Code changes from version 4.51 to 4.52

header-and-footer-scripts-inserter.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: Easily and safely add your custom HTML code (plus JavaScript, CSS, etc.) to your WordPress website, directly out of the WordPress Admin Area, without the need to have an external editor.
6
  * Author: Space X-Chimp
7
  * Author URI: https://www.spacexchimp.com
8
- * Version: 4.51
9
  * License: GPL3
10
  * Text Domain: header-and-footer-scripts-inserter
11
  * Domain Path: /languages/
5
  * Description: Easily and safely add your custom HTML code (plus JavaScript, CSS, etc.) to your WordPress website, directly out of the WordPress Admin Area, without the need to have an external editor.
6
  * Author: Space X-Chimp
7
  * Author URI: https://www.spacexchimp.com
8
+ * Version: 4.52
9
  * License: GPL3
10
  * Text Domain: header-and-footer-scripts-inserter
11
  * Domain Path: /languages/
inc/lib/codemirror/AUTHORS CHANGED
@@ -10,6 +10,7 @@ Abhishek Gahlot
10
  Adam Ahmed
11
  Adam King
12
  Adam Particka
 
13
  adanlobato
14
  Adán Lobato
15
  Aditya Toshniwal
@@ -28,6 +29,7 @@ AlbertHilb
28
  Alberto González Palomo
29
  Alberto Pose
30
  Albert Xing
 
31
  Alexander Pavlov
32
  Alexander Schepanovski
33
  Alexander Shvets
@@ -36,6 +38,7 @@ Alexandre Bique
36
  Alex Churchill
37
  alexey-k
38
  Alex Piggott
 
39
  Aliaksei Chapyzhenka
40
  Allen Sarkisyan
41
  Ami Fischman
@@ -177,6 +180,7 @@ CodeBitt
177
  coderaiser
178
  Cole R Lawrence
179
  ComFreek
 
180
  Cristian Prieto
181
  Curran Kelleher
182
  Curtis Gagliardi
@@ -208,6 +212,7 @@ David Barnett
208
  David H. Bronke
209
  David Mignot
210
  David Pathakjee
 
211
  David Rodrigues
212
  David Santana
213
  David Vázquez
@@ -221,6 +226,7 @@ Dick Choi
221
  Diego Fernandez
222
  dignifiedquire
223
  Dimage Sapelkin
 
224
  Dinindu D. Wanniarachchi
225
  dmaclach
226
  Dmitry Kiselyov
@@ -243,6 +249,7 @@ edoroshenko
243
  edsharp
244
  ekhaled
245
  Elisée
 
246
  elpnt
247
  Emmanuel Schanzer
248
  Enam Mijbah Noor
@@ -250,6 +257,7 @@ Eric Allam
250
  Eric Bogard
251
  Erik Demaine
252
  Erik Welander
 
253
  eustas
254
  Evan Minsk
255
  Fabien Dubosson
@@ -260,6 +268,7 @@ Fauntleroy
260
  fbuchinger
261
  feizhang365
262
  Felipe Lalanne
 
263
  Felix Raab
264
  ficristo
265
  Filip Noetzel
@@ -325,6 +334,7 @@ Heanes
325
  Hector Oswaldo Caballero
326
  Hein Htat
327
  Hélio
 
328
  Hendrik Wallbaum
329
  Henrik Haugbølle
330
  Herculano Campos
@@ -338,6 +348,7 @@ Hugues Malphettes
338
  Ian Beck
339
  Ian Davies
340
  Ian Dickinson
 
341
  ianhi
342
  Ian Rose
343
  Ian Wehrman
@@ -352,13 +363,16 @@ Ilya Zverev
352
  Ingo Richter
353
  Intervue
354
  Irakli Gozalishvili
 
355
  Ivan Kurnosov
356
  Ivoah
357
  Jack Douglas
358
  Jacob Lee
359
  Jaimin
360
  Jake Peyser
 
361
  Jakob Miland
 
362
  Jakub Vrana
363
  Jakub Vrána
364
  James Campos
@@ -403,6 +417,7 @@ jochenberger
403
  Jochen Berger
404
  Joel Einbinder
405
  joelpinheiro
 
406
  joewalsh
407
  Johan Ask
408
  Johannes
@@ -420,12 +435,14 @@ Jonas Helfer
420
  Jonathan Dierksen
421
  Jonathan Hart
422
  Jonathan Malmaud
 
423
  Jon Gacnik
424
  jongalloway
425
  Jon Malmaud
426
  Jon Sangster
427
  Joo
428
  Joost-Wim Boekesteijn
 
429
  Joseph Pecoraro
430
  Josh Barnes
431
  Josh Cohen
@@ -462,9 +479,11 @@ Kevin Muret
462
  Kevin Sawicki
463
  Kevin Ushey
464
  Kier Darby
 
465
  Klaus Silveira
466
  Koh Zi Han, Cliff
467
  komakino
 
468
  Konstantin Lopuhin
469
  koops
470
  Kris Ciccarello
@@ -486,10 +505,12 @@ Leo Baschy
486
  Leonid Khachaturov
487
  Leon Sorokin
488
  Leonya Khachaturov
 
489
  Liam Newman
490
  Libo Cannici
491
  Lior Goldberg
492
  Lior Shub
 
493
  LloydMilligan
494
  LM
495
  lochel
@@ -502,6 +523,7 @@ Lucas Buchala
502
  Luciano Longo
503
  Luciano Santana
504
  Lu Fangjian
 
505
  Luke Browning
506
  Luke Granger-Brown
507
  Luke Stagner
@@ -516,6 +538,7 @@ Manuel Rego Casasnovas
516
  Marat Dreizin
517
  Marcel Gerber
518
  Marcelo Camargo
 
519
  Marco Aurélio
520
  Marco Munizaga
521
  Marcus Bointon
@@ -524,6 +547,7 @@ Marijn Haverbeke
524
  Mário Gonçalves
525
  Mario Pietsch
526
  Mark Anderson
 
527
  Mark Dalgleish
528
  Mark Hamstra
529
  Mark Lentczner
@@ -537,10 +561,12 @@ Martin Hasoň
537
  Martin Hunt
538
  Martin Laine
539
  Martin Zagora
 
540
  Mason Malone
541
  Mateusz Paprocki
542
  Mathias Bynens
543
  mats cronqvist
 
544
  Matt Gaide
545
  Matthew Bauer
546
  Matthew Beale
@@ -571,6 +597,7 @@ meshuamam
571
  Metatheos
572
  Micah Dubinko
573
  Michael
 
574
  Michael Goderbauer
575
  Michael Grey
576
  Michael Kaminsky
@@ -598,6 +625,7 @@ Miraculix87
598
  misfo
599
  mkaminsky11
600
  mloginov
 
601
  Moritz Schubotz (physikerwelt)
602
  Moritz Schwörer
603
  Moshe Wajnberg
@@ -608,6 +636,7 @@ Mu-An ✌️ Chiou
608
  Mu-An Chiou
609
  mzabuawala
610
  Narciso Jaramillo
 
611
  Nathan Williams
612
  ndr
613
  Neil Anderson
@@ -634,6 +663,7 @@ Nikolaj Kappler
634
  Nikolay Kostov
635
  nilp0inter
636
  Nils Knappmeier
 
637
  Nisarg Jhaveri
638
  nlwillia
639
  noragrossman
@@ -678,19 +708,23 @@ Peter Flynn
678
  peterkroon
679
  Peter Kroon
680
  Peter László
 
681
  Philipp A
682
  Philipp Markovics
683
  Philip Stadermann
684
  Pi Delport
685
  Pierre Gerold
686
  Pieter Ouwerkerk
 
687
  Pontus Melke
688
  prasanthj
689
  Prasanth J
690
  Prayag Verma
691
  prendota
692
  Prendota
 
693
  Qiang Li
 
694
  Radek Piórkowski
695
  Rahul
696
  Rahul Anand
@@ -720,7 +754,9 @@ Roberto Abdelkader Martínez Pérez
720
  robertop23
721
  Roberto Vidal
722
  Robert Plummer
 
723
  Roman Janusz
 
724
  Rrandom
725
  Rrrandom
726
  Ruslan Osmanov
@@ -751,6 +787,7 @@ Scott Aikin
751
  Scott Feeney
752
  Scott Goodhew
753
  Seb35
 
754
  Sebastian Wilzbach
755
  Sebastian Zaha
756
  Seren D
@@ -771,7 +808,9 @@ Siamak Mokhtari
771
  Siddhartha Gunti
772
  silverwind
773
  Simon Edwards
 
774
  sinkuu
 
775
  snasa
776
  soliton4
777
  sonson
@@ -781,6 +820,7 @@ srajanpaliwal
781
  Stanislav Oaserele
782
  stan-z
783
  Stas Kobzar
 
784
  Stefan Borsje
785
  Steffen Beyer
786
  Steffen Bruchmann
@@ -789,6 +829,7 @@ Stephane Moore
789
  Stephen Lavelle
790
  Steve Champagne
791
  Steve Hoover
 
792
  Steve O'Hara
793
  stockiNail
794
  stoskov
@@ -812,6 +853,7 @@ Thaddee Tyl
812
  thanasis
813
  TheHowl
814
  themrmax
 
815
  think
816
  Thomas Brouard
817
  Thomas Dvornik
@@ -838,6 +880,7 @@ Tom MacWright
838
  Tom McLaughlin
839
  Tony Jian
840
  tophf
 
841
  Torgeir Thoresen
842
  totalamd
843
  Travis Heppe
@@ -876,6 +919,8 @@ wonderboyjon
876
  Wu Cheng-Han
877
  Xavier Mendez
878
  Yang Guo
 
 
879
  Yassin N. Hassan
880
  YNH Webdev
881
  yoongu
10
  Adam Ahmed
11
  Adam King
12
  Adam Particka
13
+ Adam Wight
14
  adanlobato
15
  Adán Lobato
16
  Aditya Toshniwal
29
  Alberto González Palomo
30
  Alberto Pose
31
  Albert Xing
32
+ Alexander Marks
33
  Alexander Pavlov
34
  Alexander Schepanovski
35
  Alexander Shvets
38
  Alex Churchill
39
  alexey-k
40
  Alex Piggott
41
+ Alf Eaton
42
  Aliaksei Chapyzhenka
43
  Allen Sarkisyan
44
  Ami Fischman
180
  coderaiser
181
  Cole R Lawrence
182
  ComFreek
183
+ Cornelius Weig
184
  Cristian Prieto
185
  Curran Kelleher
186
  Curtis Gagliardi
212
  David H. Bronke
213
  David Mignot
214
  David Pathakjee
215
+ David R. Myers
216
  David Rodrigues
217
  David Santana
218
  David Vázquez
226
  Diego Fernandez
227
  dignifiedquire
228
  Dimage Sapelkin
229
+ Dimitri Mitropoulos
230
  Dinindu D. Wanniarachchi
231
  dmaclach
232
  Dmitry Kiselyov
249
  edsharp
250
  ekhaled
251
  Elisée
252
+ Elmar Peise
253
  elpnt
254
  Emmanuel Schanzer
255
  Enam Mijbah Noor
257
  Eric Bogard
258
  Erik Demaine
259
  Erik Welander
260
+ erosman
261
  eustas
262
  Evan Minsk
263
  Fabien Dubosson
268
  fbuchinger
269
  feizhang365
270
  Felipe Lalanne
271
+ Felipe S. S. Schneider
272
  Felix Raab
273
  ficristo
274
  Filip Noetzel
334
  Hector Oswaldo Caballero
335
  Hein Htat
336
  Hélio
337
+ Hendrik Erz
338
  Hendrik Wallbaum
339
  Henrik Haugbølle
340
  Herculano Campos
348
  Ian Beck
349
  Ian Davies
350
  Ian Dickinson
351
+ Ian Henderson
352
  ianhi
353
  Ian Rose
354
  Ian Wehrman
363
  Ingo Richter
364
  Intervue
365
  Irakli Gozalishvili
366
+ iteriani
367
  Ivan Kurnosov
368
  Ivoah
369
  Jack Douglas
370
  Jacob Lee
371
  Jaimin
372
  Jake Peyser
373
+ Jakob Kummerow
374
  Jakob Miland
375
+ Jakub T. Jankiewicz
376
  Jakub Vrana
377
  Jakub Vrána
378
  James Campos
417
  Jochen Berger
418
  Joel Einbinder
419
  joelpinheiro
420
+ Joe Predham
421
  joewalsh
422
  Johan Ask
423
  Johannes
435
  Jonathan Dierksen
436
  Jonathan Hart
437
  Jonathan Malmaud
438
+ Jonathan Rascher
439
  Jon Gacnik
440
  jongalloway
441
  Jon Malmaud
442
  Jon Sangster
443
  Joo
444
  Joost-Wim Boekesteijn
445
+ José dBruxelles
446
  Joseph Pecoraro
447
  Josh Barnes
448
  Josh Cohen
479
  Kevin Sawicki
480
  Kevin Ushey
481
  Kier Darby
482
+ Kim-Anh Tran
483
  Klaus Silveira
484
  Koh Zi Han, Cliff
485
  komakino
486
+ Konstantin Chernenko
487
  Konstantin Lopuhin
488
  koops
489
  Kris Ciccarello
505
  Leonid Khachaturov
506
  Leon Sorokin
507
  Leonya Khachaturov
508
+ lexer2086
509
  Liam Newman
510
  Libo Cannici
511
  Lior Goldberg
512
  Lior Shub
513
+ lishid
514
  LloydMilligan
515
  LM
516
  lochel
523
  Luciano Longo
524
  Luciano Santana
525
  Lu Fangjian
526
+ Łukasz Wielgus
527
  Luke Browning
528
  Luke Granger-Brown
529
  Luke Stagner
538
  Marat Dreizin
539
  Marcel Gerber
540
  Marcelo Camargo
541
+ Marc Espín
542
  Marco Aurélio
543
  Marco Munizaga
544
  Marcus Bointon
547
  Mário Gonçalves
548
  Mario Pietsch
549
  Mark Anderson
550
+ Mark Boyes
551
  Mark Dalgleish
552
  Mark Hamstra
553
  Mark Lentczner
561
  Martin Hunt
562
  Martin Laine
563
  Martin Zagora
564
+ Masahiro MATAYOSHI
565
  Mason Malone
566
  Mateusz Paprocki
567
  Mathias Bynens
568
  mats cronqvist
569
+ Matt Diehl
570
  Matt Gaide
571
  Matthew Bauer
572
  Matthew Beale
597
  Metatheos
598
  Micah Dubinko
599
  Michael
600
+ Michael Chirico
601
  Michael Goderbauer
602
  Michael Grey
603
  Michael Kaminsky
625
  misfo
626
  mkaminsky11
627
  mloginov
628
+ mlsad3
629
  Moritz Schubotz (physikerwelt)
630
  Moritz Schwörer
631
  Moshe Wajnberg
636
  Mu-An Chiou
637
  mzabuawala
638
  Narciso Jaramillo
639
+ nathanlesage
640
  Nathan Williams
641
  ndr
642
  Neil Anderson
663
  Nikolay Kostov
664
  nilp0inter
665
  Nils Knappmeier
666
+ Nina Pypchenko
667
  Nisarg Jhaveri
668
  nlwillia
669
  noragrossman
708
  peterkroon
709
  Peter Kroon
710
  Peter László
711
+ Phil DeJarnett
712
  Philipp A
713
  Philipp Markovics
714
  Philip Stadermann
715
  Pi Delport
716
  Pierre Gerold
717
  Pieter Ouwerkerk
718
+ Piyush
719
  Pontus Melke
720
  prasanthj
721
  Prasanth J
722
  Prayag Verma
723
  prendota
724
  Prendota
725
+ ps173
726
  Qiang Li
727
+ quiddity-wp
728
  Radek Piórkowski
729
  Rahul
730
  Rahul Anand
754
  robertop23
755
  Roberto Vidal
756
  Robert Plummer
757
+ Roman Frolov
758
  Roman Janusz
759
+ Rongjian Zhang
760
  Rrandom
761
  Rrrandom
762
  Ruslan Osmanov
787
  Scott Feeney
788
  Scott Goodhew
789
  Seb35
790
+ Sebastian Ślepowroński
791
  Sebastian Wilzbach
792
  Sebastian Zaha
793
  Seren D
808
  Siddhartha Gunti
809
  silverwind
810
  Simon Edwards
811
+ Simon Huber
812
  sinkuu
813
+ Slava Rozhnev
814
  snasa
815
  soliton4
816
  sonson
820
  Stanislav Oaserele
821
  stan-z
822
  Stas Kobzar
823
+ stasoid
824
  Stefan Borsje
825
  Steffen Beyer
826
  Steffen Bruchmann
829
  Stephen Lavelle
830
  Steve Champagne
831
  Steve Hoover
832
+ Steven Yung
833
  Steve O'Hara
834
  stockiNail
835
  stoskov
853
  thanasis
854
  TheHowl
855
  themrmax
856
+ Thiemo Kreuz
857
  think
858
  Thomas Brouard
859
  Thomas Dvornik
880
  Tom McLaughlin
881
  Tony Jian
882
  tophf
883
+ Torben Bundt
884
  Torgeir Thoresen
885
  totalamd
886
  Travis Heppe
919
  Wu Cheng-Han
920
  Xavier Mendez
921
  Yang Guo
922
+ Yash Singh
923
+ Yash-Singh1
924
  Yassin N. Hassan
925
  YNH Webdev
926
  yoongu
inc/lib/codemirror/CHANGELOG.md CHANGED
@@ -1,3 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ## 5.58.1 (2020-09-23)
2
 
3
  ### Bug fixes
@@ -190,7 +322,7 @@ Make Shift-Delete to cut work on Firefox.
190
 
191
  [handlebars mode](https://codemirror.net/mode/handlebars/): Fix triple-brace support.
192
 
193
- [searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Support mathing `$` in reverse regexp search.
194
 
195
  [panel addon](https://codemirror.net/doc/manual.html#addon_panel): Don't get confused by changing panel sizes.
196
 
@@ -446,7 +578,7 @@ Add `hintWords` (basic completion) helper to [clojure](https://codemirror.net/mo
446
 
447
  [panel addon](https://codemirror.net/doc/manual.html#addon_panel): Fix problem where replacing the last remaining panel dropped the newly added panel.
448
 
449
- [hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Fix an infinite loop when the indention is greater than the target column.
450
 
451
  [jinja2](https://codemirror.net/mode/jinja2/) and [markdown](https://codemirror.net/mode/markdown/) modes: Add comment metadata.
452
 
@@ -834,7 +966,7 @@ Add `role=presentation` to more DOM elements to improve screen reader support.
834
 
835
  [merge addon](https://codemirror.net/doc/manual.html#addon_merge): Make aligning of unchanged chunks more robust.
836
 
837
- [comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix comment-toggling on a block of text that starts and ends in a (differnet) block comment.
838
 
839
  [javascript mode](https://codemirror.net/mode/javascript/): Improve support for TypeScript syntax.
840
 
@@ -952,7 +1084,7 @@ New event: [`optionChange`](https://codemirror.net/doc/manual.html#event_optionC
952
 
953
  Tapping/clicking the editor in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle) on Chrome now puts the cursor at the tapped position.
954
 
955
- Fix various crashes and misbehaviors when reading composition events in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle).
956
 
957
  Catches and ignores an IE 'Unspecified Error' when creating an editor in an iframe before there is a `<body>`.
958
 
@@ -1287,7 +1419,7 @@ Fix a [bug](https://github.com/codemirror/CodeMirror/issues/3834) that caused ph
1287
  * New modes: [Vue](https://codemirror.net/mode/vue/index.html), [Oz](https://codemirror.net/mode/oz/index.html), [MscGen](https://codemirror.net/mode/mscgen/index.html) (and dialects), [Closure Stylesheets](https://codemirror.net/mode/css/gss.html)
1288
  * Implement [CommonMark](http://commonmark.org)-style flexible list indent and cross-line code spans in [Markdown](https://codemirror.net/mode/markdown/index.html) mode
1289
  * Add a replace-all button to the [search addon](https://codemirror.net/doc/manual.html#addon_search), and make the persistent search dialog transparent when it obscures the match
1290
- * Handle `acync`/`await` and ocal and binary numbers in [JavaScript mode](https://codemirror.net/mode/javascript/index.html)
1291
  * Fix various issues with the [Haxe mode](https://codemirror.net/mode/haxe/index.html)
1292
  * Make the [closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets) select only the wrapped text when wrapping selection in brackets
1293
  * Tokenize properties as properties in the [CoffeeScript mode](https://codemirror.net/mode/coffeescript/index.html)
@@ -1774,7 +1906,7 @@ Emergency fix for a bug where an editor with line wrapping on IE will break when
1774
  * Slightly incompatible API changes. Read [this](https://codemirror.net/doc/upgrade_v2.2.html).
1775
  * New approach to [binding](https://codemirror.net/doc/manual.html#option_extraKeys) keys, support for [custom bindings](https://codemirror.net/doc/manual.html#option_keyMap).
1776
  * Support for overwrite (insert).
1777
- * [Custom-width](https://codemirror.net/doc/manual.html#option_tabSize) and [stylable](https://codemirror.net/demo/visibletabs.html) tabs.
1778
  * Moved more code into [add-on scripts](https://codemirror.net/doc/manual.html#addons).
1779
  * Support for sane vertical cursor movement in wrapped lines.
1780
  * More reliable handling of editing [marked text](https://codemirror.net/doc/manual.html#markText).
@@ -1788,7 +1920,7 @@ Fixes `TextMarker.clear`, which is broken in 2.17.
1788
  ## 2.17.0 (2011-11-21)
1789
 
1790
  * Add support for [line wrapping](https://codemirror.net/doc/manual.html#option_lineWrapping) and [code folding](https://codemirror.net/doc/manual.html#hideLine).
1791
- * Add [Github-style Markdown](https://codemirror.net/mode/gfm/index.html) mode.
1792
  * Add [Monokai](https://codemirror.net/theme/monokai.css) and [Rubyblue](https://codemirror.net/theme/rubyblue.css) themes.
1793
  * Add [`setBookmark`](https://codemirror.net/doc/manual.html#setBookmark) method.
1794
  * Move some of the demo code into reusable components under [`lib/util`](https://codemirror.net/addon/).
1
+ ## 5.62.0 (2021-06-21)
2
+
3
+ ### Bug fixes
4
+
5
+ Improve support for vim-style cursors in a number of themes.
6
+
7
+ ### New features
8
+
9
+ [lint addon](https://codemirror.net/doc/manual.html#addon_lint): Add support for highlighting lines with errors or warnings.
10
+
11
+ ## 5.61.1 (2021-05-20)
12
+
13
+ ### Bug fixes
14
+
15
+ Fix a bug where changing the editor's document could confuse text-direction management.
16
+
17
+ Fix a bug in horizontally scrolling the cursor into view.
18
+
19
+ Optimize adding lots of marks in a single transaction.
20
+
21
+ [simple mode addon](https://codemirror.net/demo/simplemode.html): Support regexps with a unicode flag.
22
+
23
+ [javascript mode](https://codemirror.net/mode/javascript/index.html): Add support for TypeScript template string types, improve integration with JSX mode.
24
+
25
+ ## 5.61.0 (2021-04-20)
26
+
27
+ ### Bug fixes
28
+
29
+ Improve support for being in a shadow DOM in contenteditable mode.
30
+
31
+ Prevent line number from being read by screen readers.
32
+
33
+ [show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Fix a crash caused by a race condition.
34
+
35
+ [javascript mode](https://codemirror.net/mode/javascript/): Improve scope tracking.
36
+
37
+ ### New features
38
+
39
+ The library now emits an `"updateGutter"` event when the gutter width changes.
40
+
41
+ [emacs bindings](https://codemirror.net/demo/emacs.html): Provide named commands for all bindings.
42
+
43
+ ## 5.60.0 (2021-03-20)
44
+
45
+ ### Bug fixes
46
+
47
+ Fix autofocus feature in contenteditable mode.
48
+
49
+ [simple mode addon](https://codemirror.net/demo/simplemode.html): Fix a null-dereference crash.
50
+
51
+ [multiplex addon](https://codemirror.net/demo/multiplex.html): Make it possible to use `parseDelimiters` when both delimiters are the same.
52
+
53
+ [julia mode](https://codemirror.net/mode/julia/): Fix a lockup bug.
54
+
55
+ ### New features
56
+
57
+ `setSelections` now allows ranges to omit the `head` property when it is equal to `anchor`.
58
+
59
+ [sublime bindings](https://codemirror.net/demo/sublime.html): Add support for reverse line sorting.
60
+
61
+ ## 5.59.4 (2021-02-24)
62
+
63
+ ### Bug fixes
64
+
65
+ Give the scrollbar corner filler a background again, to prevent content from peeping through between the scrollbars.
66
+
67
+ ## 5.59.3 (2021-02-20)
68
+
69
+ ### Bug fixes
70
+
71
+ Don't override the way zero-with non-joiners are rendered.
72
+
73
+ Fix an issue where resetting the history cleared the `undoDepth` option's value.
74
+
75
+ [vim bindings](https://codemirror.net/demo/vim.html): Fix substitute command when joining and splitting lines, fix global command when line number change, add support for `:vglobal`, properly treat caps lock as a modifier key.
76
+
77
+ ## 5.59.2 (2021-01-20)
78
+
79
+ ### Bug fixes
80
+
81
+ Don't try to scroll the selection into view in `readonly: "nocursor"` mode.
82
+
83
+ [closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Fix a regression in the behavior of pressing enter between brackets.
84
+
85
+ [javascript mode](https://codemirror.net/mode/javascript/): Fix an infinite loop on specific syntax errors in object types.
86
+
87
+ various modes: Fix inefficient RegExp matching.
88
+
89
+ ## 5.59.1 (2020-12-31)
90
+
91
+ ### Bug fixes
92
+
93
+ Fix an issue where some Chrome browsers were detected as iOS.
94
+
95
+ ## 5.59.0 (2020-12-20)
96
+
97
+ ### Bug fixes
98
+
99
+ Fix platform detection on recent iPadOS.
100
+
101
+ [lint addon](https://codemirror.net/doc/manual.html#addon_lint): Don't show duplicate messages for a given line.
102
+
103
+ [clojure mode](https://codemirror.net/mode/clojure/index.html): Fix regexp that matched in exponential time for some inputs.
104
+
105
+ [hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Improve handling of words that are longer than the line length.
106
+
107
+ [matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Fix leaked event handler on disabling the addon.
108
+
109
+ ### New features
110
+
111
+ [search addon](https://codemirror.net/demo/search.html): Make it possible to configure the search addon to show the dialog at the bottom of the editor.
112
+
113
+ ## 5.58.3 (2020-11-19)
114
+
115
+ ### Bug fixes
116
+
117
+ Suppress quick-firing of blur-focus events when dragging and clicking on Internet Explorer.
118
+
119
+ Fix the `insertAt` option to `addLineWidget` to actually allow the widget to be placed after all widgets for the line.
120
+
121
+ [soy mode](https://codemirror.net/mode/soy/): Support `@Attribute` and element composition.
122
+
123
+ [shell mode](https://codemirror.net/mode/shell/): Support heredoc quoting.
124
+
125
+ ## 5.58.2 (2020-10-23)
126
+
127
+ ### Bug fixes
128
+
129
+ Fix a bug where horizontally scrolling the cursor into view sometimes failed with a non-fixed gutter.
130
+
131
+ [julia mode](https://codemirror.net/mode/julia/): Fix an infinite recursion bug.
132
+
133
  ## 5.58.1 (2020-09-23)
134
 
135
  ### Bug fixes
322
 
323
  [handlebars mode](https://codemirror.net/mode/handlebars/): Fix triple-brace support.
324
 
325
+ [searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Support matching `$` in reverse regexp search.
326
 
327
  [panel addon](https://codemirror.net/doc/manual.html#addon_panel): Don't get confused by changing panel sizes.
328
 
578
 
579
  [panel addon](https://codemirror.net/doc/manual.html#addon_panel): Fix problem where replacing the last remaining panel dropped the newly added panel.
580
 
581
+ [hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Fix an infinite loop when the indentation is greater than the target column.
582
 
583
  [jinja2](https://codemirror.net/mode/jinja2/) and [markdown](https://codemirror.net/mode/markdown/) modes: Add comment metadata.
584
 
966
 
967
  [merge addon](https://codemirror.net/doc/manual.html#addon_merge): Make aligning of unchanged chunks more robust.
968
 
969
+ [comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix comment-toggling on a block of text that starts and ends in a (different) block comment.
970
 
971
  [javascript mode](https://codemirror.net/mode/javascript/): Improve support for TypeScript syntax.
972
 
1084
 
1085
  Tapping/clicking the editor in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle) on Chrome now puts the cursor at the tapped position.
1086
 
1087
+ Fix various crashes and misbehavior when reading composition events in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle).
1088
 
1089
  Catches and ignores an IE 'Unspecified Error' when creating an editor in an iframe before there is a `<body>`.
1090
 
1419
  * New modes: [Vue](https://codemirror.net/mode/vue/index.html), [Oz](https://codemirror.net/mode/oz/index.html), [MscGen](https://codemirror.net/mode/mscgen/index.html) (and dialects), [Closure Stylesheets](https://codemirror.net/mode/css/gss.html)
1420
  * Implement [CommonMark](http://commonmark.org)-style flexible list indent and cross-line code spans in [Markdown](https://codemirror.net/mode/markdown/index.html) mode
1421
  * Add a replace-all button to the [search addon](https://codemirror.net/doc/manual.html#addon_search), and make the persistent search dialog transparent when it obscures the match
1422
+ * Handle `async`/`await` and ocal and binary numbers in [JavaScript mode](https://codemirror.net/mode/javascript/index.html)
1423
  * Fix various issues with the [Haxe mode](https://codemirror.net/mode/haxe/index.html)
1424
  * Make the [closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets) select only the wrapped text when wrapping selection in brackets
1425
  * Tokenize properties as properties in the [CoffeeScript mode](https://codemirror.net/mode/coffeescript/index.html)
1906
  * Slightly incompatible API changes. Read [this](https://codemirror.net/doc/upgrade_v2.2.html).
1907
  * New approach to [binding](https://codemirror.net/doc/manual.html#option_extraKeys) keys, support for [custom bindings](https://codemirror.net/doc/manual.html#option_keyMap).
1908
  * Support for overwrite (insert).
1909
+ * [Custom-width](https://codemirror.net/doc/manual.html#option_tabSize) and [styleable](https://codemirror.net/demo/visibletabs.html) tabs.
1910
  * Moved more code into [add-on scripts](https://codemirror.net/doc/manual.html#addons).
1911
  * Support for sane vertical cursor movement in wrapped lines.
1912
  * More reliable handling of editing [marked text](https://codemirror.net/doc/manual.html#markText).
1920
  ## 2.17.0 (2011-11-21)
1921
 
1922
  * Add support for [line wrapping](https://codemirror.net/doc/manual.html#option_lineWrapping) and [code folding](https://codemirror.net/doc/manual.html#hideLine).
1923
+ * Add [GitHub-style Markdown](https://codemirror.net/mode/gfm/index.html) mode.
1924
  * Add [Monokai](https://codemirror.net/theme/monokai.css) and [Rubyblue](https://codemirror.net/theme/rubyblue.css) themes.
1925
  * Add [`setBookmark`](https://codemirror.net/doc/manual.html#setBookmark) method.
1926
  * Move some of the demo code into reusable components under [`lib/util`](https://codemirror.net/addon/).
inc/lib/codemirror/README.md CHANGED
@@ -1,8 +1,7 @@
1
  # CodeMirror
2
 
3
- [![Build Status](https://travis-ci.org/codemirror/CodeMirror.svg)](https://travis-ci.org/codemirror/CodeMirror)
4
  [![NPM version](https://img.shields.io/npm/v/codemirror.svg)](https://www.npmjs.org/package/codemirror)
5
- [![Join the chat at https://gitter.im/codemirror/CodeMirror](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/codemirror/CodeMirror)
6
 
7
  CodeMirror is a versatile text editor implemented in JavaScript for
8
  the browser. It is specialized for editing code, and comes with over
1
  # CodeMirror
2
 
3
+ [![Build Status](https://github.com/codemirror/codemirror/workflows/main/badge.svg)](https://github.com/codemirror/codemirror/actions)
4
  [![NPM version](https://img.shields.io/npm/v/codemirror.svg)](https://www.npmjs.org/package/codemirror)
 
5
 
6
  CodeMirror is a versatile text editor implemented in JavaScript for
7
  the browser. It is specialized for editing code, and comes with over
inc/lib/codemirror/addon/display/placeholder.js CHANGED
@@ -50,11 +50,12 @@
50
 
51
  function onComposition(cm) {
52
  setTimeout(function() {
53
- var empty = false, input = cm.getInputField()
54
- if (input.nodeName == "TEXTAREA")
55
- empty = !input.value
56
- else if (cm.lineCount() == 1)
57
- empty = !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
 
58
  if (empty) setPlaceholder(cm)
59
  else clearPlaceholder(cm)
60
  }, 20)
50
 
51
  function onComposition(cm) {
52
  setTimeout(function() {
53
+ var empty = false
54
+ if (cm.lineCount() == 1) {
55
+ var input = cm.getInputField()
56
+ empty = input.nodeName == "TEXTAREA" ? !cm.getLine(0).length
57
+ : !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
58
+ }
59
  if (empty) setPlaceholder(cm)
60
  else clearPlaceholder(cm)
61
  }, 20)
inc/lib/codemirror/lib/codemirror.js CHANGED
@@ -32,7 +32,7 @@
32
  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
33
  var phantom = /PhantomJS/.test(userAgent);
34
 
35
- var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
36
  var android = /Android/.test(userAgent);
37
  // This is woefully incomplete. Suggestions for alternative methods welcome.
38
  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
@@ -1311,6 +1311,7 @@
1311
  if (span.marker == marker) { return span }
1312
  } }
1313
  }
 
1314
  // Remove a span from an array, returning undefined if no spans are
1315
  // left (we don't store arrays for lines without spans).
1316
  function removeMarkedSpan(spans, span) {
@@ -1319,9 +1320,16 @@
1319
  { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
1320
  return r
1321
  }
 
1322
  // Add a span to a line.
1323
- function addMarkedSpan(line, span) {
1324
- line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
 
 
 
 
 
 
1325
  span.marker.attachLine(line);
1326
  }
1327
 
@@ -2186,6 +2194,7 @@
2186
  if (cm.options.lineNumbers || markers) {
2187
  var wrap$1 = ensureLineWrapped(lineView);
2188
  var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
 
2189
  cm.display.input.setUneditable(gutterWrap);
2190
  wrap$1.insertBefore(gutterWrap, lineView.text);
2191
  if (lineView.line.gutterClass)
@@ -3285,19 +3294,22 @@
3285
  }
3286
 
3287
  function ensureFocus(cm) {
3288
- if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
 
 
 
3289
  }
3290
 
3291
  function delayBlurEvent(cm) {
3292
  cm.state.delayingBlurEvent = true;
3293
  setTimeout(function () { if (cm.state.delayingBlurEvent) {
3294
  cm.state.delayingBlurEvent = false;
3295
- onBlur(cm);
3296
  } }, 100);
3297
  }
3298
 
3299
  function onFocus(cm, e) {
3300
- if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; }
3301
 
3302
  if (cm.options.readOnly == "nocursor") { return }
3303
  if (!cm.state.focused) {
@@ -3427,8 +3439,8 @@
3427
  // Set pos and end to the cursor positions around the character pos sticks to
3428
  // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch
3429
  // If pos == Pos(_, 0, "before"), pos and end are unchanged
3430
- pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos;
3431
  end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos;
 
3432
  }
3433
  for (var limit = 0; limit < 5; limit++) {
3434
  var changed = false;
@@ -3479,14 +3491,15 @@
3479
  if (newTop != screentop) { result.scrollTop = newTop; }
3480
  }
3481
 
3482
- var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
3483
- var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);
 
3484
  var tooWide = rect.right - rect.left > screenw;
3485
  if (tooWide) { rect.right = rect.left + screenw; }
3486
  if (rect.left < 10)
3487
  { result.scrollLeft = 0; }
3488
  else if (rect.left < screenleft)
3489
- { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); }
3490
  else if (rect.right > screenw + screenleft - 3)
3491
  { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }
3492
  return result
@@ -3778,7 +3791,8 @@
3778
  scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
3779
  scrollToPos: null, // Used to scroll to a specific position
3780
  focus: false,
3781
- id: ++nextOpId // Unique ID
 
3782
  };
3783
  pushOperation(cm.curOp);
3784
  }
@@ -4231,6 +4245,8 @@
4231
  function updateGutterSpace(display) {
4232
  var width = display.gutters.offsetWidth;
4233
  display.sizer.style.marginLeft = width + "px";
 
 
4234
  }
4235
 
4236
  function setDocumentHeight(cm, measure) {
@@ -4778,6 +4794,7 @@
4778
  estimateLineHeights(cm);
4779
  loadMode(cm);
4780
  setDirectionClass(cm);
 
4781
  if (!cm.options.lineWrapping) { findMaxLine(cm); }
4782
  cm.options.mode = doc.modeOption;
4783
  regChange(cm);
@@ -4794,19 +4811,19 @@
4794
  });
4795
  }
4796
 
4797
- function History(startGen) {
4798
  // Arrays of change events and selections. Doing something adds an
4799
  // event to done and clears undo. Undoing moves events from done
4800
  // to undone, redoing moves them in the other direction.
4801
  this.done = []; this.undone = [];
4802
- this.undoDepth = Infinity;
4803
  // Used to track when changes can be merged into a single undo
4804
  // event
4805
  this.lastModTime = this.lastSelTime = 0;
4806
  this.lastOp = this.lastSelOp = null;
4807
  this.lastOrigin = this.lastSelOrigin = null;
4808
  // Used by the isClean() method
4809
- this.generation = this.maxGeneration = startGen || 1;
4810
  }
4811
 
4812
  // Create a history change event from an updateDoc-style change
@@ -5111,7 +5128,7 @@
5111
  (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
5112
  setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
5113
 
5114
- if (!(options && options.scroll === false) && doc.cm)
5115
  { ensureCursorVisible(doc.cm); }
5116
  }
5117
 
@@ -5768,7 +5785,7 @@
5768
  changeLine(doc, handle, "widget", function (line) {
5769
  var widgets = line.widgets || (line.widgets = []);
5770
  if (widget.insertAt == null) { widgets.push(widget); }
5771
- else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); }
5772
  widget.line = line;
5773
  if (cm && !lineIsHidden(doc, line)) {
5774
  var aboveVisible = heightAtLine(line) < doc.scrollTop;
@@ -5954,7 +5971,7 @@
5954
  if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }
5955
  addMarkedSpan(line, new MarkedSpan(marker,
5956
  curLine == from.line ? from.ch : null,
5957
- curLine == to.line ? to.ch : null));
5958
  ++curLine;
5959
  });
5960
  // lineIsHidden depends on the presence of the spans, so needs a second pass
@@ -6126,6 +6143,7 @@
6126
  getRange: function(from, to, lineSep) {
6127
  var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
6128
  if (lineSep === false) { return lines }
 
6129
  return lines.join(lineSep || this.lineSeparator())
6130
  },
6131
 
@@ -6177,7 +6195,7 @@
6177
  var out = [];
6178
  for (var i = 0; i < ranges.length; i++)
6179
  { out[i] = new Range(clipPos(this, ranges[i].anchor),
6180
- clipPos(this, ranges[i].head)); }
6181
  if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
6182
  setSelection(this, normalizeSelection(this.cm, out, primary), options);
6183
  }),
@@ -6240,7 +6258,7 @@
6240
  clearHistory: function() {
6241
  var this$1 = this;
6242
 
6243
- this.history = new History(this.history.maxGeneration);
6244
  linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);
6245
  },
6246
 
@@ -6261,7 +6279,7 @@
6261
  undone: copyHistoryArray(this.history.undone)}
6262
  },
6263
  setHistory: function(histData) {
6264
- var hist = this.history = new History(this.history.maxGeneration);
6265
  hist.done = copyHistoryArray(histData.done.slice(0), null, true);
6266
  hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
6267
  },
@@ -6680,10 +6698,9 @@
6680
  // Very basic readline/emacs-style bindings, which are standard on Mac.
6681
  keyMap.emacsy = {
6682
  "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
6683
- "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
6684
- "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
6685
- "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
6686
- "Ctrl-O": "openLine"
6687
  };
6688
  keyMap.macDefault = {
6689
  "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
@@ -7377,6 +7394,10 @@
7377
  var dragEnd = operation(cm, function (e) {
7378
  if (webkit) { display.scroller.draggable = false; }
7379
  cm.state.draggingText = false;
 
 
 
 
7380
  off(display.wrapper.ownerDocument, "mouseup", dragEnd);
7381
  off(display.wrapper.ownerDocument, "mousemove", mouseMove);
7382
  off(display.scroller, "dragstart", dragStart);
@@ -7400,15 +7421,15 @@
7400
  if (webkit) { display.scroller.draggable = true; }
7401
  cm.state.draggingText = dragEnd;
7402
  dragEnd.copy = !behavior.moveOnDrag;
7403
- // IE's approach to draggable
7404
- if (display.scroller.dragDrop) { display.scroller.dragDrop(); }
7405
  on(display.wrapper.ownerDocument, "mouseup", dragEnd);
7406
  on(display.wrapper.ownerDocument, "mousemove", mouseMove);
7407
  on(display.scroller, "dragstart", dragStart);
7408
  on(display.scroller, "drop", dragEnd);
7409
 
7410
- delayBlurEvent(cm);
7411
  setTimeout(function () { return display.input.focus(); }, 20);
 
 
7412
  }
7413
 
7414
  function rangeForUnit(cm, pos, unit) {
@@ -7421,6 +7442,7 @@
7421
 
7422
  // Normal selection, as opposed to text dragging.
7423
  function leftButtonSelect(cm, event, start, behavior) {
 
7424
  var display = cm.display, doc = cm.doc;
7425
  e_preventDefault(event);
7426
 
@@ -7699,7 +7721,7 @@
7699
  for (var i = newBreaks.length - 1; i >= 0; i--)
7700
  { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }
7701
  });
7702
- option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) {
7703
  cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
7704
  if (old != Init) { cm.refresh(); }
7705
  });
@@ -8666,10 +8688,13 @@
8666
  function moveOnce(boundToLine) {
8667
  var next;
8668
  if (unit == "codepoint") {
8669
- var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1));
8670
- if (isNaN(ch)) { next = null; }
8671
- else { next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))),
8672
- -dir); }
 
 
 
8673
  } else if (visually) {
8674
  next = moveVisually(doc.cm, lineObj, pos, dir);
8675
  } else {
@@ -8754,6 +8779,7 @@
8754
 
8755
  var input = this, cm = input.cm;
8756
  var div = input.div = display.lineDiv;
 
8757
  disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);
8758
 
8759
  function belongsToInput(e) {
@@ -8820,7 +8846,7 @@
8820
  var kludge = hiddenTextarea(), te = kludge.firstChild;
8821
  cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
8822
  te.value = lastCopied.text.join("\n");
8823
- var hadFocus = document.activeElement;
8824
  selectInput(te);
8825
  setTimeout(function () {
8826
  cm.display.lineSpace.removeChild(kludge);
@@ -8843,7 +8869,7 @@
8843
 
8844
  ContentEditableInput.prototype.prepareSelection = function () {
8845
  var result = prepareSelection(this.cm, false);
8846
- result.focus = document.activeElement == this.div;
8847
  return result
8848
  };
8849
 
@@ -8939,7 +8965,7 @@
8939
 
8940
  ContentEditableInput.prototype.focus = function () {
8941
  if (this.cm.options.readOnly != "nocursor") {
8942
- if (!this.selectionInEditor() || document.activeElement != this.div)
8943
  { this.showSelection(this.prepareSelection(), true); }
8944
  this.div.focus();
8945
  }
@@ -9781,7 +9807,7 @@
9781
 
9782
  addLegacyProps(CodeMirror);
9783
 
9784
- CodeMirror.version = "5.58.1";
9785
 
9786
  return CodeMirror;
9787
 
32
  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
33
  var phantom = /PhantomJS/.test(userAgent);
34
 
35
+ var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2);
36
  var android = /Android/.test(userAgent);
37
  // This is woefully incomplete. Suggestions for alternative methods welcome.
38
  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
1311
  if (span.marker == marker) { return span }
1312
  } }
1313
  }
1314
+
1315
  // Remove a span from an array, returning undefined if no spans are
1316
  // left (we don't store arrays for lines without spans).
1317
  function removeMarkedSpan(spans, span) {
1320
  { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
1321
  return r
1322
  }
1323
+
1324
  // Add a span to a line.
1325
+ function addMarkedSpan(line, span, op) {
1326
+ var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet));
1327
+ if (inThisOp && inThisOp.has(line.markedSpans)) {
1328
+ line.markedSpans.push(span);
1329
+ } else {
1330
+ line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
1331
+ if (inThisOp) { inThisOp.add(line.markedSpans); }
1332
+ }
1333
  span.marker.attachLine(line);
1334
  }
1335
 
2194
  if (cm.options.lineNumbers || markers) {
2195
  var wrap$1 = ensureLineWrapped(lineView);
2196
  var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
2197
+ gutterWrap.setAttribute("aria-hidden", "true");
2198
  cm.display.input.setUneditable(gutterWrap);
2199
  wrap$1.insertBefore(gutterWrap, lineView.text);
2200
  if (lineView.line.gutterClass)
3294
  }
3295
 
3296
  function ensureFocus(cm) {
3297
+ if (!cm.hasFocus()) {
3298
+ cm.display.input.focus();
3299
+ if (!cm.state.focused) { onFocus(cm); }
3300
+ }
3301
  }
3302
 
3303
  function delayBlurEvent(cm) {
3304
  cm.state.delayingBlurEvent = true;
3305
  setTimeout(function () { if (cm.state.delayingBlurEvent) {
3306
  cm.state.delayingBlurEvent = false;
3307
+ if (cm.state.focused) { onBlur(cm); }
3308
  } }, 100);
3309
  }
3310
 
3311
  function onFocus(cm, e) {
3312
+ if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }
3313
 
3314
  if (cm.options.readOnly == "nocursor") { return }
3315
  if (!cm.state.focused) {
3439
  // Set pos and end to the cursor positions around the character pos sticks to
3440
  // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch
3441
  // If pos == Pos(_, 0, "before"), pos and end are unchanged
 
3442
  end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos;
3443
+ pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos;
3444
  }
3445
  for (var limit = 0; limit < 5; limit++) {
3446
  var changed = false;
3491
  if (newTop != screentop) { result.scrollTop = newTop; }
3492
  }
3493
 
3494
+ var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;
3495
+ var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;
3496
+ var screenw = displayWidth(cm) - display.gutters.offsetWidth;
3497
  var tooWide = rect.right - rect.left > screenw;
3498
  if (tooWide) { rect.right = rect.left + screenw; }
3499
  if (rect.left < 10)
3500
  { result.scrollLeft = 0; }
3501
  else if (rect.left < screenleft)
3502
+ { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }
3503
  else if (rect.right > screenw + screenleft - 3)
3504
  { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }
3505
  return result
3791
  scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
3792
  scrollToPos: null, // Used to scroll to a specific position
3793
  focus: false,
3794
+ id: ++nextOpId, // Unique ID
3795
+ markArrays: null // Used by addMarkedSpan
3796
  };
3797
  pushOperation(cm.curOp);
3798
  }
4245
  function updateGutterSpace(display) {
4246
  var width = display.gutters.offsetWidth;
4247
  display.sizer.style.marginLeft = width + "px";
4248
+ // Send an event to consumers responding to changes in gutter width.
4249
+ signalLater(display, "gutterChanged", display);
4250
  }
4251
 
4252
  function setDocumentHeight(cm, measure) {
4794
  estimateLineHeights(cm);
4795
  loadMode(cm);
4796
  setDirectionClass(cm);
4797
+ cm.options.direction = doc.direction;
4798
  if (!cm.options.lineWrapping) { findMaxLine(cm); }
4799
  cm.options.mode = doc.modeOption;
4800
  regChange(cm);
4811
  });
4812
  }
4813
 
4814
+ function History(prev) {
4815
  // Arrays of change events and selections. Doing something adds an
4816
  // event to done and clears undo. Undoing moves events from done
4817
  // to undone, redoing moves them in the other direction.
4818
  this.done = []; this.undone = [];
4819
+ this.undoDepth = prev ? prev.undoDepth : Infinity;
4820
  // Used to track when changes can be merged into a single undo
4821
  // event
4822
  this.lastModTime = this.lastSelTime = 0;
4823
  this.lastOp = this.lastSelOp = null;
4824
  this.lastOrigin = this.lastSelOrigin = null;
4825
  // Used by the isClean() method
4826
+ this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;
4827
  }
4828
 
4829
  // Create a history change event from an updateDoc-style change
5128
  (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
5129
  setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
5130
 
5131
+ if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor")
5132
  { ensureCursorVisible(doc.cm); }
5133
  }
5134
 
5785
  changeLine(doc, handle, "widget", function (line) {
5786
  var widgets = line.widgets || (line.widgets = []);
5787
  if (widget.insertAt == null) { widgets.push(widget); }
5788
+ else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }
5789
  widget.line = line;
5790
  if (cm && !lineIsHidden(doc, line)) {
5791
  var aboveVisible = heightAtLine(line) < doc.scrollTop;
5971
  if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }
5972
  addMarkedSpan(line, new MarkedSpan(marker,
5973
  curLine == from.line ? from.ch : null,
5974
+ curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp);
5975
  ++curLine;
5976
  });
5977
  // lineIsHidden depends on the presence of the spans, so needs a second pass
6143
  getRange: function(from, to, lineSep) {
6144
  var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
6145
  if (lineSep === false) { return lines }
6146
+ if (lineSep === '') { return lines.join('') }
6147
  return lines.join(lineSep || this.lineSeparator())
6148
  },
6149
 
6195
  var out = [];
6196
  for (var i = 0; i < ranges.length; i++)
6197
  { out[i] = new Range(clipPos(this, ranges[i].anchor),
6198
+ clipPos(this, ranges[i].head || ranges[i].anchor)); }
6199
  if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
6200
  setSelection(this, normalizeSelection(this.cm, out, primary), options);
6201
  }),
6258
  clearHistory: function() {
6259
  var this$1 = this;
6260
 
6261
+ this.history = new History(this.history);
6262
  linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);
6263
  },
6264
 
6279
  undone: copyHistoryArray(this.history.undone)}
6280
  },
6281
  setHistory: function(histData) {
6282
+ var hist = this.history = new History(this.history);
6283
  hist.done = copyHistoryArray(histData.done.slice(0), null, true);
6284
  hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
6285
  },
6698
  // Very basic readline/emacs-style bindings, which are standard on Mac.
6699
  keyMap.emacsy = {
6700
  "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
6701
+ "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp",
6702
+ "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine",
6703
+ "Ctrl-T": "transposeChars", "Ctrl-O": "openLine"
 
6704
  };
6705
  keyMap.macDefault = {
6706
  "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
7394
  var dragEnd = operation(cm, function (e) {
7395
  if (webkit) { display.scroller.draggable = false; }
7396
  cm.state.draggingText = false;
7397
+ if (cm.state.delayingBlurEvent) {
7398
+ if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }
7399
+ else { delayBlurEvent(cm); }
7400
+ }
7401
  off(display.wrapper.ownerDocument, "mouseup", dragEnd);
7402
  off(display.wrapper.ownerDocument, "mousemove", mouseMove);
7403
  off(display.scroller, "dragstart", dragStart);
7421
  if (webkit) { display.scroller.draggable = true; }
7422
  cm.state.draggingText = dragEnd;
7423
  dragEnd.copy = !behavior.moveOnDrag;
 
 
7424
  on(display.wrapper.ownerDocument, "mouseup", dragEnd);
7425
  on(display.wrapper.ownerDocument, "mousemove", mouseMove);
7426
  on(display.scroller, "dragstart", dragStart);
7427
  on(display.scroller, "drop", dragEnd);
7428
 
7429
+ cm.state.delayingBlurEvent = true;
7430
  setTimeout(function () { return display.input.focus(); }, 20);
7431
+ // IE's approach to draggable
7432
+ if (display.scroller.dragDrop) { display.scroller.dragDrop(); }
7433
  }
7434
 
7435
  function rangeForUnit(cm, pos, unit) {
7442
 
7443
  // Normal selection, as opposed to text dragging.
7444
  function leftButtonSelect(cm, event, start, behavior) {
7445
+ if (ie) { delayBlurEvent(cm); }
7446
  var display = cm.display, doc = cm.doc;
7447
  e_preventDefault(event);
7448
 
7721
  for (var i = newBreaks.length - 1; i >= 0; i--)
7722
  { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }
7723
  });
7724
+ option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) {
7725
  cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
7726
  if (old != Init) { cm.refresh(); }
7727
  });
8688
  function moveOnce(boundToLine) {
8689
  var next;
8690
  if (unit == "codepoint") {
8691
+ var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));
8692
+ if (isNaN(ch)) {
8693
+ next = null;
8694
+ } else {
8695
+ var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;
8696
+ next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);
8697
+ }
8698
  } else if (visually) {
8699
  next = moveVisually(doc.cm, lineObj, pos, dir);
8700
  } else {
8779
 
8780
  var input = this, cm = input.cm;
8781
  var div = input.div = display.lineDiv;
8782
+ div.contentEditable = true;
8783
  disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);
8784
 
8785
  function belongsToInput(e) {
8846
  var kludge = hiddenTextarea(), te = kludge.firstChild;
8847
  cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
8848
  te.value = lastCopied.text.join("\n");
8849
+ var hadFocus = activeElt();
8850
  selectInput(te);
8851
  setTimeout(function () {
8852
  cm.display.lineSpace.removeChild(kludge);
8869
 
8870
  ContentEditableInput.prototype.prepareSelection = function () {
8871
  var result = prepareSelection(this.cm, false);
8872
+ result.focus = activeElt() == this.div;
8873
  return result
8874
  };
8875
 
8965
 
8966
  ContentEditableInput.prototype.focus = function () {
8967
  if (this.cm.options.readOnly != "nocursor") {
8968
+ if (!this.selectionInEditor() || activeElt() != this.div)
8969
  { this.showSelection(this.prepareSelection(), true); }
8970
  this.div.focus();
8971
  }
9807
 
9808
  addLegacyProps(CodeMirror);
9809
 
9810
+ CodeMirror.version = "5.62.0";
9811
 
9812
  return CodeMirror;
9813
 
inc/lib/codemirror/mode/css/css.js CHANGED
@@ -29,7 +29,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
29
  valueKeywords = parserConfig.valueKeywords || {},
30
  allowNested = parserConfig.allowNested,
31
  lineComment = parserConfig.lineComment,
32
- supportsAtComponent = parserConfig.supportsAtComponent === true;
 
33
 
34
  var type, override;
35
  function ret(style, tp) { type = tp; return style; }
@@ -77,8 +78,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
77
  return ret("qualifier", "qualifier");
78
  } else if (/[:;{}\[\]\(\)]/.test(ch)) {
79
  return ret(null, ch);
80
- } else if (stream.match(/[\w-.]+(?=\()/)) {
81
- if (/^(url(-prefix)?|domain|regexp)$/.test(stream.current().toLowerCase())) {
82
  state.tokenize = tokenParenthesized;
83
  }
84
  return ret("variable callee", "variable");
@@ -107,7 +108,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
107
 
108
  function tokenParenthesized(stream, state) {
109
  stream.next(); // Must be '('
110
- if (!stream.match(/\s*[\"\')]/, false))
111
  state.tokenize = tokenString(")");
112
  else
113
  state.tokenize = null;
@@ -197,7 +198,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
197
  override = "property";
198
  return "maybeprop";
199
  } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
200
- override = "string-2";
201
  return "maybeprop";
202
  } else if (allowNested) {
203
  override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag";
@@ -291,7 +292,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
291
  else if (propertyKeywords.hasOwnProperty(word))
292
  override = "property";
293
  else if (nonStandardPropertyKeywords.hasOwnProperty(word))
294
- override = "string-2";
295
  else if (valueKeywords.hasOwnProperty(word))
296
  override = "atom";
297
  else if (colorKeywords.hasOwnProperty(word))
@@ -780,7 +781,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
780
  }
781
  },
782
  ":": function(stream) {
783
- if (stream.match(/\s*\{/, false))
784
  return [null, null]
785
  return false;
786
  },
29
  valueKeywords = parserConfig.valueKeywords || {},
30
  allowNested = parserConfig.allowNested,
31
  lineComment = parserConfig.lineComment,
32
+ supportsAtComponent = parserConfig.supportsAtComponent === true,
33
+ highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false;
34
 
35
  var type, override;
36
  function ret(style, tp) { type = tp; return style; }
78
  return ret("qualifier", "qualifier");
79
  } else if (/[:;{}\[\]\(\)]/.test(ch)) {
80
  return ret(null, ch);
81
+ } else if (stream.match(/^[\w-.]+(?=\()/)) {
82
+ if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) {
83
  state.tokenize = tokenParenthesized;
84
  }
85
  return ret("variable callee", "variable");
108
 
109
  function tokenParenthesized(stream, state) {
110
  stream.next(); // Must be '('
111
+ if (!stream.match(/^\s*[\"\')]/, false))
112
  state.tokenize = tokenString(")");
113
  else
114
  state.tokenize = null;
198
  override = "property";
199
  return "maybeprop";
200
  } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
201
+ override = highlightNonStandardPropertyKeywords ? "string-2" : "property";
202
  return "maybeprop";
203
  } else if (allowNested) {
204
  override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag";
292
  else if (propertyKeywords.hasOwnProperty(word))
293
  override = "property";
294
  else if (nonStandardPropertyKeywords.hasOwnProperty(word))
295
+ override = highlightNonStandardPropertyKeywords ? "string-2" : "property";
296
  else if (valueKeywords.hasOwnProperty(word))
297
  override = "atom";
298
  else if (colorKeywords.hasOwnProperty(word))
781
  }
782
  },
783
  ":": function(stream) {
784
+ if (stream.match(/^\s*\{/, false))
785
  return [null, null]
786
  return false;
787
  },
inc/lib/codemirror/mode/css/index.html CHANGED
@@ -68,6 +68,12 @@ code {
68
  });
69
  </script>
70
 
 
 
 
 
 
 
71
  <p><strong>MIME types defined:</strong> <code>text/css</code>, <code>text/x-scss</code> (<a href="scss.html">demo</a>), <code>text/x-less</code> (<a href="less.html">demo</a>).</p>
72
 
73
  <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>, <a href="../../test/index.html#verbose,css_*">verbose</a>.</p>
68
  });
69
  </script>
70
 
71
+ <p>CSS mode supports this option:</p>
72
+ <d1>
73
+ <dt><code><strong>highlightNonStandardPropertyKeywords</strong>: boolean</code></dt>
74
+ <dd>Whether to highlight non-standard CSS property keywords such as <code>margin-inline</code> or <code>zoom</code> (default: <code>true</code>).</dd>
75
+ </d1>
76
+
77
  <p><strong>MIME types defined:</strong> <code>text/css</code>, <code>text/x-scss</code> (<a href="scss.html">demo</a>), <code>text/x-less</code> (<a href="less.html">demo</a>).</p>
78
 
79
  <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>, <a href="../../test/index.html#verbose,css_*">verbose</a>.</p>
inc/lib/codemirror/mode/htmlmixed/htmlmixed.js CHANGED
@@ -74,7 +74,8 @@
74
  name: "xml",
75
  htmlMode: true,
76
  multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,
77
- multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag
 
78
  });
79
 
80
  var tags = {};
74
  name: "xml",
75
  htmlMode: true,
76
  multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,
77
+ multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag,
78
+ allowMissingTagName: parserConfig.allowMissingTagName,
79
  });
80
 
81
  var tags = {};
inc/lib/codemirror/mode/index.html CHANGED
@@ -153,6 +153,7 @@ option.</p>
153
  <li><a href="vhdl/index.html">VHDL</a></li>
154
  <li><a href="vue/index.html">Vue.js app</a></li>
155
  <li><a href="webidl/index.html">Web IDL</a></li>
 
156
  <li><a href="xml/index.html">XML/HTML</a></li>
157
  <li><a href="xquery/index.html">XQuery</a></li>
158
  <li><a href="yacas/index.html">Yacas</a></li>
153
  <li><a href="vhdl/index.html">VHDL</a></li>
154
  <li><a href="vue/index.html">Vue.js app</a></li>
155
  <li><a href="webidl/index.html">Web IDL</a></li>
156
+ <li><a href="wast/index.html">WebAssembly Text Format</a></li>
157
  <li><a href="xml/index.html">XML/HTML</a></li>
158
  <li><a href="xquery/index.html">XQuery</a></li>
159
  <li><a href="yacas/index.html">Yacas</a></li>
inc/lib/codemirror/mode/javascript/index.html CHANGED
@@ -99,6 +99,10 @@ StringStream.prototype = {
99
  <li><code>typescript</code> which will activate additional
100
  syntax highlighting and some other things for TypeScript code
101
  (<a href="typescript.html">demo</a>).</li>
 
 
 
 
102
  <li><code>statementIndent</code> which (given a number) will
103
  determine the amount of indentation to use for statements
104
  continued on a new line.</li>
@@ -110,5 +114,5 @@ StringStream.prototype = {
110
  </ul>
111
  </p>
112
 
113
- <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>, <code>application/ld+json</code>, <code>text/typescript</code>, <code>application/typescript</code>.</p>
114
  </article>
99
  <li><code>typescript</code> which will activate additional
100
  syntax highlighting and some other things for TypeScript code
101
  (<a href="typescript.html">demo</a>).</li>
102
+ <li><code>trackScope</code> can be set to false to turn off
103
+ tracking of local variables. This will prevent locals from
104
+ getting the <code>"variable-2"</code> token type, and will
105
+ break completion of locals with javascript-hint.</li>
106
  <li><code>statementIndent</code> which (given a number) will
107
  determine the amount of indentation to use for statements
108
  continued on a new line.</li>
114
  </ul>
115
  </p>
116
 
117
+ <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/javascript</code>, <code>application/x-javascript</code>, <code>text/ecmascript</code>, <code>application/ecmascript</code>, <code>application/json</code>, <code>application/x-json</code>, <code>application/manifest+json</code>, <code>application/ld+json</code>, <code>text/typescript</code>, <code>application/typescript</code>.</p>
118
  </article>
inc/lib/codemirror/mode/javascript/javascript.js CHANGED
@@ -16,6 +16,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
16
  var statementIndent = parserConfig.statementIndent;
17
  var jsonldMode = parserConfig.jsonld;
18
  var jsonMode = parserConfig.json || jsonldMode;
 
19
  var isTS = parserConfig.typescript;
20
  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
21
 
@@ -126,7 +127,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
126
  var kw = keywords[word]
127
  return ret(kw.type, kw.style, word)
128
  }
129
- if (word == "async" && stream.match(/^(\s|\/\*.*?\*\/)*[\[\(\w]/, false))
130
  return ret("async", "keyword", word)
131
  }
132
  return ret("variable", "variable", word)
@@ -218,7 +219,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
218
 
219
  // Parser
220
 
221
- var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
 
222
 
223
  function JSLexical(indented, column, type, align, prev, info) {
224
  this.indented = indented;
@@ -230,6 +232,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
230
  }
231
 
232
  function inScope(state, varname) {
 
233
  for (var v = state.localVars; v; v = v.next)
234
  if (v.name == varname) return true;
235
  for (var cx = state.context; cx; cx = cx.prev) {
@@ -276,6 +279,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
276
  function register(varname) {
277
  var state = cx.state;
278
  cx.marked = "def";
 
279
  if (state.context) {
280
  if (state.lexical.info == "var" && state.context && state.context.block) {
281
  // FIXME function decls are also not block scoped
@@ -375,7 +379,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
375
  return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse);
376
  }
377
  if (type == "function") return cont(functiondef);
378
- if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
379
  if (type == "class" || (isTS && value == "interface")) {
380
  cx.marked = "keyword"
381
  return cont(pushlex("form", type == "class" ? type : value), className, poplex)
@@ -441,7 +445,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
441
  if (type == "{") return contCommasep(objprop, "}", null, maybeop);
442
  if (type == "quasi") return pass(quasi, maybeop);
443
  if (type == "new") return cont(maybeTarget(noComma));
444
- if (type == "import") return cont(expression);
445
  return cont();
446
  }
447
  function maybeexpression(type) {
@@ -479,7 +482,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
479
  function quasi(type, value) {
480
  if (type != "quasi") return pass();
481
  if (value.slice(value.length - 2) != "${") return cont(quasi);
482
- return cont(expression, continueQuasi);
483
  }
484
  function continueQuasi(type) {
485
  if (type == "}") {
@@ -605,7 +608,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
605
  }
606
  }
607
  function typeexpr(type, value) {
608
- if (value == "keyof" || value == "typeof" || value == "infer") {
609
  cx.marked = "keyword"
610
  return cont(value == "typeof" ? expressionNoComma : typeexpr)
611
  }
@@ -616,13 +619,19 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
616
  if (value == "|" || value == "&") return cont(typeexpr)
617
  if (type == "string" || type == "number" || type == "atom") return cont(afterType);
618
  if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType)
619
- if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
620
  if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType)
621
  if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr)
 
622
  }
623
  function maybeReturnType(type) {
624
  if (type == "=>") return cont(typeexpr)
625
  }
 
 
 
 
 
626
  function typeprop(type, value) {
627
  if (type == "variable" || cx.style == "keyword") {
628
  cx.marked = "property"
@@ -635,6 +644,20 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
635
  return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop)
636
  } else if (type == "(") {
637
  return pass(functiondecl, typeprop)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
638
  }
639
  }
640
  function typearg(type, value) {
@@ -776,6 +799,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
776
  if (value == "@") return cont(expression, classBody)
777
  }
778
  function classfield(type, value) {
 
779
  if (value == "?") return cont(classfield)
780
  if (type == ":") return cont(typeexpr, maybeAssign)
781
  if (value == "=") return cont(expressionNoComma)
@@ -795,6 +819,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
795
  function afterImport(type) {
796
  if (type == "string") return cont();
797
  if (type == "(") return pass(expression);
 
798
  return pass(importSpec, maybeMoreImports, maybeFrom);
799
  }
800
  function importSpec(type, value) {
@@ -868,14 +893,14 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
868
  },
869
 
870
  indent: function(state, textAfter) {
871
- if (state.tokenize == tokenComment) return CodeMirror.Pass;
872
  if (state.tokenize != tokenBase) return 0;
873
  var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top
874
  // Kludge to prevent 'maybelse' from blocking lexical scope pops
875
  if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
876
  var c = state.cc[i];
877
  if (c == poplex) lexical = lexical.prev;
878
- else if (c != maybeelse) break;
879
  }
880
  while ((lexical.type == "stat" || lexical.type == "form") &&
881
  (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) &&
@@ -912,8 +937,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
912
  expressionAllowed: expressionAllowed,
913
 
914
  skipExpression: function(state) {
915
- var top = state.cc[state.cc.length - 1]
916
- if (top == expression || top == expressionNoComma) state.cc.pop()
917
  }
918
  };
919
  });
@@ -925,9 +949,10 @@ CodeMirror.defineMIME("text/ecmascript", "javascript");
925
  CodeMirror.defineMIME("application/javascript", "javascript");
926
  CodeMirror.defineMIME("application/x-javascript", "javascript");
927
  CodeMirror.defineMIME("application/ecmascript", "javascript");
928
- CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
929
- CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
930
- CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
 
931
  CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
932
  CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
933
 
16
  var statementIndent = parserConfig.statementIndent;
17
  var jsonldMode = parserConfig.jsonld;
18
  var jsonMode = parserConfig.json || jsonldMode;
19
+ var trackScope = parserConfig.trackScope !== false
20
  var isTS = parserConfig.typescript;
21
  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
22
 
127
  var kw = keywords[word]
128
  return ret(kw.type, kw.style, word)
129
  }
130
+ if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false))
131
  return ret("async", "keyword", word)
132
  }
133
  return ret("variable", "variable", word)
219
 
220
  // Parser
221
 
222
+ var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true,
223
+ "regexp": true, "this": true, "import": true, "jsonld-keyword": true};
224
 
225
  function JSLexical(indented, column, type, align, prev, info) {
226
  this.indented = indented;
232
  }
233
 
234
  function inScope(state, varname) {
235
+ if (!trackScope) return false
236
  for (var v = state.localVars; v; v = v.next)
237
  if (v.name == varname) return true;
238
  for (var cx = state.context; cx; cx = cx.prev) {
279
  function register(varname) {
280
  var state = cx.state;
281
  cx.marked = "def";
282
+ if (!trackScope) return
283
  if (state.context) {
284
  if (state.lexical.info == "var" && state.context && state.context.block) {
285
  // FIXME function decls are also not block scoped
379
  return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse);
380
  }
381
  if (type == "function") return cont(functiondef);
382
+ if (type == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex);
383
  if (type == "class" || (isTS && value == "interface")) {
384
  cx.marked = "keyword"
385
  return cont(pushlex("form", type == "class" ? type : value), className, poplex)
445
  if (type == "{") return contCommasep(objprop, "}", null, maybeop);
446
  if (type == "quasi") return pass(quasi, maybeop);
447
  if (type == "new") return cont(maybeTarget(noComma));
 
448
  return cont();
449
  }
450
  function maybeexpression(type) {
482
  function quasi(type, value) {
483
  if (type != "quasi") return pass();
484
  if (value.slice(value.length - 2) != "${") return cont(quasi);
485
+ return cont(maybeexpression, continueQuasi);
486
  }
487
  function continueQuasi(type) {
488
  if (type == "}") {
608
  }
609
  }
610
  function typeexpr(type, value) {
611
+ if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") {
612
  cx.marked = "keyword"
613
  return cont(value == "typeof" ? expressionNoComma : typeexpr)
614
  }
619
  if (value == "|" || value == "&") return cont(typeexpr)
620
  if (type == "string" || type == "number" || type == "atom") return cont(afterType);
621
  if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType)
622
+ if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType)
623
  if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType)
624
  if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr)
625
+ if (type == "quasi") { return pass(quasiType, afterType); }
626
  }
627
  function maybeReturnType(type) {
628
  if (type == "=>") return cont(typeexpr)
629
  }
630
+ function typeprops(type) {
631
+ if (type.match(/[\}\)\]]/)) return cont()
632
+ if (type == "," || type == ";") return cont(typeprops)
633
+ return pass(typeprop, typeprops)
634
+ }
635
  function typeprop(type, value) {
636
  if (type == "variable" || cx.style == "keyword") {
637
  cx.marked = "property"
644
  return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop)
645
  } else if (type == "(") {
646
  return pass(functiondecl, typeprop)
647
+ } else if (!type.match(/[;\}\)\],]/)) {
648
+ return cont()
649
+ }
650
+ }
651
+ function quasiType(type, value) {
652
+ if (type != "quasi") return pass();
653
+ if (value.slice(value.length - 2) != "${") return cont(quasiType);
654
+ return cont(typeexpr, continueQuasiType);
655
+ }
656
+ function continueQuasiType(type) {
657
+ if (type == "}") {
658
+ cx.marked = "string-2";
659
+ cx.state.tokenize = tokenQuasi;
660
+ return cont(quasiType);
661
  }
662
  }
663
  function typearg(type, value) {
799
  if (value == "@") return cont(expression, classBody)
800
  }
801
  function classfield(type, value) {
802
+ if (value == "!") return cont(classfield)
803
  if (value == "?") return cont(classfield)
804
  if (type == ":") return cont(typeexpr, maybeAssign)
805
  if (value == "=") return cont(expressionNoComma)
819
  function afterImport(type) {
820
  if (type == "string") return cont();
821
  if (type == "(") return pass(expression);
822
+ if (type == ".") return pass(maybeoperatorComma);
823
  return pass(importSpec, maybeMoreImports, maybeFrom);
824
  }
825
  function importSpec(type, value) {
893
  },
894
 
895
  indent: function(state, textAfter) {
896
+ if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;
897
  if (state.tokenize != tokenBase) return 0;
898
  var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top
899
  // Kludge to prevent 'maybelse' from blocking lexical scope pops
900
  if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
901
  var c = state.cc[i];
902
  if (c == poplex) lexical = lexical.prev;
903
+ else if (c != maybeelse && c != popcontext) break;
904
  }
905
  while ((lexical.type == "stat" || lexical.type == "form") &&
906
  (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) &&
937
  expressionAllowed: expressionAllowed,
938
 
939
  skipExpression: function(state) {
940
+ parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null))
 
941
  }
942
  };
943
  });
949
  CodeMirror.defineMIME("application/javascript", "javascript");
950
  CodeMirror.defineMIME("application/x-javascript", "javascript");
951
  CodeMirror.defineMIME("application/ecmascript", "javascript");
952
+ CodeMirror.defineMIME("application/json", { name: "javascript", json: true });
953
+ CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true });
954
+ CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true })
955
+ CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true });
956
  CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
957
  CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
958
 
inc/lib/codemirror/mode/javascript/test.js CHANGED
@@ -164,9 +164,9 @@
164
 
165
  MT("indent_for",
166
  "[keyword for] ([keyword var] [def i] [operator =] [number 0];",
167
- " [variable i] [operator <] [number 100];",
168
- " [variable i][operator ++])",
169
- " [variable doSomething]([variable i]);",
170
  "[keyword debugger];");
171
 
172
  MT("indent_c_style",
@@ -252,7 +252,7 @@
252
  MT("async_object",
253
  "[keyword let] [def obj] [operator =] { [property async]: [atom false] };");
254
 
255
- // async be highlighet as keyword and foo as def, but it requires potentially expensive look-ahead. See #4173
256
  MT("async_object_function",
257
  "[keyword let] [def obj] [operator =] { [property async] [property foo]([def args]) { [keyword return] [atom true]; } };");
258
 
164
 
165
  MT("indent_for",
166
  "[keyword for] ([keyword var] [def i] [operator =] [number 0];",
167
+ " [variable-2 i] [operator <] [number 100];",
168
+ " [variable-2 i][operator ++])",
169
+ " [variable doSomething]([variable-2 i]);",
170
  "[keyword debugger];");
171
 
172
  MT("indent_c_style",
252
  MT("async_object",
253
  "[keyword let] [def obj] [operator =] { [property async]: [atom false] };");
254
 
255
+ // async be highlighted as keyword and foo as def, but it requires potentially expensive look-ahead. See #4173
256
  MT("async_object_function",
257
  "[keyword let] [def obj] [operator =] { [property async] [property foo]([def args]) { [keyword return] [atom true]; } };");
258
 
inc/lib/codemirror/mode/meta.js CHANGED
@@ -44,7 +44,7 @@
44
  {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
45
  {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
46
  {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
47
- {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
48
  {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
49
  {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
50
  {name: "Esper", mime: "text/x-esper", mode: "sql"},
@@ -76,7 +76,7 @@
76
  {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]},
77
  {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]},
78
  {name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"]},
79
- {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]},
80
  {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]},
81
  {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},
82
  {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]},
@@ -169,7 +169,8 @@
169
  {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]},
170
  {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]},
171
  {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]},
172
- {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]}
 
173
  ];
174
  // Ensure all modes have a mime property for backwards compatibility
175
  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
44
  {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
45
  {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
46
  {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
47
+ {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
48
  {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
49
  {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
50
  {name: "Esper", mime: "text/x-esper", mode: "sql"},
76
  {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]},
77
  {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]},
78
  {name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"]},
79
+ {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"], alias: ["jl"]},
80
  {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]},
81
  {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},
82
  {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]},
169
  {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]},
170
  {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]},
171
  {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]},
172
+ {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]},
173
+ {name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"]},
174
  ];
175
  // Ensure all modes have a mime property for backwards compatibility
176
  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
inc/lib/codemirror/mode/xml/xml.js CHANGED
@@ -189,7 +189,7 @@ CodeMirror.defineMode("xml", function(editorConf, config_) {
189
 
190
  function Context(state, tagName, startOfLine) {
191
  this.prev = state.context;
192
- this.tagName = tagName;
193
  this.indent = state.indented;
194
  this.startOfLine = startOfLine;
195
  if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
@@ -399,7 +399,7 @@ CodeMirror.defineMode("xml", function(editorConf, config_) {
399
  xmlCurrentContext: function(state) {
400
  var context = []
401
  for (var cx = state.context; cx; cx = cx.prev)
402
- if (cx.tagName) context.push(cx.tagName)
403
  return context.reverse()
404
  }
405
  };
189
 
190
  function Context(state, tagName, startOfLine) {
191
  this.prev = state.context;
192
+ this.tagName = tagName || "";
193
  this.indent = state.indented;
194
  this.startOfLine = startOfLine;
195
  if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
399
  xmlCurrentContext: function(state) {
400
  var context = []
401
  for (var cx = state.context; cx; cx = cx.prev)
402
+ context.push(cx.tagName)
403
  return context.reverse()
404
  }
405
  };
inc/lib/codemirror/package.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "codemirror",
3
- "version": "5.58.1",
4
  "main": "lib/codemirror.js",
5
  "style": "lib/codemirror.css",
6
  "author": {
1
  {
2
  "name": "codemirror",
3
+ "version": "5.62.0",
4
  "main": "lib/codemirror.js",
5
  "style": "lib/codemirror.css",
6
  "author": {
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: Arthur Gareginyan
3
  Tags: inject code, inject scripts, inject javascript, inject js, inject html, inject css, insert code, insert scripts, insert javascript, insert js, insert html, insert css, inject custom code, inject custom scripts, inject custom snippet, insert custom code, insert custom scripts, insert custom snippet, html, javascript, js, css, code, custom code, script, scripts, custom scripts, meta, meta tags, head, header, head section, head area, footer, footer section, footer area
4
  Donate link: https://www.spacexchimp.com/donate.html
5
  Requires at least: 4.9
6
- Tested up to: 5.7
7
  Requires PHP: 5.6
8
- Stable tag: 4.51
9
  License: GPL3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -225,6 +225,10 @@ Commercial licensing (e.g. for projects that can’t use an open-source license)
225
 
226
  == Changelog ==
227
 
 
 
 
 
228
  = 4.51 - Mar 8, 2021 =
229
  * Maintenance: Ensure compatibility with upcoming WordPress 5.7.
230
  * Maintenance: Processing of options has been improved. Direct retrieving of options from the database is replaced by the "_options" callback. The "options.php" file with the "_options" function added.
3
  Tags: inject code, inject scripts, inject javascript, inject js, inject html, inject css, insert code, insert scripts, insert javascript, insert js, insert html, insert css, inject custom code, inject custom scripts, inject custom snippet, insert custom code, insert custom scripts, insert custom snippet, html, javascript, js, css, code, custom code, script, scripts, custom scripts, meta, meta tags, head, header, head section, head area, footer, footer section, footer area
4
  Donate link: https://www.spacexchimp.com/donate.html
5
  Requires at least: 4.9
6
+ Tested up to: 6.1
7
  Requires PHP: 5.6
8
+ Stable tag: 4.52
9
  License: GPL3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
225
 
226
  == Changelog ==
227
 
228
+ = 4.52 - Jul 19, 2021 =
229
+ * Maintenance: Ensure compatibility with upcoming WordPress 5.8.
230
+ * Framework update: The CodeMirror library has been updated to the latest version v5.62.0.
231
+
232
  = 4.51 - Mar 8, 2021 =
233
  * Maintenance: Ensure compatibility with upcoming WordPress 5.7.
234
  * Maintenance: Processing of options has been improved. Direct retrieving of options from the database is replaced by the "_options" callback. The "options.php" file with the "_options" function added.