Completed
Push — master ( 87ba8f...f21c84 )
by Colin
10s
created

src/Converter/CodeConverter.php (1 issue)

Check for loose comparison of strings.

Best Practice Bug Major

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace League\HTMLToMarkdown\Converter;
4
5
use League\HTMLToMarkdown\ElementInterface;
6
7
class CodeConverter implements ConverterInterface
8
{
9
    /**
10
     * @param ElementInterface $element
11
     *
12
     * @return string
13
     */
14 12
    public function convert(ElementInterface $element)
15
    {
16 12
        $language = null;
17
18
        // Checking for language class on the code block
19 12
        $classes = $element->getAttribute('class');
20
21 12
        if ($classes) {
22
            // Since tags can have more than one class, we need to find the one that starts with 'language-'
23 3
            $classes = explode(' ', $classes);
24 3
            foreach ($classes as $class) {
25 3
                if (strpos($class, 'language-') !== false) {
26
                    // Found one, save it as the selected language and stop looping over the classes.
27
                    // The space after the language avoids gluing the actual code with the language tag
28 3
                    $language = str_replace('language-', '', $class) . ' ';
29 3
                    break;
30
                }
31 2
            }
32 2
        }
33
34 12
        $markdown = '';
35 12
        $code = html_entity_decode($element->getChildrenAsString());
36
37
        // In order to remove the code tags we need to search for them and, in the case of the opening tag
38
        // use a regular expression to find the tag and the other attributes it might have
39 12
        $code = preg_replace('/<code\b[^>]*>/', '', $code);
40 12
        $code = str_replace('</code>', '', $code);
41
42
        // Checking if the code has multiple lines
43 12
        $lines = preg_split('/\r\n|\r|\n/', $code);
44 12
        if ($language || count($lines) > 1) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $language of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
45
            // Multiple lines detected, adding three backticks and newlines
46 3
            $markdown .= '```' . $language . "\n" . $code . "\n" . '```' . "\n\n";
47 2
        } else {
48
            // One line of code, wrapping it on one backtick.
49 12
            $markdown .= '`' . $language . $code . '`';
50
        }
51
52 12
        return $markdown;
53
    }
54
55
    /**
56
     * @return string[]
57
     */
58 84
    public function getSupportedTags()
59
    {
60 84
        return array('code');
61
    }
62
}
63