Skip to content

Commit

Permalink
Add safe parameter to base64.encodeMime (#20559)
Browse files Browse the repository at this point in the history
* Improve `encodeMime` signature

* `string` to `openArray[char or byte]`
* `safe` parameter

* Fix

* Revert "Fix"

This reverts commit a394c50.

* Remove encodeMime's openArray overload

* Document the `safe` parameter

* Add changelog entry
  • Loading branch information
AmjadHD authored Oct 21, 2022
1 parent 1db25ff commit 5b195ab
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 3 deletions.
1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@
`toggleAttribute`, and `matches` to `std/dom`.
- Added [`jsre.hasIndices`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/hasIndices)
- Added `capacity` for `string` and `seq` to return the current capacity, see https://github.com/nim-lang/RFCs/issues/460
- Added `safe` parameter to `base64.encodeMime`

[//]: # "Deprecations:"
- Deprecated `selfExe` for Nimscript.
Expand Down
14 changes: 11 additions & 3 deletions lib/pure/base64.nim
Original file line number Diff line number Diff line change
Expand Up @@ -161,15 +161,23 @@ proc encode*[T: byte|char](s: openArray[T], safe = false): string =
assert encode([1'u8, 2, 3, 4, 5]) == "AQIDBAU="
encodeImpl()

proc encode*[T: SomeInteger and not byte](s: openArray[T], safe = false): string {.deprecated: "use `byte` or `char` instead".} =
proc encode*[T: SomeInteger and not byte](s: openArray[T], safe = false): string
{.deprecated: "use `byte` or `char` instead".} =
encodeImpl()

proc encodeMime*(s: string, lineLen = 75.Positive, newLine = "\r\n"): string =
proc encodeMime*(s: string, lineLen = 75.Positive, newLine = "\r\n",
safe = false): string =
## Encodes `s` into base64 representation as lines.
## Used in email MIME format, use `lineLen` and `newline`.
##
## This procedure encodes a string according to MIME spec.
##
## If `safe` is `true` then it will encode using the
## URL-Safe and Filesystem-safe standard alphabet characters,
## which substitutes `-` instead of `+` and `_` instead of `/`.
## * https://en.wikipedia.org/wiki/Base64#URL_applications
## * https://tools.ietf.org/html/rfc4648#page-7
##
## **See also:**
## * `encode proc<#encode,openArray[T]>`_ for encoding an openArray
## * `decode proc<#decode,string>`_ for decoding a string
Expand All @@ -183,7 +191,7 @@ proc encodeMime*(s: string, lineLen = 75.Positive, newLine = "\r\n"): string =
inc idx

if s.len == 0: return
let e = encode(s)
let e = encode(s, safe)
if e.len <= lineLen or newLine.len == 0:
return e
result = newString(e.len + newLine.len * ((e.len div lineLen) - int(e.len mod lineLen == 0)))
Expand Down

0 comments on commit 5b195ab

Please sign in to comment.