Some class names at the start of the input string were not detected correctly due to the way greedy matching works. This fixes the issue by splitting the `class-name` rule into two rules, one before and one after the `keyword` rule that interfered and caused the issue.
Improves numeral literal handling in the Prism PHP component in two ways:
1. Since PHP 7.4, it is possible to use [underscore numeric separator](https://php.watch/versions/7.4/underscore_numeric_separator). Prism correctly handles this for decimal numbers, but not for binary, octal, and hex numerals although PHP supports the underscore separator for binary, octal, and hex numeric literals as well.
2. In upcoming PHP 8.1, PHP supports an [explicit octal numeral prefix `0o`/`0O`](https://php.watch/versions/8.1/explicit-octal-notation). The existing `0` prefix is not removed.
This commit updates the PHP number regex to accommodate both cases above, and expands the tests for new syntax.
This patch is an attempt to fix the PHP language, when it is combined
with markup.
The problem is, that markup has a higher priority than all other tokens.
This leads to weird errors, where HTML tags are highlighted inside of
comments #197. One solution to this was to set the `greedy` flag for the
comment token, but this leads to far worse errors like #1097.
This patch should fix both issues #197 and #1097, by switching the
grammar to markup on the fly. One potential problem is, that it relies
on the `<?php` tag to detect if markup is present. So if a PHP file
contains only markup and no PHP code at all, the result will look
broken.
The problem is, that inline php code can be anywhere inside of a HTML
element. To properly highlight this the php language implementation
temporarily replaces all inline php code in `env.code` with something
like `{{PHP0}}`. After the markup highlighting is finished it replaces
it again with the real code, but it leaves `env.code` corrupted.
Since the line-numbers plugin uses `env.code` to count the number of
lines, the result will be broken.
So to fix this, it must be ensured, that `env.code` is restored before
the line-numbers plugin uses it.