From deec1b9b97011d1a0ef7312c0a3efde21186b82d Mon Sep 17 00:00:00 2001 From: Tomohito Nakayama Date: Thu, 1 Aug 2019 23:04:39 +0900 Subject: [PATCH] Implement function convertLineEndingsToNative in blob.ts (#2695) based on https://w3c.github.io/FileAPI/#convert-line-endings-to-native --- js/blob.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++--- js/blob_test.ts | 9 +++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/js/blob.ts b/js/blob.ts index 7b4d23c4..f2668b64 100644 --- a/js/blob.ts +++ b/js/blob.ts @@ -2,13 +2,57 @@ import * as domTypes from "./dom_types"; import { containsOnlyASCII, hasOwnProperty } from "./util"; import { TextEncoder } from "./text_encoding"; +import { build } from "./build"; export const bytesSymbol = Symbol("bytes"); function convertLineEndingsToNative(s: string): string { - // TODO(qti3e) Implement convertLineEndingsToNative. - // https://w3c.github.io/FileAPI/#convert-line-endings-to-native - return s; + let nativeLineEnd = build.os == "win" ? "\r\n" : "\n"; + + let position = 0; + + let collectionResult = collectSequenceNotCRLF(s, position); + + let token = collectionResult.collected; + position = collectionResult.newPosition; + + let result = token; + + while (position < s.length) { + let c = s.charAt(position); + if (c == "\r") { + result += nativeLineEnd; + position++; + if (position < s.length && s.charAt(position) == "\n") { + position++; + } + } else if (c == "\n") { + position++; + result += nativeLineEnd; + } + + collectionResult = collectSequenceNotCRLF(s, position); + + token = collectionResult.collected; + position = collectionResult.newPosition; + + result += token; + } + + return result; +} + +function collectSequenceNotCRLF( + s: string, + position: number +): { collected: string; newPosition: number } { + const start = position; + for ( + let c = s.charAt(position); + position < s.length && !(c == "\r" || c == "\n"); + c = s.charAt(++position) + ); + return { collected: s.slice(start, position), newPosition: position }; } function toUint8Arrays( diff --git a/js/blob_test.ts b/js/blob_test.ts index b11a22f3..7fc7db1e 100644 --- a/js/blob_test.ts +++ b/js/blob_test.ts @@ -50,4 +50,13 @@ test(function blobShouldNotThrowError(): void { assertEquals(hasThrown, false); }); +test(function nativeEndLine(): void { + const options: object = { + ending: "native" + }; + let blob = new Blob(["Hello\nWorld"], options); + + assertEquals(blob.size, Deno.build.os === "win" ? 12 : 11); +}); + // TODO(qti3e) Test the stored data in a Blob after implementing FileReader API. -- GitLab