You are here

public static function InfoToYAML::parseInfo in Drupal 7 to 8/9 Module Upgrader 8

Parses a D7 info file. This is copied straight outta the D7 function drupal_parse_info_format().

2 calls to InfoToYAML::parseInfo()
InfoFile::analyze in src/Plugin/DMU/Analyzer/InfoFile.php
Analyzes a target module and flags any issues found.
InfoToYAML::convert in src/Plugin/DMU/Converter/InfoToYAML.php
Performs required conversions.

File

src/Plugin/DMU/Converter/InfoToYAML.php, line 60

Class

InfoToYAML
Plugin annotation @Converter( id = "info", description = @Translation("Converts Drupal 7 info files to Drupal 8.") )

Namespace

Drupal\drupalmoduleupgrader\Plugin\DMU\Converter

Code

public static function parseInfo($file) {
  $info = [];
  $constants = get_defined_constants();
  $data = file_get_contents($file);
  if (preg_match_all('
      @^\\s*                           # Start at the beginning of a line, ignoring leading whitespace
      ((?:
        [^=;\\[\\]]|                    # Key names cannot contain equal signs, semi-colons or square brackets,
        \\[[^\\[\\]]*\\]                  # unless they are balanced and not nested
      )+?)
      \\s*=\\s*                         # Key/value pairs are separated by equal signs (ignoring white-space)
      (?:
        ("(?:[^"]|(?<=\\\\)")*")|     # Double-quoted string, which may contain slash-escaped quotes/slashes
        (\'(?:[^\']|(?<=\\\\)\')*\')| # Single-quoted string, which may contain slash-escaped quotes/slashes
        ([^\\r\\n]*?)                   # Non-quoted string
      )\\s*$                           # Stop at the next end of a line, ignoring trailing whitespace
      @msx', $data, $matches, PREG_SET_ORDER)) {
    foreach ($matches as $match) {

      // Fetch the key and value string.
      $i = 0;
      foreach ([
        'key',
        'value1',
        'value2',
        'value3',
      ] as $var) {
        ${$var} = isset($match[++$i]) ? $match[$i] : '';
      }
      $value = stripslashes(substr($value1, 1, -1)) . stripslashes(substr($value2, 1, -1)) . $value3;

      // Parse array syntax.
      $keys = preg_split('/\\]?\\[/', rtrim($key, ']'));
      $last = array_pop($keys);
      $parent =& $info;

      // Create nested arrays.
      foreach ($keys as $key) {
        if ($key == '') {
          $key = count($parent);
        }
        if (!isset($parent[$key]) || !is_array($parent[$key])) {
          $parent[$key] = [];
        }
        $parent =& $parent[$key];
      }

      // Handle PHP constants.
      if (isset($constants[$value])) {
        $value = $constants[$value];
      }

      // Insert actual value.
      if ($last == '') {
        $last = count($parent);
      }
      $parent[$last] = $value;
    }
  }
  return $info;
}