// Copyright (C) 2024 Vaughn Nugent
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
using System;
using System.IO;
using System.Text.Json;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using VNLib.Utils.IO;
using SimpleBookmark.Model;
namespace SimpleBookmark
{
internal static partial class ImportExportUtil
{
///
/// Exports a colletion of bookmarks to a netscape bookmark file
///
/// The bookmark collection to export
/// The bookmark output stream to write data to
public static void ExportToNetscapeFile(IEnumerable bookmarks, Stream outputStream)
{
using VnStreamWriter writer = new(outputStream, System.Text.Encoding.UTF8, 1024)
{
NewLine = "\r\n"
};
writer.WriteLine("");
writer.WriteLine("");
writer.WriteLine("Bookmarks");
writer.WriteLine("Bookmarks
");
writer.WriteLine("");
//Add each bookmark
foreach (BookmarkEntry entry in bookmarks)
{
writer.Write("
- ");
writer.Write(entry.Name);
writer.WriteLine("");
//description
writer.Write("
- ");
writer.WriteLine(entry.Description);
}
//Close document
writer.WriteLine("
");
writer.Flush();
}
//Remove illegal characters from a string, ", \, and control characters
private static readonly Regex _illegalChars = GetIllegalCharsReg();
private static string? Escape(string? input)
{
return input is null ? null : _illegalChars.Replace(input, "");
}
public static void ExportAsCsv(IEnumerable bookmarks, Stream outputStream)
{
using VnStreamWriter writer = new(outputStream, System.Text.Encoding.UTF8, 1024)
{
NewLine = "\r\n"
};
//Write header
writer.WriteLine("Name,Url,Description,Tags,Created,LastModified");
//Write each bookmark
foreach (BookmarkEntry entry in bookmarks)
{
//User params must be escaped with double quotes
writer.Write("\"");
writer.Write(Escape(entry.Name));
writer.Write("\",\"");
writer.Write(Escape(entry.Url));
writer.Write("\",\"");
writer.Write(Escape(entry.Description));
writer.Write("\",\"");
writer.Write(Escape(entry.Tags));
writer.Write("\",");
writer.Write(new DateTimeOffset(entry.Created).ToUnixTimeSeconds());
writer.Write(",");
writer.Write(new DateTimeOffset(entry.LastModified).ToUnixTimeSeconds());
writer.WriteLine();
}
writer.Flush();
}
public static void ExportAsJson(IEnumerable bookmarks, Stream outputStream)
{
using Utf8JsonWriter writer = new(outputStream, default);
writer.WriteStartArray();
foreach (BookmarkEntry entry in bookmarks)
{
writer.WriteStartObject();
writer.WriteString("Name", entry.Name);
writer.WriteString("Url", entry.Url);
writer.WriteString("Description", entry.Description);
writer.WriteString("Tags", entry.Tags);
writer.WriteNumber("Created", new DateTimeOffset(entry.Created).ToUnixTimeSeconds());
writer.WriteNumber("LastModified", new DateTimeOffset(entry.LastModified).ToUnixTimeSeconds());
writer.WriteEndObject();
}
writer.WriteEndArray();
}
[GeneratedRegex("[\"\\p{Cc}]", RegexOptions.Compiled)]
private static partial Regex GetIllegalCharsReg();
}
}