diff --git a/CHANGES.md b/CHANGES.md index 83d50a02d6..ca0cb2443b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -17,11 +17,13 @@ Grammars: - added 3rd party Candid grammar to SUPPORTED_LANGUAGES [rvanasa][] - fix(haskell) Added support for characters [CrystalSplitter][] - enh(dart) Add `base`, `interface`, `sealed`, and `when` keywords [Sam Rawlins][] +- enh(php) detect newer more flexible NOWdoc syntax (#3679) [Timur Kamaev][] Parser: - add removePlugin api [faga295][] +[Timur Kamaev]: https://github.com/doiftrue [WisamMechano]: https://github.com/wisammechano [faga295]: https://github.com/faga295 [AdamRaichu]: https://github.com/AdamRaichu diff --git a/src/languages/php.js b/src/languages/php.js index f0e5f8ef68..13fde3abb5 100644 --- a/src/languages/php.js +++ b/src/languages/php.js @@ -51,10 +51,18 @@ export default function(hljs) { illegal: null, contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST), }); - const HEREDOC = hljs.END_SAME_AS_BEGIN({ - begin: /<<<[ \t]*(\w+)\n/, + + const HEREDOC = { + begin: /<<<[ \t]*(?:(\w+)|"(\w+)")\n/, end: /[ \t]*(\w+)\b/, contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST), + 'on:begin': (m, resp) => { resp.data._beginMatch = m[1] || m[2]; }, + 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }, + }; + + const NOWDOC = hljs.END_SAME_AS_BEGIN({ + begin: /<<<[ \t]*'(\w+)'\n/, + end: /[ \t]*(\w+)\b/, }); // list of valid whitespaces because non-breaking space might be part of a IDENT_RE const WHITESPACE = '[ \t\n]'; @@ -63,7 +71,8 @@ export default function(hljs) { variants: [ DOUBLE_QUOTED, SINGLE_QUOTED, - HEREDOC + HEREDOC, + NOWDOC ] }; const NUMBER = { diff --git a/test/markup/php/strings.expect.txt b/test/markup/php/strings.expect.txt index 8a9c4dd8f5..953138b52d 100644 --- a/test/markup/php/strings.expect.txt +++ b/test/markup/php/strings.expect.txt @@ -17,7 +17,18 @@ MSG); FROM table SQL); -var_dump(<<<SQL +var_dump(<<<"SQL" SELECT * FROM table SQL); + +// nowdoc syntax + +$var = <<<'TEXT' + Hello {$person->name}! Welcome to $company! +TEXT; + +var_dump(<<<'TEXT' + Hello {$person->name}! Welcome to $company! + TEXT); + diff --git a/test/markup/php/strings.txt b/test/markup/php/strings.txt index d539d549a8..6e879722bf 100644 --- a/test/markup/php/strings.txt +++ b/test/markup/php/strings.txt @@ -17,7 +17,17 @@ var_dump(<<name}! Welcome to $company! +TEXT; + +var_dump(<<<'TEXT' + Hello {$person->name}! Welcome to $company! + TEXT);