1- import { InputType , MarkdownBreakerRules } from "helpers/Constants" ;
21import { Notice } from "obsidian" ;
32import { DataviewApi , getAPI , isPluginEnabled } from "obsidian-dataview" ;
43import { Literal , WrappedLiteral } from "obsidian-dataview/lib/data-model/value" ;
5- import { DateTime } from "luxon" ;
6- import { LOGGER } from "services/Logger" ;
7- import { LocalSettings } from "cdm/SettingsModel" ;
84class DataviewProxy {
95
106 private static instance : DataviewProxy ;
@@ -30,52 +26,6 @@ class DataviewProxy {
3026 return this . getDataviewAPI ( ) . value . isTruthy ( literal ?. toString ( ) ) ;
3127 }
3228
33- parseLiteral ( literal : Literal , dataTypeDst : string , localSettings : LocalSettings , isInline ?: boolean ) : Literal {
34- let parsedLiteral : Literal = literal ;
35- if ( ! this . isTruthy ( literal ?. toString ( ) ) ) {
36- return "" ;
37- }
38- literal = this . parseDataArray ( literal ) ;
39- const wrapped = this . wrapLiteral ( literal ) ;
40- LOGGER . debug ( `=>parseLiteral: type ${ wrapped
41- . type } to ${ dataTypeDst } `) ;
42- // Check empty or undefined literals
43- switch ( dataTypeDst ) {
44- case InputType . TEXT :
45- parsedLiteral = this . parseToString ( wrapped ) ;
46- break ;
47- case InputType . MARKDOWN :
48- parsedLiteral = this . parseToMarkdown ( wrapped , localSettings , isInline ) ;
49- break ;
50- case InputType . TAGS :
51- parsedLiteral = this . parseToOptionsArray ( wrapped ) ;
52- break ;
53- case InputType . CALENDAR :
54- parsedLiteral = this . parseToCalendar ( wrapped , localSettings . date_format ) ;
55- break ;
56- case InputType . CALENDAR_TIME :
57- parsedLiteral = this . parseToCalendar ( wrapped , localSettings . datetime_format ) ;
58- break ;
59- case InputType . METATADA_TIME :
60- parsedLiteral = this . parseToCalendar ( wrapped ) ;
61- break ;
62- case InputType . NUMBER :
63- parsedLiteral = this . parseToNumber ( wrapped ) ;
64- break ;
65- case InputType . CHECKBOX :
66- parsedLiteral = this . parseToBoolean ( wrapped ) ;
67- break ;
68- case InputType . TASK :
69- case InputType . FORMULA :
70- // Do nothing
71- break ;
72- default :
73- parsedLiteral = parsedLiteral = this . parseToString ( wrapped ) ;
74-
75- }
76- LOGGER . debug ( `<=parseLiteral` ) ;
77- return parsedLiteral ;
78- }
7929 /**
8030 * Check if literal is Proxy DataArray, if so, parse it. If not, return same literal
8131 * @param literal
@@ -97,124 +47,6 @@ class DataviewProxy {
9747 }
9848 return this . instance ;
9949 }
100-
101- private parseToCalendar ( wrapped : WrappedLiteral , format ?: string ) : DateTime {
102- if ( wrapped . type === 'string' ) {
103- let calendarCandidate ;
104- if ( format ) {
105- calendarCandidate = DateTime . fromFormat ( wrapped . value , format ) ;
106- } else {
107- calendarCandidate = DateTime . fromISO ( wrapped . value ) ;
108- }
109-
110- if ( calendarCandidate . isValid ) {
111- return calendarCandidate ;
112- }
113- return null ;
114- }
115-
116- if ( DateTime . isDateTime ( wrapped . value ) ) {
117- return wrapped . value ;
118- } else {
119- return null ;
120- }
121- }
122-
123- private parseToString ( wrapped : WrappedLiteral ) : string {
124- if ( DateTime . isDateTime ( wrapped . value ) ) {
125- LOGGER . debug ( "adapting DateTime to string..." ) ;
126- // Values of dataview parse to md friendly strings
127- return wrapped . value . toFormat ( "yyyy-MM-dd" ) ;
128- } else {
129- return this . getDataviewAPI ( ) . value . toString ( wrapped . value ) ;
130- }
131- }
132-
133- private parseToNumber ( wrapped : WrappedLiteral ) : number {
134- if ( wrapped . type === 'number' ) {
135- return wrapped . value ;
136- } else {
137- const adjustedValue = this . getDataviewAPI ( ) . value . toString ( wrapped . value ) ;
138- return Number ( adjustedValue ) ;
139- }
140- }
141-
142- private parseToBoolean ( wrapped : WrappedLiteral ) : string {
143- if ( wrapped . type === 'boolean' ) {
144- return wrapped . value ? 'true' : 'false' ;
145- } else {
146- const adjustedValue = this . getDataviewAPI ( ) . value . toString ( wrapped . value ) ;
147- return adjustedValue === 'true' ? "true" : "false" ;
148- }
149- }
150-
151- private parseToMarkdown ( wrapped : WrappedLiteral , localSettings : LocalSettings , isInline : boolean ) : string {
152- let auxMarkdown = '' ;
153- switch ( wrapped . type ) {
154- case 'boolean' :
155- case 'number' :
156- // Do nothing
157- auxMarkdown = wrapped . value . toString ( ) ;
158- break ;
159- case 'array' :
160- auxMarkdown = wrapped . value
161- . map ( v => this . parseToMarkdown ( this . getDataviewAPI ( ) . value . wrapValue ( v ) , localSettings , isInline ) )
162- . join ( ', ' ) ;
163- break ;
164-
165- case 'date' :
166- if ( wrapped . value . hour === 0 && wrapped . value . minute === 0 && wrapped . value . second === 0 ) {
167- // Parse date
168- auxMarkdown = wrapped . value . toFormat ( localSettings . date_format ) ;
169- } else {
170- // Parse datetime
171- auxMarkdown = wrapped . value . toFormat ( localSettings . datetime_format ) ;
172- auxMarkdown = this . handleMarkdownBreaker ( auxMarkdown , localSettings , isInline ) ;
173- }
174- break ;
175- case 'object' :
176- if ( DateTime . isDateTime ( wrapped . value ) ) {
177- return this . parseToMarkdown ( { type : 'date' , value : wrapped . value } , localSettings , isInline ) ;
178- }
179- // Else go to default
180- default :
181- auxMarkdown = this . parseToString ( wrapped ) as string ;
182- // Check possible markdown breakers
183- auxMarkdown = this . handleMarkdownBreaker ( auxMarkdown , localSettings , isInline ) ;
184- }
185- return auxMarkdown ;
186- }
187-
188- private parseToOptionsArray ( wrapped : WrappedLiteral ) : Literal {
189- if ( wrapped . type !== 'array' ) {
190- return wrapped . value . toString ( ) . split ( "," ) . map ( s => s . trim ( ) ) ;
191- }
192- return wrapped . value ;
193- }
194-
195- private handleMarkdownBreaker ( value : string , localSettings : LocalSettings , isInline ?: boolean ) : string {
196- // Do nothing if is inline
197- if ( isInline ) {
198- return value ;
199- }
200-
201- // Remove a possible already existing quote wrapper
202- if ( value . startsWith ( '"' ) && value . endsWith ( '"' ) ) {
203- value = value . substring ( 1 , value . length - 1 ) ;
204- }
205-
206- // Check possible markdown breakers of the yaml
207- if ( MarkdownBreakerRules . INIT_CHARS . some ( c => value . startsWith ( c ) ) ||
208- MarkdownBreakerRules . BETWEEN_CHARS . some ( rule => value . includes ( rule ) ) ||
209- MarkdownBreakerRules . UNIQUE_CHARS . some ( c => value === c ) ||
210- localSettings . frontmatter_quote_wrap ) {
211- value = value . replaceAll ( `\\` , `` ) ;
212- value = value . replaceAll ( `"` , `\\"` ) ;
213- return `"${ value } "` ;
214- }
215-
216- return value ;
217- }
21850}
21951
22052export const DataviewService = DataviewProxy . getInstance ( ) ;
0 commit comments