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"
}
]
}
}