|\n"#).unwrap();
- static ref UNPRINTABLE_TAGS: Regex = Regex::new(
- r"(?xs)
- \[sound:[^]]+\]
- |
- \[\[type:[^]]+\]\]
- ").unwrap();
+ static ref TYPE_TAG: Regex = Regex::new(r"\[\[type:[^]]+\]\]").unwrap();
+ static ref SOUND_TAG: Regex = Regex::new(r"\[sound:([^]]+)\]").unwrap();
/// Files included in CSS with a leading underscore.
static ref UNDERSCORED_CSS_IMPORTS: Regex = Regex::new(
@@ -172,19 +168,21 @@ lazy_static! {
"#).unwrap();
}
-pub fn is_html(text: &str) -> bool {
- HTML.is_match(text)
+pub fn is_html(text: impl AsRef
) -> bool {
+ HTML.is_match(text.as_ref())
}
pub fn html_to_text_line(html: &str, preserve_media_filenames: bool) -> Cow {
+ let (html_stripper, sound_rep): (fn(&str) -> Cow, _) = if preserve_media_filenames {
+ (strip_html_preserving_media_filenames, "$1")
+ } else {
+ (strip_html, "")
+ };
PERSISTENT_HTML_SPACERS
.replace_all(html, " ")
- .map_cow(|s| UNPRINTABLE_TAGS.replace_all(s, ""))
- .map_cow(if preserve_media_filenames {
- strip_html_preserving_media_filenames
- } else {
- strip_html
- })
+ .map_cow(|s| TYPE_TAG.replace_all(s, ""))
+ .map_cow(|s| SOUND_TAG.replace_all(s, sound_rep))
+ .map_cow(html_stripper)
.trim()
}
@@ -330,16 +328,9 @@ pub(crate) fn extract_underscored_references(text: &str) -> Vec<&str> {
}
pub fn strip_html_preserving_media_filenames(html: &str) -> Cow {
- let without_fnames = HTML_MEDIA_TAGS.replace_all(html, r" ${1}${2}${3} ");
- let without_html = strip_html(&without_fnames);
- // no changes?
- if let Cow::Borrowed(b) = without_html {
- if ptr::eq(b, html) {
- return Cow::Borrowed(html);
- }
- }
- // make borrow checker happy
- without_html.into_owned().into()
+ HTML_MEDIA_TAGS
+ .replace_all(html, r" ${1}${2}${3} ")
+ .map_cow(strip_html)
}
#[allow(dead_code)]
diff --git a/ts/import-csv/FieldMapper.svelte b/ts/import-csv/FieldMapper.svelte
index 7ace7355d..4a80367f0 100644
--- a/ts/import-csv/FieldMapper.svelte
+++ b/ts/import-csv/FieldMapper.svelte
@@ -26,6 +26,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
/>
{/each}
{/await}
+
{/if}
-
diff --git a/ts/import-csv/ImportCsvPage.svelte b/ts/import-csv/ImportCsvPage.svelte
index ffbbc4195..9ce321142 100644
--- a/ts/import-csv/ImportCsvPage.svelte
+++ b/ts/import-csv/ImportCsvPage.svelte
@@ -8,7 +8,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import Row from "../components/Row.svelte";
import Spacer from "../components/Spacer.svelte";
import * as tr from "../lib/ftl";
- import { Decks, ImportExport, importExport, Notetypes } from "../lib/proto";
+ import {
+ Decks,
+ Generic,
+ ImportExport,
+ importExport,
+ Notetypes,
+ } from "../lib/proto";
import DeckSelector from "./DeckSelector.svelte";
import DelimiterSelector from "./DelimiterSelector.svelte";
import DupeResolutionSelector from "./DupeResolutionSelector.svelte";
@@ -17,6 +23,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import HtmlSwitch from "./HtmlSwitch.svelte";
import { getColumnOptions, getCsvMetadata } from "./lib";
import NotetypeSelector from "./NotetypeSelector.svelte";
+ import Preview from "./Preview.svelte";
import StickyFooter from "./StickyFooter.svelte";
import Tags from "./Tags.svelte";
@@ -32,6 +39,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export let updatedTags: string[];
export let columnLabels: string[];
export let tagsColumn: number;
+ export let guidColumn: number;
+ export let preview: Generic.StringList[];
// Protobuf oneofs. Exactly one of these pairs is expected to be set.
export let notetypeColumn: number | null;
export let globalNotetype: ImportExport.CsvMetadata.MappedNotetype | null;
@@ -41,9 +50,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
let dupeResolution: ImportExport.ImportCsvRequest.DupeResolution;
let lastNotetypeId = globalNotetype?.id;
- $: columnOptions = getColumnOptions(columnLabels, notetypeColumn, deckColumn);
- $: getCsvMetadata(path, delimiter).then((meta) => {
+ $: columnOptions = getColumnOptions(
+ columnLabels,
+ preview[0].vals,
+ notetypeColumn,
+ deckColumn,
+ tagsColumn,
+ guidColumn,
+ );
+ $: getCsvMetadata(path, delimiter, undefined, isHtml).then((meta) => {
columnLabels = meta.columnLabels;
+ preview = meta.preview;
});
$: if (globalNotetype?.id !== lastNotetypeId) {
lastNotetypeId = globalNotetype?.id;
@@ -66,6 +83,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
updatedTags,
columnLabels,
tagsColumn,
+ guidColumn,
notetypeColumn,
globalNotetype,
deckColumn,
@@ -78,6 +96,15 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
+
+
+
+
+
+
+
+
+
@@ -92,8 +119,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
{/if}
-
-
diff --git a/ts/import-csv/Preview.svelte b/ts/import-csv/Preview.svelte
new file mode 100644
index 000000000..5b476dd2d
--- /dev/null
+++ b/ts/import-csv/Preview.svelte
@@ -0,0 +1,65 @@
+
+
+
+
+
+ {#each columnOptions.slice(1) as { label, shortLabel }}
+
+ {shortLabel || label}
+ |
+ {/each}
+ {#each preview as row}
+
+ {#each row.vals as cell}
+ {cell} |
+ {/each}
+
+ {/each}
+
+
+
+
diff --git a/ts/import-csv/StickyFooter.svelte b/ts/import-csv/StickyFooter.svelte
index 49febd04b..3efc535ee 100644
--- a/ts/import-csv/StickyFooter.svelte
+++ b/ts/import-csv/StickyFooter.svelte
@@ -37,11 +37,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html