Kotlinに対応する色に変換したいXMLカラーファイルがあります。この入力ファイルが与えられると
color.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<!-- Color Scheme -->
<color name="primary">#YYYYYY</color>
<color name="primary_variant">#ZZZZZZ</color>
...
</resources>
これが私が探している結果です
color.kt
// Color Scheme
val primary = Color(0xFFYYYYYY)
val primaryVariant = Color(0xFFZZZZZZ)
...
これを行うためにPythonスクリプトを書いたが、まだ熟練していないシェルソリューションの複雑さの違いに興味があります。
具体的に私が探しているものは次のとおりです。
- コメントはKotlinのコメントにマップされます。
- 改行は維持しますが、インデントは維持しません。
- snake_caseからcamelCaseに変換された変数名
答え1
XML文書が与えられると
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<!-- Color Scheme -->
<color name="primary">#YYYYYY</color>
<color name="primary_variant">#ZZZZZZ</color>
<color name="primary_variant">#ZZZZZZ</color>
<color name="primary_variant_old">#ZZZZZZ</color>
<color name="primary_variant_new">#ZZZZZZ</color>
</resources>
では、ユーティリティを使用して次のように目的の出力を取得file.xml
できます。xq
xq -r '.resources.color[] |
"val " +
( ."@name" | gsub("_(?<a>.)"; .a | ascii_upcase) ) +
" = Color(" +
( ."#text" | sub("#"; "0xFF") ) +
")"' file.xml
それとも読みやすく、
xq -r '.resources.color[] |
[ ( ."@name" | gsub("_(?<a>.)"; .a | ascii_upcase) ),
( ."#text" | sub("#"; "0xFF") ) ] |
"val " + .[0] + " = Color(" + .[1] + ")"' file.xml
これにより、各カラーアイテムが選択され、変更された属性name
とcolor
ノード値が後続の出力文字列に挿入されます。
属性は、各(文字がある場所)を(大文字)に変換してname
camelCaseに変換されます。これにより、ノード値がに置き換えられます。_x
x
X
x
color
#
0xFF
これは出力されます
val primary = Color(0xFFYYYYYY)
val primaryVariant = Color(0xFFZZZZZZ)
val primaryVariant = Color(0xFFZZZZZZ)
val primaryVariantOld = Color(0xFFZZZZZZ)
val primaryVariantNew = Color(0xFFZZZZZZ)
このxq
ユーティリティはXMLをJSONに変換するツールです。これにより、このツールはxq
よく知られているJSONパーサーjq
のラッパーになるため、jq
式を使用してXML文書構造を変更したり、一般的に使用したりできます。これはユーティリティ配布yq
(元のYAMLパーサーラッパーjq
)の一部であり、次の場所にあります。https://kislyuk.github.io/yq/ (Linuxでyq
利用可能なユーティリティsnap
もYAMLパーサーですが、まったく異なるツールです!)
xq
他のほとんどのパーサーと同様に、パーサーはコメントを削除します。
xq
ちなみに、上記のXMLを変換したJSONドキュメントは次のとおりです。
{
"resources": {
"color": [
{
"@name": "primary",
"#text": "#YYYYYY"
},
{
"@name": "primary_variant",
"#text": "#ZZZZZZ"
},
{
"@name": "primary_variant",
"#text": "#ZZZZZZ"
},
{
"@name": "primary_variant_old",
"#text": "#ZZZZZZ"
},
{
"@name": "primary_variant_new",
"#text": "#ZZZZZZ"
}
]
}
}