My Custom Functions - Version 4.50

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 My Custom Functions
Version 4.50
Comparing to
See all releases

Code changes from version 4.49 to 4.50

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/clike/clike.js CHANGED
@@ -82,15 +82,15 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
82
  state.tokenize = tokenString(ch);
83
  return state.tokenize(stream, state);
84
  }
85
- if (isPunctuationChar.test(ch)) {
86
- curPunc = ch;
87
- return null;
88
- }
89
  if (numberStart.test(ch)) {
90
  stream.backUp(1)
91
  if (stream.match(number)) return "number"
92
  stream.next()
93
  }
 
 
 
 
94
  if (ch == "/") {
95
  if (stream.eat("*")) {
96
  state.tokenize = tokenComment;
@@ -350,8 +350,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
350
  function cpp11StringHook(stream, state) {
351
  stream.backUp(1);
352
  // Raw strings.
353
- if (stream.match(/(R|u8R|uR|UR|LR)/)) {
354
- var match = stream.match(/"([^\s\\()]{0,16})\(/);
355
  if (!match) {
356
  return false;
357
  }
@@ -360,8 +360,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
360
  return tokenRawString(stream, state);
361
  }
362
  // Unicode strings/chars.
363
- if (stream.match(/(u8|u|U|L)/)) {
364
- if (stream.match(/["']/, /* eat */ false)) {
365
  return "string";
366
  }
367
  return false;
@@ -659,7 +659,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
659
  "file import where by get set abstract enum open inner override private public internal " +
660
  "protected catch finally out final vararg reified dynamic companion constructor init " +
661
  "sealed field property receiver param sparam lateinit data inline noinline tailrec " +
662
- "external annotation crossinline const operator infix suspend actual expect setparam"
663
  ),
664
  types: words(
665
  /* package java.lang */
@@ -749,7 +749,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
749
  "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
750
  "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
751
  "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
752
- "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
753
  "gl_ProjectionMatrixInverseTranspose " +
754
  "gl_ModelViewProjectionMatrixInverseTranspose " +
755
  "gl_TextureMatrixInverseTranspose " +
82
  state.tokenize = tokenString(ch);
83
  return state.tokenize(stream, state);
84
  }
 
 
 
 
85
  if (numberStart.test(ch)) {
86
  stream.backUp(1)
87
  if (stream.match(number)) return "number"
88
  stream.next()
89
  }
90
+ if (isPunctuationChar.test(ch)) {
91
+ curPunc = ch;
92
+ return null;
93
+ }
94
  if (ch == "/") {
95
  if (stream.eat("*")) {
96
  state.tokenize = tokenComment;
350
  function cpp11StringHook(stream, state) {
351
  stream.backUp(1);
352
  // Raw strings.
353
+ if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) {
354
+ var match = stream.match(/^"([^\s\\()]{0,16})\(/);
355
  if (!match) {
356
  return false;
357
  }
360
  return tokenRawString(stream, state);
361
  }
362
  // Unicode strings/chars.
363
+ if (stream.match(/^(?:u8|u|U|L)/)) {
364
+ if (stream.match(/^["']/, /* eat */ false)) {
365
  return "string";
366
  }
367
  return false;
659
  "file import where by get set abstract enum open inner override private public internal " +
660
  "protected catch finally out final vararg reified dynamic companion constructor init " +
661
  "sealed field property receiver param sparam lateinit data inline noinline tailrec " +
662
+ "external annotation crossinline const operator infix suspend actual expect setparam value"
663
  ),
664
  types: words(
665
  /* package java.lang */
749
  "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
750
  "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
751
  "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
752
+ "gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
753
  "gl_ProjectionMatrixInverseTranspose " +
754
  "gl_ModelViewProjectionMatrixInverseTranspose " +
755
  "gl_TextureMatrixInverseTranspose " +
inc/lib/codemirror/mode/clike/index.html CHANGED
@@ -148,7 +148,7 @@ That spans two lines
148
  */
149
 
150
  #import "MyClass.h"
151
- #import <AFramework/AFrameork.h>
152
  @import BFrameworkModule;
153
 
154
  NS_ENUM(SomeValues) {
148
  */
149
 
150
  #import "MyClass.h"
151
+ #import <AFramework/AFramework.h>
152
  @import BFrameworkModule;
153
 
154
  NS_ENUM(SomeValues) {
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/php/php.js CHANGED
@@ -53,7 +53,7 @@
53
  [["]", null]]
54
  ], closing, escapes);
55
  }
56
- if (stream.match(/\-\>\w/, false)) {
57
  // Match object operator
58
  state.tokenize = matchSequence([
59
  [["->", null]],
@@ -86,7 +86,7 @@
86
  "die echo empty exit eval include include_once isset list require require_once return " +
87
  "print unset __halt_compiler self static parent yield insteadof finally";
88
  var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__";
89
- var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";
90
  CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" "));
91
  CodeMirror.registerHelper("wordChars", "php", /[\w$]/);
92
 
@@ -106,7 +106,7 @@
106
  },
107
  "<": function(stream, state) {
108
  var before;
109
- if (before = stream.match(/<<\s*/)) {
110
  var quoted = stream.eat(/['"]/);
111
  stream.eatWhile(/[\w\.]/);
112
  var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));
53
  [["]", null]]
54
  ], closing, escapes);
55
  }
56
+ if (stream.match(/^->\w/, false)) {
57
  // Match object operator
58
  state.tokenize = matchSequence([
59
  [["->", null]],
86
  "die echo empty exit eval include include_once isset list require require_once return " +
87
  "print unset __halt_compiler self static parent yield insteadof finally";
88
  var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__";
89
+ var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";
90
  CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" "));
91
  CodeMirror.registerHelper("wordChars", "php", /[\w$]/);
92
 
106
  },
107
  "<": function(stream, state) {
108
  var before;
109
+ if (before = stream.match(/^<<\s*/)) {
110
  var quoted = stream.eat(/['"]/);
111
  stream.eatWhile(/[\w\.]/);
112
  var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));
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": {
languages/my-custom-functions-fr_FR.po CHANGED
@@ -464,10 +464,8 @@ msgid "If you aren't sure how usually your web hosting provider will have instru
464
  msgstr "Si vous n'êtes pas sûr comment habituellement votre fournisseur d'hébergement Web aura des instructions quelque part sur leur site Web."
465
 
466
  #: inc/php/tabs/faq.php:264
467
- #, fuzzy
468
- #| msgid "Browse to the directory <code>wp-content/plugins/my-custom-functions/</code>."
469
  msgid "Browse to the directory <code>wp-content/plugins/"
470
- msgstr "Naviguez jusqu'au répertoire <code>wp-content/plugins/my-custom-functions/</code>."
471
 
472
  #: inc/php/tabs/faq.php:265
473
  msgid "Please contact your web hosting company to get help if you can't find this folder."
464
  msgstr "Si vous n'êtes pas sûr comment habituellement votre fournisseur d'hébergement Web aura des instructions quelque part sur leur site Web."
465
 
466
  #: inc/php/tabs/faq.php:264
 
 
467
  msgid "Browse to the directory <code>wp-content/plugins/"
468
+ msgstr "Naviguez jusqu'au répertoire <code>wp-content/plugins/"
469
 
470
  #: inc/php/tabs/faq.php:265
471
  msgid "Please contact your web hosting company to get help if you can't find this folder."
languages/my-custom-functions-nl_NL.po CHANGED
@@ -464,10 +464,8 @@ msgid "If you aren't sure how usually your web hosting provider will have instru
464
  msgstr "Als u niet zeker bent hoe, vaak heeft je webhostingprovider ergens op hun website instructies staan."
465
 
466
  #: inc/php/tabs/faq.php:264
467
- #, fuzzy
468
- #| msgid "Browse to the directory <code>wp-content/plugins/my-custom-functions/</code>."
469
  msgid "Browse to the directory <code>wp-content/plugins/"
470
- msgstr "Blader naar de map <code>wp-content/plugins/my-custom-functions/</code> ."
471
 
472
  #: inc/php/tabs/faq.php:265
473
  msgid "Please contact your web hosting company to get help if you can't find this folder."
464
  msgstr "Als u niet zeker bent hoe, vaak heeft je webhostingprovider ergens op hun website instructies staan."
465
 
466
  #: inc/php/tabs/faq.php:264
 
 
467
  msgid "Browse to the directory <code>wp-content/plugins/"
468
+ msgstr "Blader naar de map <code>wp-content/plugins/"
469
 
470
  #: inc/php/tabs/faq.php:265
471
  msgid "Please contact your web hosting company to get help if you can't find this folder."
languages/my-custom-functions-ru_RU.po CHANGED
@@ -464,10 +464,8 @@ msgid "If you aren't sure how usually your web hosting provider will have instru
464
  msgstr ""
465
 
466
  #: inc/php/tabs/faq.php:264
467
- #, fuzzy
468
- #| msgid "Browse to the directory <code>wp-content/plugins/my-custom-functions/</code>."
469
  msgid "Browse to the directory <code>wp-content/plugins/"
470
- msgstr "Перейдите в каталог <code>wp-content/plugins/my-custom-functions/</code>."
471
 
472
  #: inc/php/tabs/faq.php:265
473
  msgid "Please contact your web hosting company to get help if you can't find this folder."
464
  msgstr ""
465
 
466
  #: inc/php/tabs/faq.php:264
 
 
467
  msgid "Browse to the directory <code>wp-content/plugins/"
468
+ msgstr "Перейдите в каталог <code>wp-content/plugins/"
469
 
470
  #: inc/php/tabs/faq.php:265
471
  msgid "Please contact your web hosting company to get help if you can't find this folder."
my-custom-functions.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: Easily and safely add your custom PHP code 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.49
9
  * License: GPL3
10
  * Text Domain: my-custom-functions
11
  * Domain Path: /languages/
5
  * Description: Easily and safely add your custom PHP code 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.50
9
  * License: GPL3
10
  * Text Domain: my-custom-functions
11
  * Domain Path: /languages/
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: Arthur Gareginyan
3
  Tags: inject code, inject function, inject snippet, inject php, insert code, insert function, insert snippet, insert php, execute code, execute function, execute snippet, execute php, inject custom code, inject custom function, inject custom snippet, inject custom php, insert custom code, insert custom function, insert custom snippet, insert custom php, execute custom code, execute custom function, execute custom snippet, execute custom php, code, function, snippet, php, functionality plugin
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.49
9
  License: GPL3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -257,6 +257,10 @@ Commercial licensing (e.g. for projects that can’t use an open-source license)
257
 
258
  == Changelog ==
259
 
 
 
 
 
260
  = 4.49 - Mar 8, 2021 =
261
  * Maintenance: Ensure compatibility with upcoming WordPress 5.7.
262
  * 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 function, inject snippet, inject php, insert code, insert function, insert snippet, insert php, execute code, execute function, execute snippet, execute php, inject custom code, inject custom function, inject custom snippet, inject custom php, insert custom code, insert custom function, insert custom snippet, insert custom php, execute custom code, execute custom function, execute custom snippet, execute custom php, code, function, snippet, php, functionality plugin
4
  Donate link: https://www.spacexchimp.com/donate.html
5
  Requires at least: 4.9
6
+ Tested up to: 5.8
7
  Requires PHP: 5.6
8
+ Stable tag: 4.50
9
  License: GPL3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
257
 
258
  == Changelog ==
259
 
260
+ = 4.50 - Jul 19, 2021 =
261
+ * Maintenance: Ensure compatibility with upcoming WordPress 5.8.
262
+ * Framework update: The CodeMirror library has been updated to the latest version v5.62.0.
263
+
264
  = 4.49 - Mar 8, 2021 =
265
  * Maintenance: Ensure compatibility with upcoming WordPress 5.7.
266
  * 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.