diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index b520f22..66fddf1 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,5 +1,6 @@ +github: xuri patreon: xuri ko_fi: xurime liberapay: xuri issuehunt: xuri -custom: https://www.paypal.me/xuri +custom: https://www.paypal.com/paypalme/xuri \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e227250..edef9a3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -35,7 +35,7 @@ Briefly describe the problem you are having in a few paragraphs. (paste your output here) ``` -**EFP version or commit ID:** +**NFP version or commit ID:** ```text (paste here) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 7c33a97..a92b75c 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,17 +1,17 @@ name: Go -on: push +on: [push, pull_request] jobs: test: strategy: matrix: - go-version: [1.12.x, 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x, 1.18.x] + go-version: [1.12.x, 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x, 1.18.x, 1.19.x, 1.20.x, 1.21.x] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} id: go @@ -30,9 +30,8 @@ jobs: run: go test -v -race -coverprofile=coverage.txt -covermode=atomic ./... - name: Codecov - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v3 with: - token: ${{secrets.CODECOV_TOKEN}} file: coverage.txt flags: unittests name: codecov-umbrella diff --git a/nfp.go b/nfp.go index 043b0c8..ba3b020 100644 --- a/nfp.go +++ b/nfp.go @@ -261,18 +261,19 @@ func (ps *Parser) getTokens() Tokens { if ps.Token.TType == TokenTypeCurrencyLanguage { if ps.currentChar() != Dash && ps.currentChar() != BracketClose { if len(ps.Token.Parts) == 0 { - ps.Token.Parts = append(ps.Token.Parts, Part{Token: Token{TType: TokenSubTypeLanguageInfo}}) + ps.Token.Parts = append(ps.Token.Parts, Part{Token: Token{TType: TokenSubTypeCurrencyString}}) } ps.Token.Parts[len(ps.Token.Parts)-1].Token.TValue += ps.currentChar() } - if ps.currentChar() == Dash { - if len(ps.Token.Parts) == 1 { - ps.Token.Parts[0].Token.TType = TokenSubTypeCurrencyString - } - if len(ps.Token.Parts) == 1 { + if ps.currentChar() == Dash && ps.nextChar() != BracketClose { + if l := len(ps.Token.Parts); l == 0 { ps.Token.Parts = append(ps.Token.Parts, Part{Token: Token{TType: TokenSubTypeLanguageInfo}}) - } else if len(ps.Token.Parts) > 1 { - ps.Token.Parts[1].Token.TValue += ps.currentChar() + } else { + if ps.Token.Parts[0].Token.TType != TokenSubTypeLanguageInfo && ps.Token.Parts[0].Token.TValue != "" { + ps.Token.Parts = append(ps.Token.Parts, Part{Token: Token{TType: TokenSubTypeLanguageInfo}}) + } else { + ps.Token.Parts[l-1].Token.TValue += ps.currentChar() + } } } if ps.currentChar() == Comma { diff --git a/nfp_test.go b/nfp_test.go index 2cfa730..2cbe017 100644 --- a/nfp_test.go +++ b/nfp_test.go @@ -53,7 +53,7 @@ var testStrings [][]string = [][]string{ {"@", "[{Text [{@ TextPlaceHolder []}]}]"}, {`**x`, "[{Positive [{* RepeatsChar []} {x Literal []}]}]"}, {`[$-]`, "[{Positive [{[$-] CurrencyLanguage []}]}]"}, - {"[$-ja-JP-x-gannen,80]", "[{Positive [{[$-ja-JP-x-gannen,80] CurrencyLanguage [{{ja CurrencyString []} } {{JP-x-gannen,80 LanguageInfo []} }]}]}]"}, + {"[$-ja-JP-x-gannen,80]", "[{Positive [{[$-ja-JP-x-gannen,80] CurrencyLanguage [{{ja-JP-x-gannen,80 LanguageInfo []} }]}]}]"}, {"x0.00", "[{Positive [{x Literal []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]}]"}, {"0.0bc00", "[{Positive [{0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []} {bc Literal []} {00 ZeroPlaceHolder []}]}]"}, {"x00", "[{Positive [{x Literal []} {00 ZeroPlaceHolder []}]}]"}, @@ -290,7 +290,7 @@ var testStrings [][]string = [][]string{ {`[$-D010000]d/mm/yyyy\ h:mm\ "น.";@`, "[{Positive [{[$-D010000] CurrencyLanguage [{{D010000 LanguageInfo []} }]} {d DateTimes []} {/ Literal []} {mm DateTimes []} {/ Literal []} {yyyy DateTimes []} { Literal []} {h DateTimes []} {: Literal []} {mm DateTimes []} { Literal []} {น. Literal []}]} {Text [{@ TextPlaceHolder []}]}]"}, {`[$-F400]h:mm:ss\ AM/PM`, "[{Positive [{[$-F400] CurrencyLanguage [{{F400 LanguageInfo []} }]} {h DateTimes []} {: Literal []} {mm DateTimes []} {: Literal []} {ss DateTimes []} { Literal []} {AM/PM DateTimes []}]}]"}, {`[$-F800]dddd\,\ mmmm\ dd\,\ yyyy`, "[{Positive [{[$-F800] CurrencyLanguage [{{F800 LanguageInfo []} }]} {dddd DateTimes []} {, Literal []} { Literal []} {mmmm DateTimes []} { Literal []} {dd DateTimes []} {, Literal []} { Literal []} {yyyy DateTimes []}]}]"}, - {`[$AUD]\ #,##0.00`, "[{Positive [{[$AUD] CurrencyLanguage [{{AUD LanguageInfo []} }]} { Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]}]"}, + {`[$AUD]\ #,##0.00`, "[{Positive [{[$AUD] CurrencyLanguage [{{AUD CurrencyString []} }]} { Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]}]"}, {`[$RD$-1C0A]#,##0.00;[Red]\-[$RD$-1C0A]#,##0.00`, "[{Positive [{[$RD$-1C0A] CurrencyLanguage [{{RD$ CurrencyString []} } {{1C0A LanguageInfo []} }]} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]} {Negative [{Red Color []} {- Literal []} {[$RD$-1C0A] CurrencyLanguage [{{RD$ CurrencyString []} } {{1C0A LanguageInfo []} }]} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]}]"}, {`[$SFr.-810]\ #,##0.00_);[Red]\([$SFr.-810]\ #,##0.00\)`, "[{Positive [{[$SFr.-810] CurrencyLanguage [{{SFr. CurrencyString []} } {{810 LanguageInfo []} }]} { Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]} {Negative [{Red Color []} {( Literal []} {[$SFr.-810] CurrencyLanguage [{{SFr. CurrencyString []} } {{810 LanguageInfo []} }]} { Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []} {) Literal []}]}]"}, {`[$£-809]#,##0.00;[Red][$£-809]#,##0.00`, "[{Positive [{[$£-809] CurrencyLanguage [{{£ CurrencyString []} } {{809 LanguageInfo []} }]} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]} {Negative [{Red Color []} {[$£-809] CurrencyLanguage [{{£ CurrencyString []} } {{809 LanguageInfo []} }]} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]}]"}, @@ -419,7 +419,7 @@ var testStrings [][]string = [][]string{ {`_(* #,##0.0_);_(* \(#,##0.0\);_(* "-"??_);_(@_)`, "[{Positive [{ RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []}]} {Negative [{ RepeatsChar []} {( Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []} {) Literal []}]} {Zero [{ RepeatsChar []} {- Literal []} {?? DigitalPlaceHolder []}]} {Text [{@ TextPlaceHolder []}]}]"}, {`_(* #,##0_);_(* \(#,##0\);_(* "-"??_);_(@_)`, "[{Positive [{ RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []}]} {Negative [{ RepeatsChar []} {( Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {) Literal []}]} {Zero [{ RepeatsChar []} {- Literal []} {?? DigitalPlaceHolder []}]} {Text [{@ TextPlaceHolder []}]}]"}, {`_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)`, "[{Positive [{ RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []}]} {Negative [{ RepeatsChar []} {( Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {) Literal []}]} {Zero [{ RepeatsChar []} {- Literal []}]} {Text [{@ TextPlaceHolder []}]}]"}, - {`_([$ANG]\ * #,##0.0_);_([$ANG]\ * \(#,##0.0\);_([$ANG]\ * "-"?_);_(@_)`, "[{Positive [{[$ANG] CurrencyLanguage [{{ANG LanguageInfo []} }]} { Literal []} { RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []}]} {Negative [{[$ANG] CurrencyLanguage [{{ANG LanguageInfo []} }]} { Literal []} { RepeatsChar []} {( Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []} {) Literal []}]} {Zero [{[$ANG] CurrencyLanguage [{{ANG LanguageInfo []} }]} { Literal []} { RepeatsChar []} {- Literal []} {? DigitalPlaceHolder []}]} {Text [{@ TextPlaceHolder []}]}]"}, + {`_([$ANG]\ * #,##0.0_);_([$ANG]\ * \(#,##0.0\);_([$ANG]\ * "-"?_);_(@_)`, "[{Positive [{[$ANG] CurrencyLanguage [{{ANG CurrencyString []} }]} { Literal []} { RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []}]} {Negative [{[$ANG] CurrencyLanguage [{{ANG CurrencyString []} }]} { Literal []} { RepeatsChar []} {( Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {0 ZeroPlaceHolder []} {) Literal []}]} {Zero [{[$ANG] CurrencyLanguage [{{ANG CurrencyString []} }]} { Literal []} { RepeatsChar []} {- Literal []} {? DigitalPlaceHolder []}]} {Text [{@ TextPlaceHolder []}]}]"}, {`_-"€"\ * #,##0.00_-;_-"€"\ * #,##0.00\-;_-"€"\ * "-"??_-;_-@_-`, "[{Positive [{€ Literal []} { Literal []} { RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]} {Negative [{€ Literal []} { Literal []} { RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []} {- Literal []}]} {Zero [{€ Literal []} { Literal []} { RepeatsChar []} {- Literal []} {?? DigitalPlaceHolder []}]} {Text [{@ TextPlaceHolder []}]}]"}, {`_-* #,##0.00" TL"_-;\-* #,##0.00" TL"_-;_-* \-??" TL"_-;_-@_-`, "[{Positive [{ RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []} { TL Literal []}]} {Negative [{- Literal []} { RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []} { TL Literal []}]} {Zero [{ RepeatsChar []} {- Literal []} {?? DigitalPlaceHolder []} { TL Literal []}]} {Text [{@ TextPlaceHolder []}]}]"}, {`_-* #,##0.00" €"_-;\-* #,##0.00" €"_-;_-* \-??" €"_-;_-@_-`, "[{Positive [{ RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []} { € Literal []}]} {Negative [{- Literal []} { RepeatsChar []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []} { € Literal []}]} {Zero [{ RepeatsChar []} {- Literal []} {?? DigitalPlaceHolder []} { € Literal []}]} {Text [{@ TextPlaceHolder []}]}]"}, @@ -523,7 +523,8 @@ var testStrings [][]string = [][]string{ {`yyyy\-mm\-dd\ h:mm`, "[{Positive [{yyyy DateTimes []} {- Literal []} {mm DateTimes []} {- Literal []} {dd DateTimes []} { Literal []} {h DateTimes []} {: Literal []} {mm DateTimes []}]}]"}, {`yyyy\-mm\-dd\Thh:mm`, "[{Positive [{yyyy DateTimes []} {- Literal []} {mm DateTimes []} {- Literal []} {dd DateTimes []} {T Literal []} {hh DateTimes []} {: Literal []} {mm DateTimes []}]}]"}, {`yyyy\-mm\-dd\Thhmmss.000`, "[{Positive [{yyyy DateTimes []} {- Literal []} {mm DateTimes []} {- Literal []} {dd DateTimes []} {T Literal []} {hh DateTimes []} {mm DateTimes []} {ss DateTimes []} {. DecimalPoint []} {000 ZeroPlaceHolder []}]}]"}, - {`[DBNum1][$-zh-CN]h"时"mm"分";"====="@@@"--"@"----"`, "[{Positive [{[DBNum1] SwitchArgument []} {[$-zh-CN] CurrencyLanguage [{{zh CurrencyString []} } {{CN LanguageInfo []} }]} {h DateTimes []} {时 Literal []} {mm DateTimes []} {分 Literal []}]} {Text [{===== Literal []} {@ TextPlaceHolder []} {@ TextPlaceHolder []} {@ TextPlaceHolder []} {-- Literal []} {@ TextPlaceHolder []} {---- Literal []}]}]"}, + {`[DBNum1][$-zh-CN]h"时"mm"分";"====="@@@"--"@"----"`, "[{Positive [{[DBNum1] SwitchArgument []} {[$-zh-CN] CurrencyLanguage [{{zh-CN LanguageInfo []} }]} {h DateTimes []} {时 Literal []} {mm DateTimes []} {分 Literal []}]} {Text [{===== Literal []} {@ TextPlaceHolder []} {@ TextPlaceHolder []} {@ TextPlaceHolder []} {-- Literal []} {@ TextPlaceHolder []} {---- Literal []}]}]"}, + {"[$ZWR]\\ #,##0.00", "[{Positive [{[$ZWR] CurrencyLanguage [{{ZWR CurrencyString []} }]} { Literal []} {# HashPlaceHolder []} {, ThousandsSeparator []} {## HashPlaceHolder []} {0 ZeroPlaceHolder []} {. DecimalPoint []} {00 ZeroPlaceHolder []}]}]"}, } func TestNFP(t *testing.T) {