Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: Support [nested][groups] in ini parser #336

Open
ratijas opened this issue Dec 22, 2022 · 5 comments
Open

Feature Request: Support [nested][groups] in ini parser #336

ratijas opened this issue Dec 22, 2022 · 5 comments

Comments

@ratijas
Copy link

ratijas commented Dec 22, 2022

In KDE we have a have a specific format for config files: KConfig. It is largely based on ini syntax, but also groups can be nested like this: [Top][Middle][42]. Currently, jc --ini parser would parse it as a group named {"Top][Middle][42": {...}}

Would be convenient if ini parser could produce nested structures, even if with an additional command like option.

@ratijas
Copy link
Author

ratijas commented Dec 22, 2022

For example, here is my plasmarc config:

~/.config/plasma-org.kde.plasma.desktop-appletsrc
[ActionPlugins][0]
RightButton;NoModifier=org.kde.contextmenu
wheel:Vertical;NoModifier=org.kde.switchdesktop

[ActionPlugins][1]
RightButton;NoModifier=org.kde.contextmenu

[Containments][1]
ItemGeometries-1279x719=
ItemGeometries-1707x960=Applet-26:80,464,432,400,0;
ItemGeometries-2560x1440=
ItemGeometriesHorizontal=Applet-26:80,464,432,400,0;
activityId=1a6b35af-059d-43ea-850c-6f8ad112899a
formfactor=0
immutability=1
lastScreen=0
location=0
plugin=org.kde.plasma.folder
wallpaperplugin=org.kde.image

[Containments][1][Applets][26]
immutability=1
plugin=org.kde.plasma_applet_dict

[Containments][1][Applets][26][Configuration][ConfigDialog]
DialogHeight=539
DialogWidth=719

[Containments][1][Applets][26][Configuration][General]
dictionary=all,fd-eng-rus

[Containments][1][General]
ToolBoxButtonState=topcenter
ToolBoxButtonX=360
positions={"1707x960":[]}
sortMode=-1

[Containments][2]
activityId=
formfactor=2
immutability=1
lastScreen=0
location=4
plugin=org.kde.panel
wallpaperplugin=org.kde.image

[Containments][2][Applets][18]
immutability=1
plugin=org.kde.plasma.digitalclock

[Containments][2][Applets][18][Configuration]
PreloadWeight=100
popupHeight=450
popupWidth=396

[Containments][2][Applets][18][Configuration][Appearance]
dateFormat=isoDate

[Containments][2][Applets][18][Configuration][ConfigDialog]
DialogHeight=539
DialogWidth=719

[Containments][2][Applets][19]
immutability=1
plugin=org.kde.plasma.showdesktop

[Containments][2][Applets][27]
immutability=1
plugin=org.kde.plasma.colorpicker

[Containments][2][Applets][27][Configuration]
PreloadWeight=60

[Containments][2][Applets][27][Configuration][General]
history=#001e08,#001d06,#ff0000,#ffff00,#0080fe,#f30101,#01f301,#ff8040

[Containments][2][Applets][3]
immutability=1
plugin=org.kde.plasma.kickoff

[Containments][2][Applets][3][Configuration]
PreloadWeight=100
popupHeight=514
popupWidth=645

[Containments][2][Applets][3][Configuration][ConfigDialog]
DialogHeight=539
DialogWidth=719

[Containments][2][Applets][3][Configuration][General]
favoritesPortedToKAstats=true

[Containments][2][Applets][3][Configuration][Shortcuts]
global=Alt+F1

[Containments][2][Applets][3][Shortcuts]
global=Alt+F1

[Containments][2][Applets][4]
immutability=1
plugin=org.kde.plasma.pager

[Containments][2][Applets][5]
immutability=1
plugin=org.kde.plasma.icontasks

[Containments][2][Applets][5][Configuration][General]
launchers=applications:systemsettings.desktop,applications:org.kde.discover.desktop,preferred://filemanager,preferred://browser,applications:com.discordapp.Discord.desktop,applications:sublime_text.desktop,applications:sublime_merge.desktop,applications:org.kde.konsole.desktop

[Containments][2][Applets][6]
immutability=1
plugin=org.kde.plasma.marginsseparator

[Containments][2][Applets][7]
immutability=1
plugin=org.kde.plasma.systemtray

[Containments][2][Applets][7][Configuration]
PreloadWeight=100
SystrayContainmentId=8

[Containments][2][ConfigDialog]
DialogHeight=84
DialogWidth=1707

[Containments][2][General]
AppletOrder=3;4;5;6;27;7;18;19

[Containments][23]
ItemGeometries-1280x720=
ItemGeometriesHorizontal=
activityId=1a6b35af-059d-43ea-850c-6f8ad112899a
formfactor=0
immutability=1
lastScreen=1
location=0
plugin=org.kde.plasma.folder
wallpaperplugin=org.kde.image

[Containments][28]
ItemGeometries-0x0=
ItemGeometriesHorizontal=
activityId=00000000-0000-0000-0000-000000000000
formfactor=0
immutability=1
lastScreen=0
location=0
plugin=org.kde.plasma.folder
wallpaperplugin=org.kde.image

[Containments][8]
activityId=
formfactor=2
immutability=1
lastScreen=0
location=4
plugin=org.kde.plasma.private.systemtray
popupHeight=431
popupWidth=431
wallpaperplugin=org.kde.image

[Containments][8][Applets][10]
immutability=1
plugin=org.kde.plasma.vault

[Containments][8][Applets][11]
immutability=1
plugin=org.kde.plasma.manage-inputmethod

[Containments][8][Applets][12]
immutability=1
plugin=org.kde.plasma.clipboard

[Containments][8][Applets][12][Configuration]
PreloadWeight=65

[Containments][8][Applets][13]
immutability=1
plugin=org.kde.plasma.keyboardindicator

[Containments][8][Applets][14]
immutability=1
plugin=org.kde.plasma.volume

[Containments][8][Applets][14][Configuration]
PreloadWeight=100

[Containments][8][Applets][14][Configuration][General]
migrated=true

[Containments][8][Applets][15]
immutability=1
plugin=org.kde.plasma.devicenotifier

[Containments][8][Applets][15][Configuration]
PreloadWeight=80

[Containments][8][Applets][16]
immutability=1
plugin=org.kde.plasma.keyboardlayout

[Containments][8][Applets][16][Configuration][ConfigDialog]
DialogHeight=539
DialogWidth=719

[Containments][8][Applets][16][Configuration][General]
displayStyle=LabelOverFlag

[Containments][8][Applets][17]
immutability=1
plugin=org.kde.plasma.notifications

[Containments][8][Applets][17][Configuration]
PreloadWeight=90

[Containments][8][Applets][20]
immutability=1
plugin=org.kde.plasma.battery

[Containments][8][Applets][20][Configuration]
PreloadWeight=100

[Containments][8][Applets][20][Configuration][General]
showPercentage=true

[Containments][8][Applets][21]
immutability=1
plugin=org.kde.plasma.networkmanagement

[Containments][8][Applets][21][Configuration]
PreloadWeight=100

[Containments][8][Applets][22]
immutability=1
plugin=org.kde.plasma.bluetooth

[Containments][8][Applets][22][Configuration]
PreloadWeight=100

[Containments][8][Applets][23]
immutability=1
plugin=org.kde.plasma.mediacontroller

[Containments][8][Applets][23][Configuration]
PreloadWeight=0

[Containments][8][Applets][24]
immutability=1
plugin=org.kde.kdeconnect

[Containments][8][Applets][9]
immutability=1
plugin=org.kde.plasma.nightcolorcontrol

[Containments][8][General]
extraItems=org.kde.plasma.nightcolorcontrol,org.kde.plasma.vault,org.kde.plasma.battery,org.kde.plasma.networkmanagement,org.kde.plasma.manage-inputmethod,org.kde.plasma.clipboard,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.plasma.volume,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.keyboardlayout,org.kde.plasma.notifications,org.kde.kdeconnect
knownItems=org.kde.plasma.nightcolorcontrol,org.kde.plasma.vault,org.kde.plasma.battery,org.kde.plasma.networkmanagement,org.kde.plasma.manage-inputmethod,org.kde.plasma.clipboard,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.plasma.volume,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.keyboardlayout,org.kde.plasma.notifications,org.kde.kdeconnect

[ScreenMapping]
itemsOnDisabledScreens=
screenMapping=
jc --ini < ~/.config/plasma-org.kde.plasma.desktop-appletsrc
jc --ini
{"ActionPlugins][0":{"RightButton;NoModifier":"org.kde.contextmenu","wheel":"Vertical;NoModifier=org.kde.switchdesktop"},"ActionPlugins][1":{"RightButton;NoModifier":"org.kde.contextmenu"},"Containments][1":{"ItemGeometries-1279x719":"","ItemGeometries-1707x960":"Applet-26:80,464,432,400,0;","ItemGeometries-2560x1440":"","ItemGeometriesHorizontal":"Applet-26:80,464,432,400,0;","activityId":"1a6b35af-059d-43ea-850c-6f8ad112899a","formfactor":"0","immutability":"1","lastScreen":"0","location":"0","plugin":"org.kde.plasma.folder","wallpaperplugin":"org.kde.image"},"Containments][1][Applets][26":{"immutability":"1","plugin":"org.kde.plasma_applet_dict"},"Containments][1][Applets][26][Configuration][ConfigDialog":{"DialogHeight":"539","DialogWidth":"719"},"Containments][1][Applets][26][Configuration][General":{"dictionary":"all,fd-eng-rus"},"Containments][1][General":{"ToolBoxButtonState":"topcenter","ToolBoxButtonX":"360","positions":"{\"1707x960\":[]}","sortMode":"-1"},"Containments][2":{"activityId":"","formfactor":"2","immutability":"1","lastScreen":"0","location":"4","plugin":"org.kde.panel","wallpaperplugin":"org.kde.image"},"Containments][2][Applets][18":{"immutability":"1","plugin":"org.kde.plasma.digitalclock"},"Containments][2][Applets][18][Configuration":{"PreloadWeight":"100","popupHeight":"450","popupWidth":"396"},"Containments][2][Applets][18][Configuration][Appearance":{"dateFormat":"isoDate"},"Containments][2][Applets][18][Configuration][ConfigDialog":{"DialogHeight":"539","DialogWidth":"719"},"Containments][2][Applets][19":{"immutability":"1","plugin":"org.kde.plasma.showdesktop"},"Containments][2][Applets][27":{"immutability":"1","plugin":"org.kde.plasma.colorpicker"},"Containments][2][Applets][27][Configuration":{"PreloadWeight":"60"},"Containments][2][Applets][27][Configuration][General":{"history":"#001e08,#001d06,#ff0000,#ffff00,#0080fe,#f30101,#01f301,#ff8040"},"Containments][2][Applets][3":{"immutability":"1","plugin":"org.kde.plasma.kickoff"},"Containments][2][Applets][3][Configuration":{"PreloadWeight":"100","popupHeight":"514","popupWidth":"645"},"Containments][2][Applets][3][Configuration][ConfigDialog":{"DialogHeight":"539","DialogWidth":"719"},"Containments][2][Applets][3][Configuration][General":{"favoritesPortedToKAstats":"true"},"Containments][2][Applets][3][Configuration][Shortcuts":{"global":"Alt+F1"},"Containments][2][Applets][3][Shortcuts":{"global":"Alt+F1"},"Containments][2][Applets][4":{"immutability":"1","plugin":"org.kde.plasma.pager"},"Containments][2][Applets][5":{"immutability":"1","plugin":"org.kde.plasma.icontasks"},"Containments][2][Applets][5][Configuration][General":{"launchers":"applications:systemsettings.desktop,applications:org.kde.discover.desktop,preferred://filemanager,preferred://browser,applications:com.discordapp.Discord.desktop,applications:sublime_text.desktop,applications:sublime_merge.desktop,applications:org.kde.konsole.desktop"},"Containments][2][Applets][6":{"immutability":"1","plugin":"org.kde.plasma.marginsseparator"},"Containments][2][Applets][7":{"immutability":"1","plugin":"org.kde.plasma.systemtray"},"Containments][2][Applets][7][Configuration":{"PreloadWeight":"100","SystrayContainmentId":"8"},"Containments][2][ConfigDialog":{"DialogHeight":"84","DialogWidth":"1707"},"Containments][2][General":{"AppletOrder":"3;4;5;6;27;7;18;19"},"Containments][23":{"ItemGeometries-1280x720":"","ItemGeometriesHorizontal":"","activityId":"1a6b35af-059d-43ea-850c-6f8ad112899a","formfactor":"0","immutability":"1","lastScreen":"1","location":"0","plugin":"org.kde.plasma.folder","wallpaperplugin":"org.kde.image"},"Containments][28":{"ItemGeometries-0x0":"","ItemGeometriesHorizontal":"","activityId":"00000000-0000-0000-0000-000000000000","formfactor":"0","immutability":"1","lastScreen":"0","location":"0","plugin":"org.kde.plasma.folder","wallpaperplugin":"org.kde.image"},"Containments][8":{"activityId":"","formfactor":"2","immutability":"1","lastScreen":"0","location":"4","plugin":"org.kde.plasma.private.systemtray","popupHeight":"431","popupWidth":"431","wallpaperplugin":"org.kde.image"},"Containments][8][Applets][10":{"immutability":"1","plugin":"org.kde.plasma.vault"},"Containments][8][Applets][11":{"immutability":"1","plugin":"org.kde.plasma.manage-inputmethod"},"Containments][8][Applets][12":{"immutability":"1","plugin":"org.kde.plasma.clipboard"},"Containments][8][Applets][12][Configuration":{"PreloadWeight":"65"},"Containments][8][Applets][13":{"immutability":"1","plugin":"org.kde.plasma.keyboardindicator"},"Containments][8][Applets][14":{"immutability":"1","plugin":"org.kde.plasma.volume"},"Containments][8][Applets][14][Configuration":{"PreloadWeight":"100"},"Containments][8][Applets][14][Configuration][General":{"migrated":"true"},"Containments][8][Applets][15":{"immutability":"1","plugin":"org.kde.plasma.devicenotifier"},"Containments][8][Applets][15][Configuration":{"PreloadWeight":"80"},"Containments][8][Applets][16":{"immutability":"1","plugin":"org.kde.plasma.keyboardlayout"},"Containments][8][Applets][16][Configuration][ConfigDialog":{"DialogHeight":"539","DialogWidth":"719"},"Containments][8][Applets][16][Configuration][General":{"displayStyle":"LabelOverFlag"},"Containments][8][Applets][17":{"immutability":"1","plugin":"org.kde.plasma.notifications"},"Containments][8][Applets][17][Configuration":{"PreloadWeight":"90"},"Containments][8][Applets][20":{"immutability":"1","plugin":"org.kde.plasma.battery"},"Containments][8][Applets][20][Configuration":{"PreloadWeight":"100"},"Containments][8][Applets][20][Configuration][General":{"showPercentage":"true"},"Containments][8][Applets][21":{"immutability":"1","plugin":"org.kde.plasma.networkmanagement"},"Containments][8][Applets][21][Configuration":{"PreloadWeight":"100"},"Containments][8][Applets][22":{"immutability":"1","plugin":"org.kde.plasma.bluetooth"},"Containments][8][Applets][22][Configuration":{"PreloadWeight":"100"},"Containments][8][Applets][23":{"immutability":"1","plugin":"org.kde.plasma.mediacontroller"},"Containments][8][Applets][23][Configuration":{"PreloadWeight":"0"},"Containments][8][Applets][24":{"immutability":"1","plugin":"org.kde.kdeconnect"},"Containments][8][Applets][9":{"immutability":"1","plugin":"org.kde.plasma.nightcolorcontrol"},"Containments][8][General":{"extraItems":"org.kde.plasma.nightcolorcontrol,org.kde.plasma.vault,org.kde.plasma.battery,org.kde.plasma.networkmanagement,org.kde.plasma.manage-inputmethod,org.kde.plasma.clipboard,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.plasma.volume,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.keyboardlayout,org.kde.plasma.notifications,org.kde.kdeconnect","knownItems":"org.kde.plasma.nightcolorcontrol,org.kde.plasma.vault,org.kde.plasma.battery,org.kde.plasma.networkmanagement,org.kde.plasma.manage-inputmethod,org.kde.plasma.clipboard,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.plasma.volume,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.keyboardlayout,org.kde.plasma.notifications,org.kde.kdeconnect"},"ScreenMapping":{"itemsOnDisabledScreens":"","screenMapping":""}}

@ratijas
Copy link
Author

ratijas commented Dec 22, 2022

For the reference, here is the source code of KDE KConfig parser: https://github.com/KDE/kconfig/blob/master/src/core/kconfigini.cpp

@kellyjonbrazil
Copy link
Owner

Hi @ratijas! Thanks for the parser suggestion. This may be tough for me to do by hand, but there may be a python library that handles this case that I can use. Or perhaps the KConfig parser code you linked to can give me a clue.

I suspect this would be a separate parser - either a KConfig-specific parser, or an INI-nested parser if is something used more generally.

It sorta looks like TOML, but not quite.

@ratijas
Copy link
Author

ratijas commented Dec 24, 2022

Existing parsers may take arguments, don't they? I'm not a KConfig expert, and I'm not sure whether this is such a unique feature for ini files.

I'd expect it to be just a simple nested object merging though.

@muescha muescha mentioned this issue Feb 3, 2024
4 tasks
@muescha
Copy link
Contributor

muescha commented Feb 3, 2024

can it be done in process that goes through the keys and split the keys by ][ and then create a dict with the subkeys?

I have done a draft at:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants