Compare commits

..

1 Commits

Author SHA1 Message Date
Copilot
820c419380
Merge 6d345ac795 into 17f66dc6c6 2026-03-27 10:12:58 +00:00
4 changed files with 15 additions and 41 deletions

View File

@ -110,11 +110,11 @@ country: Australia
``` ```
then then
```bash ```bash
yq '.country[0:5]' sample.yml yq '.country[4:]' sample.yml
``` ```
will output will output
```yaml ```yaml
Austr ralia
``` ```
## Slicing strings - without the second number ## Slicing strings - without the second number
@ -126,11 +126,11 @@ country: Australia
``` ```
then then
```bash ```bash
yq '.country[5:]' sample.yml yq '.country[0:5]' sample.yml
``` ```
will output will output
```yaml ```yaml
alia Austr
``` ```
## Slicing strings - without the first number ## Slicing strings - without the first number

View File

@ -16,7 +16,7 @@ func getSliceNumber(d *dataTreeNavigator, context Context, node *CandidateNode,
return parseInt(result.MatchingNodes.Front().Value.(*CandidateNode).Value) return parseInt(result.MatchingNodes.Front().Value.(*CandidateNode).Value)
} }
func sliceStringNode(lhsNode *CandidateNode, firstNumber int, secondNumber int) *CandidateNode { func sliceStringNode(lhsNode *CandidateNode, firstNumber int, secondNumber int) (*CandidateNode, error) {
runes := []rune(lhsNode.Value) runes := []rune(lhsNode.Value)
length := len(runes) length := len(runes)
@ -45,9 +45,7 @@ func sliceStringNode(lhsNode *CandidateNode, firstNumber int, secondNumber int)
} }
slicedString := string(runes[relativeFirstNumber:relativeSecondNumber]) slicedString := string(runes[relativeFirstNumber:relativeSecondNumber])
replacement := lhsNode.CreateReplacement(ScalarNode, lhsNode.Tag, slicedString) return lhsNode.CreateReplacement(ScalarNode, "!!str", slicedString), nil
replacement.Style = lhsNode.Style
return replacement
} }
func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
@ -72,7 +70,11 @@ func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *E
} }
if lhsNode.Kind == ScalarNode && lhsNode.guessTagFromCustomType() == "!!str" { if lhsNode.Kind == ScalarNode && lhsNode.guessTagFromCustomType() == "!!str" {
results.PushBack(sliceStringNode(lhsNode, firstNumber, secondNumber)) slicedNode, err := sliceStringNode(lhsNode, firstNumber, secondNumber)
if err != nil {
return Context{}, err
}
results.PushBack(slicedNode)
continue continue
} }
@ -80,24 +82,13 @@ func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *E
if relativeFirstNumber < 0 { if relativeFirstNumber < 0 {
relativeFirstNumber = len(lhsNode.Content) + firstNumber relativeFirstNumber = len(lhsNode.Content) + firstNumber
} }
if relativeFirstNumber < 0 {
relativeFirstNumber = 0
} else if relativeFirstNumber > len(lhsNode.Content) {
relativeFirstNumber = len(lhsNode.Content)
}
relativeSecondNumber := secondNumber relativeSecondNumber := secondNumber
if relativeSecondNumber < 0 { if relativeSecondNumber < 0 {
relativeSecondNumber = len(lhsNode.Content) + secondNumber relativeSecondNumber = len(lhsNode.Content) + secondNumber
}
if relativeSecondNumber < 0 {
relativeSecondNumber = 0
} else if relativeSecondNumber > len(lhsNode.Content) { } else if relativeSecondNumber > len(lhsNode.Content) {
relativeSecondNumber = len(lhsNode.Content) relativeSecondNumber = len(lhsNode.Content)
} }
if relativeSecondNumber < relativeFirstNumber {
relativeSecondNumber = relativeFirstNumber
}
log.Debugf("calculateIndicesToTraverse: slice from %v to %v", relativeFirstNumber, relativeSecondNumber) log.Debugf("calculateIndicesToTraverse: slice from %v to %v", relativeFirstNumber, relativeSecondNumber)

View File

@ -98,37 +98,21 @@ var sliceArrayScenarios = []expressionScenario{
"D0, P[], (!!seq)::- cat1\n", "D0, P[], (!!seq)::- cat1\n",
}, },
}, },
{
skipDoc: true,
document: `[cat, dog, frog]`,
expression: `.[-100:]`,
expected: []string{
"D0, P[], (!!seq)::- cat\n- dog\n- frog\n",
},
},
{
skipDoc: true,
document: `[cat, dog, frog]`,
expression: `.[:-100]`,
expected: []string{
"D0, P[], (!!seq)::[]\n",
},
},
{ {
description: "Slicing strings", description: "Slicing strings",
document: `country: Australia`, document: `country: Australia`,
expression: `.country[0:5]`, expression: `.country[4:]`,
expected: []string{ expected: []string{
"D0, P[country], (!!str)::Austr\n", "D0, P[country], (!!str)::ralia\n",
}, },
}, },
{ {
description: "Slicing strings - without the second number", description: "Slicing strings - without the second number",
subdescription: "Finishes at the end of the string", subdescription: "Finishes at the end of the string",
document: `country: Australia`, document: `country: Australia`,
expression: `.country[5:]`, expression: `.country[0:5]`,
expected: []string{ expected: []string{
"D0, P[country], (!!str)::alia\n", "D0, P[country], (!!str)::Austr\n",
}, },
}, },
{ {

View File

@ -303,4 +303,3 @@ ralia
Austr Austr
ustrali ustrali
héllo héllo
alia