code: function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {
          var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
          var currentLang = '*';
          var genericLang = lang.split('-', 1)[0];
          var skipLang = false;
          var match = '';
  
          function nextEntry() {
            // Use infinite loop instead of recursion to avoid reaching the
            // maximum recursion limit for content with many lines.
            while (true) {
              if (!entries.length) {
                parsedRawLinesCallback();
                return;
              }
              var line = entries.shift();
  
              // comment or blank line?
              if (reComment.test(line))
                continue;
  
              // the extended syntax supports [lang] sections and @import rules
              if (extendedSyntax) {
                match = reSection.exec(line);
                if (match) { // section start?
                  // RFC 4646, section 4.4, "All comparisons MUST be performed
                  // in a case-insensitive manner."
  
                  currentLang = match[1].toLowerCase();
                  skipLang = (currentLang !== '*') &&
                      (currentLang !== lang) && (currentLang !== genericLang);
                  continue;
                } else if (skipLang) {
                  continue;
                }
                match = reImport.exec(line);
                if (match) { // @import rule?
                  loadImport(baseURL + match[1], nextEntry);
                  return;
                }
              }
  
              // key-value pair
              var tmp = line.match(reSplit);
              if (tmp && tmp.length == 3) {
                dictionary[tmp[1]] = evalString(tmp[2]);
              }
            }
          }
          nextEntry();
        }
docs: TODO: escape EOLs with '\' parse the *.properties file into an associative array