longdown 2024.4.13 → 2026.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -0
- package/lib/cli.js +4 -2
- package/lib/cljs-runtime/cljs.core.js +5658 -5658
- package/lib/cljs-runtime/cljs.core.js.map +1 -1
- package/lib/cljs-runtime/clojure.string.js +53 -53
- package/lib/cljs-runtime/clojure.string.js.map +1 -1
- package/lib/cljs-runtime/clojure.tools.cli.js +542 -542
- package/lib/cljs-runtime/clojure.tools.cli.js.map +1 -1
- package/lib/cljs-runtime/clojure.walk.js +21 -21
- package/lib/cljs-runtime/clojure.walk.js.map +1 -1
- package/lib/cljs-runtime/longdown.cli.js +73 -64
- package/lib/cljs-runtime/longdown.cli.js.map +1 -1
- package/lib/cljs-runtime/longdown.lib.js +140 -33
- package/lib/cljs-runtime/longdown.lib.js.map +1 -1
- package/lib/cljs-runtime/shadow.esm.esm_import$rehype_parse.js +5 -0
- package/lib/cljs-runtime/shadow.esm.esm_import$rehype_parse.js.map +9 -0
- package/lib/cljs-runtime/shadow.esm.esm_import$rehype_remark.js +5 -0
- package/lib/cljs-runtime/shadow.esm.esm_import$rehype_remark.js.map +9 -0
- package/lib/cljs-runtime/shadow.module.cli.prepend.js +4 -2
- package/package.json +6 -6
- package/lib/cljs-runtime/shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe.js +0 -5
- package/lib/cljs-runtime/shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe.js.map +0 -9
|
@@ -1,63 +1,67 @@
|
|
|
1
1
|
import "./cljs_env.js";
|
|
2
2
|
goog.provide('longdown.cli');
|
|
3
|
-
longdown.cli.cli_options = new cljs.core.PersistentVector(null,
|
|
3
|
+
longdown.cli.cli_options = new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, ["-d","--out-dir DIR","Output directory"], null),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [null,"--html","Read HTML input instead of markdown"], null),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [null,"--strip-highlights","Strip headers and leading bold formatting"], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["-h","--help"], null)], null);
|
|
4
4
|
longdown.cli.usage = (function longdown$cli$usage(options_summary){
|
|
5
5
|
return clojure.string.join.cljs$core$IFn$_invoke$arity$2("\n",new cljs.core.PersistentVector(null, 9, 5, cljs.core.PersistentVector.EMPTY_NODE, ["Convert longform markdown files to outline format used by Logseq","","Usage: longdown [options] file.md..."," longdown -","","When file is -, reads standard input and prints to standard output.","","Options:",options_summary], null));
|
|
6
6
|
});
|
|
7
|
-
longdown.cli.convert_files = (function longdown$cli$convert_files(out_dir,filenames){
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
7
|
+
longdown.cli.convert_files = (function longdown$cli$convert_files(out_dir,filenames,convert_fn){
|
|
8
|
+
var seq__21869 = cljs.core.seq(filenames);
|
|
9
|
+
var chunk__21870 = null;
|
|
10
|
+
var count__21871 = (0);
|
|
11
|
+
var i__21872 = (0);
|
|
12
12
|
while(true){
|
|
13
|
-
if((
|
|
14
|
-
var in_path =
|
|
15
|
-
var
|
|
16
|
-
shadow.esm.esm_import$node_fs.mkdirSync(shadow.esm.esm_import$node_path.dirname(
|
|
13
|
+
if((i__21872 < count__21871)){
|
|
14
|
+
var in_path = chunk__21870.cljs$core$IIndexed$_nth$arity$2(null,i__21872);
|
|
15
|
+
var out_path_21928 = shadow.esm.esm_import$node_path.join(out_dir,in_path);
|
|
16
|
+
shadow.esm.esm_import$node_fs.mkdirSync(shadow.esm.esm_import$node_path.dirname(out_path_21928),({"recursive": true}));
|
|
17
17
|
|
|
18
|
-
longdown.lib.spit(
|
|
18
|
+
longdown.lib.spit(out_path_21928,(function (){var G__21899 = longdown.lib.slurp(in_path);
|
|
19
|
+
return (convert_fn.cljs$core$IFn$_invoke$arity$1 ? convert_fn.cljs$core$IFn$_invoke$arity$1(G__21899) : convert_fn.call(null,G__21899));
|
|
20
|
+
})());
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
var G__21930 = seq__21869;
|
|
24
|
+
var G__21931 = chunk__21870;
|
|
25
|
+
var G__21932 = count__21871;
|
|
26
|
+
var G__21933 = (i__21872 + (1));
|
|
27
|
+
seq__21869 = G__21930;
|
|
28
|
+
chunk__21870 = G__21931;
|
|
29
|
+
count__21871 = G__21932;
|
|
30
|
+
i__21872 = G__21933;
|
|
29
31
|
continue;
|
|
30
32
|
} else {
|
|
31
|
-
var
|
|
32
|
-
if(
|
|
33
|
-
var
|
|
34
|
-
if(cljs.core.chunked_seq_QMARK_(
|
|
35
|
-
var c__5568__auto__ = cljs.core.chunk_first(
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
var
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
33
|
+
var temp__5825__auto__ = cljs.core.seq(seq__21869);
|
|
34
|
+
if(temp__5825__auto__){
|
|
35
|
+
var seq__21869__$1 = temp__5825__auto__;
|
|
36
|
+
if(cljs.core.chunked_seq_QMARK_(seq__21869__$1)){
|
|
37
|
+
var c__5568__auto__ = cljs.core.chunk_first(seq__21869__$1);
|
|
38
|
+
var G__21934 = cljs.core.chunk_rest(seq__21869__$1);
|
|
39
|
+
var G__21935 = c__5568__auto__;
|
|
40
|
+
var G__21936 = cljs.core.count(c__5568__auto__);
|
|
41
|
+
var G__21937 = (0);
|
|
42
|
+
seq__21869 = G__21934;
|
|
43
|
+
chunk__21870 = G__21935;
|
|
44
|
+
count__21871 = G__21936;
|
|
45
|
+
i__21872 = G__21937;
|
|
44
46
|
continue;
|
|
45
47
|
} else {
|
|
46
|
-
var in_path = cljs.core.first(
|
|
47
|
-
var
|
|
48
|
-
shadow.esm.esm_import$node_fs.mkdirSync(shadow.esm.esm_import$node_path.dirname(
|
|
48
|
+
var in_path = cljs.core.first(seq__21869__$1);
|
|
49
|
+
var out_path_21938 = shadow.esm.esm_import$node_path.join(out_dir,in_path);
|
|
50
|
+
shadow.esm.esm_import$node_fs.mkdirSync(shadow.esm.esm_import$node_path.dirname(out_path_21938),({"recursive": true}));
|
|
49
51
|
|
|
50
|
-
longdown.lib.spit(
|
|
52
|
+
longdown.lib.spit(out_path_21938,(function (){var G__21905 = longdown.lib.slurp(in_path);
|
|
53
|
+
return (convert_fn.cljs$core$IFn$_invoke$arity$1 ? convert_fn.cljs$core$IFn$_invoke$arity$1(G__21905) : convert_fn.call(null,G__21905));
|
|
54
|
+
})());
|
|
51
55
|
|
|
52
56
|
|
|
53
|
-
var
|
|
54
|
-
var
|
|
55
|
-
var
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
var G__21939 = cljs.core.next(seq__21869__$1);
|
|
58
|
+
var G__21940 = null;
|
|
59
|
+
var G__21941 = (0);
|
|
60
|
+
var G__21942 = (0);
|
|
61
|
+
seq__21869 = G__21939;
|
|
62
|
+
chunk__21870 = G__21940;
|
|
63
|
+
count__21871 = G__21941;
|
|
64
|
+
i__21872 = G__21942;
|
|
61
65
|
continue;
|
|
62
66
|
}
|
|
63
67
|
} else {
|
|
@@ -67,19 +71,21 @@ return null;
|
|
|
67
71
|
break;
|
|
68
72
|
}
|
|
69
73
|
});
|
|
70
|
-
longdown.cli.convert_from_stdin = (function longdown$cli$convert_from_stdin(){
|
|
71
|
-
return cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([clojure.string.trim_newline(
|
|
74
|
+
longdown.cli.convert_from_stdin = (function longdown$cli$convert_from_stdin(convert_fn){
|
|
75
|
+
return cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([clojure.string.trim_newline((function (){var G__21910 = longdown.lib.slurp(process.stdin.fd);
|
|
76
|
+
return (convert_fn.cljs$core$IFn$_invoke$arity$1 ? convert_fn.cljs$core$IFn$_invoke$arity$1(G__21910) : convert_fn.call(null,G__21910));
|
|
77
|
+
})())], 0));
|
|
72
78
|
});
|
|
73
79
|
longdown.cli._main = (function longdown$cli$_main(var_args){
|
|
74
80
|
var args__5775__auto__ = [];
|
|
75
|
-
var
|
|
76
|
-
var
|
|
81
|
+
var len__5769__auto___21945 = arguments.length;
|
|
82
|
+
var i__5770__auto___21946 = (0);
|
|
77
83
|
while(true){
|
|
78
|
-
if((
|
|
79
|
-
args__5775__auto__.push((arguments[
|
|
84
|
+
if((i__5770__auto___21946 < len__5769__auto___21945)){
|
|
85
|
+
args__5775__auto__.push((arguments[i__5770__auto___21946]));
|
|
80
86
|
|
|
81
|
-
var
|
|
82
|
-
|
|
87
|
+
var G__21948 = (i__5770__auto___21946 + (1));
|
|
88
|
+
i__5770__auto___21946 = G__21948;
|
|
83
89
|
continue;
|
|
84
90
|
} else {
|
|
85
91
|
}
|
|
@@ -91,14 +97,17 @@ return longdown.cli._main.cljs$core$IFn$_invoke$arity$variadic(argseq__5776__aut
|
|
|
91
97
|
});
|
|
92
98
|
|
|
93
99
|
(longdown.cli._main.cljs$core$IFn$_invoke$arity$variadic = (function (args){
|
|
94
|
-
var
|
|
95
|
-
var
|
|
96
|
-
var options = cljs.core.get.cljs$core$IFn$_invoke$arity$2(
|
|
97
|
-
var arguments$ = cljs.core.get.cljs$core$IFn$_invoke$arity$2(
|
|
98
|
-
var summary = cljs.core.get.cljs$core$IFn$_invoke$arity$2(
|
|
99
|
-
var
|
|
100
|
-
var
|
|
101
|
-
var out_dir = cljs.core.get.cljs$core$IFn$_invoke$arity$2(
|
|
100
|
+
var map__21922 = clojure.tools.cli.parse_opts(args,longdown.cli.cli_options);
|
|
101
|
+
var map__21922__$1 = cljs.core.__destructure_map(map__21922);
|
|
102
|
+
var options = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21922__$1,new cljs.core.Keyword(null,"options","options",99638489));
|
|
103
|
+
var arguments$ = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21922__$1,new cljs.core.Keyword(null,"arguments","arguments",-1182834456));
|
|
104
|
+
var summary = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21922__$1,new cljs.core.Keyword(null,"summary","summary",380847952));
|
|
105
|
+
var map__21923 = options;
|
|
106
|
+
var map__21923__$1 = cljs.core.__destructure_map(map__21923);
|
|
107
|
+
var out_dir = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21923__$1,new cljs.core.Keyword(null,"out-dir","out-dir",-939021234));
|
|
108
|
+
var html = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21923__$1,new cljs.core.Keyword(null,"html","html",-998796897));
|
|
109
|
+
var strip_highlights = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21923__$1,new cljs.core.Keyword(null,"strip-highlights","strip-highlights",-1830724463));
|
|
110
|
+
var convert_fn = longdown.lib.make_converter(new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"html","html",-998796897),html,new cljs.core.Keyword(null,"strip-highlights?","strip-highlights?",-1172221519),strip_highlights], null));
|
|
102
111
|
if(cljs.core.truth_((function (){var or__5045__auto__ = new cljs.core.Keyword(null,"help","help",-439233446).cljs$core$IFn$_invoke$arity$1(options);
|
|
103
112
|
if(cljs.core.truth_(or__5045__auto__)){
|
|
104
113
|
return or__5045__auto__;
|
|
@@ -109,14 +118,14 @@ return cljs.core.empty_QMARK_(arguments$);
|
|
|
109
118
|
return cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([longdown.cli.usage(summary)], 0));
|
|
110
119
|
} else {
|
|
111
120
|
if(((cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.count(arguments$),(1))) && (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.first(arguments$),"-")))){
|
|
112
|
-
return longdown.cli.convert_from_stdin();
|
|
121
|
+
return longdown.cli.convert_from_stdin(convert_fn);
|
|
113
122
|
} else {
|
|
114
123
|
if((out_dir == null)){
|
|
115
124
|
cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["Output directory is required"], 0));
|
|
116
125
|
|
|
117
126
|
return process.exit((1));
|
|
118
127
|
} else {
|
|
119
|
-
return longdown.cli.convert_files(out_dir,arguments
|
|
128
|
+
return longdown.cli.convert_files(out_dir,arguments$,convert_fn);
|
|
120
129
|
|
|
121
130
|
}
|
|
122
131
|
}
|
|
@@ -126,9 +135,9 @@ return longdown.cli.convert_files(out_dir,arguments$);
|
|
|
126
135
|
(longdown.cli._main.cljs$lang$maxFixedArity = (0));
|
|
127
136
|
|
|
128
137
|
/** @this {Function} */
|
|
129
|
-
(longdown.cli._main.cljs$lang$applyTo = (function (
|
|
138
|
+
(longdown.cli._main.cljs$lang$applyTo = (function (seq21918){
|
|
130
139
|
var self__5755__auto__ = this;
|
|
131
|
-
return self__5755__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(
|
|
140
|
+
return self__5755__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq21918));
|
|
132
141
|
}));
|
|
133
142
|
|
|
134
143
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["longdown/cli.cljs"],"mappings":";;AAQA,2BAAA,mFAAA,mFAAA,KAAA,gBAAA,2BAAA,mFAAA,KAAA,
|
|
1
|
+
{"version":3,"sources":["longdown/cli.cljs"],"mappings":"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","names":["longdown.cli/cli-options","longdown.cli/usage","options-summary","clojure.string.join","longdown.cli/convert-files","out-dir","filenames","convert-fn","seq__21869","cljs.core/seq","chunk__21870","count__21871","i__21872","temp__5825__auto__","cljs.core/chunked-seq?","c__5568__auto__","cljs.core/chunk-first","cljs.core/chunk-rest","cljs.core/count","cljs.core/first","cljs.core/next","in-path","out-path","js/shadow.esm.esm_import$node_path.join","js/shadow.esm.esm_import$node_fs.mkdirSync","js/shadow.esm.esm_import$node_path.dirname","longdown.lib/slurp","G__21899","G__21905","longdown.lib/spit","longdown.cli/convert-from-stdin","js/process","G__21910","clojure.string/trim-newline","cljs.core.println","var_args","args__5775__auto__","len__5769__auto__","i__5770__auto__","argseq__5776__auto__","cljs.core/IndexedSeq","longdown.cli/-main","seq21918","self__5755__auto__","args","map__21922","cljs.core/--destructure-map","cljs.core.get","map__21923","options","arguments","summary","clojure.tools.cli/parse-opts","html","strip-highlights","longdown.lib/make-converter","or__5045__auto__","cljs.core/empty?","cljs.core._EQ_","js/process.exit"],"sourcesContent":["(ns longdown.cli\n (:require\n [\"node:fs\" :as fs]\n [\"node:path\" :as path]\n [clojure.string :as str]\n [clojure.tools.cli :as cli]\n [longdown.lib :as lib]))\n\n(def cli-options\n [[\"-d\" \"--out-dir DIR\" \"Output directory\"]\n [nil \"--html\" \"Read HTML input instead of markdown\"]\n [nil \"--strip-highlights\" \"Strip headers and leading bold formatting\"]\n [\"-h\" \"--help\"]])\n\n(defn usage [options-summary]\n (->> [\"Convert longform markdown files to outline format used by Logseq\"\n \"\"\n \"Usage: longdown [options] file.md...\"\n \" longdown -\"\n \"\"\n \"When file is -, reads standard input and prints to standard output.\"\n \"\"\n \"Options:\"\n options-summary]\n (str/join \\newline)))\n\n(defn convert-files [out-dir filenames convert-fn]\n (doseq [in-path filenames]\n (let [out-path (path/join out-dir in-path)]\n (fs/mkdirSync (path/dirname out-path) #js {:recursive true})\n (->> (lib/slurp in-path)\n convert-fn\n (lib/spit out-path)))))\n\n(defn convert-from-stdin [convert-fn]\n (-> (lib/slurp (.-stdin.fd js/process))\n convert-fn\n (str/trim-newline)\n (println)))\n\n(defn -main [& args]\n (let [{:keys [options arguments summary]} (cli/parse-opts args cli-options)\n {:keys [out-dir html strip-highlights]} options\n convert-fn (lib/make-converter {:html html\n :strip-highlights? strip-highlights})]\n (cond\n (or (:help options) (empty? arguments))\n (println (usage summary))\n\n (and (= (count arguments) 1) (= (first arguments) \"-\"))\n (convert-from-stdin convert-fn)\n\n (nil? out-dir)\n (do\n (println \"Output directory is required\")\n (js/process.exit 1))\n\n :else (convert-files out-dir arguments convert-fn))))\n"]}
|
|
@@ -6,19 +6,19 @@ return shadow.esm.esm_import$node_fs.readFileSync(path,"utf-8");
|
|
|
6
6
|
longdown.lib.spit = (function longdown$lib$spit(path,output){
|
|
7
7
|
return shadow.esm.esm_import$node_fs.writeFileSync(path,output);
|
|
8
8
|
});
|
|
9
|
-
longdown.lib.stratify_nodes = (function longdown$lib$stratify_nodes(
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var node =
|
|
15
|
-
var remaining =
|
|
16
|
-
var
|
|
17
|
-
switch (
|
|
9
|
+
longdown.lib.stratify_nodes = (function longdown$lib$stratify_nodes(p__21486){
|
|
10
|
+
var vec__21487 = p__21486;
|
|
11
|
+
var seq__21488 = cljs.core.seq(vec__21487);
|
|
12
|
+
var first__21489 = cljs.core.first(seq__21488);
|
|
13
|
+
var seq__21488__$1 = cljs.core.next(seq__21488);
|
|
14
|
+
var node = first__21489;
|
|
15
|
+
var remaining = seq__21488__$1;
|
|
16
|
+
var G__21492 = new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(node);
|
|
17
|
+
switch (G__21492) {
|
|
18
18
|
case "heading":
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var depth = cljs.core.get.cljs$core$IFn$_invoke$arity$2(
|
|
19
|
+
var map__21496 = node;
|
|
20
|
+
var map__21496__$1 = cljs.core.__destructure_map(map__21496);
|
|
21
|
+
var depth = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21496__$1,new cljs.core.Keyword(null,"depth","depth",1768663640));
|
|
22
22
|
var nodes = remaining;
|
|
23
23
|
var children = cljs.core.PersistentVector.EMPTY;
|
|
24
24
|
while(true){
|
|
@@ -30,13 +30,13 @@ return ((cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(n
|
|
|
30
30
|
return and__5043__auto__;
|
|
31
31
|
}
|
|
32
32
|
})())){
|
|
33
|
-
var
|
|
34
|
-
var nodes__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(
|
|
35
|
-
var child__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
nodes =
|
|
39
|
-
children =
|
|
33
|
+
var vec__21515 = (longdown.lib.stratify_nodes.cljs$core$IFn$_invoke$arity$1 ? longdown.lib.stratify_nodes.cljs$core$IFn$_invoke$arity$1(nodes) : longdown.lib.stratify_nodes.call(null,nodes));
|
|
34
|
+
var nodes__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__21515,(0),null);
|
|
35
|
+
var child__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__21515,(1),null);
|
|
36
|
+
var G__21603 = nodes__$1;
|
|
37
|
+
var G__21604 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(children,child__$1);
|
|
38
|
+
nodes = G__21603;
|
|
39
|
+
children = G__21604;
|
|
40
40
|
continue;
|
|
41
41
|
} else {
|
|
42
42
|
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [nodes,new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"type","type",1174270348),"listItem",new cljs.core.Keyword(null,"children","children",-940561982),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [node,new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"type","type",1174270348),"list",new cljs.core.Keyword(null,"children","children",-940561982),children], null)], null)], null)], null);
|
|
@@ -64,13 +64,13 @@ var nodes = new cljs.core.Keyword(null,"children","children",-940561982).cljs$co
|
|
|
64
64
|
var children = cljs.core.PersistentVector.EMPTY;
|
|
65
65
|
while(true){
|
|
66
66
|
if(cljs.core.seq(nodes)){
|
|
67
|
-
var
|
|
68
|
-
var nodes__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(
|
|
69
|
-
var child = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(
|
|
70
|
-
var
|
|
71
|
-
var
|
|
72
|
-
nodes =
|
|
73
|
-
children =
|
|
67
|
+
var vec__21545 = longdown.lib.stratify_nodes(nodes);
|
|
68
|
+
var nodes__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__21545,(0),null);
|
|
69
|
+
var child = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__21545,(1),null);
|
|
70
|
+
var G__21607 = nodes__$1;
|
|
71
|
+
var G__21608 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(children,child);
|
|
72
|
+
nodes = G__21607;
|
|
73
|
+
children = G__21608;
|
|
74
74
|
continue;
|
|
75
75
|
} else {
|
|
76
76
|
return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(node,new cljs.core.Keyword(null,"children","children",-940561982),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"type","type",1174270348),"list",new cljs.core.Keyword(null,"children","children",-940561982),children], null)], null));
|
|
@@ -78,7 +78,71 @@ return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(node,new cljs.core.Keyword(
|
|
|
78
78
|
break;
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Strip leading number pattern like '1. ' from text.
|
|
83
|
+
*/
|
|
84
|
+
longdown.lib.strip_leading_number = (function longdown$lib$strip_leading_number(text){
|
|
85
|
+
return clojure.string.replace(text,/^\d+\.\s*/,"");
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* Convert a heading node to a paragraph, stripping leading numbers from text.
|
|
89
|
+
*/
|
|
90
|
+
longdown.lib.heading__GT_paragraph = (function longdown$lib$heading__GT_paragraph(node){
|
|
91
|
+
return cljs.core.update.cljs$core$IFn$_invoke$arity$3(cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(node,new cljs.core.Keyword(null,"type","type",1174270348),"paragraph"),new cljs.core.Keyword(null,"depth","depth",1768663640)),new cljs.core.Keyword(null,"children","children",-940561982),(function (children){
|
|
92
|
+
return cljs.core.mapv.cljs$core$IFn$_invoke$arity$2((function (child){
|
|
93
|
+
if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(child),"text")){
|
|
94
|
+
return cljs.core.update.cljs$core$IFn$_invoke$arity$3(child,new cljs.core.Keyword(null,"value","value",305978217),longdown.lib.strip_leading_number);
|
|
95
|
+
} else {
|
|
96
|
+
return child;
|
|
97
|
+
}
|
|
98
|
+
}),children);
|
|
99
|
+
}));
|
|
100
|
+
});
|
|
101
|
+
longdown.lib.empty_text_node_QMARK_ = (function longdown$lib$empty_text_node_QMARK_(node){
|
|
102
|
+
return ((cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(node),"text")) && (cljs.core.empty_QMARK_(new cljs.core.Keyword(null,"value","value",305978217).cljs$core$IFn$_invoke$arity$1(node))));
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* If the first non-empty child is a strong node, unwrap its children to plain nodes.
|
|
106
|
+
*/
|
|
107
|
+
longdown.lib.unwrap_leading_strong = (function longdown$lib$unwrap_leading_strong(children){
|
|
108
|
+
var non_empty = cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2(longdown.lib.empty_text_node_QMARK_,children);
|
|
109
|
+
var temp__5823__auto__ = cljs.core.first(non_empty);
|
|
110
|
+
if(cljs.core.truth_(temp__5823__auto__)){
|
|
111
|
+
var first_child = temp__5823__auto__;
|
|
112
|
+
if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(first_child),"strong")){
|
|
113
|
+
return cljs.core.concat.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"children","children",-940561982).cljs$core$IFn$_invoke$arity$1(first_child),cljs.core.rest(non_empty));
|
|
114
|
+
} else {
|
|
115
|
+
return children;
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
return children;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* Strip leading bold from paragraph or listItem children.
|
|
123
|
+
*/
|
|
124
|
+
longdown.lib.strip_leading_bold_in_node = (function longdown$lib$strip_leading_bold_in_node(node){
|
|
125
|
+
if(cljs.core.contains_QMARK_(new cljs.core.PersistentHashSet(null, new cljs.core.PersistentArrayMap(null, 2, ["paragraph",null,"listItem",null], null), null),new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(node))){
|
|
126
|
+
return cljs.core.update.cljs$core$IFn$_invoke$arity$3(node,new cljs.core.Keyword(null,"children","children",-940561982),cljs.core.comp.cljs$core$IFn$_invoke$arity$2(cljs.core.vec,longdown.lib.unwrap_leading_strong));
|
|
127
|
+
} else {
|
|
128
|
+
return node;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
/**
|
|
132
|
+
* Walk the AST and strip headers and leading bold formatting.
|
|
133
|
+
*/
|
|
134
|
+
longdown.lib.strip_highlights = (function longdown$lib$strip_highlights(node){
|
|
135
|
+
var transformed = ((cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(node),"heading"))?longdown.lib.strip_leading_bold_in_node(longdown.lib.heading__GT_paragraph(node)):((cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"type","type",1174270348).cljs$core$IFn$_invoke$arity$1(node),"paragraph"))?longdown.lib.strip_leading_bold_in_node(node):node
|
|
136
|
+
));
|
|
137
|
+
if(cljs.core.truth_(new cljs.core.Keyword(null,"children","children",-940561982).cljs$core$IFn$_invoke$arity$1(transformed))){
|
|
138
|
+
return cljs.core.update.cljs$core$IFn$_invoke$arity$3(transformed,new cljs.core.Keyword(null,"children","children",-940561982),(function (p1__21567_SHARP_){
|
|
139
|
+
return cljs.core.mapv.cljs$core$IFn$_invoke$arity$2(longdown.lib.strip_highlights,p1__21567_SHARP_);
|
|
140
|
+
}));
|
|
141
|
+
} else {
|
|
142
|
+
return transformed;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
longdown.lib.stratify_plugin = (function longdown$lib$stratify_plugin(){
|
|
82
146
|
return (function (tree,file,cb){
|
|
83
147
|
var next_tree = cljs.core.clj__GT_js(longdown.lib.stratify(cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic(tree,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252),true], 0))));
|
|
84
148
|
return (cb.cljs$core$IFn$_invoke$arity$3 ? cb.cljs$core$IFn$_invoke$arity$3(null,next_tree,file) : cb.call(null,null,next_tree,file));
|
|
@@ -103,20 +167,63 @@ return null;
|
|
|
103
167
|
}
|
|
104
168
|
});
|
|
105
169
|
longdown.lib.preserve_leading_whitespace_extension = ({"enter": ({"linePrefix": longdown.lib.onenterlineprefix}), "exit": ({"linePrefix": longdown.lib.onexitlineprefix})});
|
|
106
|
-
|
|
107
|
-
|
|
170
|
+
/**
|
|
171
|
+
* Filter unsafe rules to prevent escaping of certain characters.
|
|
172
|
+
*/
|
|
173
|
+
longdown.lib.filter_unsafe = (function longdown$lib$filter_unsafe(unsafe_arr){
|
|
174
|
+
return unsafe_arr.filter((function (x){
|
|
175
|
+
return (((!(((cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x.inConstruct,"phrasing")) && (((cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x.character," ")) || (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x.character,"\t")))))))) && (((cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(x.character,"_")) && (((cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(x.character,"&")) && (((cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(x.character,"[")) && (cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(x.character,"]")))))))));
|
|
108
176
|
}));
|
|
177
|
+
});
|
|
109
178
|
longdown.lib.custom_paragraph = (function longdown$lib$custom_paragraph(node,_,state,info){
|
|
110
179
|
var orig_unsafe = state.unsafe;
|
|
111
|
-
var ___$1 = (state.unsafe = longdown.lib.
|
|
180
|
+
var ___$1 = (state.unsafe = longdown.lib.filter_unsafe(orig_unsafe));
|
|
112
181
|
var value = shadow.esm.esm_import$mdast_util_to_markdown.defaultHandlers.paragraph(node,___$1,state,info);
|
|
113
182
|
var ___$2 = (state.unsafe = orig_unsafe);
|
|
114
183
|
return value;
|
|
115
184
|
});
|
|
116
|
-
longdown.lib.
|
|
117
|
-
return cljs.core.str.cljs$core$IFn$_invoke$arity$1(shadow.esm.esm_import$unified.unified().data("fromMarkdownExtensions",[longdown.lib.preserve_leading_whitespace_extension]).use(shadow.esm.esm_import$remark_parse.default).use(longdown.lib.process).use(shadow.esm.esm_import$remark_stringify.default,({"bullet": "-", "listItemIndent": "one", "fences": true, "join": [(function (_left,_right,_parent,_state){
|
|
185
|
+
longdown.lib.stringify_options = ({"bullet": "-", "listItemIndent": "one", "fences": true, "join": [(function (_left,_right,_parent,_state){
|
|
118
186
|
return (0);
|
|
119
|
-
})], "handlers": ({"paragraph": longdown.lib.custom_paragraph})})
|
|
187
|
+
})], "handlers": ({"paragraph": longdown.lib.custom_paragraph})});
|
|
188
|
+
longdown.lib.markdown_parser = shadow.esm.esm_import$unified.unified().data("fromMarkdownExtensions",[longdown.lib.preserve_leading_whitespace_extension]).use(shadow.esm.esm_import$remark_parse.default).use(longdown.lib.stratify_plugin).freeze();
|
|
189
|
+
longdown.lib.html_parser = shadow.esm.esm_import$unified.unified().use(shadow.esm.esm_import$rehype_parse.default).use(shadow.esm.esm_import$rehype_remark.default).use(longdown.lib.stratify_plugin).freeze();
|
|
190
|
+
longdown.lib.markdown_stringifier = shadow.esm.esm_import$unified.unified().use(shadow.esm.esm_import$remark_stringify.default,longdown.lib.stringify_options).freeze();
|
|
191
|
+
/**
|
|
192
|
+
* Parse markdown input to stratified AST (Clojure data).
|
|
193
|
+
*/
|
|
194
|
+
longdown.lib.parse_markdown = (function longdown$lib$parse_markdown(input){
|
|
195
|
+
return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic(longdown.lib.markdown_parser.runSync(longdown.lib.markdown_parser.parse(input)),cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252),true], 0));
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* Parse HTML input to stratified AST (Clojure data).
|
|
199
|
+
*/
|
|
200
|
+
longdown.lib.parse_html = (function longdown$lib$parse_html(input){
|
|
201
|
+
return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic(longdown.lib.html_parser.runSync(longdown.lib.html_parser.parse(input)),cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252),true], 0));
|
|
202
|
+
});
|
|
203
|
+
/**
|
|
204
|
+
* Stringify AST (Clojure data) to markdown string.
|
|
205
|
+
*/
|
|
206
|
+
longdown.lib.stringify_markdown = (function longdown$lib$stringify_markdown(ast){
|
|
207
|
+
return cljs.core.str.cljs$core$IFn$_invoke$arity$1(longdown.lib.markdown_stringifier.stringify(cljs.core.clj__GT_js(ast)));
|
|
208
|
+
});
|
|
209
|
+
/**
|
|
210
|
+
* Create a converter function from options.
|
|
211
|
+
* - :html - parse as HTML instead of markdown
|
|
212
|
+
* - :strip-highlights - strip headers and leading bold formatting
|
|
213
|
+
*/
|
|
214
|
+
longdown.lib.make_converter = (function longdown$lib$make_converter(p__21597){
|
|
215
|
+
var map__21598 = p__21597;
|
|
216
|
+
var map__21598__$1 = cljs.core.__destructure_map(map__21598);
|
|
217
|
+
var html = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21598__$1,new cljs.core.Keyword(null,"html","html",-998796897));
|
|
218
|
+
var strip_highlights_QMARK_ = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__21598__$1,new cljs.core.Keyword(null,"strip-highlights?","strip-highlights?",-1172221519));
|
|
219
|
+
var parse_fn = (cljs.core.truth_(html)?longdown.lib.parse_html:longdown.lib.parse_markdown);
|
|
220
|
+
if(cljs.core.truth_(strip_highlights_QMARK_)){
|
|
221
|
+
return cljs.core.comp.cljs$core$IFn$_invoke$arity$3(longdown.lib.stringify_markdown,longdown.lib.strip_highlights,parse_fn);
|
|
222
|
+
} else {
|
|
223
|
+
return cljs.core.comp.cljs$core$IFn$_invoke$arity$2(longdown.lib.stringify_markdown,parse_fn);
|
|
224
|
+
}
|
|
120
225
|
});
|
|
226
|
+
longdown.lib.longform__GT_outline = longdown.lib.make_converter(cljs.core.PersistentArrayMap.EMPTY);
|
|
227
|
+
longdown.lib.html__GT_outline = longdown.lib.make_converter(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"html","html",-998796897),true], null));
|
|
121
228
|
|
|
122
229
|
//# sourceMappingURL=longdown.lib.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["longdown/lib.cljs"],"mappings":"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","names":["longdown.lib/slurp","path","js/shadow.esm.esm_import$node_fs.readFileSync","longdown.lib/spit","output","js/shadow.esm.esm_import$node_fs.writeFileSync","p__21446","vec__21447","seq__21448","cljs.core/seq","first__21449","cljs.core/first","cljs.core/next","longdown.lib/stratify-nodes","node","remaining","G__21450","map__21451","cljs.core/--destructure-map","cljs.core.get","depth","nodes","children","child","and__5043__auto__","cljs.core.not_EQ_","vec__21457","cljs.core.nth","cljs.core.conj","longdown.lib/stratify","js/Error","cljs.core._EQ_","vec__21463","cljs.core.assoc","longdown.lib/process","_options","tree","file","cb","next-tree","cljs.core.js__GT_clj","cljs.core/clj->js","longdown.lib/onenterlineprefix","token","this","longdown.lib/onexitlineprefix","longdown.lib/preserve-leading-whitespace-extension","longdown.lib/custom-unsafe","js/shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe.unsafe","x","longdown.lib/custom-paragraph","_","state","info","orig-unsafe","value","js/shadow.esm.esm_import$mdast_util_to_markdown.defaultHandlers","longdown.lib/longform->outline","input","js/shadow.esm.esm_import$unified.unified","js/shadow.esm.esm_import$remark_parse.default","js/shadow.esm.esm_import$remark_stringify.default","_left","_right","_parent","_state"],"sourcesContent":["(ns longdown.lib\n (:require\n [\"node:fs\" :as fs]\n [\"mdast-util-from-markdown\" :refer [fromMarkdown]]\n [\"mdast-util-to-markdown\" :refer [defaultHandlers]]\n [\"mdast-util-to-markdown/lib/unsafe.js\" :refer [unsafe]]\n [\"remark-parse\" :as remark-parse]\n [\"remark-stringify\" :as remark-stringify]\n [\"unified\" :refer [unified]]\n [clojure.walk :as walk]))\n\n(defn slurp [path]\n (fs/readFileSync path \"utf-8\"))\n\n(defn spit [path output]\n (fs/writeFileSync path output))\n\n(defn- stratify-nodes [[node & remaining]]\n (case (:type node)\n \"heading\" (let [{:keys [depth]} node]\n (loop [nodes remaining\n children []]\n (let [child (first nodes)]\n (if (and child\n (or (not= (:type child) \"heading\")\n (< depth (:depth child))))\n (let [[nodes child] (stratify-nodes nodes)]\n (recur nodes (conj children child)))\n [nodes\n {:type \"listItem\"\n :children [node\n ; Strip headings, maybe make it an option\n ; (assoc node :type \"paragraph\")\n {:type \"list\"\n :children children}]}]))))\n\n ;; Add some special handling for :ordered list?\n \"list\" [remaining\n {:type \"listItem\"\n ;; Pad the list with empty paragraph, will end up\n ;; as a list under a blank node in Logseq\n :children [{:type \"paragraph\"\n :children [{:type \"text\"\n :text \"\"}]}\n node]}]\n\n [remaining\n {:type \"listItem\"\n :children [node]}]))\n\n(defn stratify [node]\n (assert (= (:type node) \"root\"))\n (loop [nodes (:children node)\n children []]\n (if (seq nodes)\n (let [[nodes child] (stratify-nodes nodes)]\n (recur nodes (conj children child)))\n (assoc node\n :children [{:type \"list\"\n :children children}]))))\n\n(defn process [_options]\n (fn [tree file cb]\n (let [next-tree (-> tree\n (js->clj :keywordize-keys true)\n stratify\n (clj->js))]\n (cb nil next-tree file))))\n\n(defn- onenterlineprefix [token]\n (this-as ^js this\n (let [node (aget (.-stack this) (- (.. this -stack -length) 1))]\n (when (= (.-type node) \"paragraph\")\n (.call (.. this -config -enter -data) this token)))))\n\n(defn- onexitlineprefix [token]\n (this-as ^js this\n (let [node (aget (.-stack this) (- (.. this -stack -length) 1))]\n (when (= (.-type node) \"text\")\n (.call (.. this -config -exit -data) this token)))))\n\n(def preserve-leading-whitespace-extension\n #js {:enter #js {:linePrefix onenterlineprefix}\n :exit #js {:linePrefix onexitlineprefix}})\n\n;; To override: https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf681a29f0f33db91bcfffdabeb9345d609/lib/unsafe.js#L24\n(def custom-unsafe\n (.filter unsafe\n (fn [^js x]\n (and (not (and (= (.-inConstruct x) \"phrasing\")\n (or (= (.-character x) \" \")\n (= (.-character x) \"\\t\"))))\n (not= (.-character x) \"_\")))))\n\n;; Override to prevent escaping spaces after newlines with ` `\n(defn custom-paragraph [node _ ^js state info]\n (let [orig-unsafe (.-unsafe state)\n _ (set! (.-unsafe state) custom-unsafe)\n value (.paragraph defaultHandlers node _ state info)\n _ (set! (.-unsafe state) orig-unsafe)]\n value))\n\n(defn longform->outline [input]\n (-> (unified)\n (.data \"fromMarkdownExtensions\" #js [preserve-leading-whitespace-extension])\n (.use remark-parse/default)\n (.use process)\n (.use remark-stringify/default\n #js {:bullet \"-\"\n :listItemIndent \"one\"\n ;; always use fenced code blocks\n :fences true\n ;; make output more compact with no extra newline between list items\n :join #js [(fn [_left _right _parent _state]\n 0)]\n :handlers #js {:paragraph custom-paragraph}})\n (.processSync input)\n str))\n\n(comment\n (println (longform->outline (slurp \"tmp.md\")))\n\n (defn- strip-position [node]\n (walk/prewalk\n (fn [x]\n (if (map? x)\n (dissoc x :position)\n x))\n node))\n\n (-> (fromMarkdown \"a\\n b\\n c\")\n (js->clj :keywordize-keys true)\n strip-position))\n"]}
|
|
1
|
+
{"version":3,"sources":["longdown/lib.cljs"],"mappings":"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","names":["longdown.lib/slurp","path","js/shadow.esm.esm_import$node_fs.readFileSync","longdown.lib/spit","output","js/shadow.esm.esm_import$node_fs.writeFileSync","p__21486","vec__21487","seq__21488","cljs.core/seq","first__21489","cljs.core/first","cljs.core/next","longdown.lib/stratify-nodes","node","remaining","G__21492","map__21496","cljs.core/--destructure-map","cljs.core.get","depth","nodes","children","child","and__5043__auto__","cljs.core.not_EQ_","vec__21515","cljs.core.nth","cljs.core.conj","longdown.lib/stratify","js/Error","cljs.core._EQ_","vec__21545","cljs.core.assoc","longdown.lib/strip-leading-number","text","clojure.string/replace","longdown.lib/heading->paragraph","cljs.core.dissoc","cljs.core.update","cljs.core.mapv","longdown.lib/empty-text-node?","cljs.core/empty?","longdown.lib/unwrap-leading-strong","non-empty","cljs.core.drop_while","temp__5823__auto__","first-child","cljs.core.concat","cljs.core/rest","longdown.lib/strip-leading-bold-in-node","cljs.core/contains?","cljs.core.comp","cljs.core/vec","longdown.lib/strip-highlights","transformed","p1__21567#","longdown.lib/stratify-plugin","tree","file","cb","next-tree","cljs.core.js__GT_clj","cljs.core/clj->js","longdown.lib/onenterlineprefix","token","this","longdown.lib/onexitlineprefix","longdown.lib/preserve-leading-whitespace-extension","longdown.lib/filter-unsafe","unsafe-arr","x","longdown.lib/custom-paragraph","_","state","info","orig-unsafe","value","js/shadow.esm.esm_import$mdast_util_to_markdown.defaultHandlers","longdown.lib/stringify-options","_left","_right","_parent","_state","longdown.lib/markdown-parser","js/shadow.esm.esm_import$unified.unified","js/shadow.esm.esm_import$remark_parse.default","longdown.lib/html-parser","js/shadow.esm.esm_import$rehype_parse.default","js/shadow.esm.esm_import$rehype_remark.default","longdown.lib/markdown-stringifier","js/shadow.esm.esm_import$remark_stringify.default","longdown.lib/parse-markdown","input","longdown.lib/parse-html","longdown.lib/stringify-markdown","ast","p__21597","map__21598","longdown.lib/make-converter","html","strip-highlights?","parse-fn","longdown.lib/longform->outline","longdown.lib/html->outline"],"sourcesContent":["(ns longdown.lib\n (:require\n [\"node:fs\" :as fs]\n [\"mdast-util-from-markdown\" :refer [fromMarkdown]]\n [\"mdast-util-to-markdown\" :refer [defaultHandlers]]\n [\"rehype-parse\" :as rehype-parse]\n [\"rehype-remark\" :as rehype-remark]\n [\"remark-parse\" :as remark-parse]\n [\"remark-stringify\" :as remark-stringify]\n [\"unified\" :refer [unified]]\n [clojure.string :as str]\n [clojure.walk :as walk]))\n\n(defn slurp [path]\n (fs/readFileSync path \"utf-8\"))\n\n(defn spit [path output]\n (fs/writeFileSync path output))\n\n(defn- stratify-nodes [[node & remaining]]\n (case (:type node)\n \"heading\" (let [{:keys [depth]} node]\n (loop [nodes remaining\n children []]\n (let [child (first nodes)]\n (if (and child\n (or (not= (:type child) \"heading\")\n (< depth (:depth child))))\n (let [[nodes child] (stratify-nodes nodes)]\n (recur nodes (conj children child)))\n [nodes\n {:type \"listItem\"\n :children [node\n ; Strip headings, maybe make it an option\n ; (assoc node :type \"paragraph\")\n {:type \"list\"\n :children children}]}]))))\n\n ;; Add some special handling for :ordered list?\n \"list\" [remaining\n {:type \"listItem\"\n ;; Pad the list with empty paragraph, will end up\n ;; as a list under a blank node in Logseq\n :children [{:type \"paragraph\"\n :children [{:type \"text\"\n :text \"\"}]}\n node]}]\n\n [remaining\n {:type \"listItem\"\n :children [node]}]))\n\n(defn stratify [node]\n (assert (= (:type node) \"root\"))\n (loop [nodes (:children node)\n children []]\n (if (seq nodes)\n (let [[nodes child] (stratify-nodes nodes)]\n (recur nodes (conj children child)))\n (assoc node\n :children [{:type \"list\"\n :children children}]))))\n\n(defn- strip-leading-number\n \"Strip leading number pattern like '1. ' from text.\"\n [text]\n (str/replace text #\"^\\d+\\.\\s*\" \"\"))\n\n(defn- heading->paragraph\n \"Convert a heading node to a paragraph, stripping leading numbers from text.\"\n [node]\n (-> node\n (assoc :type \"paragraph\")\n (dissoc :depth)\n (update :children\n (fn [children]\n (mapv (fn [child]\n (if (= (:type child) \"text\")\n (update child :value strip-leading-number)\n child))\n children)))))\n\n(defn- empty-text-node? [node]\n (and (= (:type node) \"text\")\n (empty? (:value node))))\n\n(defn- unwrap-leading-strong\n \"If the first non-empty child is a strong node, unwrap its children to plain nodes.\"\n [children]\n (let [non-empty (drop-while empty-text-node? children)]\n (if-let [first-child (first non-empty)]\n (if (= (:type first-child) \"strong\")\n (concat (:children first-child) (rest non-empty))\n children)\n children)))\n\n(defn- strip-leading-bold-in-node\n \"Strip leading bold from paragraph or listItem children.\"\n [node]\n (if (contains? #{\"paragraph\" \"listItem\"} (:type node))\n (update node :children (comp vec unwrap-leading-strong))\n node))\n\n(defn strip-highlights\n \"Walk the AST and strip headers and leading bold formatting.\"\n [node]\n (let [transformed (cond\n (= (:type node) \"heading\")\n (-> node heading->paragraph strip-leading-bold-in-node)\n\n (= (:type node) \"paragraph\")\n (strip-leading-bold-in-node node)\n\n :else node)]\n (if (:children transformed)\n (update transformed :children #(mapv strip-highlights %))\n transformed)))\n\n(defn- stratify-plugin []\n (fn [tree file cb]\n (let [next-tree (-> tree\n (js->clj :keywordize-keys true)\n stratify\n clj->js)]\n (cb nil next-tree file))))\n\n(defn- onenterlineprefix [token]\n (this-as ^js this\n (let [node (aget (.-stack this) (- (.. this -stack -length) 1))]\n (when (= (.-type node) \"paragraph\")\n (.call (.. this -config -enter -data) this token)))))\n\n(defn- onexitlineprefix [token]\n (this-as ^js this\n (let [node (aget (.-stack this) (- (.. this -stack -length) 1))]\n (when (= (.-type node) \"text\")\n (.call (.. this -config -exit -data) this token)))))\n\n(def preserve-leading-whitespace-extension\n #js {:enter #js {:linePrefix onenterlineprefix}\n :exit #js {:linePrefix onexitlineprefix}})\n\n;; To override: https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf681a29f0f33db91bcfffdabeb9345d609/lib/unsafe.js#L24\n(defn- filter-unsafe\n \"Filter unsafe rules to prevent escaping of certain characters.\"\n [unsafe-arr]\n (.filter unsafe-arr\n (fn [^js x]\n (and (not (and (= (.-inConstruct x) \"phrasing\")\n (or (= (.-character x) \" \")\n (= (.-character x) \"\\t\"))))\n (not= (.-character x) \"_\")\n (not= (.-character x) \"&\")\n (not= (.-character x) \"[\")\n (not= (.-character x) \"]\")))))\n\n;; Override to prevent escaping spaces after newlines with ` `\n(defn custom-paragraph [node _ ^js state info]\n (let [orig-unsafe (.-unsafe state)\n _ (set! (.-unsafe state) (filter-unsafe orig-unsafe))\n value (.paragraph defaultHandlers node _ state info)\n _ (set! (.-unsafe state) orig-unsafe)]\n value))\n\n(def stringify-options\n #js {:bullet \"-\"\n :listItemIndent \"one\"\n ;; always use fenced code blocks\n :fences true\n ;; make output more compact with no extra newline between list items\n :join #js [(fn [_left _right _parent _state]\n 0)]\n :handlers #js {:paragraph custom-paragraph}})\n\n(def ^:private markdown-parser\n (-> (unified)\n (.data \"fromMarkdownExtensions\" #js [preserve-leading-whitespace-extension])\n (.use remark-parse/default)\n (.use stratify-plugin)\n .freeze))\n\n(def ^:private html-parser\n (-> (unified)\n (.use rehype-parse/default)\n (.use rehype-remark/default)\n (.use stratify-plugin)\n .freeze))\n\n(def ^:private markdown-stringifier\n (-> (unified)\n (.use remark-stringify/default stringify-options)\n .freeze))\n\n(defn parse-markdown\n \"Parse markdown input to stratified AST (Clojure data).\"\n [input]\n (-> markdown-parser\n (.parse input)\n (->> (.runSync markdown-parser))\n (js->clj :keywordize-keys true)))\n\n(defn parse-html\n \"Parse HTML input to stratified AST (Clojure data).\"\n [input]\n (-> html-parser\n (.parse input)\n (->> (.runSync html-parser))\n (js->clj :keywordize-keys true)))\n\n(defn stringify-markdown\n \"Stringify AST (Clojure data) to markdown string.\"\n [ast]\n (-> ast clj->js (->> (.stringify markdown-stringifier)) str))\n\n(defn make-converter\n \"Create a converter function from options.\n - :html - parse as HTML instead of markdown\n - :strip-highlights - strip headers and leading bold formatting\"\n [{:keys [html strip-highlights?]}]\n (let [parse-fn (if html parse-html parse-markdown)]\n (if strip-highlights?\n (comp stringify-markdown strip-highlights parse-fn)\n (comp stringify-markdown parse-fn))))\n\n(def longform->outline\n (make-converter {}))\n\n(def html->outline\n (make-converter {:html true}))\n\n(comment\n (println (longform->outline (slurp \"tmp.md\")))\n\n (defn- strip-position [node]\n (walk/prewalk\n (fn [x]\n (if (map? x)\n (dissoc x :position)\n x))\n node))\n\n (-> (fromMarkdown \"a\\n b\\n c\")\n (js->clj :keywordize-keys true)\n strip-position))\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version":3,
|
|
3
|
+
"file":"shadow.esm.esm_import$rehype_parse.js",
|
|
4
|
+
"lineCount":3,
|
|
5
|
+
"mappings":"AAAAA,IAAKC,CAAAA,OAAL,CAAa,oCAAb,CAAA;AACAC,MAAOC,CAAAA,GAAIC,CAAAA,uBAAX,GAAqCA,uBAArC;;",
|
|
6
|
+
"sources":["shadow.esm.esm_import$rehype_parse.js"],
|
|
7
|
+
"sourcesContent":["goog.provide(\"shadow.esm.esm_import$rehype_parse\");\nshadow.esm.esm_import$rehype_parse = esm_import$rehype_parse;\n"],
|
|
8
|
+
"names":["goog","provide","shadow","esm","esm_import$rehype_parse"]
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version":3,
|
|
3
|
+
"file":"shadow.esm.esm_import$rehype_remark.js",
|
|
4
|
+
"lineCount":3,
|
|
5
|
+
"mappings":"AAAAA,IAAKC,CAAAA,OAAL,CAAa,qCAAb,CAAA;AACAC,MAAOC,CAAAA,GAAIC,CAAAA,wBAAX,GAAsCA,wBAAtC;;",
|
|
6
|
+
"sources":["shadow.esm.esm_import$rehype_remark.js"],
|
|
7
|
+
"sourcesContent":["goog.provide(\"shadow.esm.esm_import$rehype_remark\");\nshadow.esm.esm_import$rehype_remark = esm_import$rehype_remark;\n"],
|
|
8
|
+
"names":["goog","provide","shadow","esm","esm_import$rehype_remark"]
|
|
9
|
+
}
|
|
@@ -7,8 +7,10 @@ import * as esm_import$mdast_util_from_markdown from "mdast-util-from-markdown";
|
|
|
7
7
|
globalThis.esm_import$mdast_util_from_markdown = esm_import$mdast_util_from_markdown;
|
|
8
8
|
import * as esm_import$mdast_util_to_markdown from "mdast-util-to-markdown";
|
|
9
9
|
globalThis.esm_import$mdast_util_to_markdown = esm_import$mdast_util_to_markdown;
|
|
10
|
-
import * as esm_import$
|
|
11
|
-
globalThis.esm_import$
|
|
10
|
+
import * as esm_import$rehype_parse from "rehype-parse";
|
|
11
|
+
globalThis.esm_import$rehype_parse = esm_import$rehype_parse;
|
|
12
|
+
import * as esm_import$rehype_remark from "rehype-remark";
|
|
13
|
+
globalThis.esm_import$rehype_remark = esm_import$rehype_remark;
|
|
12
14
|
import * as esm_import$remark_parse from "remark-parse";
|
|
13
15
|
globalThis.esm_import$remark_parse = esm_import$remark_parse;
|
|
14
16
|
import * as esm_import$remark_stringify from "remark-stringify";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "longdown",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2026.02.01",
|
|
4
4
|
"description": "Convert longform markdown files to outline format used by Logseq",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
"bin",
|
|
11
11
|
"lib"
|
|
12
12
|
],
|
|
13
|
-
"dependencies": {
|
|
14
|
-
"remark-parse": "^10.0.1",
|
|
15
|
-
"remark-stringify": "^10.0.2",
|
|
16
|
-
"unified": "^10.1.2"
|
|
17
|
-
},
|
|
18
13
|
"devDependencies": {
|
|
14
|
+
"rehype-parse": "^9.0.1",
|
|
15
|
+
"rehype-remark": "^10.0.1",
|
|
16
|
+
"remark-parse": "^11.0.0",
|
|
17
|
+
"remark-stringify": "^11.0.0",
|
|
18
|
+
"unified": "^11.0.0",
|
|
19
19
|
"source-map-support": "^0.5.21"
|
|
20
20
|
},
|
|
21
21
|
"repository": {
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import "./cljs_env.js";
|
|
2
|
-
goog.provide("shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe");
|
|
3
|
-
shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe = esm_import$mdast_util_to_markdown$lib$unsafe;
|
|
4
|
-
|
|
5
|
-
//# sourceMappingURL=shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe.js.map
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version":3,
|
|
3
|
-
"file":"shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe.js",
|
|
4
|
-
"lineCount":3,
|
|
5
|
-
"mappings":"AAAAA,IAAKC,CAAAA,OAAL,CAAa,yDAAb,CAAA;AACAC,MAAOC,CAAAA,GAAIC,CAAAA,4CAAX,GAA0DA,4CAA1D;;",
|
|
6
|
-
"sources":["shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe.js"],
|
|
7
|
-
"sourcesContent":["goog.provide(\"shadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe\");\nshadow.esm.esm_import$mdast_util_to_markdown$lib$unsafe = esm_import$mdast_util_to_markdown$lib$unsafe;\n"],
|
|
8
|
-
"names":["goog","provide","shadow","esm","esm_import$mdast_util_to_markdown$lib$unsafe"]
|
|
9
|
-
}
|