123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- <?php
- /* Copyright (c) 2019 Geert Bergman (geert@scrivo.nl), highlight.php
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of "highlight.js", "highlight.php", nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
- namespace HighlightUtilities;
- require_once __DIR__ . '/_internals.php';
- require_once __DIR__ . '/_themeColors.php';
- /**
- * Get a list of available stylesheets.
- *
- * By default, a list of filenames without the `.css` extension will be returned.
- * This can be configured with the `$filePaths` argument.
- *
- * @api
- *
- * @since 9.15.8.1
- *
- * @param bool $filePaths Return absolute paths to stylesheets instead
- *
- * @return string[]
- */
- function getAvailableStyleSheets($filePaths = false)
- {
- $results = array();
- $folder = getStyleSheetFolder();
- $dh = @dir($folder);
- if ($dh) {
- while (($entry = $dh->read()) !== false) {
- if (substr($entry, -4, 4) !== ".css") {
- continue;
- }
- if ($filePaths) {
- $results[] = implode(DIRECTORY_SEPARATOR, array($folder, $entry));
- } else {
- $results[] = basename($entry, ".css");
- }
- }
- $dh->close();
- }
- return $results;
- }
- /**
- * Get the RGB representation used for the background of a given theme as an
- * array of three numbers.
- *
- * @api
- *
- * @since 9.18.1.1
- *
- * @param string $name The stylesheet name (with or without the extension)
- *
- * @throws \DomainException when no stylesheet with this name exists
- *
- * @return float[] An array representing RGB numerical values
- */
- function getThemeBackgroundColor($name)
- {
- return _getThemeBackgroundColor(_getNoCssExtension($name));
- }
- /**
- * Get the contents of the given stylesheet.
- *
- * @api
- *
- * @since 9.15.8.1
- *
- * @param string $name The stylesheet name (with or without the extension)
- *
- * @throws \DomainException when the no stylesheet with this name exists
- *
- * @return false|string The CSS content of the stylesheet or FALSE when
- * the stylesheet content could be read
- */
- function getStyleSheet($name)
- {
- $path = getStyleSheetPath($name);
- return file_get_contents($path);
- }
- /**
- * Get the absolute path to the folder containing the stylesheets distributed in this package.
- *
- * @api
- *
- * @since 9.15.8.1
- *
- * @return string An absolute path to the folder
- */
- function getStyleSheetFolder()
- {
- $paths = array(__DIR__, '..', 'styles');
- return implode(DIRECTORY_SEPARATOR, $paths);
- }
- /**
- * Get the absolute path to a given stylesheet distributed in this package.
- *
- * @api
- *
- * @since 9.15.8.1
- *
- * @param string $name The stylesheet name (with or without the extension)
- *
- * @throws \DomainException when the no stylesheet with this name exists
- *
- * @return string The absolute path to the stylesheet with the given name
- */
- function getStyleSheetPath($name)
- {
- $name = _getNoCssExtension($name);
- $path = implode(DIRECTORY_SEPARATOR, array(getStyleSheetFolder(), $name)) . ".css";
- if (!file_exists($path)) {
- throw new \DomainException("There is no stylesheet with by the name of '$name'.");
- }
- return $path;
- }
- /**
- * Convert the HTML generated by Highlighter and split it up into an array of lines.
- *
- * @api
- *
- * @since 9.15.6.1
- *
- * @param string $html An HTML string generated by `Highlighter::highlight()`
- *
- * @throws \RuntimeException when the DOM extension is not available
- * @throws \UnexpectedValueException when the given HTML could not be parsed
- *
- * @return string[]|false An array of lines of code as strings. False if an error occurred in splitting up by lines
- */
- function splitCodeIntoArray($html)
- {
- if (!extension_loaded("dom")) {
- throw new \RuntimeException("The DOM extension is not loaded but is required.");
- }
- $dom = new \DOMDocument();
- if (!$dom->loadHTML($html)) {
- throw new \UnexpectedValueException("The given HTML could not be parsed correctly.");
- }
- $spans = $dom->getElementsByTagName("span");
- /** @var \DOMElement $span */
- foreach ($spans as $span) {
- $classes = $span->getAttribute("class");
- $renderedSpan = $dom->saveHTML($span);
- if (preg_match('/\R/', $renderedSpan)) {
- $finished = preg_replace(
- '/\R/',
- sprintf('</span>%s<span class="%s">', PHP_EOL, $classes),
- $renderedSpan
- );
- $html = str_replace($renderedSpan, $finished, $html);
- }
- }
- return preg_split('/\R/', $html);
- }
|