38 for (INIContentHandler* handler : handlers) handler->startDocument(); |
38 for (INIContentHandler* handler : handlers) handler->startDocument(); |
39 |
39 |
40 std::regex whitespacePattrern("\\s*"); |
40 std::regex whitespacePattrern("\\s*"); |
41 std::regex commentPattrern("\\s*(;|#)\\s*(.*)"); |
41 std::regex commentPattrern("\\s*(;|#)\\s*(.*)"); |
42 std::regex sectionPattrern("\\s*\\[\\s*([^\\]]+)\\s*\\]\\s*(\\[\\s*([^\\]]+)\\s*\\])?\\s*((;|#)\\s*(.*))?"); |
42 std::regex sectionPattrern("\\s*\\[\\s*([^\\]]+)\\s*\\]\\s*(\\[\\s*([^\\]]+)\\s*\\])?\\s*((;|#)\\s*(.*))?"); |
43 std::regex entryQuotesPattrern(/***/"\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*\"([^']+)\"\\s*((;|#)\\s*(.*))?"); |
43 std::regex entryQuotedPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*(\"|')((?:(?!\\5).)*)(\\5)\\s*((;|#)\\s*(.*))?"); |
44 std::regex entryApostrophesPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*'([^']+)'\\s*((;|#)\\s*(.*))?"); |
|
45 std::regex entryPlainPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*(.*?)\\s*"); |
44 std::regex entryPlainPattrern("\\s*(([^=\\]]+?[^=\\s\\]]*)(\\[([^\\]]+)\\])?)\\s*=\\s*(.*?)\\s*"); |
46 |
45 |
47 std::smatch match; |
46 std::smatch match; |
48 bool inSection = false; |
47 bool inSection = false; |
49 std::string line; |
48 std::string line; |
77 // event.tag = match[3]; |
76 // event.tag = match[3]; |
78 // KDE uses some weird INI dialect that allows [section][x] syntax where „x“ is kind of „tag“ that signalizes some properties of given section. |
77 // KDE uses some weird INI dialect that allows [section][x] syntax where „x“ is kind of „tag“ that signalizes some properties of given section. |
79 // see <https://userbase.kde.org/KDE_System_Administration/Configuration_Files>, „[$i]“ means that the section is „locked“ |
78 // see <https://userbase.kde.org/KDE_System_Administration/Configuration_Files>, „[$i]“ means that the section is „locked“ |
80 // We may emit this information somehow later, but for now, it is just ignored. |
79 // We may emit this information somehow later, but for now, it is just ignored. |
81 for (INIContentHandler* handler : handlers) handler->startSection(event); |
80 for (INIContentHandler* handler : handlers) handler->startSection(event); |
82 } else if (std::regex_match(line, match, entryQuotesPattrern) || std::regex_match(line, match, entryApostrophesPattrern)) { |
81 } else if (std::regex_match(line, match, entryQuotedPattrern)) { |
83 INIContentHandler::EntryEvent event; |
82 INIContentHandler::EntryEvent event; |
84 event.lineNumber = lineNumber; |
83 event.lineNumber = lineNumber; |
85 event.eventNumber = ++eventNumber; |
84 event.eventNumber = ++eventNumber; |
86 event.key = match[2]; |
85 event.key = match[2]; |
87 event.subKey = match[4]; |
86 event.subKey = match[4]; |
88 event.fullKey = match[1]; |
87 event.fullKey = match[1]; |
89 event.value = match[5]; |
88 event.value = match[6]; |
90 if (match.size() == 9) event.comment = match[8]; |
89 event.comment = match[10]; |
91 for (INIContentHandler* handler : handlers) handler->entry(event); |
90 for (INIContentHandler* handler : handlers) handler->entry(event); |
92 } else if (std::regex_match(line, match, entryPlainPattrern)) { |
91 } else if (std::regex_match(line, match, entryPlainPattrern)) { |
93 INIContentHandler::EntryEvent event; |
92 INIContentHandler::EntryEvent event; |
94 event.lineNumber = lineNumber; |
93 event.lineNumber = lineNumber; |
95 event.eventNumber = ++eventNumber; |
94 event.eventNumber = ++eventNumber; |